OLD | NEW |
---|---|
(Empty) | |
1 function testMulticast() { | |
2 function randomHexString(count) { | |
3 var result = ''; | |
4 for(var i=0;i<count;i++) { | |
mmenke
2013/04/12 21:07:41
Space after for and after each semi-colon.
Bei Zhang
2013/04/15 22:30:26
Done.
| |
5 result += (Math.random() * 16 >> 0).toString(16); | |
6 } | |
7 return result; | |
8 } | |
9 var kMulticastAddress = "237.132.100.133"; | |
10 var kTestMessageLength = 128; | |
11 var kTestMessage = randomHexString(128); | |
12 var kPort = 11103; | |
13 function arrayBufferToString(arrayBuffer) { | |
14 // UTF-16LE | |
15 return String.fromCharCode.apply(String, new Uint16Array(arrayBuffer)); | |
16 } | |
17 | |
18 function stringToArrayBuffer(string) { | |
19 // UTF-16LE | |
20 var buf = new ArrayBuffer(string.length * 2); | |
21 var bufView = new Uint16Array(buf); | |
22 for (var i = 0, strLen = string.length; i < strLen; i++) { | |
23 bufView[i] = string.charCodeAt(i); | |
24 } | |
25 return buf; | |
26 } | |
27 | |
28 function waitForMessage(socketId, callback) { | |
29 var cancelled = false; | |
30 var relayCanceller = null; | |
31 socket.recvFrom(socketId, 1024, function (result) { | |
32 if (cancelled) return; | |
33 if (result.resultCode == kTestMessageLength * 2 && | |
34 kTestMessage === arrayBufferToString(result.data)) { | |
35 callback(cancelled); | |
36 } else { | |
37 // Restart waiting. | |
38 relayCanceller = waitForMessage(socketId, callback); | |
39 } | |
40 }); | |
41 return function canceller() { | |
42 if (relayCanceller) { | |
43 relayCanceller(); | |
44 } | |
45 cancelled = true; | |
46 callback(cancelled); | |
47 }; | |
48 } | |
49 | |
50 function testSendMessage(message, address) { | |
51 // Send the UDP message to the address with multicast ttl = 0. | |
52 address = address || kMulticastAddress; | |
53 var clientSocketId; | |
54 socket.create('udp', {}, function (socketInfo) { | |
55 if (socketInfo) { | |
56 clientSocketId = socketInfo.socketId; | |
57 chrome.test.assertTrue(clientSocketId > 0, | |
58 "Cannot create client udp socket."); | |
59 socket.setMulticastTimeToLive(clientSocketId, 0, function (result) { | |
60 chrome.test.assertEq(result, 0, "Cannot create client udp socket."); | |
61 socket.bind(clientSocketId, "0.0.0.0", kPort + 2, function (result) { | |
62 chrome.test.assertTrue(clientSocketId > 0, | |
63 "Cannot bind client udp socket."); | |
mmenke
2013/04/12 21:07:41
This should be either indented 4-spaces, with clie
Bei Zhang
2013/04/15 22:30:26
Done.
| |
64 socket.sendTo(clientSocketId, | |
65 stringToArrayBuffer(kTestMessage), | |
66 address, | |
67 kPort, function (result) { | |
68 chrome.test.assertTrue(result.bytesWritten >= 0, | |
69 "Send to failed. " + JSON.stringify(result)); | |
70 socket.destroy(clientSocketId); | |
71 }); | |
72 }); | |
73 }); | |
74 } else { | |
75 chrome.test.fail("Cannot create client udp socket"); | |
76 } | |
77 }); | |
78 } | |
79 | |
80 function recvBeforeAddMembership(serverSocketId) { | |
81 var recvTimeout; | |
82 var canceller = waitForMessage(serverSocketId, function (cancelled) { | |
83 clearTimeout(recvTimeout); | |
84 if (cancelled) { | |
85 recvWithMembership(serverSocketId); | |
86 } else { | |
87 console.log(JSON.stringify(arrayBufferToString(result.data))); | |
88 chrome.test.fail("Recieved message before joining the group"); | |
89 } | |
90 }); | |
91 testSendMessage(kTestMessage); // Meant to be lost. | |
92 recvTimeout = setTimeout(function () { | |
93 canceller(); | |
94 testSendMessage(kTestMessage, "127.0.0.1", kPort); | |
95 }, 2000); | |
96 } | |
97 | |
98 function recvWithMembership(serverSocketId) { | |
99 // Join group. | |
100 socket.joinGroup(serverSocketId, kMulticastAddress, function (result) { | |
101 chrome.test.assertEq(0, result, "Join group failed."); | |
102 var recvTimeout; | |
103 var canceller = waitForMessage(serverSocketId, function (cancelled) { | |
104 clearTimeout(recvTimeout); | |
105 if (!cancelled) { | |
106 recvWithoutMembership(serverSocketId); | |
107 } else { | |
108 console.log(JSON.stringify(arrayBufferToString(result.data))); | |
109 chrome.test.fail("Recieved message before joining the group"); | |
110 } | |
111 }); | |
112 testSendMessage(kTestMessage); | |
113 recvTimeout = setTimeout(function () { | |
114 canceller(); | |
115 socket.destroy(serverSocketId); | |
116 chrome.test.fail("Cannot receive from multicast group."); | |
117 }, 2000); | |
118 }); | |
119 } | |
120 | |
121 function recvWithoutMembership(serverSocketId) { | |
122 socket.leaveGroup(serverSocketId, kMulticastAddress, function (result) { | |
123 chrome.test.assertEq(0, result, "leave group failed."); | |
124 var recvTimeout; | |
125 var canceller = waitForMessage(serverSocketId, function (cancelled) { | |
126 clearTimeout(recvTimeout); | |
127 if (cancelled) { | |
128 chrome.test.succeed(); | |
129 } else { | |
130 console.log(JSON.stringify(arrayBufferToString(result.data))); | |
131 chrome.test.fail("Recieved message before joining the group"); | |
132 } | |
133 }); | |
134 testSendMessage(request); | |
135 recvTimeout = setTimeout(function () { | |
136 canceller(); | |
137 socket.destroy(serverSocketId); | |
138 chrome.test.succeed(); | |
139 }, 2000); | |
140 }); | |
141 } | |
142 | |
143 socket.create('udp', {}, function (socketInfo) { | |
144 var serverSocketId; | |
145 if (socketInfo) { | |
146 serverSocketId = socketInfo.socketId; | |
147 socket.bind(serverSocketId, "0.0.0.0", kPort, function (result) { | |
148 chrome.test.assertEq(0, result, "Bind failed."); | |
149 recvBeforeAddMembership(serverSocketId); | |
150 }); | |
151 } else { | |
152 chrome.test.fail("Cannot create server udp socket"); | |
153 } | |
154 }); | |
155 } | |
OLD | NEW |