tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_websocket-server.html (2674B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <head>
      4  <meta charset="utf-8">
      5  <title>Mozilla Bug</title>
      6  <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
      7  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
      8 </head>
      9 <body>
     10 <script>
     11 "use strict";
     12 
     13 window.onload = function() {
     14  const { require } = ChromeUtils.importESModule("resource://devtools/shared/loader/Loader.sys.mjs");
     15  const WebSocketServer = require("devtools/server/socket/websocket-server");
     16 
     17  const ServerSocket = Components.Constructor("@mozilla.org/network/server-socket;1",
     18    "nsIServerSocket", "init");
     19 
     20  add_task(async function() {
     21    // Create a TCP server on auto-assigned port
     22    const server = new ServerSocket(-1, true, -1);
     23    ok(server, `Launched WebSocket server on port ${server.port}`);
     24 
     25    let input, output;
     26 
     27    server.asyncListen({
     28      async onSocketAccepted(socket, transport) {
     29        info("Accepted incoming connection");
     30        input = transport.openInputStream(0, 0, 0);
     31        output = transport.openOutputStream(0, 0, 0);
     32 
     33        // Perform the WebSocket handshake
     34        const webSocket = await WebSocketServer.accept(transport, input, output);
     35 
     36        // Echo the received message back to the sender
     37        webSocket.onmessage = ({ data }) => {
     38          info("Server received message, echoing back");
     39          webSocket.send(data);
     40        };
     41      },
     42 
     43      onStopListening(socket, status) {
     44        info(`Server stopped listening with status: ${status}`);
     45      },
     46    });
     47 
     48    SimpleTest.registerCleanupFunction(() => {
     49      server.close();
     50    });
     51 
     52    // Create client connection
     53    const client = await new Promise((resolve, reject) => {
     54      const socket = new WebSocket(`ws://localhost:${server.port}`);
     55      socket.onopen = () => resolve(socket);
     56      socket.onerror = reject;
     57    });
     58    ok(client, `Created WebSocket connection to port ${server.port}`);
     59 
     60    // Create a promise that resolves when the WebSocket closes
     61    const closed = new Promise(resolve => {
     62      client.onclose = resolve;
     63    });
     64 
     65    // Send a message
     66    const message = "hello there";
     67    client.send(message);
     68    info("Sent a message to server");
     69    // Check that it was echoed
     70    const echoedMessage = await new Promise((resolve, reject) => {
     71      client.onmessage = ({ data }) => resolve(data);
     72      client.onerror = reject;
     73    });
     74 
     75    is(echoedMessage, message, "Echoed message matches");
     76 
     77    // Close the connection
     78    client.close();
     79    await closed;
     80 
     81    // Prevent leaking the streams by closing them before test ends
     82    input.close();
     83    output.close();
     84  });
     85 };
     86 </script>
     87 </body>
     88 </html>