UNPKG

3.86 kBPlain TextView Raw
1import {Injector, bind, provide, Provider, ReflectiveInjector} from 'angular2/src/core/di';
2import {isPresent, isBlank} from 'angular2/src/facade/lang';
3import {PromiseWrapper} from 'angular2/src/facade/async';
4
5import {Sampler, SampleState} from './sampler';
6import {ConsoleReporter} from './reporter/console_reporter';
7import {MultiReporter} from './reporter/multi_reporter';
8import {RegressionSlopeValidator} from './validator/regression_slope_validator';
9import {SizeValidator} from './validator/size_validator';
10import {Validator} from './validator';
11import {PerflogMetric} from './metric/perflog_metric';
12import {MultiMetric} from './metric/multi_metric';
13import {ChromeDriverExtension} from './webdriver/chrome_driver_extension';
14import {FirefoxDriverExtension} from './webdriver/firefox_driver_extension';
15import {IOsDriverExtension} from './webdriver/ios_driver_extension';
16import {WebDriverExtension} from './web_driver_extension';
17import {SampleDescription} from './sample_description';
18import {WebDriverAdapter} from './web_driver_adapter';
19import {Reporter} from './reporter';
20import {Metric} from './metric';
21import {Options} from './common_options';
22
23/**
24 * The Runner is the main entry point for executing a sample run.
25 * It provides defaults, creates the injector and calls the sampler.
26 */
27export class Runner {
28 private _defaultBindings: Provider[];
29 constructor(defaultBindings: Provider[] = null) {
30 if (isBlank(defaultBindings)) {
31 defaultBindings = [];
32 }
33 this._defaultBindings = defaultBindings;
34 }
35
36 sample({id, execute, prepare, microMetrics, bindings}:
37 {id: string, execute?: any, prepare?: any, microMetrics?: any, bindings?: any}):
38 Promise<SampleState> {
39 var sampleBindings = [
40 _DEFAULT_PROVIDERS,
41 this._defaultBindings,
42 bind(Options.SAMPLE_ID).toValue(id),
43 bind(Options.EXECUTE).toValue(execute)
44 ];
45 if (isPresent(prepare)) {
46 sampleBindings.push(bind(Options.PREPARE).toValue(prepare));
47 }
48 if (isPresent(microMetrics)) {
49 sampleBindings.push(bind(Options.MICRO_METRICS).toValue(microMetrics));
50 }
51 if (isPresent(bindings)) {
52 sampleBindings.push(bindings);
53 }
54
55 var inj = ReflectiveInjector.resolveAndCreate(sampleBindings);
56 var adapter = inj.get(WebDriverAdapter);
57
58 return PromiseWrapper
59 .all([adapter.capabilities(), adapter.executeScript('return window.navigator.userAgent;')])
60 .then((args) => {
61 var capabilities = args[0];
62 var userAgent = args[1];
63
64 // This might still create instances twice. We are creating a new injector with all the
65 // providers.
66 // Only WebDriverAdapter is reused.
67 // TODO vsavkin consider changing it when toAsyncFactory is added back or when child
68 // injectors are handled better.
69 var injector = ReflectiveInjector.resolveAndCreate([
70 sampleBindings,
71 bind(Options.CAPABILITIES).toValue(capabilities),
72 bind(Options.USER_AGENT).toValue(userAgent),
73 provide(WebDriverAdapter, {useValue: adapter})
74 ]);
75
76 var sampler = injector.get(Sampler);
77 return sampler.sample();
78 });
79 }
80}
81
82var _DEFAULT_PROVIDERS = [
83 Options.DEFAULT_PROVIDERS,
84 Sampler.BINDINGS,
85 ConsoleReporter.BINDINGS,
86 RegressionSlopeValidator.BINDINGS,
87 SizeValidator.BINDINGS,
88 ChromeDriverExtension.BINDINGS,
89 FirefoxDriverExtension.BINDINGS,
90 IOsDriverExtension.BINDINGS,
91 PerflogMetric.BINDINGS,
92 SampleDescription.BINDINGS,
93 MultiReporter.createBindings([ConsoleReporter]),
94 MultiMetric.createBindings([PerflogMetric]),
95
96 Reporter.bindTo(MultiReporter),
97 Validator.bindTo(RegressionSlopeValidator),
98 WebDriverExtension.bindTo([ChromeDriverExtension, FirefoxDriverExtension, IOsDriverExtension]),
99 Metric.bindTo(MultiMetric),
100];