diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2018-06-26 22:46:49 -0700 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2018-09-01 15:19:39 +0000 |
commit | d9766ddc3d525cf08acec4c3483e61d86c9899a8 (patch) | |
tree | 755b9c9181a24cbc1663714e888e2e3f4cd4db45 /tests/auto | |
parent | 7391662f80470549b9f9c182da43cf433efabdf7 (diff) |
Plugins: store the metadata in CBOR instead of binary JSON
In preparation for Qt 6 deprecating the binary JSON format. Also reduces
the size of the metadata a little: for the xcb platform plugin, it went
down from 264 bytes to 138; for the jpeg image plugin, it went from 320
to 135.
I've had to change the signature so older versions of Qt won't try to
parse the CBOR data as Binary JSON. Unfortunately, before QJsonDocument
could get a chance to reject it, qJsonFromRawLibraryMetaData() needed to
allocate memory and that causes crashes with Qt < 5.11.2.
Change-Id: Ieb48f7c0dd0e4e0fb35efffd153bee34e16ce347
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'tests/auto')
-rw-r--r-- | tests/auto/corelib/plugin/qplugin/tst_qplugin.cpp | 50 | ||||
-rw-r--r-- | tests/auto/corelib/plugin/qplugin/tst_qplugin.pro | 2 |
2 files changed, 44 insertions, 8 deletions
diff --git a/tests/auto/corelib/plugin/qplugin/tst_qplugin.cpp b/tests/auto/corelib/plugin/qplugin/tst_qplugin.cpp index d285ed79c0..8a5c325041 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. @@ -32,6 +33,8 @@ #include <QDir> #include <QPluginLoader> +#include <private/qplugin_p.h> + class tst_QPlugin : public QObject { Q_OBJECT @@ -124,7 +127,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 +144,52 @@ 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 !"; + + { + QCborMap m; + m.insert(int(QtPluginMetaDataKeys::IID), QLatin1String("org.qt-project.tst_qplugin")); + m.insert(int(QtPluginMetaDataKeys::ClassName), QLatin1String("tst")); + m.insert(int(QtPluginMetaDataKeys::QtVersion), int(QT_VERSION)); +#ifdef QT_NO_DEBUG + m.insert(int(QtPluginMetaDataKeys::Debug), false); +#else + m.insert(int(QtPluginMetaDataKeys::Debug), true); +#endif + m.insert(int(QtPluginMetaDataKeys::MetaData), QCborMap()); + + QTest::newRow("cbor-control") << (cprefix + QCborValue(m).toCbor()) << true << ""; + } + 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 +245,11 @@ void tst_QPlugin::scanInvalidPlugin() // now try to load this QFETCH(bool, loads); + QFETCH(QString, errMsg); + if (!loads) + 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/* |