tor-browser

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

test_udp_multicast.js (2638B)


      1 // Bug 960397: UDP multicast options
      2 "use strict";
      3 
      4 var { Constructor: CC } = Components;
      5 
      6 const UDPSocket = CC(
      7  "@mozilla.org/network/udp-socket;1",
      8  "nsIUDPSocket",
      9  "init"
     10 );
     11 const ADDRESS_TEST1 = "224.0.0.200";
     12 const ADDRESS_TEST2 = "224.0.0.201";
     13 const ADDRESS_TEST3 = "224.0.0.202";
     14 const ADDRESS_TEST4 = "224.0.0.203";
     15 
     16 const TIMEOUT = 2000;
     17 
     18 function createSocketAndJoin(addr) {
     19  let socket = new UDPSocket(
     20    -1,
     21    false,
     22    Services.scriptSecurityManager.getSystemPrincipal()
     23  );
     24  socket.joinMulticast(addr);
     25  return socket;
     26 }
     27 
     28 function sendPing(socket, addr) {
     29  let ping = "ping";
     30  let rawPing = new TextEncoder().encode(ping);
     31 
     32  return new Promise((resolve, reject) => {
     33    socket.asyncListen({
     34      onPacketReceived(s, message) {
     35        info("Received on port " + socket.port);
     36        Assert.equal(message.data, ping);
     37        socket.close();
     38        resolve(message.data);
     39      },
     40      onStopListening() {},
     41    });
     42 
     43    info("Multicast send to port " + socket.port);
     44    socket.send(addr, socket.port, rawPing, rawPing.length);
     45 
     46    // Timers are bad, but it seems like the only way to test *not* getting a
     47    // packet.
     48    let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
     49    timer.initWithCallback(
     50      () => {
     51        socket.close();
     52        reject();
     53      },
     54      TIMEOUT,
     55      Ci.nsITimer.TYPE_ONE_SHOT
     56    );
     57  });
     58 }
     59 
     60 add_test(() => {
     61  info("Joining multicast group");
     62  let socket = createSocketAndJoin(ADDRESS_TEST1);
     63  sendPing(socket, ADDRESS_TEST1).then(run_next_test, () =>
     64    do_throw("Joined group, but no packet received")
     65  );
     66 });
     67 
     68 // Disabled on Windows11 for frequent intermittent failures.
     69 // See bug 1760123.
     70 add_test({ skip_if: () => mozinfo.win11_2009 }, () => {
     71  info("Disabling multicast loopback");
     72  let socket = createSocketAndJoin(ADDRESS_TEST2);
     73  socket.multicastLoopback = false;
     74  sendPing(socket, ADDRESS_TEST2).then(
     75    () => do_throw("Loopback disabled, but still got a packet"),
     76    run_next_test
     77  );
     78 });
     79 
     80 // This fails locally on windows 11.
     81 add_test({ skip_if: () => mozinfo.win11_2009 }, () => {
     82  info("Changing multicast interface");
     83  let socket = createSocketAndJoin(ADDRESS_TEST3);
     84  socket.multicastInterface = "127.0.0.1";
     85  sendPing(socket, ADDRESS_TEST3).then(
     86    () => do_throw("Changed interface, but still got a packet"),
     87    run_next_test
     88  );
     89 });
     90 
     91 add_test(() => {
     92  info("Leaving multicast group");
     93  let socket = createSocketAndJoin(ADDRESS_TEST4);
     94  socket.leaveMulticast(ADDRESS_TEST4);
     95  sendPing(socket, ADDRESS_TEST4).then(
     96    () => do_throw("Left group, but still got a packet"),
     97    run_next_test
     98  );
     99 });