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);
 | |
|     });
 | |
|   });
 | |
| });
 |