kpluginfactorytest.cpp 5.1 KB

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