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 });