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

Unified 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 tests 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 side-by-side diff with in-line comments
Download patch
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");
+ }
+ });
+}

Powered by Google App Engine
This is Rietveld 408576698