diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2021-11-09 10:16:06 -0800 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-01-21 03:05:50 +0000 |
commit | d37d97f6394ff45d661442883a4376ac366dcdfb (patch) | |
tree | 535e69206a1182c31b42d0a0220b6f5808a684da /tests | |
parent | 0d412bbed59e3fbde7b89647064e9dbf1a629f0e (diff) |
QFactoryLoader: add setExtraSearchPath() (for QPA plugins' use)
This is added specifically for the QPA platform and theme plugins, to
honor the QT_QPA_PLATFORM_PLUGIN_PATH environment variable and the
(inadvisable) -platformpluginpath command-line argument.
This removes the last QFactoryLoader used with an empty path (also the
only two that could be reached), which were causing a scan of the
application's binary directory whenever the platform plugin path was
set. In case of applications installed to /usr/bin, the entire /usr/bin
was scanned, which can be qualified as "not good".
Fixes: QTBUG-97950
Change-Id: Ice04365c72984d07a64dfffd16b47fe1d22f26d3
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
(cherry picked from commit ddba24535fb5732c3cb757414cf1a393bd98f693)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp b/tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp index 9fa61804b3..862877fa6f 100644 --- a/tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp +++ b/tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp @@ -47,11 +47,13 @@ class tst_QFactoryLoader : public QObject QSharedPointer<QTemporaryDir> directory; #endif + QString binFolder; public slots: void initTestCase(); private slots: void usingTwoFactoriesFromSameDir(); + void extraSearchPath(); }; static const char binFolderC[] = "bin"; @@ -64,15 +66,17 @@ void tst_QFactoryLoader::initTestCase() QVERIFY(directory->isValid()); QVERIFY2(QDir::setCurrent(directory->path()), qPrintable("Could not chdir to " + directory->path())); #endif - const QString binFolder = QFINDTESTDATA(binFolderC); + binFolder = QFINDTESTDATA(binFolderC); QVERIFY2(!binFolder.isEmpty(), "Unable to locate 'bin' folder"); -#if QT_CONFIG(library) - QCoreApplication::setLibraryPaths(QStringList(QFileInfo(binFolder).absolutePath())); -#endif } void tst_QFactoryLoader::usingTwoFactoriesFromSameDir() { +#if QT_CONFIG(library) + // set the library path to contain the directory where the 'bin' dir is located + QCoreApplication::setLibraryPaths( { QFileInfo(binFolder).absolutePath() }); +#endif + const QString suffix = QLatin1Char('/') + QLatin1String(binFolderC); QFactoryLoader loader1(PluginInterface1_iid, suffix); @@ -92,5 +96,32 @@ void tst_QFactoryLoader::usingTwoFactoriesFromSameDir() QCOMPARE(plugin2->pluginName(), QLatin1String("Plugin2 ok")); } +void tst_QFactoryLoader::extraSearchPath() +{ +#if defined(Q_OS_ANDROID) && !QT_CONFIG(library) + QSKIP("Test not applicable in this configuration."); +#else + QCoreApplication::setLibraryPaths(QStringList()); + + QString absoluteBinPath = QFileInfo(binFolder).absoluteFilePath(); + QFactoryLoader loader1(PluginInterface1_iid, "/nonexistent"); + + // it shouldn't have scanned anything because we haven't given it a path yet + QVERIFY(loader1.metaData().isEmpty()); + + loader1.setExtraSearchPath(absoluteBinPath); + PluginInterface1 *plugin1 = qobject_cast<PluginInterface1 *>(loader1.instance(0)); + QVERIFY2(plugin1, + qPrintable(QString::fromLatin1("Cannot load plugin '%1'") + .arg(QLatin1String(PluginInterface1_iid)))); + + QCOMPARE(plugin1->pluginName(), QLatin1String("Plugin1 ok")); + + // check that it forgets that plugin + loader1.setExtraSearchPath(QString()); + QVERIFY(loader1.metaData().isEmpty()); +#endif +} + QTEST_MAIN(tst_QFactoryLoader) #include "tst_qfactoryloader.moc" |