diff options
Diffstat (limited to 'tests/auto/corelib/plugin')
6 files changed, 116 insertions, 11 deletions
diff --git a/tests/auto/corelib/plugin/plugin.pro b/tests/auto/corelib/plugin/plugin.pro index b094c24e55..240608fddf 100644 --- a/tests/auto/corelib/plugin/plugin.pro +++ b/tests/auto/corelib/plugin/plugin.pro @@ -11,6 +11,5 @@ qtConfig(library): SUBDIRS += \ contains(CONFIG, static) { message(Disabling tests requiring shared build of Qt) SUBDIRS -= qfactoryloader \ - qplugin \ - qpluginloader + qplugin } diff --git a/tests/auto/corelib/plugin/qplugin/tst_qplugin.cpp b/tests/auto/corelib/plugin/qplugin/tst_qplugin.cpp index d285ed79c0..a290c012df 100644 --- a/tests/auto/corelib/plugin/qplugin/tst_qplugin.cpp +++ b/tests/auto/corelib/plugin/qplugin/tst_qplugin.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2018 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -30,8 +31,11 @@ #include <QCoreApplication> #include <QDebug> #include <QDir> +#include <qplugin.h> #include <QPluginLoader> +#include <private/qplugin_p.h> + class tst_QPlugin : public QObject { Q_OBJECT @@ -124,7 +128,10 @@ void tst_QPlugin::scanInvalidPlugin_data() { QTest::addColumn<QByteArray>("metadata"); QTest::addColumn<bool>("loads"); + QTest::addColumn<QString>("errMsg"); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + // Binary JSON metadata QByteArray prefix = "QTMETADATA "; { @@ -138,27 +145,65 @@ void tst_QPlugin::scanInvalidPlugin_data() obj.insert("debug", true); #endif obj.insert("MetaData", QJsonObject()); - QTest::newRow("control") << (prefix + QJsonDocument(obj).toBinaryData()) << true; + QTest::newRow("json-control") << (prefix + QJsonDocument(obj).toBinaryData()) << true << ""; } - QTest::newRow("zeroes") << prefix << false; + QTest::newRow("json-zeroes") << prefix << false << " "; prefix += "qbjs"; - QTest::newRow("bad-json-version0") << prefix << false; - QTest::newRow("bad-json-version2") << (prefix + QByteArray("\2\0\0\0", 4)) << false; + QTest::newRow("bad-json-version0") << prefix << false << " "; + QTest::newRow("bad-json-version2") << (prefix + QByteArray("\2\0\0\0", 4)) << false << " "; // valid qbjs version 1 prefix += QByteArray("\1\0\0\0"); // too large for the file (100 MB) - QTest::newRow("bad-json-size-large1") << (prefix + QByteArray("\0\0\x40\x06")) << false; + QTest::newRow("bad-json-size-large1") << (prefix + QByteArray("\0\0\x40\x06")) << false << " "; // too large for binary JSON (512 MB) - QTest::newRow("bad-json-size-large2") << (prefix + QByteArray("\0\0\0\x20")) << false; + QTest::newRow("bad-json-size-large2") << (prefix + QByteArray("\0\0\0\x20")) << false << " "; // could overflow - QTest::newRow("bad-json-size-large3") << (prefix + "\xff\xff\xff\x7f") << false; + QTest::newRow("bad-json-size-large3") << (prefix + "\xff\xff\xff\x7f") << false << " "; +#endif + // CBOR metadata + QByteArray cprefix = "QTMETADATA !1234"; + cprefix[12] = 0; // current version + cprefix[13] = QT_VERSION_MAJOR; + cprefix[14] = QT_VERSION_MINOR; + cprefix[15] = qPluginArchRequirements(); + + QByteArray cborValid = [] { + QCborMap m; + m.insert(int(QtPluginMetaDataKeys::IID), QLatin1String("org.qt-project.tst_qplugin")); + m.insert(int(QtPluginMetaDataKeys::ClassName), QLatin1String("tst")); + m.insert(int(QtPluginMetaDataKeys::MetaData), QCborMap()); + return QCborValue(m).toCbor(); + }(); + QTest::newRow("cbor-control") << (cprefix + cborValid) << true << ""; + + cprefix[12] = 1; + QTest::newRow("cbor-major-too-new") << (cprefix + cborValid) << false + << " Invalid metadata version"; + + cprefix[12] = 0; + cprefix[13] = QT_VERSION_MAJOR + 1; + QTest::newRow("cbor-major-too-new") << (cprefix + cborValid) << false << ""; + + cprefix[13] = QT_VERSION_MAJOR - 1; + QTest::newRow("cbor-major-too-old") << (cprefix + cborValid) << false << ""; + + cprefix[13] = QT_VERSION_MAJOR; + cprefix[14] = QT_VERSION_MINOR + 1; + QTest::newRow("cbor-minor-too-new") << (cprefix + cborValid) << false << ""; + + QTest::newRow("cbor-invalid") << (cprefix + "\xff") << false + << " Metadata parsing error: Invalid CBOR stream: unexpected 'break' byte"; + QTest::newRow("cbor-not-map1") << (cprefix + "\x01") << false + << " Unexpected metadata contents"; + QTest::newRow("cbor-not-map2") << (cprefix + "\x81\x01") << false + << " Unexpected metadata contents"; } static const char invalidPluginSignature[] = "qplugin testfile"; @@ -214,6 +259,11 @@ void tst_QPlugin::scanInvalidPlugin() // now try to load this QFETCH(bool, loads); + QFETCH(QString, errMsg); + if (!errMsg.isEmpty()) + QTest::ignoreMessage(QtWarningMsg, + "Found invalid metadata in lib " + QFile::encodeName(newName) + + ":" + errMsg.toUtf8()); QPluginLoader loader(newName); QCOMPARE(loader.load(), loads); if (loads) diff --git a/tests/auto/corelib/plugin/qplugin/tst_qplugin.pro b/tests/auto/corelib/plugin/qplugin/tst_qplugin.pro index 8c6540fe87..4432ee20c1 100644 --- a/tests/auto/corelib/plugin/qplugin/tst_qplugin.pro +++ b/tests/auto/corelib/plugin/qplugin/tst_qplugin.pro @@ -1,6 +1,6 @@ CONFIG += testcase TARGET = tst_qplugin -QT = core testlib +QT = core-private testlib SOURCES = tst_qplugin.cpp TESTDATA += plugins/* diff --git a/tests/auto/corelib/plugin/qpluginloader/theplugin/theplugin.h b/tests/auto/corelib/plugin/qpluginloader/theplugin/theplugin.h index 04ce042e24..ac349c2f75 100644 --- a/tests/auto/corelib/plugin/qpluginloader/theplugin/theplugin.h +++ b/tests/auto/corelib/plugin/qpluginloader/theplugin/theplugin.h @@ -35,7 +35,7 @@ class ThePlugin : public QObject, public PluginInterface { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.autotests.plugininterface" FILE "../empty.json") + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.autotests.plugininterface" FILE "../utf8_data.json") Q_INTERFACES(PluginInterface) public: diff --git a/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp b/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp index f34741281c..c517c0809a 100644 --- a/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp +++ b/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp @@ -140,6 +140,10 @@ void tst_QPluginLoader::cleanup() void tst_QPluginLoader::errorString() { +#if !defined(QT_SHARED) + QSKIP("This test requires Qt to create shared libraries."); +#endif + const QString unknown(QLatin1String("Unknown error")); { @@ -206,6 +210,14 @@ void tst_QPluginLoader::errorString() { QPluginLoader loader( sys_qualifiedLibraryName("theplugin")); //a plugin + + // Check metadata + const QJsonObject metaData = loader.metaData(); + QCOMPARE(metaData.value("IID").toString(), QStringLiteral("org.qt-project.Qt.autotests.plugininterface")); + const QJsonObject kpluginObject = metaData.value("MetaData").toObject().value("KPlugin").toObject(); + QCOMPARE(kpluginObject.value("Name[mr]").toString(), QString::fromUtf8("चौकट भूमिती")); + + // Load QCOMPARE(loader.load(), true); QCOMPARE(loader.errorString(), unknown); @@ -224,6 +236,9 @@ void tst_QPluginLoader::errorString() void tst_QPluginLoader::loadHints() { +#if !defined(QT_SHARED) + QSKIP("This test requires Qt to create shared libraries."); +#endif QPluginLoader loader; QCOMPARE(loader.loadHints(), (QLibrary::LoadHints)0); //Do not crash loader.setLoadHints(QLibrary::ResolveAllSymbolsHint); @@ -233,6 +248,9 @@ void tst_QPluginLoader::loadHints() void tst_QPluginLoader::deleteinstanceOnUnload() { +#if !defined(QT_SHARED) + QSKIP("This test requires Qt to create shared libraries."); +#endif for (int pass = 0; pass < 2; ++pass) { QPluginLoader loader1; loader1.setFileName( sys_qualifiedLibraryName("theplugin")); //a plugin @@ -268,6 +286,9 @@ void tst_QPluginLoader::deleteinstanceOnUnload() void tst_QPluginLoader::loadDebugObj() { +#if !defined(QT_SHARED) + QSKIP("This test requires a shared build of Qt, as QPluginLoader::setFileName is a no-op in static builds"); +#endif #if defined (__ELF__) QVERIFY(QFile::exists(QFINDTESTDATA("elftest/debugobj.so"))); QPluginLoader lib1(QFINDTESTDATA("elftest/debugobj.so")); @@ -277,6 +298,9 @@ void tst_QPluginLoader::loadDebugObj() void tst_QPluginLoader::loadCorruptElf() { +#if !defined(QT_SHARED) + QSKIP("This test requires a shared build of Qt, as QPluginLoader::setFileName is a no-op in static builds"); +#endif #if defined (__ELF__) if (sizeof(void*) == 8) { QVERIFY(QFile::exists(QFINDTESTDATA("elftest/corrupt1.elf64.so"))); @@ -377,6 +401,9 @@ void tst_QPluginLoader::loadMachO() #if defined (Q_OS_UNIX) void tst_QPluginLoader::loadGarbage() { +#if !defined(QT_SHARED) + QSKIP("This test requires a shared build of Qt, as QPluginLoader::setFileName is a no-op in static builds"); +#endif for (int i=0; i<5; i++) { const QString name = QLatin1String("elftest/garbage") + QString::number(i + 1) + QLatin1String(".so"); QPluginLoader lib(QFINDTESTDATA(name)); @@ -388,6 +415,9 @@ void tst_QPluginLoader::loadGarbage() void tst_QPluginLoader::relativePath() { +#if !defined(QT_SHARED) + QSKIP("This test requires Qt to create shared libraries."); +#endif // Windows binaries run from release and debug subdirs, so we can't rely on the current dir. const QString binDir = QFINDTESTDATA("bin"); QVERIFY(!binDir.isEmpty()); @@ -402,6 +432,9 @@ void tst_QPluginLoader::relativePath() void tst_QPluginLoader::absolutePath() { +#if !defined(QT_SHARED) + QSKIP("This test requires Qt to create shared libraries."); +#endif // Windows binaries run from release and debug subdirs, so we can't rely on the current dir. const QString binDir = QFINDTESTDATA("bin"); QVERIFY(!binDir.isEmpty()); @@ -416,6 +449,9 @@ void tst_QPluginLoader::absolutePath() void tst_QPluginLoader::reloadPlugin() { +#if !defined(QT_SHARED) + QSKIP("This test requires Qt to create shared libraries."); +#endif QPluginLoader loader; loader.setFileName( sys_qualifiedLibraryName("theplugin")); //a plugin loader.load(); // not recommended, instance() should do the job. @@ -451,6 +487,9 @@ void tst_QPluginLoader::preloadedPlugin_data() void tst_QPluginLoader::preloadedPlugin() { +#if !defined(QT_SHARED) + QSKIP("This test requires Qt to create shared libraries."); +#endif // check that using QPluginLoader does not interfere with QLibrary QFETCH(QString, libname); QLibrary lib(libname); diff --git a/tests/auto/corelib/plugin/qpluginloader/utf8_data.json b/tests/auto/corelib/plugin/qpluginloader/utf8_data.json new file mode 100644 index 0000000000..7763b65178 --- /dev/null +++ b/tests/auto/corelib/plugin/qpluginloader/utf8_data.json @@ -0,0 +1,17 @@ +{ + "KPlugin": { + "Name": "WindowGeometry", + "Name[mr]": "चौकट भूमिती", + "Name[pa]": "ਵਿੰਡੋਜੁਮੈਟਰੀ", + "Name[th]": "มิติขนาดของหน้าต่าง", + "Name[uk]": "Розміри вікна", + "Name[zh_CN]": "窗口形状", + "Name[zh_TW]": "視窗位置", + "ServiceTypes": [ + "KCModule" + ] + }, + "X-KDE-ParentComponents": [ + "windowgeometry" + ] +} |