1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
/*
SPDX-FileCopyrightText: 2014 Alex Merry <alex.merry@kde.org>
SPDX-FileCopyrightText: 2021 Alexander Lohnau <alexander.lohnau@gmx.de>
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#include <QTest>
#include <QPluginLoader>
#include <kpluginfactory.h>
#include <kpluginloader.h>
// We do not have QWidgets as a dependency, this is a simple placeholder for the type to be fully qualified
class QWidget : public QObject
{
};
class KPluginFactoryTest : public QObject
{
Q_OBJECT
private Q_SLOTS:
void testCreate()
{
KPluginFactory::Result<KPluginFactory> factoryResult = KPluginFactory::loadFactory(KPluginMetaData(QStringLiteral("multiplugin")));
auto factory = factoryResult.plugin;
QVERIFY(factory);
QVariantList args;
args << QStringLiteral("Some") << QStringLiteral("args") << 5;
QObject *obj = factory->create<QObject>(this, args);
QVERIFY(obj);
QCOMPARE(obj->objectName(), QString::fromLatin1("MultiPlugin1"));
QObject *obj2 = factory->create<QObject>(this, args);
QVERIFY(obj2);
QCOMPARE(obj2->objectName(), QString::fromLatin1("MultiPlugin1"));
QVERIFY(obj != obj2);
delete obj;
delete obj2;
// Try creating a part without keyword/args
QWidget parentWidget;
QObject *partTest = factory->create<QObject>(&parentWidget, this);
QVERIFY(partTest);
delete partTest;
#if KCOREADDONS_BUILD_DEPRECATED_SINCE(5, 89)
obj = factory->create<QObject>(QStringLiteral("secondary"), this, args);
QVERIFY(obj);
QCOMPARE(obj->objectName(), QString::fromLatin1("MultiPlugin2"));
obj2 = factory->create<QObject>(QStringLiteral("secondary"), this, args);
QVERIFY(obj2);
QCOMPARE(obj2->objectName(), QString::fromLatin1("MultiPlugin2"));
QVERIFY(obj != obj2);
delete obj;
delete obj2;
#endif
}
void testPluginWithoutMetaData()
{
KPluginFactory::Result<KPluginFactory> factoryResult = KPluginFactory::loadFactory(KPluginMetaData(QStringLiteral("namespace/pluginwithoutmetadata")));
QVERIFY(factoryResult);
auto plugin = factoryResult.plugin->create<QObject>();
QVERIFY(plugin);
QCOMPARE(plugin->metaObject()->className(), "PluginWithoutMetaData");
delete plugin;
}
void testResultingCMakeMacroPlugin()
{
KPluginMetaData data(QStringLiteral("namespace/jsonplugin_cmake_macro"));
QVERIFY(data.isValid());
auto instance = QPluginLoader(data.fileName()).instance();
QVERIFY(instance);
QCOMPARE(instance->metaObject()->className(), "jsonplugin_cmake_macro_factory");
}
void testCreateUsingUtilityMethods()
{
auto result = KPluginFactory::instantiatePlugin<QObject>(KPluginMetaData(QStringLiteral("jsonplugin")), nullptr, QVariantList());
QVERIFY(result.plugin);
QCOMPARE(result.plugin->metaObject()->className(), "JsonPlugin");
QVERIFY(result.errorString.isEmpty());
QCOMPARE(result.errorReason, KPluginFactory::NO_PLUGIN_ERROR);
delete result.plugin;
}
void testCreateUsingUtilityMethodsErrorHandling()
{
{
auto result = KPluginFactory::instantiatePlugin<QObject>(KPluginMetaData(QFINDTESTDATA("jsonplugin.json")), nullptr, QVariantList());
QVERIFY(!result.plugin);
QCOMPARE(result.errorReason, KPluginFactory::INVALID_PLUGIN);
}
{
// it is a valid plugin, but does not contain a KPluginFactory
QVERIFY(QPluginLoader(QStringLiteral("qtplugin")).instance());
auto result = KPluginFactory::instantiatePlugin<QObject>(KPluginMetaData(QStringLiteral("qtplugin")), nullptr, QVariantList());
QVERIFY(!result.plugin);
// But does not contain a valid plugin factory
QCOMPARE(result.errorReason, KPluginFactory::INVALID_FACTORY);
}
{
// it is a QObject, but not a KPluginFactoryTest instance
auto result = KPluginFactory::instantiatePlugin<KPluginFactoryTest>(KPluginMetaData(QStringLiteral("jsonplugin")), nullptr, QVariantList());
QVERIFY(!result.plugin);
QCOMPARE(result.errorReason, KPluginFactory::INVALID_KPLUGINFACTORY_INSTANTIATION);
QVERIFY(result.errorText.contains("KPluginFactoryTest"));
}
}
void testStaticPlugins()
{
const auto plugins = KPluginMetaData::findPlugins(QStringLiteral("staticnamespace"));
QCOMPARE(plugins.count(), 1);
auto result = KPluginFactory::instantiatePlugin<QObject>(plugins.first());
QVERIFY(result);
delete result.plugin;
}
void testNonExistingPlugin()
{
KPluginMetaData data(QStringLiteral("does/not/exist"));
QVERIFY(!data.isValid());
const auto res = KPluginFactory::instantiatePlugin<QObject>(data);
QVERIFY(!res);
QCOMPARE(res.errorReason, KPluginFactory::INVALID_PLUGIN);
QCOMPARE(res.errorText, QStringLiteral("Could not find plugin does/not/exist"));
}
};
QTEST_MAIN(KPluginFactoryTest)
#include "kpluginfactorytest.moc"
|