signal-desktop/libtextsecure/test/websocket-resources_test.js

209 lines
6.9 KiB
JavaScript
Raw Normal View History

2018-05-02 16:51:22 +00:00
(function() {
2018-07-21 21:51:20 +00:00
describe('WebSocket-Resource', () => {
describe('requests and responses', () => {
it('receives requests and sends responses', done => {
2018-05-02 16:51:22 +00:00
// mock socket
2018-07-21 21:51:20 +00:00
const request_id = '1';
const socket = {
send(data) {
const message = textsecure.protobuf.WebSocketMessage.decode(data);
2018-05-02 16:51:22 +00:00
assert.strictEqual(
message.type,
textsecure.protobuf.WebSocketMessage.Type.RESPONSE
);
assert.strictEqual(message.response.message, 'OK');
assert.strictEqual(message.response.status, 200);
assert.strictEqual(message.response.id.toString(), request_id);
done();
},
2018-07-21 21:51:20 +00:00
addEventListener() {},
2018-05-02 16:51:22 +00:00
};
2018-05-02 16:51:22 +00:00
// actual test
2018-07-21 21:51:20 +00:00
const resource = new WebSocketResource(socket, {
handleRequest(request) {
2018-05-02 16:51:22 +00:00
assert.strictEqual(request.verb, 'PUT');
assert.strictEqual(request.path, '/some/path');
assertEqualArrayBuffers(
request.body.toArrayBuffer(),
new Uint8Array([1, 2, 3]).buffer
);
request.respond(200, 'OK');
},
});
2015-07-28 20:48:51 +00:00
2018-05-02 16:51:22 +00:00
// mock socket request
socket.onmessage({
data: new Blob([
new textsecure.protobuf.WebSocketMessage({
type: textsecure.protobuf.WebSocketMessage.Type.REQUEST,
request: {
id: request_id,
verb: 'PUT',
path: '/some/path',
body: new Uint8Array([1, 2, 3]).buffer,
},
})
.encode()
.toArrayBuffer(),
]),
});
});
2015-07-28 20:48:51 +00:00
2018-07-21 21:51:20 +00:00
it('sends requests and receives responses', done => {
2018-05-02 16:51:22 +00:00
// mock socket and request handler
2018-07-21 21:51:20 +00:00
let request_id;
const socket = {
send(data) {
const message = textsecure.protobuf.WebSocketMessage.decode(data);
2018-05-02 16:51:22 +00:00
assert.strictEqual(
message.type,
textsecure.protobuf.WebSocketMessage.Type.REQUEST
);
assert.strictEqual(message.request.verb, 'PUT');
assert.strictEqual(message.request.path, '/some/path');
assertEqualArrayBuffers(
message.request.body.toArrayBuffer(),
new Uint8Array([1, 2, 3]).buffer
);
request_id = message.request.id;
},
2018-07-21 21:51:20 +00:00
addEventListener() {},
2018-05-02 16:51:22 +00:00
};
2015-07-28 20:48:51 +00:00
2018-05-02 16:51:22 +00:00
// actual test
2018-07-21 21:51:20 +00:00
const resource = new WebSocketResource(socket);
2018-05-02 16:51:22 +00:00
resource.sendRequest({
verb: 'PUT',
path: '/some/path',
body: new Uint8Array([1, 2, 3]).buffer,
error: done,
2018-07-21 21:51:20 +00:00
success(message, status, request) {
2018-05-02 16:51:22 +00:00
assert.strictEqual(message, 'OK');
assert.strictEqual(status, 200);
done();
},
2015-07-28 20:48:51 +00:00
});
2018-05-02 16:51:22 +00:00
// mock socket response
socket.onmessage({
data: new Blob([
new textsecure.protobuf.WebSocketMessage({
type: textsecure.protobuf.WebSocketMessage.Type.RESPONSE,
response: { id: request_id, message: 'OK', status: 200 },
})
.encode()
.toArrayBuffer(),
]),
});
2018-05-02 16:51:22 +00:00
});
});
2018-07-21 21:51:20 +00:00
describe('close', () => {
before(() => {
2018-05-02 16:51:22 +00:00
window.WebSocket = MockSocket;
});
2018-07-21 21:51:20 +00:00
after(() => {
2018-05-02 16:51:22 +00:00
window.WebSocket = WebSocket;
});
2018-07-21 21:51:20 +00:00
it('closes the connection', done => {
const mockServer = new MockServer('ws://localhost:8081');
mockServer.on('connection', server => {
2018-05-02 16:51:22 +00:00
server.on('close', done);
});
2018-07-21 21:51:20 +00:00
const resource = new WebSocketResource(
2018-05-02 16:51:22 +00:00
new WebSocket('ws://localhost:8081')
);
resource.close();
});
});
2015-07-28 20:48:51 +00:00
2018-05-02 16:51:22 +00:00
describe.skip('with a keepalive config', function() {
2018-07-21 21:51:20 +00:00
before(() => {
2018-05-02 16:51:22 +00:00
window.WebSocket = MockSocket;
});
2018-07-21 21:51:20 +00:00
after(() => {
2018-05-02 16:51:22 +00:00
window.WebSocket = WebSocket;
});
this.timeout(60000);
2018-07-21 21:51:20 +00:00
it('sends keepalives once a minute', done => {
const mockServer = new MockServer('ws://localhost:8081');
mockServer.on('connection', server => {
server.on('message', data => {
const message = textsecure.protobuf.WebSocketMessage.decode(data);
2018-05-02 16:51:22 +00:00
assert.strictEqual(
message.type,
textsecure.protobuf.WebSocketMessage.Type.REQUEST
);
assert.strictEqual(message.request.verb, 'GET');
assert.strictEqual(message.request.path, '/v1/keepalive');
server.close();
done();
});
});
new WebSocketResource(new WebSocket('ws://localhost:8081'), {
keepalive: { path: '/v1/keepalive' },
});
});
2018-07-21 21:51:20 +00:00
it('uses / as a default path', done => {
const mockServer = new MockServer('ws://localhost:8081');
mockServer.on('connection', server => {
server.on('message', data => {
const message = textsecure.protobuf.WebSocketMessage.decode(data);
2018-05-02 16:51:22 +00:00
assert.strictEqual(
message.type,
textsecure.protobuf.WebSocketMessage.Type.REQUEST
);
assert.strictEqual(message.request.verb, 'GET');
assert.strictEqual(message.request.path, '/');
server.close();
done();
});
});
new WebSocketResource(new WebSocket('ws://localhost:8081'), {
keepalive: true,
});
});
2018-05-02 16:51:22 +00:00
it('optionally disconnects if no response', function(done) {
this.timeout(65000);
2018-07-21 21:51:20 +00:00
const mockServer = new MockServer('ws://localhost:8081');
const socket = new WebSocket('ws://localhost:8081');
mockServer.on('connection', server => {
2018-05-02 16:51:22 +00:00
server.on('close', done);
});
new WebSocketResource(socket, { keepalive: true });
});
2015-07-28 21:59:16 +00:00
2018-05-02 16:51:22 +00:00
it('allows resetting the keepalive timer', function(done) {
this.timeout(65000);
2018-07-21 21:51:20 +00:00
const mockServer = new MockServer('ws://localhost:8081');
const socket = new WebSocket('ws://localhost:8081');
const startTime = Date.now();
mockServer.on('connection', server => {
server.on('message', data => {
const message = textsecure.protobuf.WebSocketMessage.decode(data);
2018-05-02 16:51:22 +00:00
assert.strictEqual(
message.type,
textsecure.protobuf.WebSocketMessage.Type.REQUEST
);
assert.strictEqual(message.request.verb, 'GET');
assert.strictEqual(message.request.path, '/');
assert(
Date.now() > startTime + 60000,
'keepalive time should be longer than a minute'
);
server.close();
done();
});
});
2018-07-21 21:51:20 +00:00
const resource = new WebSocketResource(socket, { keepalive: true });
setTimeout(() => {
2018-05-02 16:51:22 +00:00
resource.resetKeepAliveTimer();
}, 5000);
});
});
2018-05-02 16:51:22 +00:00
});
})();