Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / extensions / test / data / sockets_tcp_server / api / background.js
blobbd7ed4f7a11a3f64644e20a8cb060fce5ec89ec2
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // net/tools/testserver/testserver.py is picky about the format of what it
6 // calls its "echo" messages. One might go so far as to mutter to oneself that
7 // it isn't an echo server at all.
8 //
9 // The response is based on the request but obfuscated using a random key.
10 const request = "0100000005320000005hello";
12 var address;
13 var port = -1;
14 var socketId = 0;
15 var succeeded = false;
17 // Many thanks to Dennis for his StackOverflow answer: http://goo.gl/UDanx
18 // Since amended to handle BlobBuilder deprecation.
19 function string2ArrayBuffer(string, callback) {
20   var blob = new Blob([string]);
21   var f = new FileReader();
22   f.onload = function(e) {
23     callback(e.target.result);
24   };
25   f.readAsArrayBuffer(blob);
28 function arrayBuffer2String(buf, callback) {
29   var blob = new Blob([new Uint8Array(buf)]);
30   var f = new FileReader();
31   f.onload = function(e) {
32     callback(e.target.result);
33   };
34   f.readAsText(blob);
37 // Tests listening on a socket and sending/receiving from accepted sockets.
38 var testSocketListening = function() {
39   var tmpSocketId = 0;
41   chrome.sockets.tcpServer.create({}, onServerSocketCreate);
43   function onServerSocketCreate(socketInfo) {
44     console.log("Server socket created: sd=" + socketInfo.socketId);
45     socketId = socketInfo.socketId;
46     chrome.sockets.tcpServer.listen(socketId, address, port, onListen);
47   }
49   function onListen(result) {
50     console.log("Server socket 'listen' completed: sd=" + socketId +
51         ", result=" + result);
52     chrome.test.assertEq(0, result, "Listen failed.");
53     chrome.sockets.tcpServer.onAccept.addListener(onServerSocketAccept);
54     chrome.sockets.tcp.onReceive.addListener(onReceive);
55     chrome.sockets.tcp.onReceiveError.addListener(onReceiveError);
57     // Create a new socket to connect to the TCP server.
58     chrome.sockets.tcp.create({}, function(socketInfo) {
59       console.log("Client socket created: sd=" + socketInfo.socketId);
60       tmpSocketId = socketInfo.socketId;
61       chrome.sockets.tcp.connect(tmpSocketId, address, port,
62         function(result) {
63           console.log("Client socket connected: sd=" + tmpSocketId);
64           chrome.test.assertEq(0, result, "Connect failed");
66           // Write.
67           string2ArrayBuffer(request, function(buf) {
68             chrome.sockets.tcp.send(tmpSocketId, buf, function(sendInfo) {
69               console.log("Client socket data sent: sd=" + tmpSocketId
70                   + ", result=" + sendInfo.resultCode);
71               chrome.sockets.tcp.disconnect(tmpSocketId, function() {
72                 console.log("Client socket disconnected: sd=" + tmpSocketId);
73               });
74             });
75           });
76         });
77     });
78   }
80   var clientSocketId;
82   function onServerSocketAccept(acceptInfo) {
83     console.log("Server socket 'accept' event: sd=" + acceptInfo.socketId +
84         ", client sd=" + acceptInfo.clientSocketId);
85     chrome.test.assertEq(socketId, acceptInfo.socketId, "Wrong server socket.");
86     chrome.test.assertTrue(acceptInfo.clientSocketId > 0);
87     clientSocketId = acceptInfo.clientSocketId;
88     chrome.sockets.tcp.setPaused(clientSocketId, false, function() {});
89   }
91   function onReceive(receiveInfo) {
92     console.log("Client socket 'receive' event: sd=" + receiveInfo.socketId
93         + ", bytes=" + receiveInfo.data.byteLength);
94     chrome.test.assertEq(clientSocketId, receiveInfo.socketId,
95         "Received data on wrong socket");
96     if (receiveInfo.data.byteLength == 0)
97       return;
98     arrayBuffer2String(receiveInfo.data, function(s) {
99       var match = !!s.match(request);
100       chrome.test.assertTrue(match, "Received data does not match.");
101       succeeded = true;
102       // Test whether socket.getInfo correctly reflects the connection status
103       // if the peer has closed the connection.
104       setTimeout(function() {
105         chrome.sockets.tcp.getInfo(receiveInfo.socketId, function(info) {
106           chrome.test.assertFalse(info.connected);
107           chrome.test.succeed();
108         });
109       }, 500);
110     });
111   }
113   function onReceiveError(receiveInfo) {
114     console.log("Client socket 'receive error' event: sd="
115         + receiveInfo.socketId + ", result=" + receiveInfo.resultCode);
116     //chrome.test.fail("Receive failed.");
117   }
120 var onMessageReply = function(message) {
121   var parts = message.split(":");
122   var test_type = parts[0];
123   address = parts[1];
124   port = parseInt(parts[2]);
125   console.log("Running tests, protocol " + test_type + ", echo server " +
126               address + ":" + port);
127   if (test_type == 'tcp_server') {
128     chrome.test.runTests([testSocketListening]);
129   }
132 // Find out which protocol we're supposed to test, and which echo server we
133 // should be using, then kick off the tests.
134 chrome.test.sendMessage("info_please", onMessageReply);