diff options
Diffstat (limited to 'devtools/server/socket/tests/chrome')
-rw-r--r-- | devtools/server/socket/tests/chrome/chrome.ini | 3 | ||||
-rw-r--r-- | devtools/server/socket/tests/chrome/test_websocket-server.html | 88 |
2 files changed, 91 insertions, 0 deletions
diff --git a/devtools/server/socket/tests/chrome/chrome.ini b/devtools/server/socket/tests/chrome/chrome.ini new file mode 100644 index 0000000000..cfbb612954 --- /dev/null +++ b/devtools/server/socket/tests/chrome/chrome.ini @@ -0,0 +1,3 @@ +[DEFAULT] +tags = devtools +[test_websocket-server.html] diff --git a/devtools/server/socket/tests/chrome/test_websocket-server.html b/devtools/server/socket/tests/chrome/test_websocket-server.html new file mode 100644 index 0000000000..b809aca0a5 --- /dev/null +++ b/devtools/server/socket/tests/chrome/test_websocket-server.html @@ -0,0 +1,88 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset="utf-8"> + <title>Mozilla Bug</title> + <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"> +</head> +<body> +<script> +"use strict"; + +window.onload = function() { + const { require } = ChromeUtils.importESModule("resource://devtools/shared/loader/Loader.sys.mjs"); + const WebSocketServer = require("devtools/server/socket/websocket-server"); + + const ServerSocket = Components.Constructor("@mozilla.org/network/server-socket;1", + "nsIServerSocket", "init"); + + add_task(async function() { + // Create a TCP server on auto-assigned port + const server = new ServerSocket(-1, true, -1); + ok(server, `Launched WebSocket server on port ${server.port}`); + + let input, output; + + server.asyncListen({ + async onSocketAccepted(socket, transport) { + info("Accepted incoming connection"); + input = transport.openInputStream(0, 0, 0); + output = transport.openOutputStream(0, 0, 0); + + // Perform the WebSocket handshake + const webSocket = await WebSocketServer.accept(transport, input, output); + + // Echo the received message back to the sender + webSocket.onmessage = ({ data }) => { + info("Server received message, echoing back"); + webSocket.send(data); + }; + }, + + onStopListening(socket, status) { + info(`Server stopped listening with status: ${status}`); + }, + }); + + SimpleTest.registerCleanupFunction(() => { + server.close(); + }); + + // Create client connection + const client = await new Promise((resolve, reject) => { + const socket = new WebSocket(`ws://localhost:${server.port}`); + socket.onopen = () => resolve(socket); + socket.onerror = reject; + }); + ok(client, `Created WebSocket connection to port ${server.port}`); + + // Create a promise that resolves when the WebSocket closes + const closed = new Promise(resolve => { + client.onclose = resolve; + }); + + // Send a message + const message = "hello there"; + client.send(message); + info("Sent a message to server"); + // Check that it was echoed + const echoedMessage = await new Promise((resolve, reject) => { + client.onmessage = ({ data }) => resolve(data); + client.onerror = reject; + }); + + is(echoedMessage, message, "Echoed message matches"); + + // Close the connection + client.close(); + await closed; + + // Prevent leaking the streams by closing them before test ends + input.close(); + output.close(); + }); +}; +</script> +</body> +</html> |