diff options
Diffstat (limited to 'tests/auto/corelib/plugin/qplugin')
8 files changed, 82 insertions, 192 deletions
diff --git a/tests/auto/corelib/plugin/qplugin/CMakeLists.txt b/tests/auto/corelib/plugin/qplugin/CMakeLists.txt index 2c901eff44..d0e8736e09 100644 --- a/tests/auto/corelib/plugin/qplugin/CMakeLists.txt +++ b/tests/auto/corelib/plugin/qplugin/CMakeLists.txt @@ -1,27 +1,48 @@ -# Generated from qplugin.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause -add_subdirectory(invalidplugin) +if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_qplugin LANGUAGES CXX) + find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST) +endif() -# special case begin +add_subdirectory(invalidplugin) add_subdirectory(debugplugin) add_subdirectory(releaseplugin) -# The contents below are generated from ./tst_qplugin.pro -# Collect test data -file(GLOB_RECURSE test_data_glob - RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} - plugins/*) -list(APPEND test_data ${test_data_glob}) - qt_internal_add_test(tst_qplugin SOURCES tst_qplugin.cpp LIBRARIES Qt::CorePrivate - TESTDATA ${test_data} ) +if(NOT ANDROID) + # Collect test data + file(GLOB_RECURSE test_data_glob + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + plugins/*) + list(APPEND test_data ${test_data_glob}) + set_target_properties(tst_qplugin PROPERTIES TESTDATA "${test_data}") +else() + # On Android the plugins must be located in the libs subdir of the APK. + # Use QT_ANDROID_EXTRA_LIBS to achieve that. + set(plugins + invalidplugin + debugplugin + releaseplugin + ) + set(extra_libs) + foreach(plugin IN LISTS plugins) + list(APPEND extra_libs + "${CMAKE_CURRENT_BINARY_DIR}/plugins/lib${plugin}_${CMAKE_ANDROID_ARCH_ABI}.so") + endforeach() + set_target_properties(tst_qplugin PROPERTIES + QT_ANDROID_EXTRA_LIBS "${extra_libs}" + ) +endif() + target_compile_definitions(tst_qplugin PRIVATE CMAKE_BUILD=1) add_dependencies(tst_qplugin invalidplugin debugplugin releaseplugin) -# special case end diff --git a/tests/auto/corelib/plugin/qplugin/debugplugin/CMakeLists.txt b/tests/auto/corelib/plugin/qplugin/debugplugin/CMakeLists.txt index ee4c0cf33c..230282f175 100644 --- a/tests/auto/corelib/plugin/qplugin/debugplugin/CMakeLists.txt +++ b/tests/auto/corelib/plugin/qplugin/debugplugin/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from debugplugin.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## debugplugin Generic Library: @@ -9,11 +10,8 @@ qt_internal_add_cmake_library(debugplugin OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../plugins" SOURCES main.cpp - PUBLIC_LIBRARIES + LIBRARIES Qt::Core ) -#### Keys ignored in scope 1:.:.:debugplugin.pro:<TRUE>: -# TEMPLATE = "lib" - qt_autogen_tools_initial_setup(debugplugin) diff --git a/tests/auto/corelib/plugin/qplugin/debugplugin/main.cpp b/tests/auto/corelib/plugin/qplugin/debugplugin/main.cpp index c610bfdc46..fe25c44d87 100644 --- a/tests/auto/corelib/plugin/qplugin/debugplugin/main.cpp +++ b/tests/auto/corelib/plugin/qplugin/debugplugin/main.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** 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) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QtPlugin> #include <QObject> diff --git a/tests/auto/corelib/plugin/qplugin/invalidplugin/CMakeLists.txt b/tests/auto/corelib/plugin/qplugin/invalidplugin/CMakeLists.txt index b9cdf2af05..0b12e9c0f0 100644 --- a/tests/auto/corelib/plugin/qplugin/invalidplugin/CMakeLists.txt +++ b/tests/auto/corelib/plugin/qplugin/invalidplugin/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from invalidplugin.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## invalidplugin Generic Library: @@ -9,11 +10,10 @@ qt_internal_add_cmake_library(invalidplugin OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../plugins" SOURCES main.cpp - PUBLIC_LIBRARIES + LIBRARIES Qt::Core ) -#### Keys ignored in scope 1:.:.:invalidplugin.pro:<TRUE>: # TEMPLATE = "lib" qt_autogen_tools_initial_setup(invalidplugin) diff --git a/tests/auto/corelib/plugin/qplugin/invalidplugin/main.cpp b/tests/auto/corelib/plugin/qplugin/invalidplugin/main.cpp index e6603ec89f..10b6131857 100644 --- a/tests/auto/corelib/plugin/qplugin/invalidplugin/main.cpp +++ b/tests/auto/corelib/plugin/qplugin/invalidplugin/main.cpp @@ -1,33 +1,9 @@ -/**************************************************************************** -** -** 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) 2018 Intel Corporation. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <qplugin.h> +// be careful when updating to V2, the header is different on ELF systems QT_PLUGIN_METADATA_SECTION static const char pluginMetaData[512] = { 'q', 'p', 'l', 'u', 'g', 'i', 'n', ' ', diff --git a/tests/auto/corelib/plugin/qplugin/releaseplugin/CMakeLists.txt b/tests/auto/corelib/plugin/qplugin/releaseplugin/CMakeLists.txt index abf3ae2a4d..3ec89eb4c6 100644 --- a/tests/auto/corelib/plugin/qplugin/releaseplugin/CMakeLists.txt +++ b/tests/auto/corelib/plugin/qplugin/releaseplugin/CMakeLists.txt @@ -1,4 +1,5 @@ -# Generated from releaseplugin.pro. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## releaseplugin Generic Library: @@ -9,11 +10,8 @@ qt_internal_add_cmake_library(releaseplugin OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../plugins" SOURCES main.cpp - PUBLIC_LIBRARIES + LIBRARIES Qt::Core ) -#### Keys ignored in scope 1:.:.:releaseplugin.pro:<TRUE>: -# TEMPLATE = "lib" - qt_autogen_tools_initial_setup(releaseplugin) diff --git a/tests/auto/corelib/plugin/qplugin/releaseplugin/main.cpp b/tests/auto/corelib/plugin/qplugin/releaseplugin/main.cpp index dd936f7da1..ee14da8384 100644 --- a/tests/auto/corelib/plugin/qplugin/releaseplugin/main.cpp +++ b/tests/auto/corelib/plugin/qplugin/releaseplugin/main.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** 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) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QtPlugin> #include <QObject> 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) |