benchpress
Version:
Benchpress - a framework for e2e performance tests
100 lines • 14.1 kB
JavaScript
import { isPresent, isBlank } from 'angular2/src/facade/lang';
import { PromiseWrapper } from 'angular2/src/facade/async';
import { bind } from 'angular2/src/core/di';
import { Metric } from './metric';
import { Validator } from './validator';
import { Reporter } from './reporter';
import { WebDriverAdapter } from './web_driver_adapter';
import { Options } from './common_options';
import { MeasureValues } from './measure_values';
/**
* The Sampler owns the sample loop:
* 1. calls the prepare/execute callbacks,
* 2. gets data from the metric
* 3. asks the validator for a valid sample
* 4. reports the new data to the reporter
* 5. loop until there is a valid sample
*/
export class Sampler {
constructor({ driver, metric, reporter, validator, prepare, execute, now } = {}) {
this._driver = driver;
this._metric = metric;
this._reporter = reporter;
this._validator = validator;
this._prepare = prepare;
this._execute = execute;
this._now = now;
}
// TODO(tbosch): use static values when our transpiler supports them
static get BINDINGS() { return _PROVIDERS; }
sample() {
var loop;
loop = (lastState) => {
return this._iterate(lastState).then((newState) => {
if (isPresent(newState.validSample)) {
return newState;
}
else {
return loop(newState);
}
});
};
return loop(new SampleState([], null));
}
_iterate(lastState) {
var resultPromise;
if (isPresent(this._prepare)) {
resultPromise = this._driver.waitFor(this._prepare);
}
else {
resultPromise = PromiseWrapper.resolve(null);
}
if (isPresent(this._prepare) || lastState.completeSample.length === 0) {
resultPromise = resultPromise.then((_) => this._metric.beginMeasure());
}
return resultPromise.then((_) => this._driver.waitFor(this._execute))
.then((_) => this._metric.endMeasure(isBlank(this._prepare)))
.then((measureValues) => this._report(lastState, measureValues));
}
_report(state, metricValues) {
var measureValues = new MeasureValues(state.completeSample.length, this._now(), metricValues);
var completeSample = state.completeSample.concat([measureValues]);
var validSample = this._validator.validate(completeSample);
var resultPromise = this._reporter.reportMeasureValues(measureValues);
if (isPresent(validSample)) {
resultPromise =
resultPromise.then((_) => this._reporter.reportSample(completeSample, validSample));
}
return resultPromise.then((_) => new SampleState(completeSample, validSample));
}
}
export class SampleState {
constructor(completeSample, validSample) {
this.completeSample = completeSample;
this.validSample = validSample;
}
}
var _PROVIDERS = [
bind(Sampler)
.toFactory((driver, metric, reporter, validator, prepare, execute, now) => new Sampler({
driver: driver,
reporter: reporter,
validator: validator,
metric: metric,
// TODO(tbosch): DI right now does not support null/undefined objects
// Mostly because the cache would have to be initialized with a
// special null object, which is expensive.
prepare: prepare !== false ? prepare : null,
execute: execute,
now: now
}), [
WebDriverAdapter,
Metric,
Reporter,
Validator,
Options.PREPARE,
Options.EXECUTE,
Options.NOW
])
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtcGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRpZmZpbmdfcGx1Z2luX3dyYXBwZXItb3V0cHV0X3BhdGgteEJMSUJyVlIudG1wL2JlbmNocHJlc3Mvc3JjL3NhbXBsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ik9BQU8sRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFvQixNQUFNLDBCQUEwQjtPQUN2RSxFQUFDLGNBQWMsRUFBQyxNQUFNLDJCQUEyQjtPQUNqRCxFQUFDLElBQUksRUFBaUMsTUFBTSxzQkFBc0I7T0FFbEUsRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVO09BQ3hCLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYTtPQUM5QixFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVk7T0FDNUIsRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHNCQUFzQjtPQUU5QyxFQUFDLE9BQU8sRUFBQyxNQUFNLGtCQUFrQjtPQUNqQyxFQUFDLGFBQWEsRUFBQyxNQUFNLGtCQUFrQjtBQUU5Qzs7Ozs7OztHQU9HO0FBQ0g7SUFZRSxZQUFZLEVBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFDLEdBUXBFLEVBQUU7UUFDSixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBM0JELG9FQUFvRTtJQUNwRSxXQUFXLFFBQVEsS0FBaUIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxD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Y0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDakYsQ0FBQztBQUNILENBQUM7QUFFRDtJQUNFLFlBQW1CLGNBQXFCLEVBQVMsV0FBa0I7UUFBaEQsbUJBQWMsR0FBZCxjQUFjLENBQU87UUFBUyxnQkFBVyxHQUFYLFdBQVcsQ0FBTztJQUFHLENBQUM7QUFDekUsQ0FBQztBQUVELElBQUksVUFBVSxHQUFHO0lBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUNSLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsS0FBSyxJQUFJLE9BQU8sQ0FBQztRQUMxRSxNQUFNLEVBQUUsTUFBTTtRQUNkLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLE1BQU0sRUFBRSxNQUFNO1FBQ2QscUVBQXFFO1FBQ3JFLCtEQUErRDtRQUMvRCwyQ0FBMkM7UUFDM0MsT0FBTyxFQUFFLE9BQU8sS0FBSyxLQUFLLEdBQUcsT0FBTyxHQUFHLElBQUk7UUFDM0MsT0FBTyxFQUFFLE9BQU87UUFDaEIsR0FBRyxFQUFFLEdBQUc7S0FDVCxDQUFDLEVBQ0Y7UUFDRSxnQkFBZ0I7UUFDaEIsTUFBTTtRQUNOLFFBQVE7UUFDUixTQUFTO1FBQ1QsT0FBTyxDQUFDLE9BQU87UUFDZixPQUFPLENBQUMsT0FBTztRQUNmLE9BQU8sQ0FBQyxHQUFHO0tBQ1osQ0FBQztDQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc1ByZXNlbnQsIGlzQmxhbmssIERhdGUsIERhdGVXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtQcm9taXNlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5pbXBvcnQge2JpbmQsIHByb3ZpZGUsIFByb3ZpZGVyLCBPcGFxdWVUb2tlbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuXG5pbXBvcnQge01ldHJpY30gZnJvbSAnLi9tZXRyaWMnO1xuaW1wb3J0IHtWYWxpZGF0b3J9IGZyb20gJy4vdmFsaWRhdG9yJztcbmltcG9ydCB7UmVwb3J0ZXJ9IGZyb20gJy4vcmVwb3J0ZXInO1xuaW1wb3J0IHtXZWJEcml2ZXJBZGFwdGVyfSBmcm9tICcuL3dlYl9kcml2ZXJfYWRhcHRlcic7XG5cbmltcG9ydCB7T3B0aW9uc30gZnJvbSAnLi9jb21tb25fb3B0aW9ucyc7XG5pbXBvcnQge01lYXN1cmVWYWx1ZXN9IGZyb20gJy4vbWVhc3VyZV92YWx1ZXMnO1xuXG4vKipcbiAqIFRoZSBTYW1wbGVyIG93bnMgdGhlIHNhbXBsZSBsb29wOlxuICogMS4gY2FsbHMgdGhlIHByZXBhcmUvZXhlY3V0ZSBjYWxsYmFja3MsXG4gKiAyLiBnZXRzIGRhdGEgZnJvbSB0aGUgbWV0cmljXG4gKiAzLiBhc2tzIHRoZSB2YWxpZGF0b3IgZm9yIGEgdmFsaWQgc2FtcGxlXG4gKiA0LiByZXBvcnRzIHRoZSBuZXcgZGF0YSB0byB0aGUgcmVwb3J0ZXJcbiAqIDUuIGxvb3AgdW50aWwgdGhlcmUgaXMgYSB2YWxpZCBzYW1wbGVcbiAqL1xuZXhwb3J0IGNsYXNzIFNhbXBsZXIge1xuICAvLyBUT0RPKHRib3NjaCk6IHVzZSBzdGF0aWMgdmFsdWVzIHdoZW4gb3VyIHRyYW5zcGlsZXIgc3VwcG9ydHMgdGhlbVxuICBzdGF0aWMgZ2V0IEJJTkRJTkdTKCk6IFByb3ZpZGVyW10geyByZXR1cm4gX1BST1ZJREVSUzsgfVxuXG4gIF9kcml2ZXI6IFdlYkRyaXZlckFkYXB0ZXI7XG4gIF9tZXRyaWM6IE1ldHJpYztcbiAgX3JlcG9ydGVyOiBSZXBvcnRlcjtcbiAgX3ZhbGlkYXRvcjogVmFsaWRhdG9yO1xuICBfcHJlcGFyZTogRnVuY3Rpb247XG4gIF9leGVjdXRlOiBGdW5jdGlvbjtcbiAgX25vdzogRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioe2RyaXZlciwgbWV0cmljLCByZXBvcnRlciwgdmFsaWRhdG9yLCBwcmVwYXJlLCBleGVjdXRlLCBub3d9OiB7XG4gICAgZHJpdmVyPzogV2ViRHJpdmVyQWRhcHRlcixcbiAgICBtZXRyaWM/OiBNZXRyaWMsXG4gICAgcmVwb3J0ZXI/OiBSZXBvcnRlcixcbiAgICB2YWxpZGF0b3I/OiBWYWxpZGF0b3IsXG4gICAgcHJlcGFyZT86IEZ1bmN0aW9uLFxuICAgIGV4ZWN1dGU/OiBGdW5jdGlvbixcbiAgICBub3c/OiBGdW5jdGlvblxuICB9ID0ge30pIHtcbiAgICB0aGlzLl9kcml2ZXIgPSBkcml2ZXI7XG4gICAgdGhpcy5fbWV0cmljID0gbWV0cmljO1xuICAgIHRoaXMuX3JlcG9ydGVyID0gcmVwb3J0ZXI7XG4gICAgdGhpcy5fdmFsaWRhdG9yID0gdmFsaWRhdG9yO1xuICAgIHRoaXMuX3ByZXBhcmUgPSBwcmVwYXJlO1xuICAgIHRoaXMuX2V4ZWN1dGUgPSBleGVjdXRlO1xuICAgIHRoaXMuX25vdyA9IG5vdztcbiAgfVxuXG4gIHNhbXBsZSgpOiBQcm9taXNlPFNhbXBsZVN0YXRlPiB7XG4gICAgdmFyIGxvb3A7XG4gICAgbG9vcCA9IChsYXN0U3RhdGUpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLl9pdGVyYXRlKGxhc3RTdGF0ZSkudGhlbigobmV3U3RhdGUpID0+IHtcbiAgICAgICAgaWYgKGlzUHJlc2VudChuZXdTdGF0ZS52YWxpZFNhbXBsZSkpIHtcbiAgICAgICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGxvb3AobmV3U3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBsb29wKG5ldyBTYW1wbGVTdGF0ZShbXSwgbnVsbCkpO1xuICB9XG5cbiAgX2l0ZXJhdGUobGFzdFN0YXRlKTogUHJvbWlzZTxTYW1wbGVTdGF0ZT4ge1xuICAgIHZhciByZXN1bHRQcm9taXNlOiBQcm9taXNlPGFueT47XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl9wcmVwYXJlKSkge1xuICAgICAgcmVzdWx0UHJvbWlzZSA9IHRoaXMuX2RyaXZlci53YWl0Rm9yKHRoaXMuX3ByZXBhcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRQcm9taXNlID0gUHJvbWlzZVdyYXBwZXIucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl9wcmVwYXJlKSB8fCBsYXN0U3RhdGUuY29tcGxldGVTYW1wbGUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXN1bHRQcm9taXNlID0gcmVzdWx0UHJvbWlzZS50aGVuKChfKSA9PiB0aGlzLl9tZXRyaWMuYmVnaW5NZWFzdXJlKCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0UHJvbWlzZS50aGVuKChfKSA9PiB0aGlzLl9kcml2ZXIud2FpdEZvcih0aGlzLl9leGVjdXRlKSlcbiAgICAgICAgLnRoZW4oKF8pID0+IHRoaXMuX21ldHJpYy5lbmRNZWFzdXJlKGlzQmxhbmsodGhpcy5fcHJlcGFyZSkpKVxuICAgICAgICAudGhlbigobWVhc3VyZVZhbHVlcykgPT4gdGhpcy5fcmVwb3J0KGxhc3RTdGF0ZSwgbWVhc3VyZVZhbHVlcykpO1xuICB9XG5cbiAgX3JlcG9ydChzdGF0ZTogU2FtcGxlU3RhdGUsIG1ldHJpY1ZhbHVlczoge1trZXk6IHN0cmluZ106IGFueX0pOiBQcm9taXNlPFNhbXBsZVN0YXRlPiB7XG4gICAgdmFyIG1lYXN1cmVWYWx1ZXMgPSBuZXcgTWVhc3VyZVZhbHVlcyhzdGF0ZS5jb21wbGV0ZVNhbXBsZS5sZW5ndGgsIHRoaXMuX25vdygpLCBtZXRyaWNWYWx1ZXMpO1xuICAgIHZhciBjb21wbGV0ZVNhbXBsZSA9IHN0YXRlLmNvbXBsZXRlU2FtcGxlLmNvbmNhdChbbWVhc3VyZVZhbHVlc10pO1xuICAgIHZhciB2YWxpZFNhbXBsZSA9IHRoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZShjb21wbGV0ZVNhbXBsZSk7XG4gICAgdmFyIHJlc3VsdFByb21pc2UgPSB0aGlzLl9yZXBvcnRlci5yZXBvcnRNZWFzdXJlVmFsdWVzKG1lYXN1cmVWYWx1ZXMpO1xuICAgIGlmIChpc1ByZXNlbnQodmFsaWRTYW1wbGUpKSB7XG4gICAgICByZXN1bHRQcm9taXNlID1cbiAgICAgICAgICByZXN1bHRQcm9taXNlLnRoZW4oKF8pID0+IHRoaXMuX3JlcG9ydGVyLnJlcG9ydFNhbXBsZShjb21wbGV0ZVNhbXBsZSwgdmFsaWRTYW1wbGUpKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0UHJvbWlzZS50aGVuKChfKSA9PiBuZXcgU2FtcGxlU3RhdGUoY29tcGxldGVTYW1wbGUsIHZhbGlkU2FtcGxlKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNhbXBsZVN0YXRlIHtcbiAgY29uc3RydWN0b3IocHVibGljIGNvbXBsZXRlU2FtcGxlOiBhbnlbXSwgcHVibGljIHZhbGlkU2FtcGxlOiBhbnlbXSkge31cbn1cblxudmFyIF9QUk9WSURFUlMgPSBbXG4gIGJpbmQoU2FtcGxlcilcbiAgICAgIC50b0ZhY3RvcnkoKGRyaXZlciwgbWV0cmljLCByZXBvcnRlciwgdmFsaWRhdG9yLCBwcmVwYXJlLCBleGVjdXRlLCBub3cpID0+IG5ldyBTYW1wbGVyKHtcbiAgICAgICAgICAgICAgICAgICBkcml2ZXI6IGRyaXZlcixcbiAgICAgICAgICAgICAgICAgICByZXBvcnRlcjogcmVwb3J0ZXIsXG4gICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yOiB2YWxpZGF0b3IsXG4gICAgICAgICAgICAgICAgICAgbWV0cmljOiBtZXRyaWMsXG4gICAgICAgICAgICAgICAgICAgLy8gVE9ETyh0Ym9zY2gpOiBESSByaWdodCBub3cgZG9lcyBub3Qgc3VwcG9ydCBudWxsL3VuZGVmaW5lZCBvYmplY3RzXG4gICAgICAgICAgICAgICAgICAgLy8gTW9zdGx5IGJlY2F1c2UgdGhlIGNhY2hlIHdvdWxkIGhhdmUgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCBhXG4gICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBudWxsIG9iamVjdCwgd2hpY2ggaXMgZXhwZW5zaXZlLlxuICAgICAgICAgICAgICAgICAgIHByZXBhcmU6IHByZXBhcmUgIT09IGZhbHNlID8gcHJlcGFyZSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgZXhlY3V0ZTogZXhlY3V0ZSxcbiAgICAgICAgICAgICAgICAgICBub3c6IG5vd1xuICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgIFdlYkRyaXZlckFkYXB0ZXIsXG4gICAgICAgICAgICAgICAgICAgTWV0cmljLFxuICAgICAgICAgICAgICAgICAgIFJlcG9ydGVyLFxuICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvcixcbiAgICAgICAgICAgICAgICAgICBPcHRpb25zLlBSRVBBUkUsXG4gICAgICAgICAgICAgICAgICAgT3B0aW9ucy5FWEVDVVRFLFxuICAgICAgICAgICAgICAgICAgIE9wdGlvbnMuTk9XXG4gICAgICAgICAgICAgICAgIF0pXG5dO1xuIl19