| Index: chrome/test/data/extensions/api_test/socket/api/background.js
|
| diff --git a/chrome/test/data/extensions/api_test/socket/api/background.js b/chrome/test/data/extensions/api_test/socket/api/background.js
|
| index cb799a762fbf6ac26894470ebcaf5656470ca030..576fd2e0112326304312dc0f21def97160fa4a09 100644
|
| --- a/chrome/test/data/extensions/api_test/socket/api/background.js
|
| +++ b/chrome/test/data/extensions/api_test/socket/api/background.js
|
| @@ -2,47 +2,63 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +// net/tools/testserver/testserver.py is picky about the format of what it
|
| +// calls its "echo" messages. One might go so far as to mutter to oneself that
|
| +// it isn't an echo server at all.
|
| +//
|
| +// The response is based on the request but obfuscated using a random key.
|
| +const request = "0100000005320000005hello";
|
| +var expectedResponsePattern = /0100000005320000005.{11}/;
|
| +
|
| const socket = chrome.experimental.socket;
|
| -const message = "helloECHO";
|
| -const address = "127.0.0.1";
|
| -var protocol = "none";
|
| +var address;
|
| +var bytesWritten = 0;
|
| +var dataAsString;
|
| +var dataRead = [];
|
| var port = -1;
|
| +var protocol = "none";
|
| var socketId = 0;
|
| -var dataRead = "";
|
| var succeeded = false;
|
| var waitCount = 0;
|
|
|
| -var testSocketCreation = function() {
|
| - function onCreate(socketInfo) {
|
| - chrome.test.assertTrue(socketInfo.socketId > 0);
|
| +// Many thanks to Dennis for his StackOverflow answer: http://goo.gl/UDanx
|
| +function string2ArrayBuffer(string, callback) {
|
| + var bb = new WebKitBlobBuilder();
|
| + bb.append(string);
|
| + var f = new FileReader();
|
| + f.onload = function(e) {
|
| + callback(e.target.result);
|
| + };
|
| + f.readAsArrayBuffer(bb.getBlob());
|
| +}
|
|
|
| - // TODO(miket): this doesn't work yet. It's possible this will become
|
| - // automatic, but either way we can't forget to clean up.
|
| - //socket.destroy(socketInfo.socketId);
|
| +function arrayBuffer2String(buf, callback) {
|
| + var bb = new WebKitBlobBuilder();
|
| + bb.append(buf);
|
| + var f = new FileReader();
|
| + f.onload = function(e) {
|
| + callback(e.target.result);
|
| + };
|
| + f.readAsText(bb.getBlob());
|
| +}
|
|
|
| - chrome.test.succeed();
|
| +function arrayBufferToArrayOfLongs(arrayBuffer) {
|
| + var longs = [];
|
| + var arrayBufferView = new Uint8Array(arrayBuffer);
|
| + for (var i = 0; i < arrayBufferView.length; ++i) {
|
| + longs[i] = arrayBufferView[i];
|
| }
|
| + return longs;
|
| +}
|
|
|
| - socket.create(protocol, address, port, {}, onCreate);
|
| -};
|
| -
|
| -// net/tools/testserver/testserver.py is picky about the format of what
|
| -// it calls its "echo" messages. One might go so far as to mutter to
|
| -// oneself that it isn't an echo server at all.
|
| -//
|
| -// The response is based on the request but obfuscated using a random
|
| -// key.
|
| -const request = "0100000005320000005hello";
|
| -var expectedResponsePattern = /0100000005320000005.{11}/;
|
| -
|
| -var address;
|
| -var protocol;
|
| -var port;
|
| -var socketId = 0;
|
| -var bytesWritten = 0;
|
| -var dataRead = "";
|
| -var succeeded = false;
|
| -var waitCount = 0;
|
| +function arrayOfLongsToArrayBuffer(longs) {
|
| + var arrayBuffer = new ArrayBuffer(longs.length);
|
| + var arrayBufferView = new Uint8Array(arrayBuffer);
|
| + for (var i = 0; i < longs.length; ++i) {
|
| + arrayBufferView[i] = longs[i];
|
| + }
|
| + return arrayBuffer;
|
| +}
|
|
|
| var testSocketCreation = function() {
|
| function onCreate(socketInfo) {
|
| @@ -50,6 +66,7 @@ var testSocketCreation = function() {
|
|
|
| // TODO(miket): this doesn't work yet. It's possible this will become
|
| // automatic, but either way we can't forget to clean up.
|
| + //
|
| //socket.destroy(socketInfo.socketId);
|
|
|
| chrome.test.succeed();
|
| @@ -59,11 +76,14 @@ var testSocketCreation = function() {
|
| };
|
|
|
| function onDataRead(readInfo) {
|
| - dataRead += readInfo.message;
|
| - if (dataRead.match(expectedResponsePattern)) {
|
| - succeeded = true;
|
| - chrome.test.succeed();
|
| - }
|
| + // TODO(miket): this isn't correct for multiple calls of onDataRead.
|
| + arrayBuffer2String(arrayOfLongsToArrayBuffer(readInfo.data), function(s) {
|
| + dataAsString = s; // save this for error reporting
|
| + if (s.match(expectedResponsePattern)) {
|
| + succeeded = true;
|
| + chrome.test.succeed();
|
| + }
|
| + });
|
| // Blocked. Wait for onEvent.
|
| }
|
|
|
| @@ -77,7 +97,10 @@ function onWriteComplete(writeInfo) {
|
|
|
| function onConnectComplete(connectResult) {
|
| if (connectResult == 0) {
|
| - socket.write(socketId, request, onWriteComplete);
|
| + string2ArrayBuffer(request, function(arrayBuffer) {
|
| + var longs = arrayBufferToArrayOfLongs(arrayBuffer);
|
| + socket.write(socketId, longs, onWriteComplete);
|
| + });
|
| }
|
| // Blocked. Wait for onEvent.
|
| }
|
| @@ -92,8 +115,7 @@ function onEvent(socketEvent) {
|
| if (socketEvent.type == "connectComplete") {
|
| onConnectComplete(socketEvent.resultCode);
|
| } else if (socketEvent.type == "dataRead") {
|
| - // TODO(miket): why one "message" and the other "data"?
|
| - onDataRead({message: socketEvent.data});
|
| + onDataRead({data: socketEvent.data});
|
| } else if (socketEvent.type == "writeComplete") {
|
| onWriteComplete(socketEvent.resultCode);
|
| } else {
|
| @@ -101,33 +123,13 @@ function onEvent(socketEvent) {
|
| }
|
| };
|
|
|
| -function onRead(readInfo) {
|
| - if (readInfo.message == message) {
|
| - succeeded = true;
|
| - chrome.test.succeed();
|
| - } else {
|
| - // The read blocked. Save what we've got so far, and wait for onEvent.
|
| - dataRead = readInfo.message;
|
| - }
|
| -}
|
| -
|
| -function onWrite(writeInfo) {
|
| - chrome.test.assertTrue(writeInfo.bytesWritten == message.length);
|
| - socket.read(socketId, onRead);
|
| -}
|
| -
|
| -function onConnect(connectResult) {
|
| - chrome.test.assertTrue(connectResult);
|
| - socket.write(socketId, message, onWrite);
|
| -}
|
| -
|
| function waitForBlockingOperation() {
|
| if (++waitCount < 10) {
|
| setTimeout(waitForBlockingOperation, 1000);
|
| } else {
|
| // We weren't able to succeed in the given time.
|
| chrome.test.fail("Operations didn't complete after " + waitCount + " " +
|
| - "seconds. Response so far was <" + dataRead + ">.");
|
| + "seconds. Response so far was <" + dataAsString + ">.");
|
| }
|
| }
|
|
|
|
|