// // testWebSocket.js // examples // // Created by Thijs Wenker on 8/18/15 // Copyright 2015 High Fidelity, Inc. // // WebSocket and WebSocketServer Tests // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html Script.include("../../libraries/unitTest.js"); // We set the unit testing timeout to 1000 milliseconds by default. Please increase if the test fails due to a slow connection. const UNITTEST_TIMEOUT = 1000; const WEBSOCKET_PING_URL = "ws://echo.websocket.org"; // Please do not register the following domain + gTLD: const WEBSOCKET_INVALID_URL = "ws://thisisnotavaliddomainname.invalid"; const TEST_MESSAGE = "This is a test message."; var unitTests = new SequentialUnitTester(); unitTests.addTest("Test default WebSocket values", function(finished) { var _this = this; var webSocket = new WebSocket(WEBSOCKET_PING_URL); webSocket.onmessage = this.registerCallbackFunction(function(event) { _this.assertEquals(TEST_MESSAGE, event.data, "event.data should be '" + TEST_MESSAGE + "'"); webSocket.close(); }); webSocket.onopen = this.registerCallbackFunction(function(event) { _this.assertEquals(webSocket.OPEN, webSocket.readyState, "readyState should be OPEN"); webSocket.send(TEST_MESSAGE); }); webSocket.onclose = this.registerCallbackFunction(function(event) { _this.assertEquals(webSocket.CLOSED, webSocket.readyState, "readyState should be CLOSED"); _this.done(); }); this.assertEquals(webSocket.CONNECTING, webSocket.readyState, "readyState should be CONNECTING"); this.assertEquals("blob", webSocket.binaryType, "binaryType should be 'blob'"); this.assertEquals(0, webSocket.bufferedAmount, "bufferedAmount should be 0"); this.assertEquals("", webSocket.extensions, "extensions should be an empty string by default"); this.assertEquals("", webSocket.protocol, "protocol should be an empty string by default"); this.assertEquals(WEBSOCKET_PING_URL, webSocket.url, "url should be '" + WEBSOCKET_PING_URL + "'"); }, UNITTEST_TIMEOUT); unitTests.addTest("Test WebSocket invalid URL", function(finished) { var _this = this; var webSocket = new WebSocket(WEBSOCKET_INVALID_URL); var hadError = false; webSocket.onerror = this.registerCallbackFunction(function() { hadError = true; _this.done(); }); webSocket.onclose = this.registerCallbackFunction(function(event) { _this.assertEquals(webSocket.CLOSED, webSocket.readyState, "readyState should be CLOSED"); }); this.assertEquals(webSocket.CONNECTING, webSocket.readyState, "readyState should be CONNECTING"); this.assertEquals(WEBSOCKET_INVALID_URL, webSocket.url, "url should be '" + WEBSOCKET_INVALID_URL + "'"); }, UNITTEST_TIMEOUT); if (this.WebSocketServer === undefined) { print("Skipping WebSocketServer tests."); } else { unitTests.addTest("Test WebSocketServer with three clients", function(finished) { var _this = this; const NUMBER_OF_CLIENTS = 3; var connectedClients = 0; var respondedClients = 0; var webSocketServer = new WebSocketServer(); _this.assertEquals(true, webSocketServer.listening, "listening should be true"); webSocketServer.newConnection.connect(this.registerCallbackFunction(function(newClient) { connectedClients++; newClient.onmessage = _this.registerCallbackFunction(function(event) { var data = JSON.parse(event.data); _this.assertEquals(TEST_MESSAGE, data.message, "data.message should be '" + TEST_MESSAGE + "'"); respondedClients++; if (respondedClients === NUMBER_OF_CLIENTS) { webSocketServer.close(); _this.assertEquals(false, webSocketServer.listening, "listening should be false"); _this.done(); } }); newClient.send(JSON.stringify({message: TEST_MESSAGE, client: connectedClients})); })); var newSocket1 = new WebSocket(webSocketServer.url); newSocket1.onmessage = this.registerCallbackFunction(function(event) { newSocket1.send(event.data); }); var newSocket2 = new WebSocket(webSocketServer.url); newSocket2.onmessage = this.registerCallbackFunction(function(event) { newSocket2.send(event.data); }); var newSocket3 = new WebSocket(webSocketServer.url); newSocket3.onmessage = this.registerCallbackFunction(function(event) { newSocket3.send(event.data); }); }, UNITTEST_TIMEOUT); } unitTests.run();