 Chromium Code Reviews
 Chromium Code Reviews| 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"); | 
| + } | 
| + }); | 
| +} |