diff options
Diffstat (limited to 'tests/auto/qpluginloader')
23 files changed, 838 insertions, 0 deletions
diff --git a/tests/auto/qpluginloader/.gitignore b/tests/auto/qpluginloader/.gitignore new file mode 100644 index 0000000000..6b2fa3a715 --- /dev/null +++ b/tests/auto/qpluginloader/.gitignore @@ -0,0 +1,2 @@ +tst_qpluginloader +bin/ diff --git a/tests/auto/qpluginloader/almostplugin/almostplugin.cpp b/tests/auto/qpluginloader/almostplugin/almostplugin.cpp new file mode 100644 index 0000000000..9198726766 --- /dev/null +++ b/tests/auto/qpluginloader/almostplugin/almostplugin.cpp @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <QtCore/QString> +#include "almostplugin.h" +#include <QtCore/qplugin.h> + +QString AlmostPlugin::pluginName() const +{ + unresolvedSymbol(); + return QLatin1String("Plugin ok"); +} + +Q_EXPORT_PLUGIN2(almostplugin, AlmostPlugin) diff --git a/tests/auto/qpluginloader/almostplugin/almostplugin.h b/tests/auto/qpluginloader/almostplugin/almostplugin.h new file mode 100644 index 0000000000..750a99a34a --- /dev/null +++ b/tests/auto/qpluginloader/almostplugin/almostplugin.h @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef ALMOSTPLUGIN_H +#define ALMOSTPLUGIN_H + +#include <QObject> +#include "../theplugin/plugininterface.h" + +class AlmostPlugin : public QObject, public PluginInterface +{ + Q_OBJECT + Q_INTERFACES(PluginInterface) + +public: + QString pluginName() const; + void unresolvedSymbol() const; +}; + +#endif // ALMOSTPLUGIN_H diff --git a/tests/auto/qpluginloader/almostplugin/almostplugin.pro b/tests/auto/qpluginloader/almostplugin/almostplugin.pro new file mode 100644 index 0000000000..b45509ef01 --- /dev/null +++ b/tests/auto/qpluginloader/almostplugin/almostplugin.pro @@ -0,0 +1,7 @@ +TEMPLATE = lib +CONFIG += plugin +HEADERS = almostplugin.h +SOURCES = almostplugin.cpp +TARGET = almostplugin +DESTDIR = ../bin +*-g++*:QMAKE_LFLAGS -= -Wl,--no-undefined diff --git a/tests/auto/qpluginloader/elftest/.gitattributes b/tests/auto/qpluginloader/elftest/.gitattributes new file mode 100644 index 0000000000..891192ca94 --- /dev/null +++ b/tests/auto/qpluginloader/elftest/.gitattributes @@ -0,0 +1,10 @@ +corrupt1.elf64.so set -crlf -diff +corrupt2.elf64.so set -crlf -diff +corrupt3.elf64.so set -crlf -diff +debugobj.so set -crlf -diff +garbage1.so set -crlf -diff +garbage2.so set -crlf -diff +garbage3.so set -crlf -diff +garbage4.so set -crlf -diff +garbage5.so set -crlf -diff + diff --git a/tests/auto/qpluginloader/elftest/corrupt1.elf64.so b/tests/auto/qpluginloader/elftest/corrupt1.elf64.so Binary files differnew file mode 100755 index 0000000000..12ce7362dc --- /dev/null +++ b/tests/auto/qpluginloader/elftest/corrupt1.elf64.so diff --git a/tests/auto/qpluginloader/elftest/corrupt2.elf64.so b/tests/auto/qpluginloader/elftest/corrupt2.elf64.so Binary files differnew file mode 100755 index 0000000000..11fdc2c118 --- /dev/null +++ b/tests/auto/qpluginloader/elftest/corrupt2.elf64.so diff --git a/tests/auto/qpluginloader/elftest/corrupt3.elf64.so b/tests/auto/qpluginloader/elftest/corrupt3.elf64.so Binary files differnew file mode 100755 index 0000000000..94a2bc3560 --- /dev/null +++ b/tests/auto/qpluginloader/elftest/corrupt3.elf64.so diff --git a/tests/auto/qpluginloader/elftest/debugobj.so b/tests/auto/qpluginloader/elftest/debugobj.so Binary files differnew file mode 100644 index 0000000000..f0ee0569a3 --- /dev/null +++ b/tests/auto/qpluginloader/elftest/debugobj.so diff --git a/tests/auto/qpluginloader/elftest/garbage1.so b/tests/auto/qpluginloader/elftest/garbage1.so new file mode 100644 index 0000000000..0c7453077f --- /dev/null +++ b/tests/auto/qpluginloader/elftest/garbage1.so @@ -0,0 +1,4 @@ +pcdL+&&e= +oÒʎIٝmg]!Z +L')t +N(eP)Y8G 6-y"Zk4?^n5$Y=#y
\ No newline at end of file diff --git a/tests/auto/qpluginloader/elftest/garbage2.so b/tests/auto/qpluginloader/elftest/garbage2.so new file mode 100644 index 0000000000..c06338e0c8 --- /dev/null +++ b/tests/auto/qpluginloader/elftest/garbage2.so @@ -0,0 +1 @@ +v.YtKW3
\ No newline at end of file diff --git a/tests/auto/qpluginloader/elftest/garbage3.so b/tests/auto/qpluginloader/elftest/garbage3.so new file mode 100644 index 0000000000..a24c523a77 --- /dev/null +++ b/tests/auto/qpluginloader/elftest/garbage3.so @@ -0,0 +1 @@ +ȂT-ڥ 쾜i8_xIx=4@[BKS$
\ No newline at end of file diff --git a/tests/auto/qpluginloader/elftest/garbage4.so b/tests/auto/qpluginloader/elftest/garbage4.so new file mode 100644 index 0000000000..4f45cf5157 --- /dev/null +++ b/tests/auto/qpluginloader/elftest/garbage4.so @@ -0,0 +1 @@ +!\~Uu:9T+91QEǚxng5zh^t'mm*ˈdXH;vw+G
9L0!
\ No newline at end of file diff --git a/tests/auto/qpluginloader/elftest/garbage5.so b/tests/auto/qpluginloader/elftest/garbage5.so new file mode 100644 index 0000000000..f8c0a1d544 --- /dev/null +++ b/tests/auto/qpluginloader/elftest/garbage5.so @@ -0,0 +1,2 @@ +Q +-9
\ No newline at end of file diff --git a/tests/auto/qpluginloader/lib/lib.pro b/tests/auto/qpluginloader/lib/lib.pro new file mode 100644 index 0000000000..ce9bf13c25 --- /dev/null +++ b/tests/auto/qpluginloader/lib/lib.pro @@ -0,0 +1,18 @@ +TEMPLATE = lib +CONFIG += dll +CONFIG -= staticlib +SOURCES = mylib.c +TARGET = tst_qpluginloaderlib +DESTDIR = ../bin +QT = core + +win32-msvc: DEFINES += WIN32_MSVC +win32-borland: DEFINES += WIN32_BORLAND + +#no special install rule for the library used by test +INSTALLS = + +symbian: { + TARGET.CAPABILITY=ALL -TCB +} + diff --git a/tests/auto/qpluginloader/lib/mylib.c b/tests/auto/qpluginloader/lib/mylib.c new file mode 100644 index 0000000000..8752e3c852 --- /dev/null +++ b/tests/auto/qpluginloader/lib/mylib.c @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <qglobal.h> + +#if defined(Q_CC_MSVC) || defined(Q_CC_MSVC_NET) || defined(Q_CC_BOR) +#define LIB_EXPORT __declspec(dllexport) +#else +#define LIB_EXPORT +#endif + +#if defined(Q_CC_BOR) +# define BORLAND_STDCALL __stdcall +#else +# define BORLAND_STDCALL +#endif + +LIB_EXPORT int BORLAND_STDCALL version() +{ + return 1; +} + diff --git a/tests/auto/qpluginloader/qpluginloader.pro b/tests/auto/qpluginloader/qpluginloader.pro new file mode 100644 index 0000000000..6e41b4c96a --- /dev/null +++ b/tests/auto/qpluginloader/qpluginloader.pro @@ -0,0 +1,14 @@ +QT = core +TEMPLATE = subdirs +CONFIG += ordered +SUBDIRS = lib \ + theplugin \ + tst +!win32: !macx-*: !symbian: SUBDIRS += almostplugin +TARGET = tst_qpluginloader + +# no special install rule for subdir +INSTALLS = + + +CONFIG += parallel_test diff --git a/tests/auto/qpluginloader/theplugin/plugininterface.h b/tests/auto/qpluginloader/theplugin/plugininterface.h new file mode 100644 index 0000000000..2192c8153c --- /dev/null +++ b/tests/auto/qpluginloader/theplugin/plugininterface.h @@ -0,0 +1,54 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef PLUGININTERFACE_H +#define PLUGININTERFACE_H + +struct PluginInterface { + virtual ~PluginInterface() {} + virtual QString pluginName() const = 0; +}; + +QT_BEGIN_NAMESPACE +Q_DECLARE_INTERFACE(PluginInterface, "com.trolltect.autotests.plugininterface/1.0") +QT_END_NAMESPACE + +#endif // PLUGININTERFACE_H + diff --git a/tests/auto/qpluginloader/theplugin/theplugin.cpp b/tests/auto/qpluginloader/theplugin/theplugin.cpp new file mode 100644 index 0000000000..8d4fd79dc3 --- /dev/null +++ b/tests/auto/qpluginloader/theplugin/theplugin.cpp @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <QtCore/QString> +#include "theplugin.h" +#include <QtCore/qplugin.h> + +QString ThePlugin::pluginName() const +{ + return QLatin1String("Plugin ok"); +} + +Q_EXPORT_PLUGIN2(theplugin, ThePlugin) + diff --git a/tests/auto/qpluginloader/theplugin/theplugin.h b/tests/auto/qpluginloader/theplugin/theplugin.h new file mode 100644 index 0000000000..9e85bccfb3 --- /dev/null +++ b/tests/auto/qpluginloader/theplugin/theplugin.h @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef THEPLUGIN_H +#define THEPLUGIN_H + +#include <QObject> +#include "plugininterface.h" + +class ThePlugin : public QObject, public PluginInterface +{ + Q_OBJECT + Q_INTERFACES(PluginInterface) + +public: + virtual QString pluginName() const; +}; + +#endif // THEPLUGIN_H + diff --git a/tests/auto/qpluginloader/theplugin/theplugin.pro b/tests/auto/qpluginloader/theplugin/theplugin.pro new file mode 100644 index 0000000000..44b46b439f --- /dev/null +++ b/tests/auto/qpluginloader/theplugin/theplugin.pro @@ -0,0 +1,11 @@ +TEMPLATE = lib +CONFIG += plugin +HEADERS = theplugin.h +SOURCES = theplugin.cpp +TARGET = $$qtLibraryTarget(theplugin) +DESTDIR = ../bin + +symbian: { + TARGET.EPOCALLOWDLLDATA=1 + TARGET.CAPABILITY=ALL -TCB +} diff --git a/tests/auto/qpluginloader/tst/tst.pro b/tests/auto/qpluginloader/tst/tst.pro new file mode 100644 index 0000000000..be243b812f --- /dev/null +++ b/tests/auto/qpluginloader/tst/tst.pro @@ -0,0 +1,31 @@ +load(qttest_p4) +SOURCES += ../tst_qpluginloader.cpp +TARGET = ../tst_qpluginloader +QT = core +HEADERS += ../theplugin/plugininterface.h + +win32 { + CONFIG(debug, debug|release) { + TARGET = ../../debug/tst_qpluginloader +} else { + TARGET = ../../release/tst_qpluginloader + } +} + + +wince*: { + addFiles.files = $$OUT_PWD/../bin/*.dll + addFiles.path = bin + DEPLOYMENT += addFiles +} + +symbian: { + libDep.files = tst_qpluginloaderlib.dll + libDep.path = /sys/bin + pluginDep.files = theplugin.dll + pluginDep.path = bin + + DEPLOYMENT += libDep pluginDep +} + +DEFINES += SRCDIR=\\\"$$PWD/../\\\" diff --git a/tests/auto/qpluginloader/tst_qpluginloader.cpp b/tests/auto/qpluginloader/tst_qpluginloader.cpp new file mode 100644 index 0000000000..591ef5ee52 --- /dev/null +++ b/tests/auto/qpluginloader/tst_qpluginloader.cpp @@ -0,0 +1,406 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include <QtTest/QtTest> +#include <qdir.h> +#include <qpluginloader.h> +#include "theplugin/plugininterface.h" + +// Helper macros to let us know if some suffixes are valid +#define bundle_VALID false +#define dylib_VALID false +#define sl_VALID false +#define a_VALID false +#define so_VALID false +#define dll_VALID false + +#if defined(Q_OS_DARWIN) +# undef bundle_VALID +# undef dylib_VALID +# undef so_VALID +# define bundle_VALID true +# define dylib_VALID true +# define so_VALID true +# define SUFFIX ".dylib" +# define PREFIX "lib" + +#elif defined(Q_OS_HPUX) && !defined(__ia64) +# undef sl_VALID +# define sl_VALID true +# define SUFFIX ".sl" +# define PREFIX "lib" + +#elif defined(Q_OS_AIX) +# undef a_VALID +# undef so_VALID +# define a_VALID true +# define so_VALID true +# define SUFFIX ".so" +# define PREFIX "lib" + +#elif defined(Q_OS_WIN) +# undef dll_VALID +# define dll_VALID true +# ifdef QT_NO_DEBUG +# define SUFFIX ".dll" +# else +# define SUFFIX "d.dll" +# endif +# define PREFIX "" + +#elif defined(Q_OS_SYMBIAN) +# undef dll_VALID +# define dll_VALID true +# define SUFFIX ".dll" +# define PREFIX "" + +#else // all other Unix +# undef so_VALID +# define so_VALID true +# define SUFFIX ".so" +# define PREFIX "lib" +#endif + +static QString sys_qualifiedLibraryName(const QString &fileName) +{ + QString currDir = QDir::currentPath(); + return currDir + "/bin/" + PREFIX + fileName + SUFFIX; +} + +//TESTED_CLASS= +//TESTED_FILES= + +QT_FORWARD_DECLARE_CLASS(QPluginLoader) +class tst_QPluginLoader : public QObject +{ + Q_OBJECT + +public: + tst_QPluginLoader(); + virtual ~tst_QPluginLoader(); + +private slots: + void errorString(); + void loadHints(); + void deleteinstanceOnUnload(); + void checkingStubsFromDifferentDrives(); + void loadDebugObj(); + void loadCorruptElf(); + void loadGarbage(); +}; + +tst_QPluginLoader::tst_QPluginLoader() + +{ +} + +tst_QPluginLoader::~tst_QPluginLoader() +{ +} + +//#define SHOW_ERRORS 1 + +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 + { + 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); + } +} + +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_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::checkingStubsFromDifferentDrives() +{ +#if defined(Q_OS_SYMBIAN) + + // This test needs C-drive + some additional drive (driveForStubs) + + const QString driveForStubs("E:/");// != "C:/" + const QString stubDir("system/temp/stubtest/"); + const QString stubName("dummyStub.qtplugin"); + const QString fullStubFileName(stubDir + stubName); + QDir dir(driveForStubs); + bool test1(false); bool test2(false); + + // initial clean up + QFile::remove(driveForStubs + fullStubFileName); + dir.rmdir(driveForStubs + stubDir); + + // create a stub dir and do stub drive check + if (!dir.mkpath(stubDir)) + QSKIP("Required drive not available for this test", SkipSingle); + + {// test without stub, should not be found + QPluginLoader loader("C:/" + fullStubFileName); + test1 = !loader.fileName().length(); + } + + // create a stub to defined drive + QFile tempFile(driveForStubs + fullStubFileName); + tempFile.open(QIODevice::ReadWrite); + QFileInfo fileInfo(tempFile); + + {// now should be found even tried to find from C: + QPluginLoader loader("C:/" + fullStubFileName); + test2 = (loader.fileName() == fileInfo.absoluteFilePath()); + } + + // clean up + tempFile.close(); + if (!QFile::remove(driveForStubs + fullStubFileName)) + QWARN("Could not remove stub file"); + if (!dir.rmdir(driveForStubs + stubDir)) + QWARN("Could not remove stub directory"); + + // test after cleanup + QVERIFY(test1); + QVERIFY(test2); + +#endif//Q_OS_SYMBIAN +} + +void tst_QPluginLoader::loadDebugObj() +{ +#if defined (__ELF__) + QVERIFY(QFile::exists(SRCDIR "elftest/debugobj.so")); + QPluginLoader lib1(SRCDIR "elftest/debugobj.so"); + QCOMPARE(lib1.load(), false); +#endif +} + +void tst_QPluginLoader::loadCorruptElf() +{ +#if defined (__ELF__) +if (sizeof(void*) == 8) { + QVERIFY(QFile::exists(SRCDIR "elftest/corrupt1.elf64.so")); + + QPluginLoader lib1(SRCDIR "elftest/corrupt1.elf64.so"); + QCOMPARE(lib1.load(), false); + QVERIFY(lib1.errorString().contains("not an ELF object")); + + QPluginLoader lib2(SRCDIR "elftest/corrupt2.elf64.so"); + QCOMPARE(lib2.load(), false); + QVERIFY(lib2.errorString().contains("invalid")); + + QPluginLoader lib3(SRCDIR "elftest/corrupt3.elf64.so"); + QCOMPARE(lib3.load(), false); + QVERIFY(lib3.errorString().contains("invalid")); +} else if (sizeof(void*) == 4) { + QPluginLoader libW(SRCDIR "elftest/corrupt3.elf64.so"); + QCOMPARE(libW.load(), false); + QVERIFY(libW.errorString().contains("architecture")); +} else { + QFAIL("Please port QElfParser to this platform or blacklist this test."); +} +#endif +} + +void tst_QPluginLoader::loadGarbage() +{ +#if defined (Q_OS_UNIX) && !defined(Q_OS_SYMBIAN) + for (int i=0; i<5; i++) { + QPluginLoader lib(QString(SRCDIR "elftest/garbage%1.so").arg(i)); + QCOMPARE(lib.load(), false); +#ifdef SHOW_ERRORS + qDebug() << lib.errorString(); +#endif + } +#endif +} + +QTEST_APPLESS_MAIN(tst_QPluginLoader) +#include "tst_qpluginloader.moc" |