diff options
Diffstat (limited to 'tests/auto')
21 files changed, 326 insertions, 420 deletions
diff --git a/tests/auto/qml/WebChannelTest.qml b/tests/auto/qml/Client.qml index 9a0baa9..609fbac 100644 --- a/tests/auto/qml/WebChannelTest.qml +++ b/tests/auto/qml/Client.qml @@ -43,77 +43,86 @@ import QtQuick 2.0 import QtTest 1.0 import QtWebChannel 1.0 +import QtWebChannel.Tests 1.0 +import "qrc:///qwebchannel/qwebchannel.js" as Client -TestCase { - property var lastLoadStatus - property bool useWebViewTransport: false +Item { + TestTransport { + id: serverTransport + } + readonly property var serverTransport: serverTransport - // only run after the webchannel has finished initialization - when: webSocketTransport.baseUrl != "" + property var clientMessages: [] - WebViewTransport { - id: webViewTransport - webViewExperimental: defaultView.experimental - } - WebSocketTransport { - id: webSocketTransport - } + property bool debug: false - TestWebView { - id: defaultView - } + QtObject { + id: clientTransport + + property var send; + property var onmessage; - WebChannel { - id: webChannel + function postMessage(message) + { + if (debug) { + console.log("client posts message: ", message); + } + clientMessages.push(message); + serverTransport.textMessageReceived(message); + } + + Component.onCompleted: { + serverTransport.sendTextMessageRequested.connect(function(message) { + if (debug) { + console.log("client received message: ", message); + } + onmessage({data:message}); + }); + } } - property var webChannel: webChannel + readonly property var clientTransport: clientTransport + + Timer { + id: timer + running: false + repeat: false - SignalSpy { - id: rawMessageSpy - target: useWebViewTransport ? webViewTransport : webSocketTransport; - signalName: "onMessageReceived" + property var callback + + onTriggered: { + callback(); + } } - property var rawMessageSpy: rawMessageSpy - property var rawMessageIdx: 0; - function urlForFile(file) + function setTimeout(callback, delay) { - verify(useWebViewTransport || webSocketTransport.baseUrl != "", "webSocketTransport.baseUrl is empty"); - return "data/" + file + (!useWebViewTransport ? "?webChannelBaseUrl=" + webSocketTransport.baseUrl : ""); + if (timer.running) { + console.error("nested calls to setTimeout are not supported!", JSON.stringify(callback), JSON.stringify(timer.callback)); + return; + } + timer.callback = callback; + // note: an interval of 0 is directly triggered, so add a little padding + timer.interval = delay + 1; + timer.running = true; } - // load file in the given view or use the global one by default - function loadUrl(file, view) + function createChannel(callback, raw) { - if (useWebViewTransport) { - webChannel.disconnectFrom(webSocketTransport); - webChannel.connectTo(webViewTransport); - } else { - webChannel.disconnectFrom(webViewTransport); - webChannel.connectTo(webSocketTransport); - } - if (!view) { - view = defaultView; - } - view.url = urlForFile(file); - view.waitForLoaded(); + return new Client.QWebChannel(clientTransport, callback, raw); } function cleanup() { - defaultView.clear(); - rawMessageSpy.clear(); - rawMessageIdx = 0; + clientMessages = []; + timer.running = false; } function awaitRawMessage() { - rawMessageSpy.wait(500); - if (rawMessageSpy.signalArguments.length <= rawMessageIdx) { - // still no message received, fail - return null; + for (var i = 0; i < 10 && !clientMessages.length; ++i) { + wait(10); } - return rawMessageSpy.signalArguments[rawMessageIdx++][0]; + return clientMessages.shift(); } function awaitMessage() @@ -131,7 +140,7 @@ TestCase { verify(msg); verify(msg.data); verify(msg.data.type); - compare(msg.data.type, qWebChannelMessageTypes.init); + compare(msg.data.type, Client.QWebChannelMessageTypes.init); } function awaitIdle() @@ -139,19 +148,19 @@ TestCase { var msg = awaitMessage(); verify(msg); verify(msg.data); - compare(msg.data.type, qWebChannelMessageTypes.idle); + compare(msg.data.type, Client.QWebChannelMessageTypes.idle); verify(webChannel.test_clientIsIdle()) } - property var qWebChannelMessageTypes: ({ - signal: 1, - propertyUpdate: 2, - init: 3, - idle: 4, - debug: 5, - invokeMethod: 6, - connectToSignal: 7, - disconnectFromSignal: 8, - setProperty: 9, - }); + function awaitMessageSkipIdle() + { + var msg; + do { + msg = awaitMessage(); + verify(msg); + verify(msg.data); + } while (msg.data.type === Client.QWebChannelMessageTypes.idle); + return msg; + } + } diff --git a/tests/auto/qml/data/bench_init.html b/tests/auto/qml/data/bench_init.html deleted file mode 100644 index 7d3af5b..0000000 --- a/tests/auto/qml/data/bench_init.html +++ /dev/null @@ -1,13 +0,0 @@ -<html> - <head> - <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> - <script type="text/javascript" src="testsetup.js"></script> - <script type="text/javascript"> - //BEGIN SETUP - createWebChannel(function(channel) {}); - //END SETUP - </script> - </head> - <body> - </body> -</html> diff --git a/tests/auto/qml/data/disconnect.html b/tests/auto/qml/data/disconnect.html deleted file mode 100644 index a9a479c..0000000 --- a/tests/auto/qml/data/disconnect.html +++ /dev/null @@ -1,21 +0,0 @@ -<html> - <head> - <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> - <script type="text/javascript" src="testsetup.js"></script> - <script type="text/javascript"> - //BEGIN SETUP - createWebChannel(function(channel) { - myObj.mySignal.connect(function(arg) { - channel.exec({label: "mySignalReceived", args: [arg]}); - myObj.mySignal.disconnect(this); - }); - channel.subscribe("report", function() { - channel.exec({label: "report"}); - }); - }); - //END SETUP - </script> - </head> - <body> - </body> -</html> diff --git a/tests/auto/qml/data/grouping.html b/tests/auto/qml/data/grouping.html deleted file mode 100644 index f6bc33c..0000000 --- a/tests/auto/qml/data/grouping.html +++ /dev/null @@ -1,17 +0,0 @@ -<html> - <head> - <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> - <script type="text/javascript" src="testsetup.js"></script> - <script type="text/javascript"> - //BEGIN SETUP - window.channel = createWebChannel(function(channel) { - channel.subscribe(QWebChannelMessageTypes.propertyUpdate, function() { - channel.exec({label: "gotPropertyUpdate", values: [myObj.myProperty, myOtherObj.foo, myOtherObj.bar]}); - }); - }); - //END SETUP - </script> - </head> - <body> - </body> -</html> diff --git a/tests/auto/qml/data/method.html b/tests/auto/qml/data/method.html deleted file mode 100644 index 6dbaa90..0000000 --- a/tests/auto/qml/data/method.html +++ /dev/null @@ -1,17 +0,0 @@ -<html> - <head> - <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> - <script type="text/javascript" src="testsetup.js"></script> - <script type="text/javascript"> - //BEGIN SETUP - createWebChannel(function(channel) { - channel.subscribe("invokeMethod", function(arg) { - myObj.myMethod(arg); - }); - }); - //END SETUP - </script> - </head> - <body> - </body> -</html> diff --git a/tests/auto/qml/data/multiclient.html b/tests/auto/qml/data/multiclient.html deleted file mode 100644 index 1573a1a..0000000 --- a/tests/auto/qml/data/multiclient.html +++ /dev/null @@ -1,19 +0,0 @@ -<html> - <head> - <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> - <script type="text/javascript" src="testsetup.js"></script> - <script type="text/javascript"> - //BEGIN SETUP - createWebChannel(function(channel) { - foo.ping.connect(function() { - foo.pong(function(value) { - channel.exec({pongAnswer: value}); - }); - }); - }); - //END SETUP - </script> - </head> - <body> - </body> -</html> diff --git a/tests/auto/qml/data/property.html b/tests/auto/qml/data/property.html deleted file mode 100644 index 49b3811..0000000 --- a/tests/auto/qml/data/property.html +++ /dev/null @@ -1,21 +0,0 @@ -<html> - <head> - <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> - <script type="text/javascript" src="testsetup.js"></script> - <script type="text/javascript"> - //BEGIN SETUP - createWebChannel(function(channel) { - channel.exec({label: "init", value: myObj.myProperty}); - myObj.myPropertyChanged.connect(function() { - channel.exec({label: "changed", value: myObj.myProperty}); - }); - channel.subscribe("setProperty", function(newValue) { - myObj.myProperty = newValue; - }); - }); - //END SETUP - </script> - </head> - <body> - </body> -</html> diff --git a/tests/auto/qml/data/receiveRaw.html b/tests/auto/qml/data/receiveRaw.html deleted file mode 100644 index 139b2b1..0000000 --- a/tests/auto/qml/data/receiveRaw.html +++ /dev/null @@ -1,15 +0,0 @@ -<html> - <head> - <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> - <script type="text/javascript" src="testsetup.js"></script> - <script type="text/javascript"> - //BEGIN SETUP - createWebChannel(function(channel) { - channel.send("foobar"); - }, true /* raw */); - //END SETUP - </script> - </head> - <body> - </body> -</html> diff --git a/tests/auto/qml/data/send.html b/tests/auto/qml/data/send.html deleted file mode 100644 index c60fbf4..0000000 --- a/tests/auto/qml/data/send.html +++ /dev/null @@ -1,17 +0,0 @@ -<html> - <head> - <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> - <script type="text/javascript" src="testsetup.js"></script> - <script type="text/javascript"> - //BEGIN SETUP - createWebChannel(function(channel) { - channel.subscribe("myMessage", function(payload) { - channel.send("myMessagePong:" + payload); - }); - }, true /* raw */); - //END SETUP - </script> - </head> - <body> - </body> -</html> diff --git a/tests/auto/qml/data/signal.html b/tests/auto/qml/data/signal.html deleted file mode 100644 index bdce0c7..0000000 --- a/tests/auto/qml/data/signal.html +++ /dev/null @@ -1,17 +0,0 @@ -<html> - <head> - <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> - <script type="text/javascript" src="testsetup.js"></script> - <script type="text/javascript"> - //BEGIN SETUP - createWebChannel(function(channel) { - myObj.mySignal.connect(function(arg) { - channel.exec({label: "signalReceived", value: arg}); - }); - }); - //END SETUP - </script> - </head> - <body> - </body> -</html> diff --git a/tests/auto/qml/data/wrapper.html b/tests/auto/qml/data/wrapper.html deleted file mode 100644 index df368ee..0000000 --- a/tests/auto/qml/data/wrapper.html +++ /dev/null @@ -1,28 +0,0 @@ -<html> - <head> - <script type="text/javascript" src="qrc:///qwebchannel/qwebchannel.js"></script> - <script type="text/javascript" src="testsetup.js"></script> - <script type="text/javascript"> - //BEGIN SETUP - createWebChannel(function(channel) { - myFactory.create("testObj", function(obj) { - window[obj.objectName] = obj; - obj.mySignal.connect(function(arg1, arg2) { - channel.exec({label: "signalReceived", args: [arg1, arg2]}); - }); - obj.myProperty = 42; - obj.myMethod("foobar"); - }); - channel.subscribe("triggerDelete", function() { - testObj.deleteLater(); - }); - channel.subscribe("report", function() { - channel.exec({label:"report", obj: testObj}) - }); - }); - //END SETUP - </script> - </head> - <body> - </body> -</html> diff --git a/tests/auto/qml/qml.cpp b/tests/auto/qml/qml.cpp index 7267842..0612bdb 100644 --- a/tests/auto/qml/qml.cpp +++ b/tests/auto/qml/qml.cpp @@ -40,5 +40,17 @@ ****************************************************************************/ #include <QtQuickTest/quicktest.h> +#include <QtQml/qqml.h> -QUICK_TEST_MAIN(qml) +#ifndef QUICK_TEST_SOURCE_DIR +#define QUICK_TEST_SOURCE_DIR Q_NULLPTR +#endif + +#include "testtransport.h" + +int main(int argc, char **argv) +{ + qmlRegisterType<TestTransport>("QtWebChannel.Tests", 1, 0, "TestTransport"); + + return quick_test_main(argc, argv, "qml", QUICK_TEST_SOURCE_DIR); +} diff --git a/tests/auto/qml/qml.pro b/tests/auto/qml/qml.pro index f86dc90..ddef2cb 100644 --- a/tests/auto/qml/qml.pro +++ b/tests/auto/qml/qml.pro @@ -8,7 +8,11 @@ CONFIG += warn_on qmltestcase IMPORTPATH += $$OUT_PWD/../../../qml $$PWD SOURCES += \ - qml.cpp + qml.cpp \ + testtransport.cpp + +HEADERS += \ + testtransport.h OTHER_FILES += \ WebChannelTest.qml \ diff --git a/tests/auto/qml/data/testsetup.js b/tests/auto/qml/testtransport.cpp index c0db83a..a332955 100644 --- a/tests/auto/qml/data/testsetup.js +++ b/tests/auto/qml/testtransport.cpp @@ -39,9 +39,19 @@ ** ****************************************************************************/ -window.createWebChannel = function(callback, raw) +#include "testtransport.h" + +QT_BEGIN_NAMESPACE + +TestTransport::TestTransport(QObject *parent) +: QWebChannelAbstractTransport(parent) { - var baseUrlMatch = /[?&]webChannelBaseUrl=([A-Za-z0-9\-:/\.]+)/.exec(location.search); - var transport = baseUrlMatch ? baseUrlMatch[1] : navigator.qt; - return new QWebChannel(transport, callback, raw); + } + +void TestTransport::sendTextMessage(const QString &message) +{ + emit sendTextMessageRequested(message); +} + +QT_END_NAMESPACE diff --git a/tests/auto/qml/TestWebView.qml b/tests/auto/qml/testtransport.h index 3b12f38..dd07832 100644 --- a/tests/auto/qml/TestWebView.qml +++ b/tests/auto/qml/testtransport.h @@ -39,43 +39,25 @@ ** ****************************************************************************/ -import QtQuick 2.0 -import QtTest 1.0 +#ifndef TESTTRANSPORT_H +#define TESTTRANSPORT_H -import QtWebKit 3.0 -import QtWebKit.experimental 1.0 +#include <QtWebChannel/QWebChannelAbstractTransport> -WebView { - id: view - property var lastLoadStatus +QT_BEGIN_NAMESPACE - experimental.preferences.developerExtrasEnabled: true - experimental.preferences.navigatorQtObjectEnabled: true +class TestTransport : public QWebChannelAbstractTransport +{ + Q_OBJECT +public: + explicit TestTransport(QObject *parent = 0); - onLoadingChanged: { - // NOTE: we cannot use spy.signalArguments nor save the loadRequest anywhere, as it gets - // deleted after the slots connected to the signal have finished... i.e. it's a weak pointer, - // not a shared pointer. As such, we have to copy out the interesting data we need later on here... - lastLoadStatus = loadRequest.status - } + virtual void sendTextMessage(const QString &message); - SignalSpy { - id: loadingSpy - target: view - signalName: "onLoadingChanged" - } +Q_SIGNALS: + void sendTextMessageRequested(const QString &message); +}; - function waitForLoaded() - { - do { - loadingSpy.wait(500); - } while (loading); - return lastLoadStatus == WebView.LoadSucceededStatus; - } +QT_END_NAMESPACE - function clear() - { - url = ""; - loadingSpy.clear() - } -} +#endif // TESTTRANSPORT_H diff --git a/tests/auto/qml/tst_bench.qml b/tests/auto/qml/tst_bench.qml index 056dda9..833720e 100644 --- a/tests/auto/qml/tst_bench.qml +++ b/tests/auto/qml/tst_bench.qml @@ -40,13 +40,24 @@ ****************************************************************************/ import QtQuick 2.0 +import QtTest 1.0 import QtWebChannel 1.0 +import "qrc:///qwebchannel/qwebchannel.js" as Client -WebChannelTest { +TestCase { name: "Bench" id: test + Client { + id: client + } + + WebChannel { + id: webChannel + transports: [client.serverTransport] + } + Component { id: component QtObject { @@ -96,28 +107,15 @@ WebChannelTest { webChannel.registerObjects(objects); } - function benchmark_init_baseline() - { - loadUrl("bench_init.html"); - } - - function benchmark_init_webview() + function cleanup() { - useWebViewTransport = true; - loadUrl("bench_init.html"); - // init - awaitMessage(); - // idle - awaitMessage(); + client.cleanup(); } - function benchmark_init_websocket() + function benchmark_init() { - useWebViewTransport = false; - loadUrl("bench_init.html"); - // init - awaitMessage(); - // idle - awaitMessage(); + var channel = client.createChannel(function() {}); + client.awaitInit(); + client.awaitIdle(); } } diff --git a/tests/auto/qml/tst_metaobjectpublisher.qml b/tests/auto/qml/tst_metaobjectpublisher.qml index e07f105..880b30d 100644 --- a/tests/auto/qml/tst_metaobjectpublisher.qml +++ b/tests/auto/qml/tst_metaobjectpublisher.qml @@ -40,12 +40,17 @@ ****************************************************************************/ import QtQuick 2.0 +import QtTest 1.0 import QtWebChannel 1.0 +import "qrc:///qwebchannel/qwebchannel.js" as Client -WebChannelTest { +TestCase { name: "MetaObjectPublisher" - id: test + + Client { + id: client + } property var lastMethodArg @@ -90,62 +95,71 @@ WebChannelTest { } } - function initTestCase() - { - webChannel.registeredObjects = [myObj, myOtherObj, myFactory]; + WebChannel { + id: webChannel + transports: [client.serverTransport] + registeredObjects: [myObj, myOtherObj, myFactory] } - function awaitMessageSkipIdle() + function init() { - var msg; - do { - msg = awaitMessage(); - verify(msg); - verify(msg.data); - } while (msg.data.type === qWebChannelMessageTypes.idle); - return msg; + myObj.myProperty = 1 + client.cleanup(); } function test_property() { - myObj.myProperty = 1 - loadUrl("property.html"); - awaitInit(); - var msg = awaitMessageSkipIdle(); + var channel = client.createChannel(function(channel) { + channel.exec({label: "init", value: channel.objects.myObj.myProperty}); + channel.objects.myObj.myPropertyChanged.connect(function() { + channel.exec({label: "changed", value: channel.objects.myObj.myProperty}); + }); + channel.subscribe("setProperty", function(newValue) { + channel.objects.myObj.myProperty = newValue; + }); + }); + + client.awaitInit(); + var msg = client.awaitMessageSkipIdle(); compare(msg.data.label, "init"); compare(msg.data.value, 1); compare(myObj.myProperty, 1); // change property, should be propagated to HTML client and a message be send there myObj.myProperty = 2; - msg = awaitMessageSkipIdle(); + msg = client.awaitMessageSkipIdle(); compare(msg.data.label, "changed"); compare(msg.data.value, 2); compare(myObj.myProperty, 2); // now trigger a write from the client side webChannel.sendMessage("setProperty", 3); - msg = awaitMessageSkipIdle(); + msg = client.awaitMessageSkipIdle(); compare(myObj.myProperty, 3); // the above write is also propagated to the HTML client - msg = awaitMessageSkipIdle(); + msg = client.awaitMessageSkipIdle(); compare(msg.data.label, "changed"); compare(msg.data.value, 3); - awaitIdle(); + client.awaitIdle(); } function test_method() { - loadUrl("method.html"); - awaitInit(); - awaitIdle(); + var channel = client.createChannel(function (channel) { + channel.subscribe("invokeMethod", function (arg) { + channel.objects.myObj.myMethod(arg); + }); + }); + + client.awaitInit(); + client.awaitIdle(); webChannel.sendMessage("invokeMethod", "test"); - var msg = awaitMessage(); - compare(msg.data.type, qWebChannelMessageTypes.invokeMethod); + var msg = client.awaitMessage(); + compare(msg.data.type, Client.QWebChannelMessageTypes.invokeMethod); compare(msg.data.object, "myObj"); compare(msg.data.args, ["test"]); @@ -154,27 +168,35 @@ WebChannelTest { function test_signal() { - loadUrl("signal.html"); - awaitInit(); - - var msg = awaitMessage(); - compare(msg.data.type, qWebChannelMessageTypes.connectToSignal); + var channel = client.createChannel(function(channel) { + channel.objects.myObj.mySignal.connect(function(arg) { + channel.exec({label: "signalReceived", value: arg}); + }); + }); + client.awaitInit(); + + var msg = client.awaitMessage(); + compare(msg.data.type, Client.QWebChannelMessageTypes.connectToSignal); compare(msg.data.object, "myObj"); - awaitIdle(); + client.awaitIdle(); myObj.mySignal("test"); - msg = awaitMessage(); + msg = client.awaitMessageSkipIdle(); compare(msg.data.label, "signalReceived"); compare(msg.data.value, "test"); } function test_grouping() { - loadUrl("grouping.html"); - awaitInit(); - awaitIdle(); + var channel = client.createChannel(function(channel) { + channel.subscribe(Client.QWebChannelMessageTypes.propertyUpdate, function() { + channel.exec({label: "gotPropertyUpdate", values: [channel.objects.myObj.myProperty, channel.objects.myOtherObj.foo, channel.objects.myOtherObj.bar]}); + }); + }); + client.awaitInit(); + client.awaitIdle(); // change properties a lot, we expect this to be grouped into a single update notification for (var i = 0; i < 10; ++i) { @@ -183,81 +205,106 @@ WebChannelTest { myOtherObj.bar = i; } - var msg = awaitMessage(); + var msg = client.awaitMessage(); verify(msg); compare(msg.data.label, "gotPropertyUpdate"); compare(msg.data.values, [myObj.myProperty, myOtherObj.foo, myOtherObj.bar]); - awaitIdle(); + client.awaitIdle(); } function test_wrapper() { - loadUrl("wrapper.html"); - awaitInit(); - - var msg = awaitMessageSkipIdle(); - compare(msg.data.type, qWebChannelMessageTypes.invokeMethod); + var channel = client.createChannel(function(channel) { + channel.objects.myFactory.create("testObj", function(obj) { + channel.objects["testObj"] = obj; + obj.mySignal.connect(function(arg1, arg2) { + channel.exec({label: "signalReceived", args: [arg1, arg2]}); + }); + obj.myProperty = 42; + obj.myMethod("foobar"); + }); + channel.subscribe("triggerDelete", function() { + channel.objects.testObj.deleteLater(); + }); + channel.subscribe("report", function() { + channel.exec({label:"report", obj: channel.objects.testObj}) + }); + }); + client.awaitInit(); + + var msg = client.awaitMessageSkipIdle(); + compare(msg.data.type, Client.QWebChannelMessageTypes.invokeMethod); compare(msg.data.object, "myFactory"); verify(myFactory.lastObj); compare(myFactory.lastObj.objectName, "testObj"); - msg = awaitMessageSkipIdle(); - compare(msg.data.type, qWebChannelMessageTypes.connectToSignal); + msg = client.awaitMessageSkipIdle(); + compare(msg.data.type, Client.QWebChannelMessageTypes.connectToSignal); verify(msg.data.object); var objId = msg.data.object; - msg = awaitMessageSkipIdle(); - compare(msg.data.type, qWebChannelMessageTypes.connectToSignal); + msg = client.awaitMessageSkipIdle(); + compare(msg.data.type, Client.QWebChannelMessageTypes.connectToSignal); compare(msg.data.object, objId); - msg = awaitMessageSkipIdle(); - compare(msg.data.type, qWebChannelMessageTypes.setProperty); + msg = client.awaitMessageSkipIdle(); + compare(msg.data.type, Client.QWebChannelMessageTypes.setProperty); compare(msg.data.object, objId); compare(myFactory.lastObj.myProperty, 42); - msg = awaitMessageSkipIdle(); - compare(msg.data.type, qWebChannelMessageTypes.invokeMethod); + msg = client.awaitMessageSkipIdle(); + compare(msg.data.type, Client.QWebChannelMessageTypes.invokeMethod); compare(msg.data.object, objId); compare(msg.data.args, ["foobar"]); - msg = awaitMessageSkipIdle(); + msg = client.awaitMessageSkipIdle(); compare(msg.data.label, "signalReceived"); compare(msg.data.args, ["foobar", 42]); // pass QObject* on the fly and trigger deleteLater from client side webChannel.sendMessage("triggerDelete"); - msg = awaitMessageSkipIdle(); - compare(msg.data.type, qWebChannelMessageTypes.invokeMethod); + msg = client.awaitMessageSkipIdle(); + compare(msg.data.type, Client.QWebChannelMessageTypes.invokeMethod); compare(msg.data.object, objId); + client.awaitIdle(); + webChannel.sendMessage("report"); - msg = awaitMessageSkipIdle(); + msg = client.awaitMessageSkipIdle(); compare(msg.data.label, "report"); compare(msg.data.obj, {}); } function test_disconnect() { - loadUrl("disconnect.html"); - awaitInit(); - - var msg = awaitMessage(); - compare(msg.data.type, qWebChannelMessageTypes.connectToSignal); + var channel = client.createChannel(function(channel) { + channel.objects.myObj.mySignal.connect(function(arg) { + channel.exec({label: "mySignalReceived", args: [arg]}); + channel.objects.myObj.mySignal.disconnect(this); + }); + channel.subscribe("report", function() { + channel.exec({label: "report"}); + }); + }); + client.awaitInit(); + + var msg = client.awaitMessage(); + compare(msg.data.type, Client.QWebChannelMessageTypes.connectToSignal); compare(msg.data.object, "myObj"); - awaitIdle(); + client.awaitIdle(); myObj.mySignal(42); - msg = awaitMessage(); + msg = client.awaitMessage(); compare(msg.data.label, "mySignalReceived"); compare(msg.data.args, [42]); - msg = awaitMessage(); - compare(msg.data.type, qWebChannelMessageTypes.disconnectFromSignal); + msg = client.awaitMessage(); + compare(msg.data.type, Client.QWebChannelMessageTypes.disconnectFromSignal); compare(msg.data.object, "myObj"); myObj.mySignal(0); @@ -266,7 +313,7 @@ WebChannelTest { // and verify no mySignalReceived was triggered by the above emission webChannel.sendMessage("report"); - msg = awaitMessage(); + msg = client.awaitMessage(); compare(msg.data.label, "report"); } } diff --git a/tests/auto/qml/tst_multiclient.qml b/tests/auto/qml/tst_multiclient.qml index 519a63c..6c4b9b7 100644 --- a/tests/auto/qml/tst_multiclient.qml +++ b/tests/auto/qml/tst_multiclient.qml @@ -40,12 +40,21 @@ ****************************************************************************/ import QtQuick 2.0 +import QtTest 1.0 import QtWebChannel 1.0 +import "qrc:///qwebchannel/qwebchannel.js" as Client -WebChannelTest { +TestCase { name: "MultiClient" - id: test + + Client { + id: client1 + } + + Client { + id: client2 + } QtObject { id: foo @@ -61,39 +70,50 @@ WebChannelTest { WebChannel.id: "foo" } - TestWebView { - id: client1 + WebChannel { + id: webChannel + transports: [client1.serverTransport, client2.serverTransport] + registeredObjects: [foo] } - TestWebView { - id: client2 + + function init() + { + client1.cleanup(); + client2.cleanup(); } - function initTestCase() + function clientInitCallback(channel) { - webChannel.registeredObjects = [foo]; + channel.objects.foo.ping.connect(function() { + channel.objects.foo.pong(function(value) { + channel.exec({pongAnswer: value}); + }); + }); } function test_multiclient() { - loadUrl("multiclient.html", client1); - loadUrl("multiclient.html", client2); + var c1 = client1.createChannel(clientInitCallback); + var c2 = client2.createChannel(clientInitCallback); + // init, connect & idle messages for two clients - for (var i = 0; i < 3 * 2; ++i) { - awaitMessage(); + for (var i = 0; i < 3; ++i) { + client1.awaitMessage(); + client2.awaitMessage(); } foo.ping(); // invoke of pong method - awaitMessage(); - awaitMessage(); + client1.awaitMessage(); + client2.awaitMessage(); - var msg = awaitMessage(); + var msg = client1.awaitMessage(); compare(msg.data.pongAnswer, 1); - msg = awaitMessage(); + msg = client2.awaitMessage(); compare(msg.data.pongAnswer, 2); - awaitIdle(); - awaitIdle(); + client1.awaitIdle(); + client2.awaitIdle(); } } diff --git a/tests/auto/qml/tst_webchannel.qml b/tests/auto/qml/tst_webchannel.qml index dddba71..3c404d3 100644 --- a/tests/auto/qml/tst_webchannel.qml +++ b/tests/auto/qml/tst_webchannel.qml @@ -40,20 +40,47 @@ ****************************************************************************/ import QtQuick 2.0 +import QtTest 1.0 -WebChannelTest { +import QtWebChannel 1.0 +import "qrc:///qwebchannel/qwebchannel.js" as Client + +TestCase { name: "WebChannel" + Client { + id: client + } + + WebChannel { + id: webChannel + transports: [client.serverTransport] + } + + function cleanup() + { + client.cleanup(); + } + function test_receiveRawMessage() { - loadUrl("receiveRaw.html"); - compare(awaitRawMessage(), "foobar"); + var channel = client.createChannel(function (channel) { + channel.send("foobar"); + }, true /* raw */); + compare(client.awaitRawMessage(), "foobar"); } function test_sendMessage() { - loadUrl("send.html"); + var channel = client.createChannel(function (channel) { + channel.subscribe("myMessage", function(payload) { + channel.send("myMessagePong:" + payload); + }); + channel.send("initialized"); + }, true /* raw */); + + compare(client.awaitRawMessage(), "initialized"); webChannel.sendMessage("myMessage", "foobar"); - compare(awaitRawMessage(), "myMessagePong:foobar"); + compare(client.awaitRawMessage(), "myMessagePong:foobar"); } } diff --git a/tests/auto/webchannel/tst_webchannel.cpp b/tests/auto/webchannel/tst_webchannel.cpp index ece02a8..10baaa3 100644 --- a/tests/auto/webchannel/tst_webchannel.cpp +++ b/tests/auto/webchannel/tst_webchannel.cpp @@ -44,7 +44,6 @@ #include <qwebchannel.h> #include <qwebchannel_p.h> #include <qmetaobjectpublisher_p.h> -#include <qwebsockettransport.h> #include <QtTest> @@ -76,20 +75,6 @@ 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; diff --git a/tests/auto/webchannel/tst_webchannel.h b/tests/auto/webchannel/tst_webchannel.h index 314fe99..4811a5c 100644 --- a/tests/auto/webchannel/tst_webchannel.h +++ b/tests/auto/webchannel/tst_webchannel.h @@ -44,24 +44,22 @@ #include <QObject> #include <QVariant> -#include <qwebchanneltransportinterface.h> -class DummyTransport : public QObject, public QWebChannelTransportInterface +#include <QtWebChannel/QWebChannelAbstractTransport> + +class DummyTransport : public QWebChannelAbstractTransport { Q_OBJECT - Q_INTERFACES(QWebChannelTransportInterface) public: explicit DummyTransport(QObject *parent) - : QObject(parent) + : QWebChannelAbstractTransport(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 - {} +public slots: + void sendTextMessage(const QString &/*message*/) Q_DECL_OVERRIDE + { + } }; class TestObject : public QObject @@ -216,7 +214,6 @@ public: Q_INVOKABLE void setVariant(const QVariant &v); private slots: - void testInitWebSocketTransport(); void testRegisterObjects(); void testInfoForObject(); void testInvokeMethodConversion(); |