diff options
Diffstat (limited to 'tests/auto/corelib/plugin/qplugin/tst_qplugin.cpp')
-rw-r--r-- | tests/auto/corelib/plugin/qplugin/tst_qplugin.cpp | 119 |
1 files changed, 33 insertions, 86 deletions
diff --git a/tests/auto/corelib/plugin/qplugin/tst_qplugin.cpp b/tests/auto/corelib/plugin/qplugin/tst_qplugin.cpp index 1a7cf2e1e8..3d3cb8330d 100644 --- a/tests/auto/corelib/plugin/qplugin/tst_qplugin.cpp +++ b/tests/auto/corelib/plugin/qplugin/tst_qplugin.cpp @@ -1,31 +1,6 @@ -/**************************************************************************** -** -** 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. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2020 The Qt Company Ltd. +// Copyright (C) 2021 Intel Corporation. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QTest> #include <QCoreApplication> @@ -54,8 +29,15 @@ private slots: }; tst_QPlugin::tst_QPlugin() - : dir(QFINDTESTDATA("plugins")) { + // On Android the plugins must be located in the APK's libs subdir +#ifndef Q_OS_ANDROID + dir = QFINDTESTDATA("plugins"); +#else + const QStringList paths = QCoreApplication::libraryPaths(); + if (!paths.isEmpty()) + dir = paths.first(); +#endif } void tst_QPlugin::initTestCase() @@ -75,7 +57,7 @@ void tst_QPlugin::loadDebugPlugin() if (!QLibrary::isLibrary(fileName)) continue; QPluginLoader loader(dir.filePath(fileName)); -#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) +#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) // we can always load a plugin on unix QVERIFY(loader.load()); QObject *object = loader.instance(); @@ -108,7 +90,7 @@ void tst_QPlugin::loadReleasePlugin() if (!QLibrary::isLibrary(fileName)) continue; QPluginLoader loader(dir.filePath(fileName)); -#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) +#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) // we can always load a plugin on unix QVERIFY(loader.load()); QObject *object = loader.instance(); @@ -137,49 +119,10 @@ void tst_QPlugin::scanInvalidPlugin_data() QTest::addColumn<bool>("loads"); QTest::addColumn<QString>("errMsg"); -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) - // Binary JSON metadata - QByteArray prefix = "QTMETADATA "; - - { - QJsonObject obj; - obj.insert("IID", "org.qt-project.tst_qplugin"); - obj.insert("className", "tst"); - obj.insert("version", int(QT_VERSION)); -#ifdef QT_NO_DEBUG - obj.insert("debug", false); -#else - obj.insert("debug", true); -#endif - obj.insert("MetaData", QJsonObject()); - QTest::newRow("json-control") << (prefix + QJsonDocument(obj).toBinaryData()) << true << ""; - } - - 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 << " "; - - // 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 << " "; - - // too large for binary JSON (512 MB) - 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 << " "; -#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(); + static constexpr QPluginMetaData::MagicHeader header = {}; + static constexpr qsizetype MagicLen = sizeof(header.magic); + QByteArray cprefix(reinterpret_cast<const char *>(&header), sizeof(header)); QByteArray cborValid = [] { QCborMap m; @@ -190,27 +133,27 @@ void tst_QPlugin::scanInvalidPlugin_data() }(); 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; + cprefix[MagicLen + 1] = QT_VERSION_MAJOR + 1; QTest::newRow("cbor-major-too-new") << (cprefix + cborValid) << false << ""; - cprefix[13] = QT_VERSION_MAJOR - 1; + cprefix[MagicLen + 1] = QT_VERSION_MAJOR - 1; QTest::newRow("cbor-major-too-old") << (cprefix + cborValid) << false << ""; - cprefix[13] = QT_VERSION_MAJOR; - cprefix[14] = QT_VERSION_MINOR + 1; + cprefix[MagicLen + 1] = QT_VERSION_MAJOR; + cprefix[MagicLen + 2] = QT_VERSION_MINOR + 1; QTest::newRow("cbor-minor-too-new") << (cprefix + cborValid) << false << ""; + cprefix[MagicLen + 2] = QT_VERSION_MINOR; 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"; + + ++cprefix[MagicLen + 0]; + QTest::newRow("cbor-major-too-new-invalid") + << (cprefix + cborValid) << false << " Invalid metadata version"; } static const char invalidPluginSignature[] = "qplugin testfile"; @@ -234,6 +177,9 @@ static qsizetype locateMetadata(const uchar *data, qsizetype len) void tst_QPlugin::scanInvalidPlugin() { +#if defined(Q_OS_MACOS) && defined(Q_PROCESSOR_ARM) + QSKIP("This test crashes on ARM macOS"); +#endif const auto fileNames = dir.entryList({"*invalid*"}, QDir::Files); QString invalidPluginName; if (fileNames.isEmpty()) @@ -270,13 +216,14 @@ void tst_QPlugin::scanInvalidPlugin() memset(data + offset + metadata.size(), 0, 512 - metadata.size()); } +#if defined(Q_OS_QNX) + // On QNX plugin access is still too early + QTest::qSleep(1000); +#endif + // 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) |