diff options
author | Milian Wolff <milian.wolff@kdab.com> | 2014-07-02 16:03:37 +0200 |
---|---|---|
committer | Milian Wolff <milian.wolff@kdab.com> | 2014-07-03 13:44:42 +0200 |
commit | 5418f5795e2fd657efa3ceede749228c1e10d25c (patch) | |
tree | 0d3109f25ab416befbaa44ba26f1380d64b30db6 /tests/auto/webchannel | |
parent | 3c1884f15ed1120bf36efb918cad0bcb461d5193 (diff) | |
download | qtwebchannel-5418f5795e2fd657efa3ceede749228c1e10d25c.tar.gz |
Add cmake test, adapt test directory layout and point to dev branches.
The auto tests are now located in tests/auto instead of directly in
tests/. This is required to ensure the cmake test is found.
Furthermore, the sync.profile is updated to point to refs/heads/dev,
as we target Qt 5.4 with this new module.
Change-Id: I1e6e99968b7081b5774eaf30319cac1fbaed35c2
Reviewed-by: Sergio Ahumada <sahumada@blackberry.com>
Diffstat (limited to 'tests/auto/webchannel')
-rw-r--r-- | tests/auto/webchannel/tst_webchannel.cpp | 345 | ||||
-rw-r--r-- | tests/auto/webchannel/tst_webchannel.h | 237 | ||||
-rw-r--r-- | tests/auto/webchannel/webchannel.pro | 14 |
3 files changed, 596 insertions, 0 deletions
diff --git a/tests/auto/webchannel/tst_webchannel.cpp b/tests/auto/webchannel/tst_webchannel.cpp new file mode 100644 index 0000000..ece02a8 --- /dev/null +++ b/tests/auto/webchannel/tst_webchannel.cpp @@ -0,0 +1,345 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff <milian.wolff@kdab.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtWebChannel module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "tst_webchannel.h" + +#include <qwebchannel.h> +#include <qwebchannel_p.h> +#include <qmetaobjectpublisher_p.h> +#include <qwebsockettransport.h> + +#include <QtTest> + +TestWebChannel::TestWebChannel(QObject *parent) + : QObject(parent) + , m_dummyTransport(new DummyTransport(this)) + , m_lastInt(0) + , m_lastDouble(0) +{ +} + +TestWebChannel::~TestWebChannel() +{ + +} + +void TestWebChannel::setInt(int i) +{ + m_lastInt = i; +} + +void TestWebChannel::setDouble(double d) +{ + m_lastDouble = d; +} + +void TestWebChannel::setVariant(const QVariant &v) +{ + m_lastVariant = v; +} + +void TestWebChannel::testInitWebSocketTransport() +{ + QWebSocketTransport transport; + QSignalSpy initSpy(&transport, SIGNAL(initialized())); + QSignalSpy baseUrlSpy(&transport, SIGNAL(baseUrlChanged(QString))); + + QVERIFY(initSpy.wait()); + QCOMPARE(initSpy.size(), 1); + QCOMPARE(baseUrlSpy.size(), 1); + QCOMPARE(baseUrlSpy.first().size(), 1); + QCOMPARE(transport.baseUrl(), baseUrlSpy.first().first().toString()); + QVERIFY(!transport.baseUrl().isEmpty()); +} + +void TestWebChannel::testRegisterObjects() +{ + QWebChannel channel; + QObject plain; + + QHash<QString, QObject*> objects; + objects[QStringLiteral("plain")] = &plain; + objects[QStringLiteral("channel")] = &channel; + objects[QStringLiteral("publisher")] = channel.d->publisher; + objects[QStringLiteral("test")] = this; + + channel.registerObjects(objects); +} + +void TestWebChannel::testInfoForObject() +{ + TestObject obj; + obj.setObjectName("myTestObject"); + + QWebChannel channel; + const QJsonObject info = channel.d->publisher->classInfoForObject(&obj); + + QCOMPARE(info.keys(), QStringList() << "enums" << "methods" << "properties" << "signals"); + + { // enums + QJsonObject fooEnum; + fooEnum["Asdf"] = TestObject::Asdf; + fooEnum["Bar"] = TestObject::Bar; + QJsonObject expected; + expected["Foo"] = fooEnum; + QCOMPARE(info["enums"].toObject(), expected); + } + + { // methods & slots + QJsonArray expected; + { + QJsonArray method; + method.append(QStringLiteral("deleteLater")); + method.append(obj.metaObject()->indexOfMethod("deleteLater()")); + expected.append(method); + } + { + QJsonArray method; + method.append(QStringLiteral("slot1")); + method.append(obj.metaObject()->indexOfMethod("slot1()")); + expected.append(method); + } + { + QJsonArray method; + method.append(QStringLiteral("slot2")); + method.append(obj.metaObject()->indexOfMethod("slot2(QString)")); + expected.append(method); + } + { + QJsonArray method; + method.append(QStringLiteral("method1")); + method.append(obj.metaObject()->indexOfMethod("method1()")); + expected.append(method); + } + QCOMPARE(info["methods"].toArray(), expected); + } + + { // signals + QJsonArray expected; + { + QJsonArray signal; + signal.append(QStringLiteral("destroyed")); + signal.append(obj.metaObject()->indexOfMethod("destroyed(QObject*)")); + expected.append(signal); + } + { + QJsonArray signal; + signal.append(QStringLiteral("sig1")); + signal.append(obj.metaObject()->indexOfMethod("sig1()")); + expected.append(signal); + } + { + QJsonArray signal; + signal.append(QStringLiteral("sig2")); + signal.append(obj.metaObject()->indexOfMethod("sig2(QString)")); + expected.append(signal); + } + QCOMPARE(info["signals"].toArray(), expected); + } + + { // properties + QJsonArray expected; + { + QJsonArray property; + property.append(obj.metaObject()->indexOfProperty("objectName")); + property.append(QStringLiteral("objectName")); + { + QJsonArray signal; + signal.append(1); + signal.append(obj.metaObject()->indexOfMethod("objectNameChanged(QString)")); + property.append(signal); + } + property.append(obj.objectName()); + expected.append(property); + } + { + QJsonArray property; + property.append(obj.metaObject()->indexOfProperty("foo")); + property.append(QStringLiteral("foo")); + { + QJsonArray signal; + property.append(signal); + } + property.append(obj.foo()); + expected.append(property); + } + { + QJsonArray property; + property.append(obj.metaObject()->indexOfProperty("asdf")); + property.append(QStringLiteral("asdf")); + { + QJsonArray signal; + signal.append(1); + signal.append(obj.metaObject()->indexOfMethod("asdfChanged()")); + property.append(signal); + } + property.append(obj.asdf()); + expected.append(property); + } + { + QJsonArray property; + property.append(obj.metaObject()->indexOfProperty("bar")); + property.append(QStringLiteral("bar")); + { + QJsonArray signal; + signal.append(QStringLiteral("theBarHasChanged")); + signal.append(obj.metaObject()->indexOfMethod("theBarHasChanged()")); + property.append(signal); + } + property.append(obj.bar()); + expected.append(property); + } + QCOMPARE(info["properties"].toArray(), expected); + } +} + +void TestWebChannel::testInvokeMethodConversion() +{ + QWebChannel channel; + channel.connectTo(m_dummyTransport); + + QJsonArray args; + args.append(QJsonValue(1000)); + + { + int method = metaObject()->indexOfMethod("setInt(int)"); + QVERIFY(method != -1); + QVERIFY(!channel.d->publisher->invokeMethod(this, method, args, QJsonValue()).isEmpty()); + QCOMPARE(m_lastInt, args.at(0).toInt()); + } + { + int method = metaObject()->indexOfMethod("setDouble(double)"); + QVERIFY(method != -1); + QVERIFY(!channel.d->publisher->invokeMethod(this, method, args, QJsonValue()).isEmpty()); + QCOMPARE(m_lastDouble, args.at(0).toDouble()); + } + { + int method = metaObject()->indexOfMethod("setVariant(QVariant)"); + QVERIFY(method != -1); + QVERIFY(!channel.d->publisher->invokeMethod(this, method, args, QJsonValue()).isEmpty()); + QCOMPARE(m_lastVariant, args.at(0).toVariant()); + } +} + +static QHash<QString, QObject*> createObjects(QObject *parent) +{ + const int num = 100; + QHash<QString, QObject*> objects; + objects.reserve(num); + for (int i = 0; i < num; ++i) { + objects[QStringLiteral("obj%1").arg(i)] = new BenchObject(parent); + } + return objects; +} + +void TestWebChannel::benchClassInfo() +{ + QWebChannel channel; + channel.connectTo(m_dummyTransport); + + QObject parent; + const QHash<QString, QObject*> objects = createObjects(&parent); + + QBENCHMARK { + foreach (const QObject *object, objects) { + channel.d->publisher->classInfoForObject(object); + } + } +} + +void TestWebChannel::benchInitializeClients() +{ + QWebChannel channel; + channel.connectTo(m_dummyTransport); + + QObject parent; + channel.registerObjects(createObjects(&parent)); + + QMetaObjectPublisher *publisher = channel.d->publisher; + QBENCHMARK { + publisher->initializeClients(); + + publisher->propertyUpdatesInitialized = false; + publisher->signalToPropertyMap.clear(); + publisher->signalHandler.clear(); + } +} + +void TestWebChannel::benchPropertyUpdates() +{ + QWebChannel channel; + channel.connectTo(m_dummyTransport); + + QObject parent; + const QHash<QString, QObject*> objects = createObjects(&parent); + QVector<BenchObject*> objectList; + objectList.reserve(objects.size()); + foreach (QObject *obj, objects) { + objectList << qobject_cast<BenchObject*>(obj); + } + + channel.registerObjects(objects); + channel.d->publisher->initializeClients(); + + QBENCHMARK { + foreach (BenchObject *obj, objectList) { + obj->change(); + } + + channel.d->publisher->clientIsIdle = true; + channel.d->publisher->sendPendingPropertyUpdates(); + } +} + +void TestWebChannel::benchRegisterObjects() +{ + QWebChannel channel; + channel.connectTo(m_dummyTransport); + + QObject parent; + const QHash<QString, QObject*> objects = createObjects(&parent); + + QBENCHMARK { + channel.registerObjects(objects); + } +} + +QTEST_MAIN(TestWebChannel) diff --git a/tests/auto/webchannel/tst_webchannel.h b/tests/auto/webchannel/tst_webchannel.h new file mode 100644 index 0000000..314fe99 --- /dev/null +++ b/tests/auto/webchannel/tst_webchannel.h @@ -0,0 +1,237 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff <milian.wolff@kdab.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtWebChannel module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef TST_WEBCHANNEL_H +#define TST_WEBCHANNEL_H + +#include <QObject> +#include <QVariant> +#include <qwebchanneltransportinterface.h> + +class DummyTransport : public QObject, public QWebChannelTransportInterface +{ + Q_OBJECT + Q_INTERFACES(QWebChannelTransportInterface) +public: + explicit DummyTransport(QObject *parent) + : QObject(parent) + {} + ~DummyTransport() {}; + + void sendMessage(const QString &/*message*/, int /*clientId*/) const Q_DECL_OVERRIDE + {} + void sendMessage(const QByteArray &/*message*/, int /*clientId*/) const Q_DECL_OVERRIDE + {} + void setMessageHandler(QWebChannelMessageHandlerInterface * /*handler*/) Q_DECL_OVERRIDE + {} +}; + +class TestObject : public QObject +{ + Q_OBJECT + Q_ENUMS(Foo) + + Q_PROPERTY(Foo foo READ foo CONSTANT) + Q_PROPERTY(int asdf READ asdf NOTIFY asdfChanged) + Q_PROPERTY(QString bar READ bar NOTIFY theBarHasChanged) +public: + explicit TestObject(QObject *parent = 0) + : QObject(parent) + { } + + enum Foo { + Bar, + Asdf + }; + + Foo foo() const {return Bar;} + int asdf() const {return 42;} + QString bar() const {return QString();} + + Q_INVOKABLE void method1() {} + +protected: + Q_INVOKABLE void method2() {} + +private: + Q_INVOKABLE void method3() {} + +signals: + void sig1(); + void sig2(const QString&); + void asdfChanged(); + void theBarHasChanged(); + +public slots: + void slot1() {} + void slot2(const QString&) {} + +protected slots: + void slot3() {} + +private slots: + void slot4() {} +}; + +class BenchObject : public QObject +{ + Q_OBJECT + + Q_PROPERTY(int p0 MEMBER m_p0 NOTIFY p0Changed) + Q_PROPERTY(int p1 MEMBER m_p1 NOTIFY p1Changed) + Q_PROPERTY(int p2 MEMBER m_p2 NOTIFY p2Changed) + Q_PROPERTY(int p3 MEMBER m_p3 NOTIFY p3Changed) + Q_PROPERTY(int p4 MEMBER m_p4 NOTIFY p4Changed) + Q_PROPERTY(int p5 MEMBER m_p5 NOTIFY p5Changed) + Q_PROPERTY(int p6 MEMBER m_p6 NOTIFY p6Changed) + Q_PROPERTY(int p7 MEMBER m_p7 NOTIFY p7Changed) + Q_PROPERTY(int p8 MEMBER m_p8 NOTIFY p8Changed) + Q_PROPERTY(int p9 MEMBER m_p9 NOTIFY p9Changed) +public: + explicit BenchObject(QObject *parent = 0) + : QObject(parent) + , m_p0(0) + , m_p1(0) + , m_p2(0) + , m_p3(0) + , m_p4(0) + , m_p5(0) + , m_p6(0) + , m_p7(0) + , m_p8(0) + , m_p9(0) + { } + + void change() + { + m_p0++; + m_p1++; + m_p2++; + m_p3++; + m_p4++; + m_p5++; + m_p6++; + m_p7++; + m_p8++; + m_p9++; + emit p0Changed(m_p0); + emit p1Changed(m_p1); + emit p2Changed(m_p2); + emit p3Changed(m_p3); + emit p4Changed(m_p4); + emit p5Changed(m_p5); + emit p6Changed(m_p6); + emit p7Changed(m_p7); + emit p8Changed(m_p8); + emit p9Changed(m_p9); + } + +signals: + void s0(); + void s1(); + void s2(); + void s3(); + void s4(); + void s5(); + void s6(); + void s7(); + void s8(); + void s9(); + + void p0Changed(int); + void p1Changed(int); + void p2Changed(int); + void p3Changed(int); + void p4Changed(int); + void p5Changed(int); + void p6Changed(int); + void p7Changed(int); + void p8Changed(int); + void p9Changed(int); + +public slots: + void m0(){}; + void m1(){}; + void m2(){}; + void m3(){}; + void m4(){}; + void m5(){}; + void m6(){}; + void m7(){}; + void m8(){}; + void m9(){}; + +private: + int m_p0, m_p1, m_p2, m_p3, m_p4, m_p5, m_p6, m_p7, m_p8, m_p9; +}; + +class TestWebChannel : public QObject +{ + Q_OBJECT + +public: + explicit TestWebChannel(QObject *parent = 0); + virtual ~TestWebChannel(); + + Q_INVOKABLE void setInt(int i); + Q_INVOKABLE void setDouble(double d); + Q_INVOKABLE void setVariant(const QVariant &v); + +private slots: + void testInitWebSocketTransport(); + void testRegisterObjects(); + void testInfoForObject(); + void testInvokeMethodConversion(); + + void benchClassInfo(); + void benchInitializeClients(); + void benchPropertyUpdates(); + void benchRegisterObjects(); + +private: + DummyTransport *m_dummyTransport; + + int m_lastInt; + double m_lastDouble; + QVariant m_lastVariant; +}; + +#endif // TST_WEBCHANNEL_H diff --git a/tests/auto/webchannel/webchannel.pro b/tests/auto/webchannel/webchannel.pro new file mode 100644 index 0000000..71036dd --- /dev/null +++ b/tests/auto/webchannel/webchannel.pro @@ -0,0 +1,14 @@ +QT = core webchannel-private testlib + +CONFIG += testcase strict_flags warn_on + +INCLUDEPATH += ../../../src/webchannel +VPATH += ../../../src/webchannel + +TARGET = tst_webchannel + +SOURCES += \ + tst_webchannel.cpp + +HEADERS += \ + tst_webchannel.h |