Skip to content

Commit 1d4ffd9

Browse files
committed
feat(bench press): allow multiple reporters, metrics and driver extensions.
1 parent 987a5fd commit 1d4ffd9

29 files changed

+559
-63
lines changed

modules/benchpress/benchpress.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,7 @@ export { IOsDriverExtension } from './src/webdriver/ios_driver_extension';
1414
export { Runner } from './src/runner';
1515
export { Options } from './src/sample_options';
1616
export { MeasureValues } from './src/measure_values';
17+
export { MultiMetric } from './src/metric/multi_metric';
18+
export { MultiReporter } from './src/reporter/multi_reporter';
1719

1820
export { bind, Injector, OpaqueToken } from 'angular2/di';

modules/benchpress/src/metric.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { bind } from 'angular2/di';
12
import {
23
Promise, PromiseWrapper
34
} from 'angular2/src/facade/async';
@@ -11,6 +12,14 @@ import { StringMap } from 'angular2/src/facade/collection';
1112
*/
1213
@ABSTRACT()
1314
export class Metric {
15+
static bindTo(delegateToken) {
16+
return [
17+
bind(Metric).toFactory(
18+
(delegate) => delegate, [delegateToken]
19+
)
20+
];
21+
}
22+
1423
/**
1524
* Starts measuring
1625
*/
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { bind, Injector, OpaqueToken } from 'angular2/di';
2+
import { List, ListWrapper, StringMapWrapper, StringMap } from 'angular2/src/facade/collection';
3+
import { Promise, PromiseWrapper } from 'angular2/src/facade/async';
4+
5+
import { Metric } from '../metric';
6+
7+
export class MultiMetric extends Metric {
8+
static createBindings(childTokens) {
9+
return [
10+
bind(_CHILDREN).toAsyncFactory(
11+
(injector) => PromiseWrapper.all(ListWrapper.map(childTokens, (token) => injector.asyncGet(token) )),
12+
[Injector]
13+
),
14+
bind(MultiMetric).toFactory(
15+
(children) => new MultiMetric(children),
16+
[_CHILDREN]
17+
)
18+
];
19+
}
20+
21+
_metrics:List;
22+
23+
constructor(metrics) {
24+
super();
25+
this._metrics = metrics;
26+
}
27+
28+
/**
29+
* Starts measuring
30+
*/
31+
beginMeasure():Promise {
32+
return PromiseWrapper.all(ListWrapper.map(
33+
this._metrics, (metric) => metric.beginMeasure()
34+
));
35+
}
36+
37+
/**
38+
* Ends measuring and reports the data
39+
* since the begin call.
40+
* @param restart: Whether to restart right after this.
41+
*/
42+
endMeasure(restart:boolean):Promise<StringMap> {
43+
return PromiseWrapper.all(ListWrapper.map(
44+
this._metrics, (metric) => metric.endMeasure(restart)
45+
)).then( (values) => {
46+
return mergeStringMaps(values);
47+
});
48+
}
49+
50+
/**
51+
* Describes the metrics provided by this metric implementation.
52+
* (e.g. units, ...)
53+
*/
54+
describe():StringMap {
55+
return mergeStringMaps(this._metrics.map( (metric) => metric.describe() ));
56+
}
57+
}
58+
59+
function mergeStringMaps(maps) {
60+
var result = {};
61+
ListWrapper.forEach(maps, (map) => {
62+
StringMapWrapper.forEach(map, (value, prop) => {
63+
result[prop] = value;
64+
});
65+
});
66+
return result;
67+
}
68+
69+
var _CHILDREN = new OpaqueToken('MultiMetric.children');

modules/benchpress/src/metric/perflog_metric.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ var _MAX_RETRY_COUNT = 20;
155155
var _MARK_NAME_PREFIX = 'benchpress';
156156
var _SET_TIMEOUT = new OpaqueToken('PerflogMetric.setTimeout');
157157
var _BINDINGS = [
158-
bind(Metric).toFactory(
158+
bind(PerflogMetric).toFactory(
159159
(driverExtension, setTimeout) => new PerflogMetric(driverExtension, setTimeout),
160160
[WebDriverExtension, _SET_TIMEOUT]
161161
),

modules/benchpress/src/reporter.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { bind } from 'angular2/di';
12
import {
23
Promise, PromiseWrapper
34
} from 'angular2/src/facade/async';
@@ -12,6 +13,14 @@ import { MeasureValues } from './measure_values';
1213
*/
1314
@ABSTRACT()
1415
export class Reporter {
16+
static bindTo(delegateToken) {
17+
return [
18+
bind(Reporter).toFactory(
19+
(delegate) => delegate, [delegateToken]
20+
)
21+
];
22+
}
23+
1524
reportMeasureValues(values:MeasureValues):Promise {
1625
throw new BaseException('NYI');
1726
}

modules/benchpress/src/reporter/console_reporter.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ export class ConsoleReporter extends Reporter {
109109
var _PRINT = new OpaqueToken('ConsoleReporter.print');
110110
var _COLUMN_WIDTH = new OpaqueToken('ConsoleReporter.columnWidht');
111111
var _BINDINGS = [
112-
bind(Reporter).toFactory(
112+
bind(ConsoleReporter).toFactory(
113113
(columnWidth, sampleDescription, print) => new ConsoleReporter(columnWidth, sampleDescription, print),
114114
[_COLUMN_WIDTH, SampleDescription, _PRINT]
115115
),
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { bind, Injector, OpaqueToken } from 'angular2/di';
2+
import { List, ListWrapper } from 'angular2/src/facade/collection';
3+
import { Promise, PromiseWrapper } from 'angular2/src/facade/async';
4+
5+
import { MeasureValues } from '../measure_values';
6+
import { Reporter } from '../reporter';
7+
8+
export class MultiReporter extends Reporter {
9+
static createBindings(childTokens) {
10+
return [
11+
bind(_CHILDREN).toAsyncFactory(
12+
(injector) => PromiseWrapper.all(ListWrapper.map(childTokens, (token) => injector.asyncGet(token) )),
13+
[Injector]
14+
),
15+
bind(MultiReporter).toFactory(
16+
(children) => new MultiReporter(children),
17+
[_CHILDREN]
18+
)
19+
];
20+
}
21+
22+
_reporters:List;
23+
24+
constructor(reporters) {
25+
super();
26+
this._reporters = reporters;
27+
}
28+
29+
reportMeasureValues(values:MeasureValues):Promise {
30+
return PromiseWrapper.all(ListWrapper.map(
31+
this._reporters, (reporter) => reporter.reportMeasureValues(values)
32+
));
33+
}
34+
35+
reportSample(completeSample:List<MeasureValues>, validSample:List<MeasureValues>):Promise {
36+
return PromiseWrapper.all(ListWrapper.map(
37+
this._reporters, (reporter) => reporter.reportSample(completeSample, validSample)
38+
));
39+
}
40+
}
41+
42+
var _CHILDREN = new OpaqueToken('MultiReporter.children');

modules/benchpress/src/runner.js

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,19 @@ import { Promise } from 'angular2/src/facade/async';
55

66
import { Sampler, SampleState } from './sampler';
77
import { ConsoleReporter } from './reporter/console_reporter';
8+
import { MultiReporter } from './reporter/multi_reporter';
89
import { RegressionSlopeValidator } from './validator/regression_slope_validator';
10+
import { SizeValidator } from './validator/size_validator';
11+
import { Validator } from './validator';
912
import { PerflogMetric } from './metric/perflog_metric';
13+
import { MultiMetric } from './metric/multi_metric';
1014
import { ChromeDriverExtension } from './webdriver/chrome_driver_extension';
15+
import { IOsDriverExtension } from './webdriver/ios_driver_extension';
16+
import { WebDriverExtension } from './web_driver_extension';
1117
import { SampleDescription } from './sample_description';
12-
18+
import { WebDriverAdapter } from './web_driver_adapter';
19+
import { Reporter } from './reporter';
20+
import { Metric } from './metric';
1321
import { Options } from './sample_options';
1422

1523
/**
@@ -48,7 +56,23 @@ var _DEFAULT_BINDINGS = [
4856
Sampler.BINDINGS,
4957
ConsoleReporter.BINDINGS,
5058
RegressionSlopeValidator.BINDINGS,
59+
SizeValidator.BINDINGS,
5160
ChromeDriverExtension.BINDINGS,
61+
IOsDriverExtension.BINDINGS,
5262
PerflogMetric.BINDINGS,
53-
SampleDescription.BINDINGS
63+
SampleDescription.BINDINGS,
64+
MultiReporter.createBindings([ConsoleReporter]),
65+
MultiMetric.createBindings([PerflogMetric]),
66+
67+
Reporter.bindTo(MultiReporter),
68+
Validator.bindTo(RegressionSlopeValidator),
69+
WebDriverExtension.bindTo([ChromeDriverExtension, IOsDriverExtension]),
70+
Metric.bindTo(MultiMetric),
71+
72+
bind(Options.CAPABILITIES).toAsyncFactory(
73+
(adapter) => adapter.capabilities(), [WebDriverAdapter]
74+
),
75+
bind(Options.USER_AGENT).toAsyncFactory(
76+
(adapter) => adapter.executeScript('return window.navigator.userAgent;'), [WebDriverAdapter]
77+
)
5478
];

modules/benchpress/src/sample_description.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,18 @@ export class SampleDescription {
2727

2828
var _BINDINGS = [
2929
bind(SampleDescription).toFactory(
30-
(metric, id, forceGc, validator, defaultDesc, userDesc) => new SampleDescription(id,
30+
(metric, id, forceGc, userAgent, validator, defaultDesc, userDesc) => new SampleDescription(id,
3131
[
32-
{'forceGc': forceGc},
32+
{'forceGc': forceGc, 'userAgent': userAgent},
3333
validator.describe(),
3434
defaultDesc,
3535
userDesc
3636
],
3737
metric.describe()),
38-
[Metric, Options.SAMPLE_ID, Options.FORCE_GC, Validator, Options.DEFAULT_DESCRIPTION, Options.SAMPLE_DESCRIPTION]
38+
[
39+
Metric, Options.SAMPLE_ID, Options.FORCE_GC, Options.USER_AGENT,
40+
Validator, Options.DEFAULT_DESCRIPTION, Options.SAMPLE_DESCRIPTION
41+
]
3942
),
4043
bind(Options.DEFAULT_DESCRIPTION).toValue({}),
4144
bind(Options.SAMPLE_DESCRIPTION).toValue({})

modules/benchpress/src/sample_options.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,17 @@ export class Options {
1313
static get PREPARE() { return _PREPARE; }
1414
// TODO(tbosch): use static initializer when our transpiler supports it
1515
static get EXECUTE() { return _EXECUTE; }
16+
// TODO(tbosch): use static initializer when our transpiler supports it
17+
static get CAPABILITIES() { return _CAPABILITIES; }
18+
// TODO(tbosch): use static initializer when our transpiler supports it
19+
static get USER_AGENT() { return _USER_AGENT; }
1620
}
1721

18-
var _SAMPLE_ID = new OpaqueToken('SampleDescription.sampleId');
19-
var _DEFAULT_DESCRIPTION = new OpaqueToken('SampleDescription.defaultDescription');
20-
var _SAMPLE_DESCRIPTION = new OpaqueToken('SampleDescription.sampleDescription');
21-
var _FORCE_GC = new OpaqueToken('Sampler.forceGc');
22-
var _PREPARE = new OpaqueToken('Sampler.prepare');
23-
var _EXECUTE = new OpaqueToken('Sampler.execute');
22+
var _SAMPLE_ID = new OpaqueToken('Options.sampleId');
23+
var _DEFAULT_DESCRIPTION = new OpaqueToken('Options.defaultDescription');
24+
var _SAMPLE_DESCRIPTION = new OpaqueToken('Options.sampleDescription');
25+
var _FORCE_GC = new OpaqueToken('Options.forceGc');
26+
var _PREPARE = new OpaqueToken('Options.prepare');
27+
var _EXECUTE = new OpaqueToken('Options.execute');
28+
var _CAPABILITIES = new OpaqueToken('Options.capabilities');
29+
var _USER_AGENT = new OpaqueToken('Options.userAgent');

0 commit comments

Comments
 (0)