| 
									
										
										
										
											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 {supportPatchXHROnProperty} from '../test-util'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | declare const global: any; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe('TaskTrackingZone', function() { | 
					
						
							|  |  |  |   let _TaskTrackingZoneSpec: typeof TaskTrackingZoneSpec = (Zone as any)['TaskTrackingZoneSpec']; | 
					
						
							|  |  |  |   let taskTrackingZoneSpec: TaskTrackingZoneSpec|null = null; | 
					
						
							|  |  |  |   let taskTrackingZone: Zone; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   beforeEach(() => { | 
					
						
							|  |  |  |     taskTrackingZoneSpec = new _TaskTrackingZoneSpec(); | 
					
						
							|  |  |  |     taskTrackingZone = Zone.current.fork(taskTrackingZoneSpec); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should track tasks', (done: Function) => { | 
					
						
							|  |  |  |     taskTrackingZone.run(() => { | 
					
						
							|  |  |  |       taskTrackingZone.scheduleMicroTask('test1', () => {}); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |       expect(taskTrackingZoneSpec!.microTasks.length).toBe(1); | 
					
						
							|  |  |  |       expect(taskTrackingZoneSpec!.microTasks[0].source).toBe('test1'); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |       setTimeout(() => {}); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |       expect(taskTrackingZoneSpec!.macroTasks.length).toBe(1); | 
					
						
							|  |  |  |       expect(taskTrackingZoneSpec!.macroTasks[0].source).toBe('setTimeout'); | 
					
						
							|  |  |  |       taskTrackingZone.cancelTask(taskTrackingZoneSpec!.macroTasks[0]); | 
					
						
							|  |  |  |       expect(taskTrackingZoneSpec!.macroTasks.length).toBe(0); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |       setTimeout(() => { | 
					
						
							|  |  |  |         // assert on execution it is null
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |         expect(taskTrackingZoneSpec!.macroTasks.length).toBe(0); | 
					
						
							|  |  |  |         expect(taskTrackingZoneSpec!.microTasks.length).toBe(0); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // If a browser does not have XMLHttpRequest, then end test here.
 | 
					
						
							|  |  |  |         if (typeof global['XMLHttpRequest'] == 'undefined') return done(); | 
					
						
							|  |  |  |         const xhr = new XMLHttpRequest(); | 
					
						
							|  |  |  |         xhr.open('get', '/', true); | 
					
						
							|  |  |  |         xhr.onreadystatechange = () => { | 
					
						
							|  |  |  |           if (xhr.readyState == 4) { | 
					
						
							|  |  |  |             // clear current event tasks using setTimeout
 | 
					
						
							|  |  |  |             setTimeout(() => { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |               expect(taskTrackingZoneSpec!.macroTasks.length).toBe(0); | 
					
						
							|  |  |  |               expect(taskTrackingZoneSpec!.microTasks.length).toBe(0); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |               if (supportPatchXHROnProperty()) { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                 expect(taskTrackingZoneSpec!.eventTasks.length).not.toBe(0); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |               taskTrackingZoneSpec!.clearEvents(); | 
					
						
							|  |  |  |               expect(taskTrackingZoneSpec!.eventTasks.length).toBe(0); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |               done(); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         xhr.send(); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |         expect(taskTrackingZoneSpec!.macroTasks.length).toBe(1); | 
					
						
							|  |  |  |         expect(taskTrackingZoneSpec!.macroTasks[0].source).toBe('XMLHttpRequest.send'); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |         if (supportPatchXHROnProperty()) { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |           expect(taskTrackingZoneSpec!.eventTasks[0].source) | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |               .toMatch(/\.addEventListener:readystatechange/); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should capture task creation stacktrace', (done) => { | 
					
						
							|  |  |  |     taskTrackingZone.run(() => { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |       setTimeout(() => { | 
					
						
							|  |  |  |         done(); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       expect((taskTrackingZoneSpec!.macroTasks[0] as any)['creationLocation']).toBeTruthy(); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }); |