diff options
Diffstat (limited to 'tests/auto/corelib/plugin/qfactoryloader')
13 files changed, 180 insertions, 19 deletions
diff --git a/tests/auto/corelib/plugin/qfactoryloader/CMakeLists.txt b/tests/auto/corelib/plugin/qfactoryloader/CMakeLists.txt index c55ededca2..14174da173 100644 --- a/tests/auto/corelib/plugin/qfactoryloader/CMakeLists.txt +++ b/tests/auto/corelib/plugin/qfactoryloader/CMakeLists.txt @@ -1,6 +1,13 @@ # Copyright (C) 2022 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause +if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_qfactoryloader LANGUAGES CXX) + find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST) +endif() + add_subdirectory(plugin1) add_subdirectory(plugin2) +add_subdirectory(staticplugin) add_subdirectory(test) diff --git a/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.cpp b/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.cpp index 51825f0017..6731d560a7 100644 --- a/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.cpp +++ b/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QtCore/qstring.h> #include "plugin1.h" @@ -7,3 +7,5 @@ QString Plugin1::pluginName() const { return QLatin1String("Plugin1 ok"); } + +#include "moc_plugin1.cpp" diff --git a/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.h b/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.h index 8afb501f04..aba0b5c2f5 100644 --- a/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.h +++ b/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.h @@ -1,5 +1,5 @@ // Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #ifndef THEPLUGIN_H #define THEPLUGIN_H @@ -10,7 +10,7 @@ class Plugin1 : public QObject, public PluginInterface1 { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.autotests.plugininterface1") + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.autotests.plugininterface1" FILE "plugin1.json") Q_INTERFACES(PluginInterface1) public: diff --git a/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.json b/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.json new file mode 100644 index 0000000000..ce67846d48 --- /dev/null +++ b/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.json @@ -0,0 +1,5 @@ +{ + "Keys": [ + "plugin1" + ] +} diff --git a/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugininterface1.h b/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugininterface1.h index b7251db358..a652273eb5 100644 --- a/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugininterface1.h +++ b/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugininterface1.h @@ -1,5 +1,5 @@ // Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #ifndef PLUGININTERFACE1_H #define PLUGININTERFACE1_H diff --git a/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.cpp b/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.cpp index 88a34ac73e..c2ac873317 100644 --- a/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.cpp +++ b/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QtCore/qstring.h> #include "plugin2.h" @@ -7,3 +7,5 @@ QString Plugin2::pluginName() const { return QLatin1String("Plugin2 ok"); } + +#include "moc_plugin2.cpp" diff --git a/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.h b/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.h index a2ccae198e..02ef062b77 100644 --- a/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.h +++ b/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.h @@ -1,5 +1,5 @@ // Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #ifndef THEPLUGIN_H #define THEPLUGIN_H diff --git a/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugininterface2.h b/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugininterface2.h index e332e80b89..df30f2ffd3 100644 --- a/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugininterface2.h +++ b/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugininterface2.h @@ -1,5 +1,5 @@ // Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #ifndef PLUGININTERFACE2_H #define PLUGININTERFACE2_H diff --git a/tests/auto/corelib/plugin/qfactoryloader/staticplugin/CMakeLists.txt b/tests/auto/corelib/plugin/qfactoryloader/staticplugin/CMakeLists.txt new file mode 100644 index 0000000000..c43a69c707 --- /dev/null +++ b/tests/auto/corelib/plugin/qfactoryloader/staticplugin/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_internal_add_cmake_library(tst_qfactoryloader_staticplugin + STATIC + SOURCES + main.cpp + LIBRARIES + Qt::Core +) + +qt_autogen_tools_initial_setup(tst_qfactoryloader_staticplugin) + +target_compile_definitions(tst_qfactoryloader_staticplugin PRIVATE QT_STATICPLUGIN) diff --git a/tests/auto/corelib/plugin/qfactoryloader/staticplugin/main.cpp b/tests/auto/corelib/plugin/qfactoryloader/staticplugin/main.cpp new file mode 100644 index 0000000000..6506f9cf9b --- /dev/null +++ b/tests/auto/corelib/plugin/qfactoryloader/staticplugin/main.cpp @@ -0,0 +1,22 @@ +// Copyright (C) 2018 Intel Corporation. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only +#include <QtPlugin> +#include <QObject> + +class StaticPlugin1 : public QObject +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "StaticPlugin1" FILE "plugin.json") +public: + StaticPlugin1() {} +}; + +class StaticPlugin2 : public QObject +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "StaticPlugin2" FILE "plugin.json") +public: + StaticPlugin2() {} +}; + +#include "main.moc" diff --git a/tests/auto/corelib/plugin/qfactoryloader/staticplugin/plugin.json b/tests/auto/corelib/plugin/qfactoryloader/staticplugin/plugin.json new file mode 100644 index 0000000000..7321080fb4 --- /dev/null +++ b/tests/auto/corelib/plugin/qfactoryloader/staticplugin/plugin.json @@ -0,0 +1,3 @@ +{ + "Keys": [ "Value" ] +} diff --git a/tests/auto/corelib/plugin/qfactoryloader/test/CMakeLists.txt b/tests/auto/corelib/plugin/qfactoryloader/test/CMakeLists.txt index 7b32c6953a..fb3b6f5acb 100644 --- a/tests/auto/corelib/plugin/qfactoryloader/test/CMakeLists.txt +++ b/tests/auto/corelib/plugin/qfactoryloader/test/CMakeLists.txt @@ -13,11 +13,9 @@ qt_internal_add_test(tst_qfactoryloader ../tst_qfactoryloader.cpp LIBRARIES Qt::CorePrivate + tst_qfactoryloader_staticplugin ) -## Scopes: -##################################################################### - qt_internal_extend_target(tst_qfactoryloader CONDITION NOT QT_FEATURE_library LIBRARIES tst_qfactoryloader_plugin1 diff --git a/tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp b/tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp index a3ee6fa3d4..faec311f2d 100644 --- a/tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp +++ b/tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp @@ -1,11 +1,13 @@ // Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QtTest/qtest.h> #include <QtCore/qdir.h> #include <QtCore/qfileinfo.h> #include <QtCore/qplugin.h> +#include <QtCore/qversionnumber.h> #include <private/qfactoryloader_p.h> +#include <private/qlibrary_p.h> #include "plugin1/plugininterface1.h" #include "plugin2/plugininterface2.h" @@ -18,10 +20,6 @@ class tst_QFactoryLoader : public QObject { Q_OBJECT -#ifdef Q_OS_ANDROID - QSharedPointer<QTemporaryDir> directory; -#endif - QString binFolder; public slots: void initTestCase(); @@ -29,6 +27,9 @@ public slots: private slots: void usingTwoFactoriesFromSameDir(); void extraSearchPath(); + void multiplePaths(); + void staticPlugin_data(); + void staticPlugin(); }; static const char binFolderC[] = "bin"; @@ -48,21 +49,61 @@ void tst_QFactoryLoader::usingTwoFactoriesFromSameDir() // set the library path to contain the directory where the 'bin' dir is located QCoreApplication::setLibraryPaths( { QFileInfo(binFolder).absolutePath() }); #endif + auto versionNumber = [](const QCborValue &value) { + // Qt plugins only store major & minor versions in the metadata, so + // the low 8 bits are always zero. + qint64 v = value.toInteger(); + return QVersionNumber(v >> 16, uchar(v >> 8)); + }; + QVersionNumber qtVersion(QT_VERSION_MAJOR, 0); const QString suffix = QLatin1Char('/') + QLatin1String(binFolderC); QFactoryLoader loader1(PluginInterface1_iid, suffix); + const QFactoryLoader::MetaDataList list1 = loader1.metaData(); + const QList<QCborArray> keys1 = loader1.metaDataKeys(); + QCOMPARE(list1.size(), 1); + QCOMPARE(keys1.size(), 1); + QCOMPARE_GE(versionNumber(list1[0].value(QtPluginMetaDataKeys::QtVersion)), qtVersion); + QCOMPARE(list1[0].value(QtPluginMetaDataKeys::IID), PluginInterface1_iid); + QCOMPARE(list1[0].value(QtPluginMetaDataKeys::ClassName), "Plugin1"); + + // plugin1's Q_PLUGIN_METADATA has FILE "plugin1.json" + QCborValue metadata1 = list1[0].value(QtPluginMetaDataKeys::MetaData); + QCOMPARE(metadata1.type(), QCborValue::Map); + QCOMPARE(metadata1["Keys"], QCborArray{ "plugin1" }); + QCOMPARE(keys1[0], QCborArray{ "plugin1" }); + QCOMPARE(loader1.indexOf("Plugin1"), 0); + QCOMPARE(loader1.indexOf("PLUGIN1"), 0); + QCOMPARE(loader1.indexOf("Plugin2"), -1); - PluginInterface1 *plugin1 = qobject_cast<PluginInterface1 *>(loader1.instance(0)); + QFactoryLoader loader2(PluginInterface2_iid, suffix); + const QFactoryLoader::MetaDataList list2 = loader2.metaData(); + const QList<QCborArray> keys2 = loader2.metaDataKeys(); + QCOMPARE(list2.size(), 1); + QCOMPARE(keys2.size(), 1); + QCOMPARE_GE(versionNumber(list2[0].value(QtPluginMetaDataKeys::QtVersion)), qtVersion); + QCOMPARE(list2[0].value(QtPluginMetaDataKeys::IID), PluginInterface2_iid); + QCOMPARE(list2[0].value(QtPluginMetaDataKeys::ClassName), "Plugin2"); + + // plugin2's Q_PLUGIN_METADATA does not have FILE + QCOMPARE(list2[0].value(QtPluginMetaDataKeys::MetaData), QCborValue()); + QCOMPARE(keys2[0], QCborArray()); + QCOMPARE(loader2.indexOf("Plugin1"), -1); + QCOMPARE(loader2.indexOf("Plugin2"), -1); + + QObject *obj1 = loader1.instance(0); + PluginInterface1 *plugin1 = qobject_cast<PluginInterface1 *>(obj1); QVERIFY2(plugin1, qPrintable(QString::fromLatin1("Cannot load plugin '%1'") .arg(QLatin1String(PluginInterface1_iid)))); + QCOMPARE(obj1->metaObject()->className(), "Plugin1"); - QFactoryLoader loader2(PluginInterface2_iid, suffix); - - PluginInterface2 *plugin2 = qobject_cast<PluginInterface2 *>(loader2.instance(0)); + QObject *obj2 = loader2.instance(0); + PluginInterface2 *plugin2 = qobject_cast<PluginInterface2 *>(obj2); QVERIFY2(plugin2, qPrintable(QString::fromLatin1("Cannot load plugin '%1'") .arg(QLatin1String(PluginInterface2_iid)))); + QCOMPARE(obj2->metaObject()->className(), "Plugin2"); QCOMPARE(plugin1->pluginName(), QLatin1String("Plugin1 ok")); QCOMPARE(plugin2->pluginName(), QLatin1String("Plugin2 ok")); @@ -109,5 +150,72 @@ void tst_QFactoryLoader::extraSearchPath() #endif } +void tst_QFactoryLoader::multiplePaths() +{ +#if !QT_CONFIG(library) || !(defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN)) || defined(Q_OS_ANDROID) + QSKIP("Test not applicable in this configuration."); +#else + QTemporaryDir dir; + QVERIFY(dir.isValid()); + + QString pluginsPath = QFileInfo(binFolder, binFolderC).absolutePath(); + QString linkPath = dir.filePath(binFolderC); + QVERIFY(QFile::link(pluginsPath, linkPath)); + + QCoreApplication::setLibraryPaths({ QFileInfo(binFolder).absolutePath(), dir.path() }); + + const QString suffix = QLatin1Char('/') + QLatin1String(binFolderC); + QFactoryLoader loader1(PluginInterface1_iid, suffix); + + QLibraryPrivate *library1 = loader1.library("plugin1"); + QVERIFY(library1); + QCOMPARE(library1->loadHints(), QLibrary::PreventUnloadHint); +#endif +} + +Q_IMPORT_PLUGIN(StaticPlugin1) +Q_IMPORT_PLUGIN(StaticPlugin2) +constexpr bool IsDebug = +#ifdef QT_NO_DEBUG + false && +#endif + true; + +void tst_QFactoryLoader::staticPlugin_data() +{ + QTest::addColumn<QString>("iid"); + auto addRow = [](const char *iid) { + QTest::addRow("%s", iid) << QString(iid); + }; + addRow("StaticPlugin1"); + addRow("StaticPlugin2"); +} + +void tst_QFactoryLoader::staticPlugin() +{ + QFETCH(QString, iid); + QFactoryLoader loader(iid.toLatin1(), "/irrelevant"); + QFactoryLoader::MetaDataList list = loader.metaData(); + QCOMPARE(list.size(), 1); + + QCborMap map = list.at(0).toCbor(); + QCOMPARE(map[int(QtPluginMetaDataKeys::QtVersion)], + QT_VERSION_CHECK(QT_VERSION_MAJOR, QT_VERSION_MINOR, 0)); + QCOMPARE(map[int(QtPluginMetaDataKeys::IID)], iid); + QCOMPARE(map[int(QtPluginMetaDataKeys::ClassName)], iid); + QCOMPARE(map[int(QtPluginMetaDataKeys::IsDebug)], IsDebug); + + QCborValue metaData = map[int(QtPluginMetaDataKeys::MetaData)]; + QVERIFY(metaData.isMap()); + QCOMPARE(metaData["Keys"], QCborArray{ "Value" }); + QCOMPARE(loader.metaDataKeys(), QList{ QCborArray{ "Value" } }); + QCOMPARE(loader.indexOf("Value"), 0); + + // instantiate + QObject *instance = loader.instance(0); + QVERIFY(instance); + QCOMPARE(instance->metaObject()->className(), iid); +} + QTEST_MAIN(tst_QFactoryLoader) #include "tst_qfactoryloader.moc" |