Index: chrome/test/data/extensions/api_test/socket/api/multicast.js |
diff --git a/chrome/test/data/extensions/api_test/socket/api/multicast.js b/chrome/test/data/extensions/api_test/socket/api/multicast.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..25a896c5222851a82d84f4e14ad4a51194111cb4 |
--- /dev/null |
+++ b/chrome/test/data/extensions/api_test/socket/api/multicast.js |
@@ -0,0 +1,155 @@ |
+function testMulticast() { |
+ function randomHexString(count) { |
+ var result = ''; |
+ 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.
|
+ result += (Math.random() * 16 >> 0).toString(16); |
+ } |
+ return result; |
+ } |
+ var kMulticastAddress = "237.132.100.133"; |
+ var kTestMessageLength = 128; |
+ var kTestMessage = randomHexString(128); |
+ var kPort = 11103; |
+ function arrayBufferToString(arrayBuffer) { |
+ // UTF-16LE |
+ return String.fromCharCode.apply(String, new Uint16Array(arrayBuffer)); |
+ } |
+ |
+ function stringToArrayBuffer(string) { |
+ // UTF-16LE |
+ var buf = new ArrayBuffer(string.length * 2); |
+ var bufView = new Uint16Array(buf); |
+ for (var i = 0, strLen = string.length; i < strLen; i++) { |
+ bufView[i] = string.charCodeAt(i); |
+ } |
+ return buf; |
+ } |
+ |
+ function waitForMessage(socketId, callback) { |
+ var cancelled = false; |
+ var relayCanceller = null; |
+ socket.recvFrom(socketId, 1024, function (result) { |
+ if (cancelled) return; |
+ if (result.resultCode == kTestMessageLength * 2 && |
+ kTestMessage === arrayBufferToString(result.data)) { |
+ callback(cancelled); |
+ } else { |
+ // Restart waiting. |
+ relayCanceller = waitForMessage(socketId, callback); |
+ } |
+ }); |
+ return function canceller() { |
+ if (relayCanceller) { |
+ relayCanceller(); |
+ } |
+ cancelled = true; |
+ callback(cancelled); |
+ }; |
+ } |
+ |
+ function testSendMessage(message, address) { |
+ // Send the UDP message to the address with multicast ttl = 0. |
+ address = address || kMulticastAddress; |
+ var clientSocketId; |
+ socket.create('udp', {}, function (socketInfo) { |
+ if (socketInfo) { |
+ clientSocketId = socketInfo.socketId; |
+ chrome.test.assertTrue(clientSocketId > 0, |
+ "Cannot create client udp socket."); |
+ socket.setMulticastTimeToLive(clientSocketId, 0, function (result) { |
+ chrome.test.assertEq(result, 0, "Cannot create client udp socket."); |
+ socket.bind(clientSocketId, "0.0.0.0", kPort + 2, function (result) { |
+ chrome.test.assertTrue(clientSocketId > 0, |
+ "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.
|
+ socket.sendTo(clientSocketId, |
+ stringToArrayBuffer(kTestMessage), |
+ address, |
+ kPort, function (result) { |
+ chrome.test.assertTrue(result.bytesWritten >= 0, |
+ "Send to failed. " + JSON.stringify(result)); |
+ socket.destroy(clientSocketId); |
+ }); |
+ }); |
+ }); |
+ } else { |
+ chrome.test.fail("Cannot create client udp socket"); |
+ } |
+ }); |
+ } |
+ |
+ function recvBeforeAddMembership(serverSocketId) { |
+ var recvTimeout; |
+ var canceller = waitForMessage(serverSocketId, function (cancelled) { |
+ clearTimeout(recvTimeout); |
+ if (cancelled) { |
+ recvWithMembership(serverSocketId); |
+ } else { |
+ console.log(JSON.stringify(arrayBufferToString(result.data))); |
+ chrome.test.fail("Recieved message before joining the group"); |
+ } |
+ }); |
+ testSendMessage(kTestMessage); // Meant to be lost. |
+ recvTimeout = setTimeout(function () { |
+ canceller(); |
+ testSendMessage(kTestMessage, "127.0.0.1", kPort); |
+ }, 2000); |
+ } |
+ |
+ function recvWithMembership(serverSocketId) { |
+ // Join group. |
+ socket.joinGroup(serverSocketId, kMulticastAddress, function (result) { |
+ chrome.test.assertEq(0, result, "Join group failed."); |
+ var recvTimeout; |
+ var canceller = waitForMessage(serverSocketId, function (cancelled) { |
+ clearTimeout(recvTimeout); |
+ if (!cancelled) { |
+ recvWithoutMembership(serverSocketId); |
+ } else { |
+ console.log(JSON.stringify(arrayBufferToString(result.data))); |
+ chrome.test.fail("Recieved message before joining the group"); |
+ } |
+ }); |
+ testSendMessage(kTestMessage); |
+ recvTimeout = setTimeout(function () { |
+ canceller(); |
+ socket.destroy(serverSocketId); |
+ chrome.test.fail("Cannot receive from multicast group."); |
+ }, 2000); |
+ }); |
+ } |
+ |
+ function recvWithoutMembership(serverSocketId) { |
+ socket.leaveGroup(serverSocketId, kMulticastAddress, function (result) { |
+ chrome.test.assertEq(0, result, "leave group failed."); |
+ var recvTimeout; |
+ var canceller = waitForMessage(serverSocketId, function (cancelled) { |
+ clearTimeout(recvTimeout); |
+ if (cancelled) { |
+ chrome.test.succeed(); |
+ } else { |
+ console.log(JSON.stringify(arrayBufferToString(result.data))); |
+ chrome.test.fail("Recieved message before joining the group"); |
+ } |
+ }); |
+ testSendMessage(request); |
+ recvTimeout = setTimeout(function () { |
+ canceller(); |
+ socket.destroy(serverSocketId); |
+ chrome.test.succeed(); |
+ }, 2000); |
+ }); |
+ } |
+ |
+ socket.create('udp', {}, function (socketInfo) { |
+ var serverSocketId; |
+ if (socketInfo) { |
+ serverSocketId = socketInfo.socketId; |
+ socket.bind(serverSocketId, "0.0.0.0", kPort, function (result) { |
+ chrome.test.assertEq(0, result, "Bind failed."); |
+ recvBeforeAddMembership(serverSocketId); |
+ }); |
+ } else { |
+ chrome.test.fail("Cannot create server udp socket"); |
+ } |
+ }); |
+} |