Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 function testMulticast() { | |
| 2 function randomHexString(count) { | |
| 3 var result = ''; | |
| 4 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.
| |
| 5 result += (Math.random() * 16 >> 0).toString(16); | |
| 6 } | |
| 7 return result; | |
| 8 } | |
| 9 var kMulticastAddress = "237.132.100.133"; | |
| 10 var kTestMessageLength = 128; | |
| 11 var kTestMessage = randomHexString(128); | |
| 12 var kPort = 11103; | |
| 13 function arrayBufferToString(arrayBuffer) { | |
| 14 // UTF-16LE | |
| 15 return String.fromCharCode.apply(String, new Uint16Array(arrayBuffer)); | |
| 16 } | |
| 17 | |
| 18 function stringToArrayBuffer(string) { | |
| 19 // UTF-16LE | |
| 20 var buf = new ArrayBuffer(string.length * 2); | |
| 21 var bufView = new Uint16Array(buf); | |
| 22 for (var i = 0, strLen = string.length; i < strLen; i++) { | |
| 23 bufView[i] = string.charCodeAt(i); | |
| 24 } | |
| 25 return buf; | |
| 26 } | |
| 27 | |
| 28 function waitForMessage(socketId, callback) { | |
| 29 var cancelled = false; | |
| 30 var relayCanceller = null; | |
| 31 socket.recvFrom(socketId, 1024, function (result) { | |
| 32 if (cancelled) return; | |
| 33 if (result.resultCode == kTestMessageLength * 2 && | |
| 34 kTestMessage === arrayBufferToString(result.data)) { | |
| 35 callback(cancelled); | |
| 36 } else { | |
| 37 // Restart waiting. | |
| 38 relayCanceller = waitForMessage(socketId, callback); | |
| 39 } | |
| 40 }); | |
| 41 return function canceller() { | |
| 42 if (relayCanceller) { | |
| 43 relayCanceller(); | |
| 44 } | |
| 45 cancelled = true; | |
| 46 callback(cancelled); | |
| 47 }; | |
| 48 } | |
| 49 | |
| 50 function testSendMessage(message, address) { | |
| 51 // Send the UDP message to the address with multicast ttl = 0. | |
| 52 address = address || kMulticastAddress; | |
| 53 var clientSocketId; | |
| 54 socket.create('udp', {}, function (socketInfo) { | |
| 55 if (socketInfo) { | |
| 56 clientSocketId = socketInfo.socketId; | |
| 57 chrome.test.assertTrue(clientSocketId > 0, | |
| 58 "Cannot create client udp socket."); | |
| 59 socket.setMulticastTimeToLive(clientSocketId, 0, function (result) { | |
| 60 chrome.test.assertEq(result, 0, "Cannot create client udp socket."); | |
| 61 socket.bind(clientSocketId, "0.0.0.0", kPort + 2, function (result) { | |
| 62 chrome.test.assertTrue(clientSocketId > 0, | |
| 63 "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.
| |
| 64 socket.sendTo(clientSocketId, | |
| 65 stringToArrayBuffer(kTestMessage), | |
| 66 address, | |
| 67 kPort, function (result) { | |
| 68 chrome.test.assertTrue(result.bytesWritten >= 0, | |
| 69 "Send to failed. " + JSON.stringify(result)); | |
| 70 socket.destroy(clientSocketId); | |
| 71 }); | |
| 72 }); | |
| 73 }); | |
| 74 } else { | |
| 75 chrome.test.fail("Cannot create client udp socket"); | |
| 76 } | |
| 77 }); | |
| 78 } | |
| 79 | |
| 80 function recvBeforeAddMembership(serverSocketId) { | |
| 81 var recvTimeout; | |
| 82 var canceller = waitForMessage(serverSocketId, function (cancelled) { | |
| 83 clearTimeout(recvTimeout); | |
| 84 if (cancelled) { | |
| 85 recvWithMembership(serverSocketId); | |
| 86 } else { | |
| 87 console.log(JSON.stringify(arrayBufferToString(result.data))); | |
| 88 chrome.test.fail("Recieved message before joining the group"); | |
| 89 } | |
| 90 }); | |
| 91 testSendMessage(kTestMessage); // Meant to be lost. | |
| 92 recvTimeout = setTimeout(function () { | |
| 93 canceller(); | |
| 94 testSendMessage(kTestMessage, "127.0.0.1", kPort); | |
| 95 }, 2000); | |
| 96 } | |
| 97 | |
| 98 function recvWithMembership(serverSocketId) { | |
| 99 // Join group. | |
| 100 socket.joinGroup(serverSocketId, kMulticastAddress, function (result) { | |
| 101 chrome.test.assertEq(0, result, "Join group failed."); | |
| 102 var recvTimeout; | |
| 103 var canceller = waitForMessage(serverSocketId, function (cancelled) { | |
| 104 clearTimeout(recvTimeout); | |
| 105 if (!cancelled) { | |
| 106 recvWithoutMembership(serverSocketId); | |
| 107 } else { | |
| 108 console.log(JSON.stringify(arrayBufferToString(result.data))); | |
| 109 chrome.test.fail("Recieved message before joining the group"); | |
| 110 } | |
| 111 }); | |
| 112 testSendMessage(kTestMessage); | |
| 113 recvTimeout = setTimeout(function () { | |
| 114 canceller(); | |
| 115 socket.destroy(serverSocketId); | |
| 116 chrome.test.fail("Cannot receive from multicast group."); | |
| 117 }, 2000); | |
| 118 }); | |
| 119 } | |
| 120 | |
| 121 function recvWithoutMembership(serverSocketId) { | |
| 122 socket.leaveGroup(serverSocketId, kMulticastAddress, function (result) { | |
| 123 chrome.test.assertEq(0, result, "leave group failed."); | |
| 124 var recvTimeout; | |
| 125 var canceller = waitForMessage(serverSocketId, function (cancelled) { | |
| 126 clearTimeout(recvTimeout); | |
| 127 if (cancelled) { | |
| 128 chrome.test.succeed(); | |
| 129 } else { | |
| 130 console.log(JSON.stringify(arrayBufferToString(result.data))); | |
| 131 chrome.test.fail("Recieved message before joining the group"); | |
| 132 } | |
| 133 }); | |
| 134 testSendMessage(request); | |
| 135 recvTimeout = setTimeout(function () { | |
| 136 canceller(); | |
| 137 socket.destroy(serverSocketId); | |
| 138 chrome.test.succeed(); | |
| 139 }, 2000); | |
| 140 }); | |
| 141 } | |
| 142 | |
| 143 socket.create('udp', {}, function (socketInfo) { | |
| 144 var serverSocketId; | |
| 145 if (socketInfo) { | |
| 146 serverSocketId = socketInfo.socketId; | |
| 147 socket.bind(serverSocketId, "0.0.0.0", kPort, function (result) { | |
| 148 chrome.test.assertEq(0, result, "Bind failed."); | |
| 149 recvBeforeAddMembership(serverSocketId); | |
| 150 }); | |
| 151 } else { | |
| 152 chrome.test.fail("Cannot create server udp socket"); | |
| 153 } | |
| 154 }); | |
| 155 } | |
| OLD | NEW |