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

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: Fix code style 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 }
49 cancelled = true;
50 callback(cancelled);
51 };
52 }
53
54 function testSendMessage(message, address) {
55 // Send the UDP message to the address with multicast ttl = 0.
56 address = address || kMulticastAddress;
57 var clientSocketId;
58 socket.create('udp', {}, function (socketInfo) {
59 if (socketInfo) {
60 clientSocketId = socketInfo.socketId;
61 chrome.test.assertTrue(clientSocketId > 0,
62 "Cannot create client udp socket.");
63 socket.setMulticastTimeToLive(clientSocketId, 0, function (result) {
64 chrome.test.assertEq(result, 0, "Cannot create client udp socket.");
65 socket.bind(clientSocketId, "0.0.0.0", kPort + 2, function (result) {
66 chrome.test.assertTrue(clientSocketId > 0,
67 "Cannot bind client udp socket.");
68 socket.sendTo(clientSocketId,
69 stringToArrayBuffer(kTestMessage),
70 address,
71 kPort, function (result) {
72 chrome.test.assertTrue(result.bytesWritten >= 0,
73 "Send to failed. " + JSON.stringify(result));
74 socket.destroy(clientSocketId);
75 });
76 });
77 });
78 } else {
79 chrome.test.fail("Cannot create client udp socket");
80 }
81 });
82 }
83
84 function recvBeforeAddMembership(serverSocketId) {
85 var recvTimeout;
86 var canceller = waitForMessage(serverSocketId, function (cancelled) {
87 clearTimeout(recvTimeout);
88 if (cancelled) {
89 recvWithMembership(serverSocketId);
90 } else {
91 console.log(JSON.stringify(arrayBufferToString(result.data)));
92 chrome.test.fail("Recieved message before joining the group");
93 }
94 });
95 testSendMessage(kTestMessage); // Meant to be lost.
96 recvTimeout = setTimeout(function () {
97 canceller();
98 testSendMessage(kTestMessage, "127.0.0.1", kPort);
99 }, 2000);
100 }
101
102 function recvWithMembership(serverSocketId) {
103 // Join group.
104 socket.joinGroup(serverSocketId, kMulticastAddress, function (result) {
105 chrome.test.assertEq(0, result, "Join group failed.");
106 var recvTimeout;
107 var canceller = waitForMessage(serverSocketId, function (cancelled) {
108 clearTimeout(recvTimeout);
109 if (!cancelled) {
110 recvWithoutMembership(serverSocketId);
111 } else {
112 console.log(JSON.stringify(arrayBufferToString(result.data)));
113 chrome.test.fail("Recieved message before joining the group");
114 }
115 });
116 testSendMessage(kTestMessage);
117 recvTimeout = setTimeout(function () {
118 canceller();
119 socket.destroy(serverSocketId);
120 chrome.test.fail("Cannot receive from multicast group.");
121 }, 2000);
122 });
123 }
124
125 function recvWithoutMembership(serverSocketId) {
126 socket.leaveGroup(serverSocketId, kMulticastAddress, function (result) {
127 chrome.test.assertEq(0, result, "leave group failed.");
128 var recvTimeout;
129 var canceller = waitForMessage(serverSocketId, function (cancelled) {
130 clearTimeout(recvTimeout);
131 if (cancelled) {
132 chrome.test.succeed();
133 } else {
134 console.log(JSON.stringify(arrayBufferToString(result.data)));
135 chrome.test.fail("Recieved message before joining the group");
136 }
137 });
138 testSendMessage(request);
139 recvTimeout = setTimeout(function () {
140 canceller();
141 socket.destroy(serverSocketId);
142 chrome.test.succeed();
143 }, 2000);
144 });
145 }
146
147 socket.create('udp', {}, function (socketInfo) {
148 var serverSocketId;
149 if (socketInfo) {
150 serverSocketId = socketInfo.socketId;
151 socket.bind(serverSocketId, "0.0.0.0", kPort, function (result) {
152 chrome.test.assertEq(0, result, "Bind failed.");
153 recvBeforeAddMembership(serverSocketId);
154 });
155 } else {
156 chrome.test.fail("Cannot create server udp socket");
157 }
158 });
159 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698