benchpress
Version:
Benchpress - a framework for e2e performance tests
89 lines • 13.7 kB
JavaScript
import { Injector, bind, provide } from 'angular2/src/core/di';
import { isPresent, isBlank } from 'angular2/src/facade/lang';
import { PromiseWrapper } from 'angular2/src/facade/async';
import { Sampler } from './sampler';
import { ConsoleReporter } from './reporter/console_reporter';
import { MultiReporter } from './reporter/multi_reporter';
import { RegressionSlopeValidator } from './validator/regression_slope_validator';
import { SizeValidator } from './validator/size_validator';
import { Validator } from './validator';
import { PerflogMetric } from './metric/perflog_metric';
import { MultiMetric } from './metric/multi_metric';
import { ChromeDriverExtension } from './webdriver/chrome_driver_extension';
import { FirefoxDriverExtension } from './webdriver/firefox_driver_extension';
import { IOsDriverExtension } from './webdriver/ios_driver_extension';
import { WebDriverExtension } from './web_driver_extension';
import { SampleDescription } from './sample_description';
import { WebDriverAdapter } from './web_driver_adapter';
import { Reporter } from './reporter';
import { Metric } from './metric';
import { Options } from './common_options';
/**
* The Runner is the main entry point for executing a sample run.
* It provides defaults, creates the injector and calls the sampler.
*/
export class Runner {
constructor(defaultBindings = null) {
if (isBlank(defaultBindings)) {
defaultBindings = [];
}
this._defaultBindings = defaultBindings;
}
sample({ id, execute, prepare, microMetrics, bindings }) {
var sampleBindings = [
_DEFAULT_PROVIDERS,
this._defaultBindings,
bind(Options.SAMPLE_ID).toValue(id),
bind(Options.EXECUTE).toValue(execute)
];
if (isPresent(prepare)) {
sampleBindings.push(bind(Options.PREPARE).toValue(prepare));
}
if (isPresent(microMetrics)) {
sampleBindings.push(bind(Options.MICRO_METRICS).toValue(microMetrics));
}
if (isPresent(bindings)) {
sampleBindings.push(bindings);
}
var inj = Injector.resolveAndCreate(sampleBindings);
var adapter = inj.get(WebDriverAdapter);
return PromiseWrapper
.all([adapter.capabilities(), adapter.executeScript('return window.navigator.userAgent;')])
.then((args) => {
var capabilities = args[0];
var userAgent = args[1];
// This might still create instances twice. We are creating a new injector with all the
// providers.
// Only WebDriverAdapter is reused.
// TODO vsavkin consider changing it when toAsyncFactory is added back or when child
// injectors are handled better.
var injector = Injector.resolveAndCreate([
sampleBindings,
bind(Options.CAPABILITIES).toValue(capabilities),
bind(Options.USER_AGENT).toValue(userAgent),
provide(WebDriverAdapter, { useValue: adapter })
]);
var sampler = injector.get(Sampler);
return sampler.sample();
});
}
}
var _DEFAULT_PROVIDERS = [
Options.DEFAULT_PROVIDERS,
Sampler.BINDINGS,
ConsoleReporter.BINDINGS,
RegressionSlopeValidator.BINDINGS,
SizeValidator.BINDINGS,
ChromeDriverExtension.BINDINGS,
FirefoxDriverExtension.BINDINGS,
IOsDriverExtension.BINDINGS,
PerflogMetric.BINDINGS,
SampleDescription.BINDINGS,
MultiReporter.createBindings([ConsoleReporter]),
MultiMetric.createBindings([PerflogMetric]),
Reporter.bindTo(MultiReporter),
Validator.bindTo(RegressionSlopeValidator),
WebDriverExtension.bindTo([ChromeDriverExtension, FirefoxDriverExtension, IOsDriverExtension]),
Metric.bindTo(MultiMetric),
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmVuY2hwcmVzcy9zcmMvcnVubmVyLnRzIl0sIm5hbWVzIjpbIlJ1bm5lciIsIlJ1bm5lci5jb25zdHJ1Y3RvciIsIlJ1bm5lci5zYW1wbGUiXSwibWFwcGluZ3MiOiJPQUFPLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQVcsTUFBTSxzQkFBc0I7T0FDL0QsRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFDLE1BQU0sMEJBQTBCO09BQ3BELEVBQUMsY0FBYyxFQUFDLE1BQU0sMkJBQTJCO09BRWpELEVBQUMsT0FBTyxFQUFjLE1BQU0sV0FBVztPQUN2QyxFQUFDLGVBQWUsRUFBQyxNQUFNLDZCQUE2QjtPQUNwRCxFQUFDLGFBQWEsRUFBQyxNQUFNLDJCQUEyQjtPQUNoRCxFQUFDLHdCQUF3QixFQUFDLE1BQU0sd0NBQXdDO09BQ3hFLEVBQUMsYUFBYSxFQUFDLE1BQU0sNEJBQTRCO09BQ2pELEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYTtPQUM5QixFQUFDLGFBQWEsRUFBQyxNQUFNLHlCQUF5QjtPQUM5QyxFQUFDLFdBQVcsRUFBQyxNQUFNLHVCQUF1QjtPQUMxQyxFQUFDLHFCQUFxQixFQUFDLE1BQU0scUNBQXFDO09BQ2xFLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxzQ0FBc0M7T0FDcEUsRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGtDQUFrQztPQUM1RCxFQUFDLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCO09BQ2xELEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxzQkFBc0I7T0FDL0MsRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHNCQUFzQjtPQUM5QyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVk7T0FDNUIsRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVO09BQ3hCLEVBQUMsT0FBTyxFQUFDLE1BQU0sa0JBQWtCO0FBRXhDOzs7R0FHRztBQUNIO0lBRUVBLFlBQVlBLGVBQWVBLEdBQWVBLElBQUlBO1FB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R0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0E7WUFDcENBLE1BQU1BLENBQUNBLE9BQU9BLENBQUNBLE1BQU1BLEVBQUVBLENBQUNBO1FBQzFCQSxDQUFDQSxDQUFDQSxDQUFDQTtJQUNUQSxDQUFDQTtBQUNIRixDQUFDQTtBQUVELElBQUksa0JBQWtCLEdBQUc7SUFDdkIsT0FBTyxDQUFDLGlCQUFpQjtJQUN6QixPQUFPLENBQUMsUUFBUTtJQUNoQixlQUFlLENBQUMsUUFBUTtJQUN4Qix3QkFBd0IsQ0FBQyxRQUFRO0lBQ2pDLGFBQWEsQ0FBQyxRQUFRO0lBQ3RCLHFCQUFxQixDQUFDLFFBQVE7SUFDOUIsc0JBQXNCLENBQUMsUUFBUTtJQUMvQixrQkFBa0IsQ0FBQyxRQUFRO0lBQzNCLGFBQWEsQ0FBQyxRQUFRO0lBQ3RCLGlCQUFpQixDQUFDLFFBQVE7SUFDMUIsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQy9DLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUUzQyxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUM5QixTQUFTLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDO0lBQzFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDOUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7Q0FDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0b3IsIGJpbmQsIHByb3ZpZGUsIFByb3ZpZGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge2lzUHJlc2VudCwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7UHJvbWlzZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuXG5pbXBvcnQge1NhbXBsZXIsIFNhbXBsZVN0YXRlfSBmcm9tICcuL3NhbXBsZXInO1xuaW1wb3J0IHtDb25zb2xlUmVwb3J0ZXJ9IGZyb20gJy4vcmVwb3J0ZXIvY29uc29sZV9yZXBvcnRlcic7XG5pbXBvcnQge011bHRpUmVwb3J0ZXJ9IGZyb20gJy4vcmVwb3J0ZXIvbXVsdGlfcmVwb3J0ZXInO1xuaW1wb3J0IHtSZWdyZXNzaW9uU2xvcGVWYWxpZGF0b3J9IGZyb20gJy4vdmFsaWRhdG9yL3JlZ3Jlc3Npb25fc2xvcGVfdmFsaWRhdG9yJztcbmltcG9ydCB7U2l6ZVZhbGlkYXRvcn0gZnJvbSAnLi92YWxpZGF0b3Ivc2l6ZV92YWxpZGF0b3InO1xuaW1wb3J0IHtWYWxpZGF0b3J9IGZyb20gJy4vdmFsaWRhdG9yJztcbmltcG9ydCB7UGVyZmxvZ01ldHJpY30gZnJvbSAnLi9tZXRyaWMvcGVyZmxvZ19tZXRyaWMnO1xuaW1wb3J0IHtNdWx0aU1ldHJpY30gZnJvbSAnLi9tZXRyaWMvbXVsdGlfbWV0cmljJztcbmltcG9ydCB7Q2hyb21lRHJpdmVyRXh0ZW5zaW9ufSBmcm9tICcuL3dlYmRyaXZlci9jaHJvbWVfZHJpdmVyX2V4dGVuc2lvbic7XG5pbXBvcnQge0ZpcmVmb3hEcml2ZXJFeHRlbnNpb259IGZyb20gJy4vd2ViZHJpdmVyL2ZpcmVmb3hfZHJpdmVyX2V4dGVuc2lvbic7XG5pbXBvcnQge0lPc0RyaXZlckV4dGVuc2lvbn0gZnJvbSAnLi93ZWJkcml2ZXIvaW9zX2RyaXZlcl9leHRlbnNpb24nO1xuaW1wb3J0IHtXZWJEcml2ZXJFeHRlbnNpb259IGZyb20gJy4vd2ViX2RyaXZlcl9leHRlbnNpb24nO1xuaW1wb3J0IHtTYW1wbGVEZXNjcmlwdGlvbn0gZnJvbSAnLi9zYW1wbGVfZGVzY3JpcHRpb24nO1xuaW1wb3J0IHtXZWJEcml2ZXJBZGFwdGVyfSBmcm9tICcuL3dlYl9kcml2ZXJfYWRhcHRlcic7XG5pbXBvcnQge1JlcG9ydGVyfSBmcm9tICcuL3JlcG9ydGVyJztcbmltcG9ydCB7TWV0cmljfSBmcm9tICcuL21ldHJpYyc7XG5pbXBvcnQge09wdGlvbnN9IGZyb20gJy4vY29tbW9uX29wdGlvbnMnO1xuXG4vKipcbiAqIFRoZSBSdW5uZXIgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIGV4ZWN1dGluZyBhIHNhbXBsZSBydW4uXG4gKiBJdCBwcm92aWRlcyBkZWZhdWx0cywgY3JlYXRlcyB0aGUgaW5qZWN0b3IgYW5kIGNhbGxzIHRoZSBzYW1wbGVyLlxuICovXG5leHBvcnQgY2xhc3MgUnVubmVyIHtcbiAgcHJpdmF0ZSBfZGVmYXVsdEJpbmRpbmdzOiBQcm92aWRlcltdO1xuICBjb25zdHJ1Y3RvcihkZWZhdWx0QmluZGluZ3M6IFByb3ZpZGVyW10gPSBudWxsKSB7XG4gICAgaWYgKGlzQmxhbmsoZGVmYXVsdEJpbmRpbmdzKSkge1xuICAgICAgZGVmYXVsdEJpbmRpbmdzID0gW107XG4gICAgfVxuICAgIHRoaXMuX2RlZmF1bHRCaW5kaW5ncyA9IGRlZmF1bHRCaW5kaW5ncztcbiAgfVxuXG4gIHNhbXBsZSh7aWQsIGV4ZWN1dGUsIHByZXBhcmUsIG1pY3JvTWV0cmljcywgYmluZGluZ3N9OlxuICAgICAgICAgICAgIHtpZDogc3RyaW5nLCBleGVjdXRlPzogYW55LCBwcmVwYXJlPzogYW55LCBtaWNyb01ldHJpY3M/OiBhbnksIGJpbmRpbmdzPzogYW55fSk6XG4gICAgICBQcm9taXNlPFNhbXBsZVN0YXRlPiB7XG4gICAgdmFyIHNhbXBsZUJpbmRpbmdzID0gW1xuICAgICAgX0RFRkFVTFRfUFJPVklERVJTLFxuICAgICAgdGhpcy5fZGVmYXVsdEJpbmRpbmdzLFxuICAgICAgYmluZChPcHRpb25zLlNBTVBMRV9JRCkudG9WYWx1ZShpZCksXG4gICAgICBiaW5kKE9wdGlvbnMuRVhFQ1VURSkudG9WYWx1ZShleGVjdXRlKVxuICAgIF07XG4gICAgaWYgKGlzUHJlc2VudChwcmVwYXJlKSkge1xuICAgICAgc2FtcGxlQmluZGluZ3MucHVzaChiaW5kKE9wdGlvbnMuUFJFUEFSRSkudG9WYWx1ZShwcmVwYXJlKSk7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQobWljcm9NZXRyaWNzKSkge1xuICAgICAgc2FtcGxlQmluZGluZ3MucHVzaChiaW5kKE9wdGlvbnMuTUlDUk9fTUVUUklDUykudG9WYWx1ZShtaWNyb01ldHJpY3MpKTtcbiAgICB9XG4gICAgaWYgKGlzUHJlc2VudChiaW5kaW5ncykpIHtcbiAgICAgIHNhbXBsZUJpbmRpbmdzLnB1c2goYmluZGluZ3MpO1xuICAgIH1cblxuICAgIHZhciBpbmogPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKHNhbXBsZUJpbmRpbmdzKTtcbiAgICB2YXIgYWRhcHRlciA9IGluai5nZXQoV2ViRHJpdmVyQWRhcHRlcik7XG5cbiAgICByZXR1cm4gUHJvbWlzZVdyYXBwZXJcbiAgICAgICAgLmFsbChbYWRhcHRlci5jYXBhYmlsaXRpZXMoKSwgYWRhcHRlci5leGVjdXRlU2NyaXB0KCdyZXR1cm4gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7JyldKVxuICAgICAgICAudGhlbigoYXJncykgPT4ge1xuICAgICAgICAgIHZhciBjYXBhYmlsaXRpZXMgPSBhcmdzWzBdO1xuICAgICAgICAgIHZhciB1c2VyQWdlbnQgPSBhcmdzWzFdO1xuXG4gICAgICAgICAgLy8gVGhpcyBtaWdodCBzdGlsbCBjcmVhdGUgaW5zdGFuY2VzIHR3aWNlLiBXZSBhcmUgY3JlYXRpbmcgYSBuZXcgaW5qZWN0b3Igd2l0aCBhbGwgdGhlXG4gICAgICAgICAgLy8gcHJvdmlkZXJzLlxuICAgICAgICAgIC8vIE9ubHkgV2ViRHJpdmVyQWRhcHRlciBpcyByZXVzZWQuXG4gICAgICAgICAgLy8gVE9ETyB2c2F2a2luIGNvbnNpZGVyIGNoYW5naW5nIGl0IHdoZW4gdG9Bc3luY0ZhY3RvcnkgaXMgYWRkZWQgYmFjayBvciB3aGVuIGNoaWxkXG4gICAgICAgICAgLy8gaW5qZWN0b3JzIGFyZSBoYW5kbGVkIGJldHRlci5cbiAgICAgICAgICB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICAgICAgICAgIHNhbXBsZUJpbmRpbmdzLFxuICAgICAgICAgICAgYmluZChPcHRpb25zLkNBUEFCSUxJVElFUykudG9WYWx1ZShjYXBhYmlsaXRpZXMpLFxuICAgICAgICAgICAgYmluZChPcHRpb25zLlVTRVJfQUdFTlQpLnRvVmFsdWUodXNlckFnZW50KSxcbiAgICAgICAgICAgIHByb3ZpZGUoV2ViRHJpdmVyQWRhcHRlciwge3VzZVZhbHVlOiBhZGFwdGVyfSlcbiAgICAgICAgICBdKTtcblxuICAgICAgICAgIHZhciBzYW1wbGVyID0gaW5qZWN0b3IuZ2V0KFNhbXBsZXIpO1xuICAgICAgICAgIHJldHVybiBzYW1wbGVyLnNhbXBsZSgpO1xuICAgICAgICB9KTtcbiAgfVxufVxuXG52YXIgX0RFRkFVTFRfUFJPVklERVJTID0gW1xuICBPcHRpb25zLkRFRkFVTFRfUFJPVklERVJTLFxuICBTYW1wbGVyLkJJTkRJTkdTLFxuICBDb25zb2xlUmVwb3J0ZXIuQklORElOR1MsXG4gIFJlZ3Jlc3Npb25TbG9wZVZhbGlkYXRvci5CSU5ESU5HUyxcbiAgU2l6ZVZhbGlkYXRvci5CSU5ESU5HUyxcbiAgQ2hyb21lRHJpdmVyRXh0ZW5zaW9uLkJJTkRJTkdTLFxuICBGaXJlZm94RHJpdmVyRXh0ZW5zaW9uLkJJTkRJTkdTLFxuICBJT3NEcml2ZXJFeHRlbnNpb24uQklORElOR1MsXG4gIFBlcmZsb2dNZXRyaWMuQklORElOR1MsXG4gIFNhbXBsZURlc2NyaXB0aW9uLkJJTkRJTkdTLFxuICBNdWx0aVJlcG9ydGVyLmNyZWF0ZUJpbmRpbmdzKFtDb25zb2xlUmVwb3J0ZXJdKSxcbiAgTXVsdGlNZXRyaWMuY3JlYXRlQmluZGluZ3MoW1BlcmZsb2dNZXRyaWNdKSxcblxuICBSZXBvcnRlci5iaW5kVG8oTXVsdGlSZXBvcnRlciksXG4gIFZhbGlkYXRvci5iaW5kVG8oUmVncmVzc2lvblNsb3BlVmFsaWRhdG9yKSxcbiAgV2ViRHJpdmVyRXh0ZW5zaW9uLmJpbmRUbyhbQ2hyb21lRHJpdmVyRXh0ZW5zaW9uLCBGaXJlZm94RHJpdmVyRXh0ZW5zaW9uLCBJT3NEcml2ZXJFeHRlbnNpb25dKSxcbiAgTWV0cmljLmJpbmRUbyhNdWx0aU1ldHJpYyksXG5dO1xuIl19