More protobufjs use
This commit is contained in:
parent
1fa0e6c8c1
commit
299fe2af36
20 changed files with 646 additions and 447 deletions
|
@ -11,8 +11,10 @@ import { assert } from 'chai';
|
|||
import * as sinon from 'sinon';
|
||||
import EventEmitter from 'events';
|
||||
import { connection as WebSocket } from 'websocket';
|
||||
import Long from 'long';
|
||||
|
||||
import { typedArrayToArrayBuffer as toArrayBuffer } from '../Crypto';
|
||||
import { dropNull } from '../util/dropNull';
|
||||
import { SignalService as Proto } from '../protobuf';
|
||||
|
||||
import WebSocketResource from '../textsecure/WebsocketResources';
|
||||
|
||||
|
@ -23,23 +25,38 @@ describe('WebSocket-Resource', () => {
|
|||
public close() {}
|
||||
}
|
||||
|
||||
const NOW = Date.now();
|
||||
|
||||
beforeEach(function beforeEach() {
|
||||
this.sandbox = sinon.createSandbox();
|
||||
this.clock = this.sandbox.useFakeTimers({
|
||||
now: NOW,
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(function afterEach() {
|
||||
this.sandbox.restore();
|
||||
});
|
||||
|
||||
describe('requests and responses', () => {
|
||||
it('receives requests and sends responses', done => {
|
||||
// mock socket
|
||||
const requestId = '1';
|
||||
const requestId = new Long(0xdeadbeef, 0x7fffffff);
|
||||
const socket = new FakeSocket();
|
||||
|
||||
sinon.stub(socket, 'sendBytes').callsFake((data: Uint8Array) => {
|
||||
const message = window.textsecure.protobuf.WebSocketMessage.decode(
|
||||
toArrayBuffer(data)
|
||||
);
|
||||
assert.strictEqual(
|
||||
message.type,
|
||||
window.textsecure.protobuf.WebSocketMessage.Type.RESPONSE
|
||||
);
|
||||
const message = Proto.WebSocketMessage.decode(data);
|
||||
assert.strictEqual(message.type, Proto.WebSocketMessage.Type.RESPONSE);
|
||||
assert.strictEqual(message.response?.message, 'OK');
|
||||
assert.strictEqual(message.response?.status, 200);
|
||||
assert.strictEqual(message.response?.id.toString(), requestId);
|
||||
const id = message.response?.id;
|
||||
|
||||
if (id instanceof Long) {
|
||||
assert(id.equals(requestId));
|
||||
} else {
|
||||
assert(false, `id should be Long, got ${id}`);
|
||||
}
|
||||
|
||||
done();
|
||||
});
|
||||
|
||||
|
@ -48,14 +65,7 @@ describe('WebSocket-Resource', () => {
|
|||
handleRequest(request: any) {
|
||||
assert.strictEqual(request.verb, 'PUT');
|
||||
assert.strictEqual(request.path, '/some/path');
|
||||
assert.ok(
|
||||
window.Signal.Crypto.constantTimeEqual(
|
||||
request.body.toArrayBuffer(),
|
||||
window.Signal.Crypto.typedArrayToArrayBuffer(
|
||||
new Uint8Array([1, 2, 3])
|
||||
)
|
||||
)
|
||||
);
|
||||
assert.deepEqual(request.body, new Uint8Array([1, 2, 3]));
|
||||
request.respond(200, 'OK');
|
||||
},
|
||||
});
|
||||
|
@ -63,48 +73,30 @@ describe('WebSocket-Resource', () => {
|
|||
// mock socket request
|
||||
socket.emit('message', {
|
||||
type: 'binary',
|
||||
binaryData: new Uint8Array(
|
||||
new window.textsecure.protobuf.WebSocketMessage({
|
||||
type: window.textsecure.protobuf.WebSocketMessage.Type.REQUEST,
|
||||
request: {
|
||||
id: requestId,
|
||||
verb: 'PUT',
|
||||
path: '/some/path',
|
||||
body: window.Signal.Crypto.typedArrayToArrayBuffer(
|
||||
new Uint8Array([1, 2, 3])
|
||||
),
|
||||
},
|
||||
})
|
||||
.encode()
|
||||
.toArrayBuffer()
|
||||
),
|
||||
binaryData: Proto.WebSocketMessage.encode({
|
||||
type: Proto.WebSocketMessage.Type.REQUEST,
|
||||
request: {
|
||||
id: requestId,
|
||||
verb: 'PUT',
|
||||
path: '/some/path',
|
||||
body: new Uint8Array([1, 2, 3]),
|
||||
},
|
||||
}).finish(),
|
||||
});
|
||||
});
|
||||
|
||||
it('sends requests and receives responses', done => {
|
||||
// mock socket and request handler
|
||||
let requestId: Long | undefined;
|
||||
let requestId: number | Long | undefined;
|
||||
const socket = new FakeSocket();
|
||||
|
||||
sinon.stub(socket, 'sendBytes').callsFake((data: Uint8Array) => {
|
||||
const message = window.textsecure.protobuf.WebSocketMessage.decode(
|
||||
toArrayBuffer(data)
|
||||
);
|
||||
assert.strictEqual(
|
||||
message.type,
|
||||
window.textsecure.protobuf.WebSocketMessage.Type.REQUEST
|
||||
);
|
||||
const message = Proto.WebSocketMessage.decode(data);
|
||||
assert.strictEqual(message.type, Proto.WebSocketMessage.Type.REQUEST);
|
||||
assert.strictEqual(message.request?.verb, 'PUT');
|
||||
assert.strictEqual(message.request?.path, '/some/path');
|
||||
assert.ok(
|
||||
window.Signal.Crypto.constantTimeEqual(
|
||||
message.request?.body.toArrayBuffer(),
|
||||
window.Signal.Crypto.typedArrayToArrayBuffer(
|
||||
new Uint8Array([1, 2, 3])
|
||||
)
|
||||
)
|
||||
);
|
||||
requestId = message.request?.id;
|
||||
assert.deepEqual(message.request?.body, new Uint8Array([1, 2, 3]));
|
||||
requestId = dropNull(message.request?.id);
|
||||
});
|
||||
|
||||
// actual test
|
||||
|
@ -112,9 +104,7 @@ describe('WebSocket-Resource', () => {
|
|||
resource.sendRequest({
|
||||
verb: 'PUT',
|
||||
path: '/some/path',
|
||||
body: window.Signal.Crypto.typedArrayToArrayBuffer(
|
||||
new Uint8Array([1, 2, 3])
|
||||
),
|
||||
body: new Uint8Array([1, 2, 3]),
|
||||
error: done,
|
||||
success(message: string, status: number) {
|
||||
assert.strictEqual(message, 'OK');
|
||||
|
@ -126,14 +116,10 @@ describe('WebSocket-Resource', () => {
|
|||
// mock socket response
|
||||
socket.emit('message', {
|
||||
type: 'binary',
|
||||
binaryData: new Uint8Array(
|
||||
new window.textsecure.protobuf.WebSocketMessage({
|
||||
type: window.textsecure.protobuf.WebSocketMessage.Type.RESPONSE,
|
||||
response: { id: requestId, message: 'OK', status: 200 },
|
||||
})
|
||||
.encode()
|
||||
.toArrayBuffer()
|
||||
),
|
||||
binaryData: Proto.WebSocketMessage.encode({
|
||||
type: Proto.WebSocketMessage.Type.RESPONSE,
|
||||
response: { id: requestId, message: 'OK', status: 200 },
|
||||
}).finish(),
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -147,33 +133,27 @@ describe('WebSocket-Resource', () => {
|
|||
const resource = new WebSocketResource(socket as WebSocket);
|
||||
resource.close();
|
||||
});
|
||||
|
||||
it('force closes the connection', function test(done) {
|
||||
const socket = new FakeSocket();
|
||||
|
||||
const resource = new WebSocketResource(socket as WebSocket);
|
||||
resource.close();
|
||||
|
||||
resource.addEventListener('close', () => done());
|
||||
|
||||
// Wait 5 seconds to forcefully close the connection
|
||||
this.clock.next();
|
||||
});
|
||||
});
|
||||
|
||||
describe('with a keepalive config', () => {
|
||||
const NOW = Date.now();
|
||||
|
||||
beforeEach(function beforeEach() {
|
||||
this.sandbox = sinon.createSandbox();
|
||||
this.clock = this.sandbox.useFakeTimers({
|
||||
now: NOW,
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(function afterEach() {
|
||||
this.sandbox.restore();
|
||||
});
|
||||
|
||||
it('sends keepalives once a minute', function test(done) {
|
||||
const socket = new FakeSocket();
|
||||
|
||||
sinon.stub(socket, 'sendBytes').callsFake(data => {
|
||||
const message = window.textsecure.protobuf.WebSocketMessage.decode(
|
||||
toArrayBuffer(data)
|
||||
);
|
||||
assert.strictEqual(
|
||||
message.type,
|
||||
window.textsecure.protobuf.WebSocketMessage.Type.REQUEST
|
||||
);
|
||||
const message = Proto.WebSocketMessage.decode(data);
|
||||
assert.strictEqual(message.type, Proto.WebSocketMessage.Type.REQUEST);
|
||||
assert.strictEqual(message.request?.verb, 'GET');
|
||||
assert.strictEqual(message.request?.path, '/v1/keepalive');
|
||||
done();
|
||||
|
@ -190,13 +170,8 @@ describe('WebSocket-Resource', () => {
|
|||
const socket = new FakeSocket();
|
||||
|
||||
sinon.stub(socket, 'sendBytes').callsFake(data => {
|
||||
const message = window.textsecure.protobuf.WebSocketMessage.decode(
|
||||
toArrayBuffer(data)
|
||||
);
|
||||
assert.strictEqual(
|
||||
message.type,
|
||||
window.textsecure.protobuf.WebSocketMessage.Type.REQUEST
|
||||
);
|
||||
const message = Proto.WebSocketMessage.decode(data);
|
||||
assert.strictEqual(message.type, Proto.WebSocketMessage.Type.REQUEST);
|
||||
assert.strictEqual(message.request?.verb, 'GET');
|
||||
assert.strictEqual(message.request?.path, '/');
|
||||
done();
|
||||
|
@ -245,13 +220,8 @@ describe('WebSocket-Resource', () => {
|
|||
const socket = new FakeSocket();
|
||||
|
||||
sinon.stub(socket, 'sendBytes').callsFake(data => {
|
||||
const message = window.textsecure.protobuf.WebSocketMessage.decode(
|
||||
toArrayBuffer(data)
|
||||
);
|
||||
assert.strictEqual(
|
||||
message.type,
|
||||
window.textsecure.protobuf.WebSocketMessage.Type.REQUEST
|
||||
);
|
||||
const message = Proto.WebSocketMessage.decode(data);
|
||||
assert.strictEqual(message.type, Proto.WebSocketMessage.Type.REQUEST);
|
||||
assert.strictEqual(message.request?.verb, 'GET');
|
||||
assert.strictEqual(message.request?.path, '/');
|
||||
assert.strictEqual(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue