2020-10-30 20:34:04 +00:00
|
|
|
// Copyright 2015-2020 Signal Messenger, LLC
|
|
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
|
2018-11-02 18:02:53 +00:00
|
|
|
describe('WebSocket-Resource', () => {
|
|
|
|
describe('requests and responses', () => {
|
|
|
|
it('receives requests and sends responses', done => {
|
|
|
|
// mock socket
|
|
|
|
const requestId = '1';
|
|
|
|
const socket = {
|
|
|
|
send(data) {
|
2020-04-13 17:37:29 +00:00
|
|
|
const message = window.textsecure.protobuf.WebSocketMessage.decode(
|
|
|
|
data
|
|
|
|
);
|
2018-11-02 18:02:53 +00:00
|
|
|
assert.strictEqual(
|
|
|
|
message.type,
|
2020-04-13 17:37:29 +00:00
|
|
|
window.textsecure.protobuf.WebSocketMessage.Type.RESPONSE
|
2018-11-02 18:02:53 +00:00
|
|
|
);
|
|
|
|
assert.strictEqual(message.response.message, 'OK');
|
|
|
|
assert.strictEqual(message.response.status, 200);
|
|
|
|
assert.strictEqual(message.response.id.toString(), requestId);
|
|
|
|
done();
|
|
|
|
},
|
|
|
|
addEventListener() {},
|
|
|
|
};
|
2015-07-28 20:48:51 +00:00
|
|
|
|
2018-11-02 18:02:53 +00:00
|
|
|
// actual test
|
2020-04-13 17:37:29 +00:00
|
|
|
this.resource = new window.textsecure.WebSocketResource(socket, {
|
2018-11-02 18:02:53 +00:00
|
|
|
handleRequest(request) {
|
|
|
|
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');
|
|
|
|
},
|
2018-05-02 16:51:22 +00:00
|
|
|
});
|
2015-07-28 20:48:51 +00:00
|
|
|
|
2018-11-02 18:02:53 +00:00
|
|
|
// mock socket request
|
|
|
|
socket.onmessage({
|
|
|
|
data: new Blob([
|
2020-04-13 17:37:29 +00:00
|
|
|
new window.textsecure.protobuf.WebSocketMessage({
|
|
|
|
type: window.textsecure.protobuf.WebSocketMessage.Type.REQUEST,
|
2018-11-02 18:02:53 +00:00
|
|
|
request: {
|
|
|
|
id: requestId,
|
|
|
|
verb: 'PUT',
|
|
|
|
path: '/some/path',
|
|
|
|
body: new Uint8Array([1, 2, 3]).buffer,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
.encode()
|
|
|
|
.toArrayBuffer(),
|
|
|
|
]),
|
2018-05-02 16:51:22 +00:00
|
|
|
});
|
|
|
|
});
|
2014-11-28 06:03:42 +00:00
|
|
|
|
2018-11-02 18:02:53 +00:00
|
|
|
it('sends requests and receives responses', done => {
|
|
|
|
// mock socket and request handler
|
|
|
|
let requestId;
|
|
|
|
const socket = {
|
|
|
|
send(data) {
|
2020-04-13 17:37:29 +00:00
|
|
|
const message = window.textsecure.protobuf.WebSocketMessage.decode(
|
|
|
|
data
|
|
|
|
);
|
2018-11-02 18:02:53 +00:00
|
|
|
assert.strictEqual(
|
|
|
|
message.type,
|
2020-04-13 17:37:29 +00:00
|
|
|
window.textsecure.protobuf.WebSocketMessage.Type.REQUEST
|
2018-11-02 18:02:53 +00:00
|
|
|
);
|
|
|
|
assert.strictEqual(message.request.verb, 'PUT');
|
|
|
|
assert.strictEqual(message.request.path, '/some/path');
|
|
|
|
assertEqualArrayBuffers(
|
|
|
|
message.request.body.toArrayBuffer(),
|
|
|
|
new Uint8Array([1, 2, 3]).buffer
|
|
|
|
);
|
|
|
|
requestId = message.request.id;
|
|
|
|
},
|
|
|
|
addEventListener() {},
|
|
|
|
};
|
|
|
|
|
|
|
|
// actual test
|
2020-04-13 17:37:29 +00:00
|
|
|
const resource = new window.textsecure.WebSocketResource(socket);
|
2018-11-02 18:02:53 +00:00
|
|
|
resource.sendRequest({
|
|
|
|
verb: 'PUT',
|
|
|
|
path: '/some/path',
|
|
|
|
body: new Uint8Array([1, 2, 3]).buffer,
|
|
|
|
error: done,
|
|
|
|
success(message, status) {
|
|
|
|
assert.strictEqual(message, 'OK');
|
|
|
|
assert.strictEqual(status, 200);
|
|
|
|
done();
|
|
|
|
},
|
2018-05-02 16:51:22 +00:00
|
|
|
});
|
2018-11-02 18:02:53 +00:00
|
|
|
|
|
|
|
// mock socket response
|
|
|
|
socket.onmessage({
|
|
|
|
data: new Blob([
|
2020-04-13 17:37:29 +00:00
|
|
|
new window.textsecure.protobuf.WebSocketMessage({
|
|
|
|
type: window.textsecure.protobuf.WebSocketMessage.Type.RESPONSE,
|
2018-11-02 18:02:53 +00:00
|
|
|
response: { id: requestId, message: 'OK', status: 200 },
|
|
|
|
})
|
|
|
|
.encode()
|
|
|
|
.toArrayBuffer(),
|
|
|
|
]),
|
2018-05-02 16:51:22 +00:00
|
|
|
});
|
|
|
|
});
|
2018-11-02 18:02:53 +00:00
|
|
|
});
|
2015-07-28 20:48:51 +00:00
|
|
|
|
2018-11-02 18:02:53 +00:00
|
|
|
describe('close', () => {
|
|
|
|
before(() => {
|
|
|
|
window.WebSocket = MockSocket;
|
|
|
|
});
|
|
|
|
after(() => {
|
|
|
|
window.WebSocket = WebSocket;
|
|
|
|
});
|
|
|
|
it('closes the connection', done => {
|
|
|
|
const mockServer = new MockServer('ws://localhost:8081');
|
|
|
|
mockServer.on('connection', server => {
|
|
|
|
server.on('close', done);
|
2018-05-02 16:51:22 +00:00
|
|
|
});
|
2020-04-13 17:37:29 +00:00
|
|
|
const resource = new window.textsecure.WebSocketResource(
|
2018-11-02 18:02:53 +00:00
|
|
|
new WebSocket('ws://localhost:8081')
|
|
|
|
);
|
|
|
|
resource.close();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe.skip('with a keepalive config', function thisNeeded() {
|
|
|
|
before(() => {
|
|
|
|
window.WebSocket = MockSocket;
|
|
|
|
});
|
|
|
|
after(() => {
|
|
|
|
window.WebSocket = WebSocket;
|
|
|
|
});
|
|
|
|
this.timeout(60000);
|
|
|
|
it('sends keepalives once a minute', done => {
|
|
|
|
const mockServer = new MockServer('ws://localhost:8081');
|
|
|
|
mockServer.on('connection', server => {
|
|
|
|
server.on('message', data => {
|
2020-04-13 17:37:29 +00:00
|
|
|
const message = window.textsecure.protobuf.WebSocketMessage.decode(
|
|
|
|
data
|
|
|
|
);
|
2018-11-02 18:02:53 +00:00
|
|
|
assert.strictEqual(
|
|
|
|
message.type,
|
2020-04-13 17:37:29 +00:00
|
|
|
window.textsecure.protobuf.WebSocketMessage.Type.REQUEST
|
2018-11-02 18:02:53 +00:00
|
|
|
);
|
|
|
|
assert.strictEqual(message.request.verb, 'GET');
|
|
|
|
assert.strictEqual(message.request.path, '/v1/keepalive');
|
|
|
|
server.close();
|
|
|
|
done();
|
2018-05-02 16:51:22 +00:00
|
|
|
});
|
|
|
|
});
|
2020-04-13 17:37:29 +00:00
|
|
|
this.resource = new window.textsecure.WebSocketResource(
|
2018-11-02 18:02:53 +00:00
|
|
|
new WebSocket('ws://loc1alhost:8081'),
|
|
|
|
{
|
|
|
|
keepalive: { path: '/v1/keepalive' },
|
|
|
|
}
|
|
|
|
);
|
|
|
|
});
|
2014-11-28 06:03:42 +00:00
|
|
|
|
2018-11-02 18:02:53 +00:00
|
|
|
it('uses / as a default path', done => {
|
|
|
|
const mockServer = new MockServer('ws://localhost:8081');
|
|
|
|
mockServer.on('connection', server => {
|
|
|
|
server.on('message', data => {
|
2020-04-13 17:37:29 +00:00
|
|
|
const message = window.textsecure.protobuf.WebSocketMessage.decode(
|
|
|
|
data
|
|
|
|
);
|
2018-11-02 18:02:53 +00:00
|
|
|
assert.strictEqual(
|
|
|
|
message.type,
|
2020-04-13 17:37:29 +00:00
|
|
|
window.textsecure.protobuf.WebSocketMessage.Type.REQUEST
|
2018-11-02 18:02:53 +00:00
|
|
|
);
|
|
|
|
assert.strictEqual(message.request.verb, 'GET');
|
|
|
|
assert.strictEqual(message.request.path, '/');
|
|
|
|
server.close();
|
|
|
|
done();
|
2018-05-02 16:51:22 +00:00
|
|
|
});
|
|
|
|
});
|
2020-04-13 17:37:29 +00:00
|
|
|
this.resource = new window.textsecure.WebSocketResource(
|
2018-11-02 18:02:53 +00:00
|
|
|
new WebSocket('ws://localhost:8081'),
|
|
|
|
{
|
|
|
|
keepalive: true,
|
|
|
|
}
|
|
|
|
);
|
|
|
|
});
|
2014-11-28 06:03:42 +00:00
|
|
|
|
2018-11-02 18:02:53 +00:00
|
|
|
it('optionally disconnects if no response', function thisNeeded1(done) {
|
|
|
|
this.timeout(65000);
|
|
|
|
const mockServer = new MockServer('ws://localhost:8081');
|
|
|
|
const socket = new WebSocket('ws://localhost:8081');
|
|
|
|
mockServer.on('connection', server => {
|
|
|
|
server.on('close', done);
|
2018-05-02 16:51:22 +00:00
|
|
|
});
|
2020-04-13 17:37:29 +00:00
|
|
|
this.resource = new window.textsecure.WebSocketResource(socket, {
|
|
|
|
keepalive: true,
|
|
|
|
});
|
2018-11-02 18:02:53 +00:00
|
|
|
});
|
2015-07-28 21:59:16 +00:00
|
|
|
|
2018-11-02 18:02:53 +00:00
|
|
|
it('allows resetting the keepalive timer', function thisNeeded2(done) {
|
|
|
|
this.timeout(65000);
|
|
|
|
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 => {
|
2020-04-13 17:37:29 +00:00
|
|
|
const message = window.textsecure.protobuf.WebSocketMessage.decode(
|
|
|
|
data
|
|
|
|
);
|
2018-11-02 18:02:53 +00:00
|
|
|
assert.strictEqual(
|
|
|
|
message.type,
|
2020-04-13 17:37:29 +00:00
|
|
|
window.textsecure.protobuf.WebSocketMessage.Type.REQUEST
|
2018-11-02 18:02:53 +00:00
|
|
|
);
|
|
|
|
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();
|
2014-11-28 06:03:42 +00:00
|
|
|
});
|
2018-05-02 16:51:22 +00:00
|
|
|
});
|
2020-04-13 17:37:29 +00:00
|
|
|
const resource = new window.textsecure.WebSocketResource(socket, {
|
|
|
|
keepalive: true,
|
|
|
|
});
|
2018-11-02 18:02:53 +00:00
|
|
|
setTimeout(() => {
|
|
|
|
resource.resetKeepAliveTimer();
|
|
|
|
}, 5000);
|
2014-11-28 06:03:42 +00:00
|
|
|
});
|
2018-05-02 16:51:22 +00:00
|
|
|
});
|
2018-11-02 18:02:53 +00:00
|
|
|
});
|