1 // Bug 960397: UDP multicast options
4 var { Constructor
: CC
} = Components
;
7 "@mozilla.org/network/udp-socket;1",
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";
18 function createSocketAndJoin(addr
) {
19 let socket
= new UDPSocket(
22 Services
.scriptSecurityManager
.getSystemPrincipal()
24 socket
.joinMulticast(addr
);
28 function sendPing(socket
, addr
) {
30 let rawPing
= new TextEncoder().encode(ping
);
32 return new Promise((resolve
, reject
) => {
34 onPacketReceived(s
, message
) {
35 info("Received on port " + socket
.port
);
36 Assert
.equal(message
.data
, ping
);
38 resolve(message
.data
);
43 info("Multicast send to port " + socket
.port
);
44 socket
.send(addr
, socket
.port
, rawPing
, rawPing
.length
);
46 // Timers are bad, but it seems like the only way to test *not* getting a
48 let timer
= Cc
["@mozilla.org/timer;1"].createInstance(Ci
.nsITimer
);
49 timer
.initWithCallback(
55 Ci
.nsITimer
.TYPE_ONE_SHOT
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")
68 // Disabled on Windows11 for frequent intermittent failures.
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"),
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"),
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"),