///
///
import socks = require('../../socks-common/socks-headers');
import proxyintegrationtesttypes = require('./proxy-integration-test.types');
import ProxyIntegrationTester = proxyintegrationtesttypes.ProxyIntegrationTester;
import ReceivedDataEvent = proxyintegrationtesttypes.ReceivedDataEvent;
import arraybuffers = require('../../../../third_party/uproxy-lib/arraybuffers/arraybuffers');
import freedom_types = require('freedom.types');
function slowTestDescription(useChurn:boolean) {
var testerFactoryManager
:freedom_types.FreedomModuleFactoryManager;
var createTestModule = function(denyLocalhost?:boolean)
:ProxyIntegrationTester {
return testerFactoryManager(denyLocalhost, useChurn);
};
beforeEach((done) => {
freedom('files/freedom-module.json', { 'debug': 'debug' })
.then((freedomModuleFactoryManager) => {
testerFactoryManager = freedomModuleFactoryManager;
done();
});
});
afterEach(() => {
expect(testerFactoryManager).not.toBeUndefined();
// Close all created interfaces to the freedom module.
testerFactoryManager.close();
});
// The default TCP SYN timeout is two minutes, so to be safe we
// set a test timeout of four minutes.
jasmine.DEFAULT_TIMEOUT_INTERVAL = 240000;
// Opens 200 connections, sends 1 KB on each, and receives 250 KB on each
it('download load test', (done) => {
var blockSize = 1024;
var testBlock :ArrayBuffer = new ArrayBuffer(blockSize);
var repeat :number = 250;
var testModule = createTestModule();
testModule.setRepeat(repeat);
testModule.startEchoServer().then((port:number) => {
var connectionPromises :Promise[] = [];
for (var i = 0; i < 200; ++i) {
connectionPromises.push(testModule.connect(port));
}
return Promise.all(connectionPromises);
}).then((connectionIds:string[]) => {
var completions = connectionIds.map((connectionId:string) : Promise => {
var resolve :Function;
var result :Promise = new Promise((F, R) => { resolve = F; });
var isDone = false;
var outputString = '';
testModule.on('receivedData', (event:ReceivedDataEvent) => {
if (event.connectionId != connectionId) {
return;
}
expect(isDone).toBe(false);
if (event.response.byteLength === repeat * blockSize) {
isDone = true;
resolve();
}
});
return testModule.sendData(connectionId, testBlock).then(() => {
return result;
});
});
Promise.all(completions).then(done);
});
});
// Opens 200 connections, sends 250 KB on each, and receives 0 KB on each
it('upload load test', (done) => {
var size = 250 * 1024;
var testBlock :ArrayBuffer = new ArrayBuffer(size);
var testModule = createTestModule();
testModule.setRepeat(0); // Don't send a reply at all.
testModule.startEchoServer().then((port:number) => {
var connectionPromises :Promise[] = [];
for (var i = 0; i < 200; ++i) {
connectionPromises.push(testModule.connect(port));
}
return Promise.all(connectionPromises);
}).then((connectionIds:string[]) : Promise[] => {
return connectionIds.map((connectionId:string) : Promise => {
return testModule.sendData(connectionId, testBlock);
});
}).then((sendResults:Promise[]) : Promise<[any]> => {
return Promise.all(sendResults);
}).catch((e:any) => {
expect(e).toBeUndefined();
}).then(done);
});
it('100 MB echo load test', (done) => {
var size = 100 * 1024 * 1024; // Larger than the 16 MB internal buffer in Chrome.
var input = new ArrayBuffer(size);
var testModule = createTestModule();
testModule.startEchoServer().then((port:number) => {
return testModule.connect(port);
}).then((connectionId:string) => {
return testModule.echo(connectionId, input);
}).then((output:ArrayBuffer) => {
expect(output.byteLength).toEqual(input.byteLength);
expect(arraybuffers.byteEquality(input, output)).toBe(true);
}).catch((e:any) => {
expect(e).toBeUndefined();
}).then(done);
});
it('attempt to connect to a nonexistent IP address', (done) => {
var testModule = createTestModule();
// 192.0.2.0/24 is a reserved IP address range.
testModule.connect(80, '192.0.2.111').then((connectionId:string) => {
// This code should not run, because this is a reserved IP address.
expect(connectionId).toBeUndefined();
}).catch((e:{reply:socks.Reply}) => {
// The socket should time out after two minutes.
expect(e.reply).toEqual(socks.Reply.TTL_EXPIRED);
}).then(done);
});
}
describe('slow integration tests', function() {
slowTestDescription(false);
});
describe('slow integration tests with churn', function() {
slowTestDescription(true);
});