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..a10bfa29a882aa09767b05e62e7a6cf171b57878 |
| --- /dev/null |
| +++ b/chrome/test/data/extensions/api_test/socket/api/multicast.js |
| @@ -0,0 +1,193 @@ |
| +function testMulticast() { |
| + function randomHexString(count) { |
| + var result = ''; |
| + for (var i = 0; i < count; i++) { |
| + 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(); |
| + } else { |
| + cancelled = true; |
| + callback(true); |
| + } |
| + }; |
| + } |
| + |
| + function testMulticastSettings() { |
| + socket.create('udp', {}, function (socketInfo) { |
| + var socket_id; |
| + if (socketInfo) { |
| + socket_id = socketInfo.socketId; |
| + socket.setMulticastTimeToLive(socket_id, 0, function (result) { |
| + chrome.test.assertEq(0, result, |
| + "Error setting multicast time to live."); |
| + socket.setMulticastTimeToLive(socket_id, -3, function (result) { |
| + chrome.test.assertEq(-4, result, |
| + "Error setting multicast time to live."); |
| + socket.setMulticastLoopbackMode(socket_id, false, |
| + function (result) { |
| + chrome.test.assertEq(0, result, |
| + "Error setting multicast loop back mode."); |
| + socket.setMulticastLoopbackMode(socket_id, true, |
| + function (result) { |
| + chrome.test.assertEq(0, result, |
| + "Error setting multicast loop back mode."); |
| + socket.destroy(socket_id); |
| + testMulticastRecv(); |
| + }); |
| + }); |
| + }); |
| + }); |
| + } else { |
| + chrome.test.fail("Cannot create server udp socket"); |
| + } |
| + }); |
| + } |
| + |
| + function testSendMessage(message, address) { |
| + // Send the UDP message to the address with multicast ttl = 0. |
| + address = address || kMulticastAddress; |
| + socket.create('udp', {}, function (socketInfo) { |
| + var clientSocketId; |
| + if (socketInfo) { |
| + clientSocketId = socketInfo.socketId; |
| + chrome.test.assertTrue(clientSocketId > 0, |
| + "Cannot create client udp socket."); |
| + socket.setMulticastTimeToLive(clientSocketId, 0, function (result) { |
| + chrome.test.assertEq(0, result, |
| + "Cannot create client udp socket."); |
| + socket.connect(clientSocketId, address, kPort, function (result) { |
| + chrome.test.assertEq(0, result, |
| + "Cannot connect to localhost."); |
| + socket.write(clientSocketId, stringToArrayBuffer(kTestMessage), |
| + 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 { |
| + 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 { |
| + chrome.test.fail("Faild to receive message after 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) { |
| + socket.destroy(serverSocketId); |
| + chrome.test.succeed(); |
| + } else { |
| + 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.
|
| + socket.destroy(serverSocketId); |
| + } |
| + }); |
| + testSendMessage(request); |
| + recvTimeout = setTimeout(function () { |
| + canceller(); |
| + socket.destroy(serverSocketId); |
| + chrome.test.succeed(); |
| + }, 2000); |
| + }); |
| + } |
| + |
| + function testMulticastRecv() { |
| + 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"); |
| + } |
| + }); |
| + } |
| + |
| + testMulticastSettings(); |
| +} |