diff options
-rw-r--r-- | src/corelib/plugin/qlibrary.cpp | 1 | ||||
-rw-r--r-- | tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp | 24 |
2 files changed, 25 insertions, 0 deletions
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp index 3815082989..2217140cbf 100644 --- a/src/corelib/plugin/qlibrary.cpp +++ b/src/corelib/plugin/qlibrary.cpp @@ -429,6 +429,7 @@ bool QLibraryPrivate::unload() libraryRefCount.deref(); } pHnd = 0; + instance = 0; } } diff --git a/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp b/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp index b79479ace8..58081cc6e3 100644 --- a/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp +++ b/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp @@ -109,6 +109,7 @@ private slots: void loadDebugObj(); void loadCorruptElf(); void loadGarbage(); + void reloadPlugin(); }; void tst_QPluginLoader::errorString() @@ -291,5 +292,28 @@ void tst_QPluginLoader::loadGarbage() #endif } +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")); +} + QTEST_MAIN(tst_QPluginLoader) #include "tst_qpluginloader.moc" |