summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2021-11-09 10:16:06 -0800
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-01-21 03:05:50 +0000
commitd37d97f6394ff45d661442883a4376ac366dcdfb (patch)
tree535e69206a1182c31b42d0a0220b6f5808a684da /tests
parent0d412bbed59e3fbde7b89647064e9dbf1a629f0e (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.cpp39
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"