You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			215 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			215 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			JavaScript
		
	
/* global textsecure, WebSocketResource */
 | 
						|
 | 
						|
describe('WebSocket-Resource', () => {
 | 
						|
  describe('requests and responses', () => {
 | 
						|
    it('receives requests and sends responses', done => {
 | 
						|
      // mock socket
 | 
						|
      const requestId = '1';
 | 
						|
      const socket = {
 | 
						|
        send(data) {
 | 
						|
          const message = textsecure.protobuf.WebSocketMessage.decode(data);
 | 
						|
          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(), requestId);
 | 
						|
          done();
 | 
						|
        },
 | 
						|
        addEventListener() {},
 | 
						|
      };
 | 
						|
 | 
						|
      // actual test
 | 
						|
      this.resource = new WebSocketResource(socket, {
 | 
						|
        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');
 | 
						|
        },
 | 
						|
      });
 | 
						|
 | 
						|
      // mock socket request
 | 
						|
      socket.onmessage({
 | 
						|
        data: new Blob([
 | 
						|
          new textsecure.protobuf.WebSocketMessage({
 | 
						|
            type: textsecure.protobuf.WebSocketMessage.Type.REQUEST,
 | 
						|
            request: {
 | 
						|
              id: requestId,
 | 
						|
              verb: 'PUT',
 | 
						|
              path: '/some/path',
 | 
						|
              body: new Uint8Array([1, 2, 3]).buffer,
 | 
						|
            },
 | 
						|
          })
 | 
						|
            .encode()
 | 
						|
            .toArrayBuffer(),
 | 
						|
        ]),
 | 
						|
      });
 | 
						|
    });
 | 
						|
 | 
						|
    it('sends requests and receives responses', done => {
 | 
						|
      // mock socket and request handler
 | 
						|
      let requestId;
 | 
						|
      const socket = {
 | 
						|
        send(data) {
 | 
						|
          const message = textsecure.protobuf.WebSocketMessage.decode(data);
 | 
						|
          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
 | 
						|
          );
 | 
						|
          requestId = message.request.id;
 | 
						|
        },
 | 
						|
        addEventListener() {},
 | 
						|
      };
 | 
						|
 | 
						|
      // actual test
 | 
						|
      const resource = new WebSocketResource(socket);
 | 
						|
      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();
 | 
						|
        },
 | 
						|
      });
 | 
						|
 | 
						|
      // mock socket response
 | 
						|
      socket.onmessage({
 | 
						|
        data: new Blob([
 | 
						|
          new textsecure.protobuf.WebSocketMessage({
 | 
						|
            type: textsecure.protobuf.WebSocketMessage.Type.RESPONSE,
 | 
						|
            response: { id: requestId, message: 'OK', status: 200 },
 | 
						|
          })
 | 
						|
            .encode()
 | 
						|
            .toArrayBuffer(),
 | 
						|
        ]),
 | 
						|
      });
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  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);
 | 
						|
      });
 | 
						|
      const resource = new WebSocketResource(
 | 
						|
        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 => {
 | 
						|
          const message = textsecure.protobuf.WebSocketMessage.decode(data);
 | 
						|
          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();
 | 
						|
        });
 | 
						|
      });
 | 
						|
      this.resource = new WebSocketResource(
 | 
						|
        new WebSocket('ws://loc1alhost:8081'),
 | 
						|
        {
 | 
						|
          keepalive: { path: '/v1/keepalive' },
 | 
						|
        }
 | 
						|
      );
 | 
						|
    });
 | 
						|
 | 
						|
    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);
 | 
						|
          assert.strictEqual(
 | 
						|
            message.type,
 | 
						|
            textsecure.protobuf.WebSocketMessage.Type.REQUEST
 | 
						|
          );
 | 
						|
          assert.strictEqual(message.request.verb, 'GET');
 | 
						|
          assert.strictEqual(message.request.path, '/');
 | 
						|
          server.close();
 | 
						|
          done();
 | 
						|
        });
 | 
						|
      });
 | 
						|
      this.resource = new WebSocketResource(
 | 
						|
        new WebSocket('ws://localhost:8081'),
 | 
						|
        {
 | 
						|
          keepalive: true,
 | 
						|
        }
 | 
						|
      );
 | 
						|
    });
 | 
						|
 | 
						|
    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);
 | 
						|
      });
 | 
						|
      this.resource = new WebSocketResource(socket, { keepalive: true });
 | 
						|
    });
 | 
						|
 | 
						|
    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 => {
 | 
						|
          const message = textsecure.protobuf.WebSocketMessage.decode(data);
 | 
						|
          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();
 | 
						|
        });
 | 
						|
      });
 | 
						|
      const resource = new WebSocketResource(socket, { keepalive: true });
 | 
						|
      setTimeout(() => {
 | 
						|
        resource.resetKeepAliveTimer();
 | 
						|
      }, 5000);
 | 
						|
    });
 | 
						|
  });
 | 
						|
});
 |