| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							| 
									
										
										
										
											2020-05-19 12:08:49 -07:00
										 |  |  |  * Copyright Google LLC All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Use of this source code is governed by an MIT-style license that can be | 
					
						
							|  |  |  |  * found in the LICENSE file at https://angular.io/license
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import {ifEnvSupports} from '../test-util'; | 
					
						
							|  |  |  | declare const window: any; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const TIMEOUT = 5000; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!window['saucelabs']) { | 
					
						
							|  |  |  |   // sauceLabs does not support WebSockets; skip these tests
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   xdescribe('WebSocket', ifEnvSupports('WebSocket', function() { | 
					
						
							|  |  |  |               let socket: WebSocket; | 
					
						
							|  |  |  |               const TEST_SERVER_URL = 'ws://localhost:8001'; | 
					
						
							|  |  |  |               const testZone = Zone.current.fork({name: 'test'}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               beforeEach(function(done) { | 
					
						
							|  |  |  |                 socket = new WebSocket(TEST_SERVER_URL); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                 socket.addEventListener('open', function() { | 
					
						
							|  |  |  |                   done(); | 
					
						
							|  |  |  |                 }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |                 socket.addEventListener('error', function() { | 
					
						
							|  |  |  |                   fail( | 
					
						
							|  |  |  |                       'Can\'t establish socket to ' + TEST_SERVER_URL + | 
					
						
							|  |  |  |                       '! do you have test/ws-server.js running?'); | 
					
						
							|  |  |  |                   done(); | 
					
						
							|  |  |  |                 }); | 
					
						
							|  |  |  |               }, TIMEOUT); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               afterEach(function(done) { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                 socket.addEventListener('close', function() { | 
					
						
							|  |  |  |                   done(); | 
					
						
							|  |  |  |                 }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |                 socket.close(); | 
					
						
							|  |  |  |               }, TIMEOUT); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               xit('should be patched in a Web Worker', done => { | 
					
						
							|  |  |  |                 const worker = new Worker('/base/test/ws-webworker-context.js'); | 
					
						
							|  |  |  |                 worker.onmessage = (e: MessageEvent) => { | 
					
						
							|  |  |  |                   if (e.data !== 'pass' && e.data !== 'fail') { | 
					
						
							|  |  |  |                     fail(`web worker ${e.data}`); | 
					
						
							|  |  |  |                     return; | 
					
						
							|  |  |  |                   } | 
					
						
							|  |  |  |                   expect(e.data).toBe('pass'); | 
					
						
							|  |  |  |                   done(); | 
					
						
							|  |  |  |                 }; | 
					
						
							|  |  |  |               }, 10000); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               it('should work with addEventListener', function(done) { | 
					
						
							|  |  |  |                 testZone.run(function() { | 
					
						
							|  |  |  |                   socket.addEventListener('message', function(event) { | 
					
						
							|  |  |  |                     expect(Zone.current).toBe(testZone); | 
					
						
							|  |  |  |                     expect(event['data']).toBe('hi'); | 
					
						
							|  |  |  |                     done(); | 
					
						
							|  |  |  |                   }); | 
					
						
							|  |  |  |                 }); | 
					
						
							|  |  |  |                 socket.send('hi'); | 
					
						
							|  |  |  |               }, TIMEOUT); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               it('should respect removeEventListener', function(done) { | 
					
						
							|  |  |  |                 let log = ''; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 function logOnMessage() { | 
					
						
							|  |  |  |                   log += 'a'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                   expect(log).toEqual('a'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                   socket.removeEventListener('message', logOnMessage); | 
					
						
							|  |  |  |                   socket.send('hi'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                   setTimeout(function() { | 
					
						
							|  |  |  |                     expect(log).toEqual('a'); | 
					
						
							|  |  |  |                     done(); | 
					
						
							|  |  |  |                   }, 10); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 socket.addEventListener('message', logOnMessage); | 
					
						
							|  |  |  |                 socket.send('hi'); | 
					
						
							|  |  |  |               }, TIMEOUT); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               it('should work with onmessage', function(done) { | 
					
						
							|  |  |  |                 testZone.run(function() { | 
					
						
							|  |  |  |                   socket.onmessage = function(contents) { | 
					
						
							|  |  |  |                     expect(Zone.current).toBe(testZone); | 
					
						
							|  |  |  |                     expect(contents.data).toBe('hi'); | 
					
						
							|  |  |  |                     done(); | 
					
						
							|  |  |  |                   }; | 
					
						
							|  |  |  |                 }); | 
					
						
							|  |  |  |                 socket.send('hi'); | 
					
						
							|  |  |  |               }, TIMEOUT); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               it('should only allow one onmessage handler', function(done) { | 
					
						
							|  |  |  |                 let log = ''; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 socket.onmessage = function() { | 
					
						
							|  |  |  |                   log += 'a'; | 
					
						
							|  |  |  |                   expect(log).toEqual('b'); | 
					
						
							|  |  |  |                   done(); | 
					
						
							|  |  |  |                 }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 socket.onmessage = function() { | 
					
						
							|  |  |  |                   log += 'b'; | 
					
						
							|  |  |  |                   expect(log).toEqual('b'); | 
					
						
							|  |  |  |                   done(); | 
					
						
							|  |  |  |                 }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 socket.send('hi'); | 
					
						
							|  |  |  |               }, TIMEOUT); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               it('should handler removing onmessage', function(done) { | 
					
						
							|  |  |  |                 let log = ''; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                 socket.onmessage = function() { | 
					
						
							|  |  |  |                   log += 'a'; | 
					
						
							|  |  |  |                 }; | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 socket.onmessage = null as any; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 socket.send('hi'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 setTimeout(function() { | 
					
						
							|  |  |  |                   expect(log).toEqual(''); | 
					
						
							|  |  |  |                   done(); | 
					
						
							|  |  |  |                 }, 100); | 
					
						
							|  |  |  |               }, TIMEOUT); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               it('should have constants', function() { | 
					
						
							|  |  |  |                 expect(Object.keys(WebSocket)).toContain('CONNECTING'); | 
					
						
							|  |  |  |                 expect(Object.keys(WebSocket)).toContain('OPEN'); | 
					
						
							|  |  |  |                 expect(Object.keys(WebSocket)).toContain('CLOSING'); | 
					
						
							|  |  |  |                 expect(Object.keys(WebSocket)).toContain('CLOSED'); | 
					
						
							|  |  |  |               }); | 
					
						
							|  |  |  |             })); | 
					
						
							|  |  |  | } |