| 
									
										
										
										
											2016-08-03 15:00:07 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							|  |  |  |  * Copyright Google Inc. All Rights Reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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
 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-04-20 17:01:51 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-15 19:37:42 -07:00
										 |  |  | import {Provider, ReflectiveInjector} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2016-09-27 17:12:25 -07:00
										 |  |  | import {AsyncTestCompleter, describe, expect, inject, it} from '@angular/core/testing/testing_internal'; | 
					
						
							| 
									
										
										
										
											2016-08-26 16:34:08 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-27 17:12:25 -07:00
										 |  |  | import {Options, PerfLogEvent, PerfLogFeatures, UserMetric, WebDriverAdapter} from '../../index'; | 
					
						
							| 
									
										
										
										
											2016-04-20 17:01:51 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | export function main() { | 
					
						
							|  |  |  |   var wdAdapter: MockDriverAdapter; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-03 15:00:07 -07:00
										 |  |  |   function createMetric( | 
					
						
							| 
									
										
										
										
											2016-08-26 16:34:08 -07:00
										 |  |  |       perfLogs: PerfLogEvent[], perfLogFeatures: PerfLogFeatures, | 
					
						
							| 
									
										
										
										
											2016-08-03 15:00:07 -07:00
										 |  |  |       {userMetrics}: {userMetrics?: {[key: string]: string}} = {}): UserMetric { | 
					
						
							| 
									
										
										
										
											2016-09-30 09:26:53 -07:00
										 |  |  |     if (!perfLogFeatures) { | 
					
						
							| 
									
										
										
										
											2016-04-20 17:01:51 -07:00
										 |  |  |       perfLogFeatures = | 
					
						
							|  |  |  |           new PerfLogFeatures({render: true, gc: true, frameCapture: true, userTiming: true}); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-30 09:26:53 -07:00
										 |  |  |     if (!userMetrics) { | 
					
						
							| 
									
										
										
										
											2016-09-19 17:15:57 -07:00
										 |  |  |       userMetrics = {}; | 
					
						
							| 
									
										
										
										
											2016-04-20 17:01:51 -07:00
										 |  |  |     } | 
					
						
							|  |  |  |     wdAdapter = new MockDriverAdapter(); | 
					
						
							| 
									
										
										
										
											2016-08-26 16:34:08 -07:00
										 |  |  |     var providers: Provider[] = [ | 
					
						
							| 
									
										
										
										
											2016-08-03 15:00:07 -07:00
										 |  |  |       Options.DEFAULT_PROVIDERS, UserMetric.PROVIDERS, | 
					
						
							| 
									
										
										
										
											2016-08-15 19:37:42 -07:00
										 |  |  |       {provide: Options.USER_METRICS, useValue: userMetrics}, | 
					
						
							|  |  |  |       {provide: WebDriverAdapter, useValue: wdAdapter} | 
					
						
							| 
									
										
										
										
											2016-04-20 17:01:51 -07:00
										 |  |  |     ]; | 
					
						
							| 
									
										
										
										
											2016-08-26 16:34:08 -07:00
										 |  |  |     return ReflectiveInjector.resolveAndCreate(providers).get(UserMetric); | 
					
						
							| 
									
										
										
										
											2016-04-20 17:01:51 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('user metric', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should describe itself based on userMetrics', () => { | 
					
						
							| 
									
										
										
										
											2016-08-03 15:00:07 -07:00
										 |  |  |       expect(createMetric([[]], new PerfLogFeatures(), { | 
					
						
							|  |  |  |                userMetrics: {'loadTime': 'time to load'} | 
					
						
							|  |  |  |              }).describe()) | 
					
						
							| 
									
										
										
										
											2016-04-20 17:01:51 -07:00
										 |  |  |           .toEqual({'loadTime': 'time to load'}); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('endMeasure', () => { | 
					
						
							|  |  |  |       it('should stop measuring when all properties have numeric values', | 
					
						
							| 
									
										
										
										
											2016-08-26 16:34:08 -07:00
										 |  |  |          inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { | 
					
						
							| 
									
										
										
										
											2016-04-20 17:01:51 -07:00
										 |  |  |            let metric = createMetric( | 
					
						
							|  |  |  |                [[]], new PerfLogFeatures(), | 
					
						
							|  |  |  |                {userMetrics: {'loadTime': 'time to load', 'content': 'time to see content'}}); | 
					
						
							|  |  |  |            metric.beginMeasure() | 
					
						
							|  |  |  |                .then((_) => metric.endMeasure(true)) | 
					
						
							|  |  |  |                .then((values: {[key: string]: string}) => { | 
					
						
							|  |  |  |                  expect(values['loadTime']).toBe(25); | 
					
						
							|  |  |  |                  expect(values['content']).toBe(250); | 
					
						
							|  |  |  |                  async.done(); | 
					
						
							|  |  |  |                }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            wdAdapter.data['loadTime'] = 25; | 
					
						
							|  |  |  |            // Wait before setting 2nd property.
 | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  |            setTimeout(() => { wdAdapter.data['content'] = 250; }, 50); | 
					
						
							| 
									
										
										
										
											2016-04-20 17:01:51 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |          }), 600); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class MockDriverAdapter extends WebDriverAdapter { | 
					
						
							|  |  |  |   data: any = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   executeScript(script: string): any { | 
					
						
							|  |  |  |     // Just handles `return window.propName` ignores `delete window.propName`.
 | 
					
						
							|  |  |  |     if (script.indexOf('return window.') == 0) { | 
					
						
							|  |  |  |       let metricName = script.substring('return window.'.length); | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  |       return Promise.resolve(this.data[metricName]); | 
					
						
							| 
									
										
										
										
											2016-04-20 17:01:51 -07:00
										 |  |  |     } else if (script.indexOf('delete window.') == 0) { | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  |       return Promise.resolve(null); | 
					
						
							| 
									
										
										
										
											2016-04-20 17:01:51 -07:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  |       return Promise.reject(`Unexpected syntax: ${script}`); | 
					
						
							| 
									
										
										
										
											2016-04-20 17:01:51 -07:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |