Mon 21 Jul 22:43:21 CEST 2025
This commit is contained in:
parent
7a94b1b767
commit
47b80e5f4a
894
js/ui/cordova/plugins/cordova-plugin-chrome-apps-sockets-tcp/tests/tests.js
vendored
Normal file
894
js/ui/cordova/plugins/cordova-plugin-chrome-apps-sockets-tcp/tests/tests.js
vendored
Normal file
|
@ -0,0 +1,894 @@
|
||||||
|
// Copyright (c) 2014 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.
|
||||||
|
|
||||||
|
function createData(size) {
|
||||||
|
var arr = new Uint8Array(size);
|
||||||
|
for (var i = 0; i < arr.length; i++) {
|
||||||
|
arr[i] = i % 256;
|
||||||
|
}
|
||||||
|
return arr.buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.defineManualTests = function(rootEl, addButton) {
|
||||||
|
var addr = '127.0.0.1';
|
||||||
|
var port = 12345;
|
||||||
|
var smallData = createData(256);
|
||||||
|
|
||||||
|
function receiveErrorListener(info) {
|
||||||
|
console.log('Client RecvError on socket: ' + info.socketId);
|
||||||
|
console.log(info);
|
||||||
|
chrome.sockets.tcp.disconnect(info.socketId);
|
||||||
|
chrome.sockets.tcp.close(info.socketId);
|
||||||
|
}
|
||||||
|
|
||||||
|
function receiveListener(info) {
|
||||||
|
console.log('Client Recv: success');
|
||||||
|
console.log(info);
|
||||||
|
if (info.data) {
|
||||||
|
var message = String.fromCharCode.apply(null, new Uint8Array(info.data));
|
||||||
|
console.log(message);
|
||||||
|
}
|
||||||
|
chrome.sockets.tcp.disconnect(info.socketId);
|
||||||
|
chrome.sockets.tcp.close(info.socketId);
|
||||||
|
|
||||||
|
if (info.uri) {
|
||||||
|
window.resolveLocalFileSystemURL(info.uri, function(fe) {
|
||||||
|
fe.file(function(file) {
|
||||||
|
var reader = new FileReader();
|
||||||
|
reader.onloadend = function(e) {
|
||||||
|
console.log('Onload End');
|
||||||
|
console.log(e);
|
||||||
|
console.log('result is ' + this.result);
|
||||||
|
};
|
||||||
|
|
||||||
|
reader.readAsText(file);
|
||||||
|
});
|
||||||
|
}, console.log);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function addReceiveListeners() {
|
||||||
|
chrome.sockets.tcp.onReceiveError.addListener(receiveErrorListener);
|
||||||
|
chrome.sockets.tcp.onReceive.addListener(receiveListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeReceiveListeners() {
|
||||||
|
chrome.sockets.tcp.onReceiveError.removeListener(receiveErrorListener);
|
||||||
|
chrome.sockets.tcp.onReceive.removeListener(receiveListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
function connect() {
|
||||||
|
chrome.sockets.tcp.create(function(createInfo) {
|
||||||
|
chrome.sockets.tcp.connect(createInfo.socketId, addr, port, function(result) {
|
||||||
|
if (result === 0) {
|
||||||
|
console.log('connect: success');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function connectAndPause() {
|
||||||
|
chrome.sockets.tcp.create(function(createInfo) {
|
||||||
|
console.log('create socket: ' + createInfo.socketId);
|
||||||
|
chrome.sockets.tcp.connect(createInfo.socketId, addr, port, function(result) {
|
||||||
|
if (result === 0) {
|
||||||
|
console.log('connect: success');
|
||||||
|
chrome.sockets.tcp.setPaused(createInfo.socketId, true, function() {
|
||||||
|
console.log('paused');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function connectAndSend(data) {
|
||||||
|
chrome.sockets.tcp.create(function(createInfo) {
|
||||||
|
chrome.sockets.tcp.connect(createInfo.socketId, addr, port, function(result) {
|
||||||
|
if (result === 0) {
|
||||||
|
chrome.sockets.tcp.send(createInfo.socketId, data, function(result) {
|
||||||
|
if (result.resultCode === 0) {
|
||||||
|
console.log('connectAndSend: success');
|
||||||
|
chrome.sockets.tcp.disconnect(createInfo.socketId);
|
||||||
|
chrome.sockets.tcp.close(createInfo.socketId);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function stringToArrayBuffer(string) {
|
||||||
|
var buf = new ArrayBuffer(string.length);
|
||||||
|
var bufView = new Uint8Array(buf);
|
||||||
|
for (var i = 0, strLen = string.length; i < strLen; i++) {
|
||||||
|
bufView[i] = string.charCodeAt(i);
|
||||||
|
}
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
function redirectToFile(append) {
|
||||||
|
var hostname = 'httpbin.org';
|
||||||
|
var requestString = 'GET /get HTTP/1.1\r\nHOST: ' + hostname + '\r\n\r\n';
|
||||||
|
var message = stringToArrayBuffer(requestString);
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
uri: cordova.file.applicationStorageDirectory + 'Documents/redirectToFile.txt',
|
||||||
|
append: append,
|
||||||
|
numBytes: 15
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log(options);
|
||||||
|
|
||||||
|
chrome.sockets.tcp.create(function(createInfo) {
|
||||||
|
|
||||||
|
chrome.sockets.tcp.pipeToFile(createInfo.socketId, options, function() {
|
||||||
|
console.log('file redirection is done');
|
||||||
|
});
|
||||||
|
|
||||||
|
chrome.sockets.tcp.connect(createInfo.socketId, hostname, 80, function(result) {
|
||||||
|
if (result === 0) {
|
||||||
|
chrome.sockets.tcp.send(createInfo.socketId, message, function(result) {
|
||||||
|
console.log('send result: ' + result);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function connectSecureAndSend() {
|
||||||
|
var hostname = 'httpbin.org';
|
||||||
|
var requestString = 'GET /get HTTP/1.1\r\nHOST: ' + hostname + '\r\n\r\n';
|
||||||
|
var message = stringToArrayBuffer(requestString);
|
||||||
|
|
||||||
|
chrome.sockets.tcp.create(function(createInfo) {
|
||||||
|
// Set paused to true to prevent read consume TLS handshake data, native
|
||||||
|
// readling loop will not pause/abort pending read when set paused after a
|
||||||
|
// connection has established.
|
||||||
|
chrome.sockets.tcp.setPaused(createInfo.socketId, true, function() {
|
||||||
|
chrome.sockets.tcp.connect(createInfo.socketId, hostname, 443, function(result) {
|
||||||
|
if (result === 0) {
|
||||||
|
chrome.sockets.tcp.secure(createInfo.socketId, {tlsVersion: {min: 'ssl3', max: 'tls1.2'}}, function(result) {
|
||||||
|
if (result !== 0) {
|
||||||
|
console.log('secure connection failed: ' + result);
|
||||||
|
}
|
||||||
|
|
||||||
|
chrome.sockets.tcp.setPaused(createInfo.socketId, false, function() {
|
||||||
|
// Test secure send multiple times to ensure that buffer in Android is manipulated correctly.
|
||||||
|
for (var i = 0; i < 3; i++) {
|
||||||
|
(function(i) {
|
||||||
|
chrome.sockets.tcp.send(createInfo.socketId, message, function(result) {
|
||||||
|
if (result.resultCode === 0) {
|
||||||
|
console.log('connectSecureAndSend: success ' + i);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// This method should fail on iOS and Desktop.
|
||||||
|
function simpleStartTLS() {
|
||||||
|
|
||||||
|
var startTLSReceiver = function(info) {
|
||||||
|
var message = String.fromCharCode.apply(null, new Uint8Array(info.data));
|
||||||
|
if (message.indexOf('Ready to start TLS' > -1)) {
|
||||||
|
chrome.sockets.tcp.secure(info.socketId, function(result) {
|
||||||
|
console.log('secure result:' + result);
|
||||||
|
chrome.sockets.tcp.onReceive.removeListener(startTLSReceiver);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
chrome.sockets.tcp.onReceive.addListener(startTLSReceiver);
|
||||||
|
|
||||||
|
var addr = 'smtp.gmail.com';
|
||||||
|
var port = 25;
|
||||||
|
var command = stringToArrayBuffer('HELO me.com\r\nSTARTTLS\r\n');
|
||||||
|
|
||||||
|
chrome.sockets.tcp.create(function(createInfo) {
|
||||||
|
chrome.sockets.tcp.connect(createInfo.socketId, addr, port, function(result) {
|
||||||
|
chrome.sockets.tcp.send(createInfo.socketId, command, function(result) {
|
||||||
|
if (result === 0) {
|
||||||
|
console.log('send command success');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function send(data) {
|
||||||
|
chrome.sockets.tcp.create(function(createInfo) {
|
||||||
|
chrome.sockets.tcp.send(createInfo.socketId, data, function(result) {
|
||||||
|
if (result.resultCode === 0) {
|
||||||
|
console.log('send: success');
|
||||||
|
chrome.sockets.tcp.close(createInfo.socketId);
|
||||||
|
} else {
|
||||||
|
console.log('send error: ' + result.resultCode);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function disconnectAndSend(data) {
|
||||||
|
chrome.sockets.tcp.create(function(createInfo) {
|
||||||
|
chrome.sockets.tcp.disconnect(createInfo.socketId, function() {
|
||||||
|
chrome.sockets.tcp.send(createInfo.socketId, data, function(result) {
|
||||||
|
if (result.resultCode === 0) {
|
||||||
|
console.log('send: success');
|
||||||
|
chrome.sockets.tcp.close(createInfo.socketId);
|
||||||
|
} else {
|
||||||
|
console.log('send error: ' + result.resultCode);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSockets() {
|
||||||
|
chrome.sockets.tcp.getSockets(function(socketsInfo) {
|
||||||
|
if (!socketsInfo) return;
|
||||||
|
for (var i = 0; i < socketsInfo.length; i++) {
|
||||||
|
console.log(socketsInfo[i]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateSocket() {
|
||||||
|
chrome.sockets.tcp.create({}, function(createInfo) {
|
||||||
|
updatedProperties = {
|
||||||
|
persistent: true,
|
||||||
|
name: 'testUpdate',
|
||||||
|
bufferSize: 2048
|
||||||
|
};
|
||||||
|
|
||||||
|
chrome.sockets.tcp.update(createInfo.socketId, updatedProperties);
|
||||||
|
|
||||||
|
chrome.sockets.tcp.getInfo(createInfo.socketId, function(socketInfo) {
|
||||||
|
console.log(socketInfo);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function closeSockets() {
|
||||||
|
chrome.sockets.tcp.getSockets(function(socketsInfo) {
|
||||||
|
if (!socketsInfo) return;
|
||||||
|
for (var i = 0; i < socketsInfo.length; i++) {
|
||||||
|
console.log('closing socket: ' + socketsInfo[i].socketId);
|
||||||
|
chrome.sockets.tcp.close(socketsInfo[i].socketId);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function initPage() {
|
||||||
|
console.log('Run this in terminal:');
|
||||||
|
console.log('while true; do');
|
||||||
|
console.log(' (nc -lv 12345 | xxd) || break; echo;');
|
||||||
|
console.log('done');
|
||||||
|
|
||||||
|
addButton('add receive listeners', function() {
|
||||||
|
addReceiveListeners();
|
||||||
|
});
|
||||||
|
|
||||||
|
addButton('remove receive listeners', function() {
|
||||||
|
removeReceiveListeners();
|
||||||
|
});
|
||||||
|
|
||||||
|
addButton('TCP: connect', function() {
|
||||||
|
connect();
|
||||||
|
});
|
||||||
|
|
||||||
|
addButton('TCP: connect & paused', function() {
|
||||||
|
connectAndPause();
|
||||||
|
});
|
||||||
|
|
||||||
|
addButton('TCP: connect & send', function() {
|
||||||
|
connectAndSend(smallData);
|
||||||
|
});
|
||||||
|
|
||||||
|
addButton('TCP: test redirect to file with append', function() {
|
||||||
|
redirectToFile(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
addButton('TCP: test redirect to file without append', function() {
|
||||||
|
redirectToFile(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
addButton('TCP: connect & secure & send', function() {
|
||||||
|
connectSecureAndSend();
|
||||||
|
});
|
||||||
|
|
||||||
|
addButton('TCP: test startTLS', function() {
|
||||||
|
simpleStartTLS();
|
||||||
|
});
|
||||||
|
|
||||||
|
addButton('TCP: send to unconnected', function() {
|
||||||
|
send(smallData);
|
||||||
|
});
|
||||||
|
|
||||||
|
addButton('TCP: unconnected & send', function() {
|
||||||
|
disconnectAndSend(smallData);
|
||||||
|
});
|
||||||
|
|
||||||
|
addButton('TCP: update socket', function() {
|
||||||
|
updateSocket();
|
||||||
|
});
|
||||||
|
|
||||||
|
addButton('TCP: get sockets', function() {
|
||||||
|
getSockets();
|
||||||
|
});
|
||||||
|
|
||||||
|
addButton('TCP: close sockets', function() {
|
||||||
|
closeSockets();
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
initPage();
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.defineAutoTests = function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
require('cordova-plugin-chrome-apps-test-framework.jasmine_helpers').addJasmineHelpers();
|
||||||
|
|
||||||
|
// constants
|
||||||
|
var bindAddr = '0.0.0.0';
|
||||||
|
var connectAddr = '127.0.0.1';
|
||||||
|
var serverPort = Math.floor(Math.random() * (65535-1024)) + 1024; // random in 1024 -> 65535
|
||||||
|
var smallData = createData(300);
|
||||||
|
var bigData = createData(256 * 1024 + 1); // +1 to not be a multiple of buffer size.
|
||||||
|
|
||||||
|
// Socket management -- Make sure we clean up sockets after each test, even upon failure
|
||||||
|
var clientSockets = [];
|
||||||
|
var serverSockets = [];
|
||||||
|
|
||||||
|
function createSocket(properties, callback) {
|
||||||
|
if (typeof properties == 'function') {
|
||||||
|
callback = properties;
|
||||||
|
properties = {};
|
||||||
|
}
|
||||||
|
chrome.sockets.tcp.create(properties, function(clientCreateInfo) {
|
||||||
|
expect(clientCreateInfo).toBeTruthy();
|
||||||
|
expect(clientCreateInfo.socketId).toBeDefined();
|
||||||
|
clientSockets.push(clientCreateInfo);
|
||||||
|
chrome.sockets.tcpServer.create(properties, function(serverCreateInfo) {
|
||||||
|
expect(serverCreateInfo).toBeTruthy();
|
||||||
|
expect(serverCreateInfo.socketId).toBeDefined();
|
||||||
|
serverSockets.push(serverCreateInfo);
|
||||||
|
callback();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function createSockets(count, callback) {
|
||||||
|
if (!count)
|
||||||
|
return setTimeout(callback, 0);
|
||||||
|
createSocket(createSockets.bind(null, count-1, callback));
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeEach(function() {
|
||||||
|
var customMatchers = {
|
||||||
|
toBeValidTcpReadResultEqualTo: function(util, customEqualityTesters) {
|
||||||
|
return {
|
||||||
|
compare: function(actual, expected) {
|
||||||
|
if (!actual) return { message:'c', pass: false };
|
||||||
|
return customMatchers.toBeArrayBuffer(util, customEqualityTesters).compare(actual.data, expected);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
toBeArrayBuffer: function(util, customEqualityTesters) {
|
||||||
|
return {
|
||||||
|
compare: function(actual, expected) {
|
||||||
|
if (Object.prototype.toString.call(expected).slice(8, -1) !== "ArrayBuffer")
|
||||||
|
throw new Error("toBeValidTcpReadResultEqualTo expects an ArrayBuffer");
|
||||||
|
if (!actual) return { message:'a', pass: false };
|
||||||
|
if (Object.prototype.toString.call(actual).slice(8, -1) !== "ArrayBuffer") return { message:'b', pass: false };
|
||||||
|
|
||||||
|
var sent = new Uint8Array(expected);
|
||||||
|
var recv = new Uint8Array(actual);
|
||||||
|
if (recv.length !== sent.length) {
|
||||||
|
return {
|
||||||
|
pass: false,
|
||||||
|
message: "expected len: " + expected.byteLength + " got len: " + actual.byteLength
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < recv.length; i++) {
|
||||||
|
if (recv[i] !== sent[i]) {
|
||||||
|
result.pass = false;
|
||||||
|
return { pass: false, message: "bytes differed at index " + i }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {pass:true};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.addMatchers(customMatchers);
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(function(done) {
|
||||||
|
createSockets(1, done);
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(function() {
|
||||||
|
clientSockets.forEach(function(createInfo) {
|
||||||
|
chrome.sockets.tcp.disconnect(createInfo.socketId);
|
||||||
|
chrome.sockets.tcp.close(createInfo.socketId);
|
||||||
|
});
|
||||||
|
clientSockets = [];
|
||||||
|
|
||||||
|
serverSockets.forEach(function(createInfo) {
|
||||||
|
chrome.sockets.tcpServer.disconnect(createInfo.socketId);
|
||||||
|
chrome.sockets.tcpServer.close(createInfo.socketId);
|
||||||
|
});
|
||||||
|
serverSockets = [];
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should contain definitions', function() {
|
||||||
|
expect(chrome.sockets.tcp.create).toBeDefined();
|
||||||
|
expect(chrome.sockets.tcp.update).toBeDefined();
|
||||||
|
expect(chrome.sockets.tcp.setPaused).toBeDefined();
|
||||||
|
expect(chrome.sockets.tcp.setKeepAlive).toBeDefined();
|
||||||
|
expect(chrome.sockets.tcp.setNoDelay).toBeDefined();
|
||||||
|
expect(chrome.sockets.tcp.connect).toBeDefined();
|
||||||
|
expect(chrome.sockets.tcp.disconnect).toBeDefined();
|
||||||
|
expect(chrome.sockets.tcp.secure).toBeDefined();
|
||||||
|
expect(chrome.sockets.tcp.send).toBeDefined();
|
||||||
|
expect(chrome.sockets.tcp.close).toBeDefined();
|
||||||
|
expect(chrome.sockets.tcp.getInfo).toBeDefined();
|
||||||
|
expect(chrome.sockets.tcp.getSockets).toBeDefined();
|
||||||
|
|
||||||
|
expect(chrome.sockets.tcpServer.create).toBeDefined();
|
||||||
|
expect(chrome.sockets.tcpServer.update).toBeDefined();
|
||||||
|
expect(chrome.sockets.tcpServer.setPaused).toBeDefined();
|
||||||
|
expect(chrome.sockets.tcpServer.listen).toBeDefined();
|
||||||
|
expect(chrome.sockets.tcpServer.disconnect).toBeDefined();
|
||||||
|
expect(chrome.sockets.tcpServer.close).toBeDefined();
|
||||||
|
expect(chrome.sockets.tcpServer.getInfo).toBeDefined();
|
||||||
|
expect(chrome.sockets.tcpServer.getSockets).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('TCP and TCPServer', function() {
|
||||||
|
afterEach(function() {
|
||||||
|
chrome.sockets.tcpServer.onAccept.listeners.length = 0;
|
||||||
|
chrome.sockets.tcp.onReceive.listeners.length = 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
it('port is available (sanity test)', function(done) {
|
||||||
|
chrome.sockets.tcpServer.listen(serverSockets[0].socketId, bindAddr, serverPort, function(listenResult) {
|
||||||
|
expect(listenResult).toEqual(0);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('TCP connect to TCPServer', function(done) {
|
||||||
|
chrome.sockets.tcpServer.listen(serverSockets[0].socketId, bindAddr, serverPort, function(listenResult) {
|
||||||
|
expect(listenResult).toEqual(0);
|
||||||
|
chrome.sockets.tcp.connect(clientSockets[0].socketId, connectAddr, serverPort, function(connectResult) {
|
||||||
|
expect(connectResult).toEqual(0);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('TCP getInfo works', function(done) {
|
||||||
|
chrome.sockets.tcpServer.listen(serverSockets[0].socketId, bindAddr, serverPort, function(listenResult) {
|
||||||
|
expect(listenResult).toEqual(0);
|
||||||
|
chrome.sockets.tcp.connect(clientSockets[0].socketId, connectAddr, serverPort, function(connectResult) {
|
||||||
|
expect(connectResult).toEqual(0);
|
||||||
|
chrome.sockets.tcp.getInfo(clientSockets[0].socketId, function(socketInfo) {
|
||||||
|
expect(socketInfo.socketId).toBeTruthy();
|
||||||
|
expect(socketInfo.connected).toBe(true);
|
||||||
|
expect(socketInfo.paused).toBe(false);
|
||||||
|
expect(socketInfo.localAddress).toBeTruthy();
|
||||||
|
expect(socketInfo.localPort).toBeTruthy();
|
||||||
|
expect(socketInfo.peerAddress).toBeTruthy();
|
||||||
|
expect(socketInfo.peerPort).toBeTruthy();
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('TCPServer getInfo works', function(done) {
|
||||||
|
chrome.sockets.tcpServer.listen(serverSockets[0].socketId, bindAddr, serverPort, function(listenResult) {
|
||||||
|
expect(listenResult).toEqual(0);
|
||||||
|
chrome.sockets.tcp.connect(clientSockets[0].socketId, connectAddr, serverPort, function(connectResult) {
|
||||||
|
expect(connectResult).toEqual(0);
|
||||||
|
chrome.sockets.tcpServer.getInfo(serverSockets[0].socketId, function(socketInfo) {
|
||||||
|
expect(socketInfo.socketId).toBeTruthy();
|
||||||
|
expect(socketInfo.paused).toBe(false);
|
||||||
|
expect(socketInfo.localAddress).toBeTruthy();
|
||||||
|
expect(socketInfo.localPort).toBeTruthy();
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('update TCP socket', function(done) {
|
||||||
|
var updatedProperties = {
|
||||||
|
persistent: true,
|
||||||
|
name: 'testUpdate',
|
||||||
|
bufferSize: 2048
|
||||||
|
};
|
||||||
|
|
||||||
|
chrome.sockets.tcp.update(clientSockets[0].socketId, updatedProperties, function() {
|
||||||
|
chrome.sockets.tcp.getInfo(clientSockets[0].socketId, function(socketInfo) {
|
||||||
|
expect(socketInfo.persistent).toEqual(updatedProperties.persistent);
|
||||||
|
expect(socketInfo.bufferSize).toEqual(updatedProperties.bufferSize);
|
||||||
|
expect(socketInfo.name).toEqual(updatedProperties.name);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('update TCPServer socket', function(done) {
|
||||||
|
var updatedProperties = {
|
||||||
|
persistent: true,
|
||||||
|
name: 'testUpdate'
|
||||||
|
};
|
||||||
|
|
||||||
|
chrome.sockets.tcpServer.update(serverSockets[0].socketId, updatedProperties, function() {
|
||||||
|
chrome.sockets.tcpServer.getInfo(serverSockets[0].socketId, function(socketInfo) {
|
||||||
|
expect(socketInfo.persistent).toEqual(updatedProperties.persistent);
|
||||||
|
expect(socketInfo.name).toEqual(updatedProperties.name);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('TCP connect write', function(done) {
|
||||||
|
var acceptListener = function(info) {
|
||||||
|
expect(info.socketId).toEqual(serverSockets[0].socketId);
|
||||||
|
expect(info.clientSocketId).toBeTruthy();
|
||||||
|
chrome.sockets.tcp.setPaused(info.clientSocketId, false, function() {
|
||||||
|
chrome.sockets.tcpServer.onAccept.removeListener(acceptListener);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
chrome.sockets.tcpServer.onAccept.addListener(acceptListener);
|
||||||
|
|
||||||
|
var recvListener = function(info) {
|
||||||
|
expect(info.socketId).not.toEqual(clientSockets[0].socketId);
|
||||||
|
expect(info).toBeValidTcpReadResultEqualTo(smallData);
|
||||||
|
chrome.sockets.tcp.onReceive.removeListener(recvListener);
|
||||||
|
done();
|
||||||
|
};
|
||||||
|
chrome.sockets.tcp.onReceive.addListener(recvListener);
|
||||||
|
|
||||||
|
chrome.sockets.tcpServer.listen(serverSockets[0].socketId, bindAddr, serverPort, function(listenResult) {
|
||||||
|
expect(listenResult).toEqual(0);
|
||||||
|
chrome.sockets.tcp.connect(clientSockets[0].socketId, connectAddr, serverPort, function(connectResult) {
|
||||||
|
expect(connectResult).toEqual(0);
|
||||||
|
chrome.sockets.tcp.send(clientSockets[0].socketId, smallData, function(result) {
|
||||||
|
expect(result.resultCode).toEqual(0);
|
||||||
|
expect(result.bytesSent).toEqual(smallData.byteLength);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('TCP connect write big', function(done) {
|
||||||
|
var acceptListener = function(info) {
|
||||||
|
expect(info.socketId).toEqual(serverSockets[0].socketId);
|
||||||
|
expect(info.clientSocketId).toBeTruthy();
|
||||||
|
chrome.sockets.tcp.setPaused(info.clientSocketId, false, function() {
|
||||||
|
chrome.sockets.tcpServer.onAccept.removeListener(acceptListener);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
chrome.sockets.tcpServer.onAccept.addListener(acceptListener);
|
||||||
|
|
||||||
|
var amountReceived = 0;
|
||||||
|
|
||||||
|
var recvListener = function(info) {
|
||||||
|
expect(info.socketId).not.toEqual(clientSockets[0].socketId);
|
||||||
|
expect(info.data).toBeArrayBuffer(bigData.slice(amountReceived, amountReceived + info.data.byteLength));
|
||||||
|
amountReceived += info.data.byteLength;
|
||||||
|
if (amountReceived == bigData.byteLength) {
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
chrome.sockets.tcp.onReceive.addListener(recvListener);
|
||||||
|
|
||||||
|
chrome.sockets.tcpServer.listen(serverSockets[0].socketId, bindAddr, serverPort, function(listenResult) {
|
||||||
|
expect(listenResult).toEqual(0);
|
||||||
|
chrome.sockets.tcp.connect(clientSockets[0].socketId, connectAddr, serverPort, function(connectResult) {
|
||||||
|
expect(connectResult).toEqual(0);
|
||||||
|
chrome.sockets.tcp.send(clientSockets[0].socketId, bigData, function(result) {
|
||||||
|
expect(result.resultCode).toEqual(0);
|
||||||
|
expect(result.bytesSent).toEqual(bigData.byteLength);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}, 4000);
|
||||||
|
|
||||||
|
it('TCPServer connect write', function(done) {
|
||||||
|
var acceptListener = function(info) {
|
||||||
|
expect(info.socketId).toEqual(serverSockets[0].socketId);
|
||||||
|
expect(info.clientSocketId).toBeTruthy();
|
||||||
|
chrome.sockets.tcp.send(info.clientSocketId, smallData, function(result) {
|
||||||
|
expect(result.resultCode).toEqual(0);
|
||||||
|
expect(result.bytesSent).toEqual(smallData.byteLength);
|
||||||
|
chrome.sockets.tcpServer.onAccept.removeListener(acceptListener);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
chrome.sockets.tcpServer.onAccept.addListener(acceptListener);
|
||||||
|
|
||||||
|
var recvListener = function(info) {
|
||||||
|
expect(info.socketId).toEqual(clientSockets[0].socketId);
|
||||||
|
expect(info).toBeValidTcpReadResultEqualTo(smallData);
|
||||||
|
chrome.sockets.tcp.onReceive.removeListener(recvListener);
|
||||||
|
done();
|
||||||
|
};
|
||||||
|
chrome.sockets.tcp.onReceive.addListener(recvListener);
|
||||||
|
|
||||||
|
chrome.sockets.tcpServer.listen(serverSockets[0].socketId, bindAddr, serverPort, function(listenResult) {
|
||||||
|
expect(listenResult).toEqual(0);
|
||||||
|
chrome.sockets.tcp.connect(clientSockets[0].socketId, connectAddr, serverPort, function(connectResult) {
|
||||||
|
expect(connectResult).toEqual(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describeExcludeChrome('fail on desktop', function() {
|
||||||
|
|
||||||
|
it('TCP file redirect partial data', function(done) {
|
||||||
|
var acceptListener = function(info) {
|
||||||
|
expect(info.socketId).toEqual(serverSockets[0].socketId);
|
||||||
|
expect(info.clientSocketId).toBeTruthy();
|
||||||
|
chrome.sockets.tcp.send(info.clientSocketId, smallData, function(result) {
|
||||||
|
expect(result.resultCode).toEqual(0);
|
||||||
|
expect(result.bytesSent).toEqual(smallData.byteLength);
|
||||||
|
chrome.sockets.tcpServer.onAccept.removeListener(acceptListener);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
chrome.sockets.tcpServer.onAccept.addListener(acceptListener);
|
||||||
|
|
||||||
|
var pipeOptions = {
|
||||||
|
uri: cordova.file.applicationStorageDirectory + 'Documents/redirectToFilePartial.txt',
|
||||||
|
append: false,
|
||||||
|
numBytes: 128
|
||||||
|
};
|
||||||
|
|
||||||
|
var callCounter = 0;
|
||||||
|
var recvListener = function(info) {
|
||||||
|
callCounter++;
|
||||||
|
if (callCounter === 1) {
|
||||||
|
expect(info.socketId).toEqual(clientSockets[0].socketId);
|
||||||
|
expect(info.uri).toBeDefined();
|
||||||
|
expect(info.bytesRead).toEqual(pipeOptions.numBytes);
|
||||||
|
} else {
|
||||||
|
window.resolveLocalFileSystemURL(pipeOptions.uri, function(fe) {
|
||||||
|
fe.file(function(file) {
|
||||||
|
var reader = new FileReader();
|
||||||
|
reader.onloadend = function() {
|
||||||
|
var allData = new Uint8Array(info.data.byteLength + pipeOptions.numBytes);
|
||||||
|
allData.set(new Uint8Array(this.result), 0);
|
||||||
|
allData.set(new Uint8Array(info.data), pipeOptions.numBytes);
|
||||||
|
expect(allData.buffer).toBeArrayBuffer(smallData);
|
||||||
|
chrome.sockets.tcp.onReceive.removeListener(recvListener);
|
||||||
|
done();
|
||||||
|
};
|
||||||
|
reader.readAsArrayBuffer(file);
|
||||||
|
});
|
||||||
|
}, null);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
chrome.sockets.tcp.onReceive.addListener(recvListener);
|
||||||
|
|
||||||
|
chrome.sockets.tcpServer.listen(serverSockets[0].socketId, bindAddr, serverPort, function(listenResult) {
|
||||||
|
expect(listenResult).toEqual(0);
|
||||||
|
chrome.sockets.tcp.pipeToFile(clientSockets[0].socketId, pipeOptions, function() {});
|
||||||
|
chrome.sockets.tcp.connect(clientSockets[0].socketId, connectAddr, serverPort, function(connectResult) {
|
||||||
|
expect(connectResult).toEqual(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it('TCP file redirect all data', function(done) {
|
||||||
|
var acceptListener = function(info) {
|
||||||
|
expect(info.socketId).toEqual(serverSockets[0].socketId);
|
||||||
|
expect(info.clientSocketId).toBeTruthy();
|
||||||
|
chrome.sockets.tcp.send(info.clientSocketId, smallData, function(result) {
|
||||||
|
expect(result.resultCode).toEqual(0);
|
||||||
|
expect(result.bytesSent).toEqual(smallData.byteLength);
|
||||||
|
chrome.sockets.tcpServer.onAccept.removeListener(acceptListener);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
chrome.sockets.tcpServer.onAccept.addListener(acceptListener);
|
||||||
|
|
||||||
|
var recvListener = function(info) {
|
||||||
|
expect(info.socketId).toEqual(clientSockets[0].socketId);
|
||||||
|
expect(info.uri).toBeDefined();
|
||||||
|
chrome.sockets.tcp.onReceive.removeListener(recvListener);
|
||||||
|
};
|
||||||
|
chrome.sockets.tcp.onReceive.addListener(recvListener);
|
||||||
|
|
||||||
|
chrome.sockets.tcpServer.listen(serverSockets[0].socketId, bindAddr, serverPort, function(listenResult) {
|
||||||
|
expect(listenResult).toEqual(0);
|
||||||
|
|
||||||
|
var pipeOptions = {
|
||||||
|
uri: cordova.file.applicationStorageDirectory + 'Documents/redirectToFileAll.txt',
|
||||||
|
append: false,
|
||||||
|
numBytes: smallData.byteLength
|
||||||
|
};
|
||||||
|
|
||||||
|
chrome.sockets.tcp.pipeToFile(clientSockets[0].socketId, pipeOptions, function() {
|
||||||
|
window.resolveLocalFileSystemURL(pipeOptions.uri, function(fe) {
|
||||||
|
fe.file(function(file) {
|
||||||
|
var reader = new FileReader();
|
||||||
|
reader.onloadend = function() {
|
||||||
|
expect(this.result.byteLength).toBe(smallData.byteLength);
|
||||||
|
expect(this.result).toBeArrayBuffer(smallData);
|
||||||
|
done();
|
||||||
|
};
|
||||||
|
reader.readAsArrayBuffer(file);
|
||||||
|
});
|
||||||
|
}, null);
|
||||||
|
});
|
||||||
|
|
||||||
|
chrome.sockets.tcp.connect(clientSockets[0].socketId, connectAddr, serverPort, function(connectResult) {
|
||||||
|
expect(connectResult).toEqual(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('TCP secure get https website', function(done) {
|
||||||
|
var hostname = 'ajax.googleapis.com';
|
||||||
|
var port = 443;
|
||||||
|
var requestString = 'GET /ajax/libs/jquery/2.1.3/jquery.min.js HTTP/1.1\r\nHOST: ' + hostname + '\r\n\r\n';
|
||||||
|
var request = new ArrayBuffer(requestString.length);
|
||||||
|
var reqView = new Uint8Array(request);
|
||||||
|
for (var i = 0, strLen = requestString.length; i < strLen; i++) {
|
||||||
|
reqView[i] = requestString.charCodeAt(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
var amountReceived = 0;
|
||||||
|
var timeoutId = setTimeout(function() {
|
||||||
|
console.warn('jquery only got: ' + amountReceived + ' of 84320 bytes');
|
||||||
|
}, 7000);
|
||||||
|
|
||||||
|
var recvListener = function(info) {
|
||||||
|
expect(info.socketId).toEqual(clientSockets[0].socketId);
|
||||||
|
amountReceived += info.data.byteLength;
|
||||||
|
// 84320 is size of body, but will be more from headers.
|
||||||
|
if (amountReceived > 84320) {
|
||||||
|
clearTimeout(timeoutId);
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
chrome.sockets.tcp.onReceive.addListener(recvListener);
|
||||||
|
|
||||||
|
chrome.sockets.tcp.setPaused(clientSockets[0].socketId, true, function() {
|
||||||
|
chrome.sockets.tcp.connect(clientSockets[0].socketId, hostname, port, function(connectResult) {
|
||||||
|
expect(connectResult).toEqual(0);
|
||||||
|
chrome.sockets.tcp.secure(clientSockets[0].socketId, function(secureResult) {
|
||||||
|
expect(secureResult).toEqual(0);
|
||||||
|
chrome.sockets.tcp.send(clientSockets[0].socketId, request, function(sendResult) {
|
||||||
|
expect(sendResult.resultCode).toEqual(0);
|
||||||
|
expect(sendResult.bytesSent).toEqual(requestString.length);
|
||||||
|
chrome.sockets.tcp.setPaused(clientSockets[0].socketId, false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}, 7000);
|
||||||
|
|
||||||
|
it('TCP secure get https website three times', function(done) {
|
||||||
|
var hostname = 'httpbin.org';
|
||||||
|
var port = 443;
|
||||||
|
var requestString = 'GET /get HTTP/1.1\r\nHOST: ' + hostname + '\r\n\r\n';
|
||||||
|
var request = new ArrayBuffer(requestString.length);
|
||||||
|
var reqView = new Uint8Array(request);
|
||||||
|
var recvCounter = 0;
|
||||||
|
for (var i = 0, strLen = requestString.length; i < strLen; i++) {
|
||||||
|
reqView[i] = requestString.charCodeAt(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
var recvListener = function(info) {
|
||||||
|
recvCounter++;
|
||||||
|
expect(info.socketId).toEqual(clientSockets[0].socketId);
|
||||||
|
expect(info.data.byteLength).toBeGreaterThan(0);
|
||||||
|
if (recvCounter == 3) {
|
||||||
|
chrome.sockets.tcp.onReceive.removeListener(recvListener);
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
chrome.sockets.tcp.onReceive.addListener(recvListener);
|
||||||
|
|
||||||
|
chrome.sockets.tcp.setPaused(clientSockets[0].socketId, true, function() {
|
||||||
|
chrome.sockets.tcp.connect(clientSockets[0].socketId, hostname, port, function(connectResult) {
|
||||||
|
expect(connectResult).toEqual(0);
|
||||||
|
chrome.sockets.tcp.secure(clientSockets[0].socketId, function(secureResult) {
|
||||||
|
expect(secureResult).toEqual(0);
|
||||||
|
for (var i = 0; i < 3; i++) {
|
||||||
|
chrome.sockets.tcp.send(clientSockets[0].socketId, request, function(sendResult) {
|
||||||
|
expect(sendResult.resultCode).toEqual(0);
|
||||||
|
expect(sendResult.bytesSent).toEqual(requestString.length);
|
||||||
|
chrome.sockets.tcp.setPaused(clientSockets[0].socketId, false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}, 5000);
|
||||||
|
|
||||||
|
it('TLS version control', function(done) {
|
||||||
|
var hostname = 'www.howsmyssl.com';
|
||||||
|
var port = 443;
|
||||||
|
var requestString = 'GET /a/check HTTP/1.1\r\nHOST: ' + hostname + '\r\n\r\n';
|
||||||
|
var request = new ArrayBuffer(requestString.length);
|
||||||
|
var reqView = new Uint8Array(request);
|
||||||
|
for (var i = 0, strLen = requestString.length; i < strLen; i++) {
|
||||||
|
reqView[i] = requestString.charCodeAt(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
var decoder = new TextDecoder();
|
||||||
|
var response = '';
|
||||||
|
|
||||||
|
var checkResponse = function() {
|
||||||
|
var parts = response.split('\r\n\r\n');
|
||||||
|
if (parts.length < 2) {
|
||||||
|
return; // We haven't hit the end of the headers yet.
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
var a = JSON.parse(parts[1]);
|
||||||
|
expect(a.tls_version).toEqual('TLS 1.2');
|
||||||
|
done();
|
||||||
|
} catch (e) {
|
||||||
|
// Probably the response is just incomplete.
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var recvListener = function(info) {
|
||||||
|
expect(info.socketId).toEqual(clientSockets[0].socketId);
|
||||||
|
response += decoder.decode(info.data);
|
||||||
|
checkResponse();
|
||||||
|
};
|
||||||
|
chrome.sockets.tcp.onReceive.addListener(recvListener);
|
||||||
|
|
||||||
|
chrome.sockets.tcp.setPaused(clientSockets[0].socketId, true, function() {
|
||||||
|
chrome.sockets.tcp.connect(clientSockets[0].socketId, hostname, port, function(connectResult) {
|
||||||
|
expect(connectResult).toEqual(0);
|
||||||
|
chrome.sockets.tcp.secure(clientSockets[0].socketId, {tlsVersion: {min: 'tls1.2', max: 'tls1.2'}}, function(secureResult) {
|
||||||
|
expect(secureResult).toEqual(0);
|
||||||
|
chrome.sockets.tcp.send(clientSockets[0].socketId, request, function(sendResult) {
|
||||||
|
expect(sendResult.resultCode).toEqual(0);
|
||||||
|
expect(sendResult.bytesSent).toEqual(requestString.length);
|
||||||
|
chrome.sockets.tcp.setPaused(clientSockets[0].socketId, false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}, 7000);
|
||||||
|
|
||||||
|
it('TLS failure detection', function(done) {
|
||||||
|
var hostname = 'google.com';
|
||||||
|
var port = 80; // Not a TLS server!
|
||||||
|
chrome.sockets.tcp.setPaused(clientSockets[0].socketId, true, function() {
|
||||||
|
chrome.sockets.tcp.connect(clientSockets[0].socketId, hostname, port, function(connectResult) {
|
||||||
|
expect(connectResult).toEqual(0);
|
||||||
|
chrome.sockets.tcp.secure(clientSockets[0].socketId, function(secureResult) {
|
||||||
|
expect(secureResult).not.toEqual(0);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}, 7000);
|
||||||
|
});
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user