Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(389)

Side by Side Diff: chrome/test/data/extensions/api_test/socket/api/multicast.js

Issue 12684008: Multicast socket API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Minor fixes Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698