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