void tst_QPluginLoader::deleteinstanceOnUnload() { for (int pass = 0; pass < 2; ++pass) { QPluginLoader loader1; loader1.setFileName( sys_qualifiedLibraryName("theplugin")); //a plugin if (pass == 0) loader1.load(); // not recommended, instance() should do the job. PluginInterface *instance1 = qobject_cast<PluginInterface*>(loader1.instance()); QVERIFY(instance1); QCOMPARE(instance1->pluginName(), QLatin1String("Plugin ok")); QPluginLoader loader2; loader2.setFileName( sys_qualifiedLibraryName("theplugin")); //a plugin if (pass == 0) loader2.load(); // not recommended, instance() should do the job. PluginInterface *instance2 = qobject_cast<PluginInterface*>(loader2.instance()); QCOMPARE(instance2->pluginName(), QLatin1String("Plugin ok")); QSignalSpy spy1(loader1.instance(), SIGNAL(destroyed())); QSignalSpy spy2(loader2.instance(), SIGNAL(destroyed())); if (pass == 0) { QCOMPARE(loader2.unload(), false); // refcount not reached 0, not really unloaded QCOMPARE(spy1.count(), 0); QCOMPARE(spy2.count(), 0); } QCOMPARE(instance1->pluginName(), QLatin1String("Plugin ok")); QCOMPARE(instance2->pluginName(), QLatin1String("Plugin ok")); QVERIFY(loader1.unload()); // refcount reached 0, did really unload QCOMPARE(spy1.count(), 1); QCOMPARE(spy2.count(), 1); } }
void tst_QPluginLoader::preloadedPlugin_data() { QTest::addColumn<bool>("doLoad"); QTest::addColumn<QString>("libname"); QTest::newRow("create-plugin") << false << sys_qualifiedLibraryName("theplugin"); QTest::newRow("load-plugin") << true << sys_qualifiedLibraryName("theplugin"); QTest::newRow("create-non-plugin") << false << sys_qualifiedLibraryName("tst_qpluginloaderlib"); QTest::newRow("load-non-plugin") << true << sys_qualifiedLibraryName("tst_qpluginloaderlib"); }
void tst_QPluginLoader::loadHints() { QPluginLoader loader; QCOMPARE(loader.loadHints(), (QLibrary::LoadHints)0); //Do not crash loader.setLoadHints(QLibrary::ResolveAllSymbolsHint); loader.setFileName( sys_qualifiedLibraryName("theplugin")); //a plugin QCOMPARE(loader.loadHints(), QLibrary::ResolveAllSymbolsHint); }
void tst_QLibrary::fileName_data() { QTest::addColumn<QString>("libName"); QTest::addColumn<QString>("expectedFilename"); QTest::newRow( "ok02" ) << sys_qualifiedLibraryName(QLatin1String("mylib")) << sys_qualifiedLibraryName(QLatin1String("mylib")); #ifdef Q_OS_WIN #ifndef Q_OS_WINCE QTest::newRow( "ok03" ) << "user32" << "USER32.dll"; #else QTest::newRow( "ok03" ) << "coredll" << "coredll.dll"; #endif #endif }
void tst_QPluginLoader::cleanup() { // check if the library/plugin was leaked // we can't use QPluginLoader::isLoaded here because on some platforms the plugin is always loaded by QPluginLoader. // Also, if this test fails once, it will keep on failing because we can't force the unload, // so we report it only once. static bool failedAlready = false; if (!failedAlready) { QLibrary lib(sys_qualifiedLibraryName("theplugin")); failedAlready = true; QVERIFY2(!lib.isLoaded(), "Plugin was leaked - will not check again"); failedAlready = false; } }
void tst_QPluginLoader::reloadPlugin() { QPluginLoader loader; loader.setFileName( sys_qualifiedLibraryName("theplugin")); //a plugin loader.load(); // not recommended, instance() should do the job. PluginInterface *instance = qobject_cast<PluginInterface*>(loader.instance()); QVERIFY(instance); QCOMPARE(instance->pluginName(), QLatin1String("Plugin ok")); QSignalSpy spy(loader.instance(), SIGNAL(destroyed())); QVERIFY(spy.isValid()); QVERIFY(loader.unload()); // refcount reached 0, did really unload QCOMPARE(spy.count(), 1); // reload plugin QVERIFY(loader.load()); QVERIFY(loader.isLoaded()); PluginInterface *instance2 = qobject_cast<PluginInterface*>(loader.instance()); QVERIFY(instance2); QCOMPARE(instance2->pluginName(), QLatin1String("Plugin ok")); QVERIFY(loader.unload()); }
void tst_QPluginLoader::errorString() { #if defined(Q_OS_WINCE) // On WinCE we need an QCoreApplication object for current dir int argc = 0; QCoreApplication app(argc,0); #endif const QString unknown(QLatin1String("Unknown error")); { QPluginLoader loader; // default constructed bool loaded = loader.load(); #ifdef SHOW_ERRORS qDebug() << loader.errorString(); #endif QCOMPARE(loaded, false); QCOMPARE(loader.errorString(), unknown); QObject *obj = loader.instance(); #ifdef SHOW_ERRORS qDebug() << loader.errorString(); #endif QCOMPARE(obj, static_cast<QObject*>(0)); QCOMPARE(loader.errorString(), unknown); bool unloaded = loader.unload(); #ifdef SHOW_ERRORS qDebug() << loader.errorString(); #endif QCOMPARE(unloaded, false); QCOMPARE(loader.errorString(), unknown); } { QPluginLoader loader( sys_qualifiedLibraryName("tst_qpluginloaderlib")); //not a plugin bool loaded = loader.load(); #ifdef SHOW_ERRORS qDebug() << loader.errorString(); #endif QCOMPARE(loaded, false); QVERIFY(loader.errorString() != unknown); QObject *obj = loader.instance(); #ifdef SHOW_ERRORS qDebug() << loader.errorString(); #endif QCOMPARE(obj, static_cast<QObject*>(0)); QVERIFY(loader.errorString() != unknown); bool unloaded = loader.unload(); #ifdef SHOW_ERRORS qDebug() << loader.errorString(); #endif QCOMPARE(unloaded, false); QVERIFY(loader.errorString() != unknown); } { QPluginLoader loader( sys_qualifiedLibraryName("nosuchfile")); //not a file bool loaded = loader.load(); #ifdef SHOW_ERRORS qDebug() << loader.errorString(); #endif QCOMPARE(loaded, false); QVERIFY(loader.errorString() != unknown); QObject *obj = loader.instance(); #ifdef SHOW_ERRORS qDebug() << loader.errorString(); #endif QCOMPARE(obj, static_cast<QObject*>(0)); QVERIFY(loader.errorString() != unknown); bool unloaded = loader.unload(); #ifdef SHOW_ERRORS qDebug() << loader.errorString(); #endif QCOMPARE(unloaded, false); QVERIFY(loader.errorString() != unknown); } #if !defined Q_OS_WIN && !defined Q_OS_MAC && !defined Q_OS_HPUX && !defined Q_OS_SYMBIAN && !defined Q_OS_QNX { QPluginLoader loader( sys_qualifiedLibraryName("almostplugin")); //a plugin with unresolved symbols loader.setLoadHints(QLibrary::ResolveAllSymbolsHint); QCOMPARE(loader.load(), false); #ifdef SHOW_ERRORS qDebug() << loader.errorString(); #endif QVERIFY(loader.errorString() != unknown); QCOMPARE(loader.instance(), static_cast<QObject*>(0)); #ifdef SHOW_ERRORS qDebug() << loader.errorString(); #endif QVERIFY(loader.errorString() != unknown); QCOMPARE(loader.unload(), false); #ifdef SHOW_ERRORS qDebug() << loader.errorString(); #endif QVERIFY(loader.errorString() != unknown); } #endif { QPluginLoader loader( sys_qualifiedLibraryName("theplugin")); //a plugin QCOMPARE(loader.load(), true); QCOMPARE(loader.errorString(), unknown); QVERIFY(loader.instance() != static_cast<QObject*>(0)); QCOMPARE(loader.errorString(), unknown); // Make sure that plugin really works PluginInterface* theplugin = qobject_cast<PluginInterface*>(loader.instance()); QString pluginName = theplugin->pluginName(); QCOMPARE(pluginName, QLatin1String("Plugin ok")); QCOMPARE(loader.unload(), true); QCOMPARE(loader.errorString(), unknown); } }