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

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: Add License info to multicast.js 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..2447a82ebf4eb96263591badff4c1cb7d3b5ec90
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/socket/api/multicast.js
@@ -0,0 +1,198 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Tests for multicast UDP socket.
+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("Received 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("Received message after leaving the group");
+ 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();
+}
« no previous file with comments | « chrome/test/data/extensions/api_test/socket/api/manifest.json ('k') | content/public/common/socket_permission_request.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698