benchpress
Version:
Benchpress - a framework for e2e performance tests
116 lines • 17.3 kB
JavaScript
import { bind } from 'angular2/src/core/di';
import { Json, isPresent, isBlank, StringWrapper } from 'angular2/src/facade/lang';
import { BaseException } from 'angular2/src/facade/exceptions';
import { WebDriverExtension, PerfLogFeatures } from '../web_driver_extension';
import { WebDriverAdapter } from '../web_driver_adapter';
export class IOsDriverExtension extends WebDriverExtension {
constructor(_driver) {
super();
this._driver = _driver;
}
// TODO(tbosch): use static values when our transpiler supports them
static get BINDINGS() { return _PROVIDERS; }
gc() { throw new BaseException('Force GC is not supported on iOS'); }
timeBegin(name) {
return this._driver.executeScript(`console.time('${name}');`);
}
timeEnd(name, restartName = null) {
var script = `console.timeEnd('${name}');`;
if (isPresent(restartName)) {
script += `console.time('${restartName}');`;
}
return this._driver.executeScript(script);
}
// See https://github.com/WebKit/webkit/tree/master/Source/WebInspectorUI/Versions
readPerfLog() {
// TODO(tbosch): Bug in IOsDriver: Need to execute at least one command
// so that the browser logs can be read out!
return this._driver.executeScript('1+1')
.then((_) => this._driver.logs('performance'))
.then((entries) => {
var records = [];
entries.forEach(entry => {
var message = Json.parse(entry['message'])['message'];
if (StringWrapper.equals(message['method'], 'Timeline.eventRecorded')) {
records.push(message['params']['record']);
}
});
return this._convertPerfRecordsToEvents(records);
});
}
_convertPerfRecordsToEvents(records, events = null) {
if (isBlank(events)) {
events = [];
}
records.forEach((record) => {
var endEvent = null;
var type = record['type'];
var data = record['data'];
var startTime = record['startTime'];
var endTime = record['endTime'];
if (StringWrapper.equals(type, 'FunctionCall') &&
(isBlank(data) || !StringWrapper.equals(data['scriptName'], 'InjectedScript'))) {
events.push(createStartEvent('script', startTime));
endEvent = createEndEvent('script', endTime);
}
else if (StringWrapper.equals(type, 'Time')) {
events.push(createMarkStartEvent(data['message'], startTime));
}
else if (StringWrapper.equals(type, 'TimeEnd')) {
events.push(createMarkEndEvent(data['message'], startTime));
}
else if (StringWrapper.equals(type, 'RecalculateStyles') ||
StringWrapper.equals(type, 'Layout') ||
StringWrapper.equals(type, 'UpdateLayerTree') ||
StringWrapper.equals(type, 'Paint') || StringWrapper.equals(type, 'Rasterize') ||
StringWrapper.equals(type, 'CompositeLayers')) {
events.push(createStartEvent('render', startTime));
endEvent = createEndEvent('render', endTime);
}
// Note: ios used to support GCEvent up until iOS 6 :-(
if (isPresent(record['children'])) {
this._convertPerfRecordsToEvents(record['children'], events);
}
if (isPresent(endEvent)) {
events.push(endEvent);
}
});
return events;
}
perfLogFeatures() { return new PerfLogFeatures({ render: true }); }
supports(capabilities) {
return StringWrapper.equals(capabilities['browserName'].toLowerCase(), 'safari');
}
}
function createEvent(ph, name, time, args = null) {
var result = {
'cat': 'timeline',
'name': name,
'ts': time,
'ph': ph,
// The ios protocol does not support the notions of multiple processes in
// the perflog...
'pid': 'pid0'
};
if (isPresent(args)) {
result['args'] = args;
}
return result;
}
function createStartEvent(name, time, args = null) {
return createEvent('B', name, time, args);
}
function createEndEvent(name, time, args = null) {
return createEvent('E', name, time, args);
}
function createMarkStartEvent(name, time) {
return createEvent('b', name, time);
}
function createMarkEndEvent(name, time) {
return createEvent('e', name, time);
}
var _PROVIDERS = [
bind(IOsDriverExtension)
.toFactory((driver) => new IOsDriverExtension(driver), [WebDriverAdapter])
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW9zX2RyaXZlcl9leHRlbnNpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaWZmaW5nX3BsdWdpbl93cmFwcGVyLW91dHB1dF9wYXRoLXhCTElCclZSLnRtcC9iZW5jaHByZXNzL3NyYy93ZWJkcml2ZXIvaW9zX2RyaXZlcl9leHRlbnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ik9BQU8sRUFBQyxJQUFJLEVBQW9CLE1BQU0sc0JBQXNCO09BQ3JELEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQWlCLGFBQWEsRUFBQyxNQUFNLDBCQUEwQjtPQUN4RixFQUFDLGFBQWEsRUFBbUIsTUFBTSxnQ0FBZ0M7T0FFdkUsRUFBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUMsTUFBTSx5QkFBeUI7T0FDcEUsRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QjtBQUV0RCx3Q0FBd0Msa0JBQWtCO0lBSXhELFlBQW9CLE9BQXlCO1FBQUksT0FBTyxDQUFDO1FBQXJDLFlBQU8sR0FBUCxPQUFPLENBQWtCO0lBQWEsQ0FBQztJQUgzRCxvRUFBb0U7SUFDcEUsV0FBVyxRQUFRLEtBQWlCLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBSXhELEVBQUUsS0FBbUIsTUFBTSxJQUFJLGFBQWEsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVuRixTQUFTLENBQUMsSUFBWTtRQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsaUJBQWlCLElBQUksS0FBSyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFZLEVBQUUsV0FBVyxHQUFXLElBQUk7UUFDOUMsSUFBSSxNQUFNLEdBQUcsb0JBQW9CLElBQUksS0FBSyxDQUFDO1FBQzNDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxJQUFJLGlCQUFpQixXQUFXLEtB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RUQsSUFBSSxVQUFVLEdBQUc7SUFDZixJQUFJLENBQUMsa0JBQWtCLENBQUM7U0FDbkIsU0FBUyxDQUFDLENBQUMsTUFBTSxLQUFLLElBQUksa0JBQWtCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0NBQy9FLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2JpbmQsIHByb3ZpZGUsIFByb3ZpZGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge0pzb24sIGlzUHJlc2VudCwgaXNCbGFuaywgUmVnRXhwV3JhcHBlciwgU3RyaW5nV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcblxuaW1wb3J0IHtXZWJEcml2ZXJFeHRlbnNpb24sIFBlcmZMb2dGZWF0dXJlc30gZnJvbSAnLi4vd2ViX2RyaXZlcl9leHRlbnNpb24nO1xuaW1wb3J0IHtXZWJEcml2ZXJBZGFwdGVyfSBmcm9tICcuLi93ZWJfZHJpdmVyX2FkYXB0ZXInO1xuXG5leHBvcnQgY2xhc3MgSU9zRHJpdmVyRXh0ZW5zaW9uIGV4dGVuZHMgV2ViRHJpdmVyRXh0ZW5zaW9uIHtcbiAgLy8gVE9ETyh0Ym9zY2gpOiB1c2Ugc3RhdGljIHZhbHVlcyB3aGVuIG91ciB0cmFuc3BpbGVyIHN1cHBvcnRzIHRoZW1cbiAgc3RhdGljIGdldCBCSU5ESU5HUygpOiBQcm92aWRlcltdIHsgcmV0dXJuIF9QUk9WSURFUlM7IH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kcml2ZXI6IFdlYkRyaXZlckFkYXB0ZXIpIHsgc3VwZXIoKTsgfVxuXG4gIGdjKCk6IFByb21pc2U8YW55PiB7IHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdGb3JjZSBHQyBpcyBub3Qgc3VwcG9ydGVkIG9uIGlPUycpOyB9XG5cbiAgdGltZUJlZ2luKG5hbWU6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RyaXZlci5leGVjdXRlU2NyaXB0KGBjb25zb2xlLnRpbWUoJyR7bmFtZX0nKTtgKTtcbiAgfVxuXG4gIHRpbWVFbmQobmFtZTogc3RyaW5nLCByZXN0YXJ0TmFtZTogc3RyaW5nID0gbnVsbCk6IFByb21pc2U8YW55PiB7XG4gICAgdmFyIHNjcmlwdCA9IGBjb25zb2xlLnRpbWVFbmQoJyR7bmFtZX0nKTtgO1xuICAgIGlmIChpc1ByZXNlbnQocmVzdGFydE5hbWUpKSB7XG4gICAgICBzY3JpcHQgKz0gYGNvbnNvbGUudGltZSgnJHtyZXN0YXJ0TmFtZX0nKTtgXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kcml2ZXIuZXhlY3V0ZVNjcmlwdChzY3JpcHQpO1xuICB9XG5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJLaXQvd2Via2l0L3RyZWUvbWFzdGVyL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9WZXJzaW9uc1xuICByZWFkUGVyZkxvZygpIHtcbiAgICAvLyBUT0RPKHRib3NjaCk6IEJ1ZyBpbiBJT3NEcml2ZXI6IE5lZWQgdG8gZXhlY3V0ZSBhdCBsZWFzdCBvbmUgY29tbWFuZFxuICAgIC8vIHNvIHRoYXQgdGhlIGJyb3dzZXIgbG9ncyBjYW4gYmUgcmVhZCBvdXQhXG4gICAgcmV0dXJuIHRoaXMuX2RyaXZlci5leGVjdXRlU2NyaXB0KCcxKzEnKVxuICAgICAgICAudGhlbigoXykgPT4gdGhpcy5fZHJpdmVyLmxvZ3MoJ3BlcmZvcm1hbmNlJykpXG4gICAgICAgIC50aGVuKChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgdmFyIHJlY29yZHMgPSBbXTtcbiAgICAgICAgICBlbnRyaWVzLmZvckVhY2goZW50cnkgPT4ge1xuICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBKc29uLnBhcnNlKGVudHJ5WydtZXNzYWdlJ10pWydtZXNzYWdlJ107XG4gICAgICAgICAgICBpZiAoU3RyaW5nV3JhcHBlci5lcXVhbHMobWVzc2FnZVsnbWV0aG9kJ10sICdUaW1lbGluZS5ldmVudFJlY29yZGVkJykpIHtcbiAgICAgICAgICAgICAgcmVjb3Jkcy5wdXNoKG1lc3NhZ2VbJ3BhcmFtcyddWydyZWNvcmQnXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRQZXJmUmVjb3Jkc1RvRXZlbnRzKHJlY29yZHMpO1xuICAgICAgICB9KTtcbiAgfVxuXG4gIF9jb252ZXJ0UGVyZlJlY29yZHNUb0V2ZW50cyhyZWNvcmRzOiBhbnlbXSwgZXZlbnRzOiBhbnlbXSA9IG51bGwpIHtcbiAgICBpZiAoaXNCbGFuayhldmVudHMpKSB7XG4gICAgICBldmVudHMgPSBbXTtcbiAgICB9XG4gICAgcmVjb3Jkcy5mb3JFYWNoKChyZWNvcmQpID0+IHtcbiAgICAgIHZhciBlbmRFdmVudCA9IG51bGw7XG4gICAgICB2YXIgdHlwZSA9IHJlY29yZFsndHlwZSddO1xuICAgICAgdmFyIGRhdGEgPSByZWNvcmRbJ2RhdGEnXTtcbiAgICAgIHZhciBzdGFydFRpbWUgPSByZWNvcmRbJ3N0YXJ0VGltZSddO1xuICAgICAgdmFyIGVuZFRpbWUgPSByZWNvcmRbJ2VuZFRpbWUnXTtcblxuICAgICAgaWYgKFN0cmluZ1dyYXBwZXIuZXF1YWxzKHR5cGUsICdGdW5jdGlvbkNhbGwnKSAmJlxuICAgICAgICAgIChpc0JsYW5rKGRhdGEpIHx8ICFTdHJpbmdXcmFwcGVyLmVxdWFscyhkYXRhWydzY3JpcHROYW1lJ10sICdJbmplY3RlZFNjcmlwdCcpKSkge1xuICAgICAgICBldmVudHMucHVzaChjcmVhdGVTdGFydEV2ZW50KCdzY3JpcHQnLCBzdGFydFRpbWUpKTtcbiAgICAgICAgZW5kRXZlbnQgPSBjcmVhdGVFbmRFdmVudCgnc2NyaXB0JywgZW5kVGltZSk7XG4gICAgICB9IGVsc2UgaWYgKFN0cmluZ1dyYXBwZXIuZXF1YWxzKHR5cGUsICdUaW1lJykpIHtcbiAgICAgICAgZXZlbnRzLnB1c2goY3JlYXRlTWFya1N0YXJ0RXZlbnQoZGF0YVsnbWVzc2FnZSddLCBzdGFydFRpbWUpKTtcbiAgICAgIH0gZWxzZSBpZiAoU3RyaW5nV3JhcHBlci5lcXVhbHModHlwZSwgJ1RpbWVFbmQnKSkge1xuICAgICAgICBldmVudHMucHVzaChjcmVhdGVNYXJrRW5kRXZlbnQoZGF0YVsnbWVzc2FnZSddLCBzdGFydFRpbWUpKTtcbiAgICAgIH0gZWxzZSBpZiAoU3RyaW5nV3JhcHBlci5lcXVhbHModHlwZSwgJ1JlY2FsY3VsYXRlU3R5bGVzJykgfHxcbiAgICAgICAgICAgICAgICAgU3RyaW5nV3JhcHBlci5lcXVhbHModHlwZSwgJ0xheW91dCcpIHx8XG4gICAgICAgICAgICAgICAgIFN0cmluZ1dyYXBwZXIuZXF1YWxzKHR5cGUsICdVcGRhdGVMYXllclRyZWUnKSB8fFxuICAgICAgICAgICAgICAgICBTdHJpbmdXcmFwcGVyLmVxdWFscyh0eXBlLCAnUGFpbnQnKSB8fCBTdHJpbmdXcmFwcGVyLmVxdWFscyh0eXBlLCAnUmFzdGVyaXplJykgfHxcbiAgICAgICAgICAgICAgICAgU3RyaW5nV3JhcHBlci5lcXVhbHModHlwZSwgJ0NvbXBvc2l0ZUxheWVycycpKSB7XG4gICAgICAgIGV2ZW50cy5wdXNoKGNyZWF0ZVN0YXJ0RXZlbnQoJ3JlbmRlcicsIHN0YXJ0VGltZSkpO1xuICAgICAgICBlbmRFdmVudCA9IGNyZWF0ZUVuZEV2ZW50KCdyZW5kZXInLCBlbmRUaW1lKTtcbiAgICAgIH1cbiAgICAgIC8vIE5vdGU6IGlvcyB1c2VkIHRvIHN1cHBvcnQgR0NFdmVudCB1cCB1bnRpbCBpT1MgNiA6LShcbiAgICAgIGlmIChpc1ByZXNlbnQocmVjb3JkWydjaGlsZHJlbiddKSkge1xuICAgICAgICB0aGlzLl9jb252ZXJ0UGVyZlJlY29yZHNUb0V2ZW50cyhyZWNvcmRbJ2NoaWxkcmVuJ10sIGV2ZW50cyk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQcmVzZW50KGVuZEV2ZW50KSkge1xuICAgICAgICBldmVudHMucHVzaChlbmRFdmVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGV2ZW50cztcbiAgfVxuXG4gIHBlcmZMb2dGZWF0dXJlcygpOiBQZXJmTG9nRmVhdHVyZXMgeyByZXR1cm4gbmV3IFBlcmZMb2dGZWF0dXJlcyh7cmVuZGVyOiB0cnVlfSk7IH1cblxuICBzdXBwb3J0cyhjYXBhYmlsaXRpZXM6IHtba2V5OiBzdHJpbmddOiBhbnl9KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFN0cmluZ1dyYXBwZXIuZXF1YWxzKGNhcGFiaWxpdGllc1snYnJvd3Nlck5hbWUnXS50b0xvd2VyQ2FzZSgpLCAnc2FmYXJpJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRXZlbnQocGgsIG5hbWUsIHRpbWUsIGFyZ3MgPSBudWxsKSB7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgJ2NhdCc6ICd0aW1lbGluZScsXG4gICAgJ25hbWUnOiBuYW1lLFxuICAgICd0cyc6IHRpbWUsXG4gICAgJ3BoJzogcGgsXG4gICAgLy8gVGhlIGlvcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBub3Rpb25zIG9mIG11bHRpcGxlIHByb2Nlc3NlcyBpblxuICAgIC8vIHRoZSBwZXJmbG9nLi4uXG4gICAgJ3BpZCc6ICdwaWQwJ1xuICB9O1xuICBpZiAoaXNQcmVzZW50KGFyZ3MpKSB7XG4gICAgcmVzdWx0WydhcmdzJ10gPSBhcmdzO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0YXJ0RXZlbnQobmFtZSwgdGltZSwgYXJncyA9IG51bGwpIHtcbiAgcmV0dXJuIGNyZWF0ZUV2ZW50KCdCJywgbmFtZSwgdGltZSwgYXJncyk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVuZEV2ZW50KG5hbWUsIHRpbWUsIGFyZ3MgPSBudWxsKSB7XG4gIHJldHVybiBjcmVhdGVFdmVudCgnRScsIG5hbWUsIHRpbWUsIGFyZ3MpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVNYXJrU3RhcnRFdmVudChuYW1lLCB0aW1lKSB7XG4gIHJldHVybiBjcmVhdGVFdmVudCgnYicsIG5hbWUsIHRpbWUpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVNYXJrRW5kRXZlbnQobmFtZSwgdGltZSkge1xuICByZXR1cm4gY3JlYXRlRXZlbnQoJ2UnLCBuYW1lLCB0aW1lKTtcbn1cblxudmFyIF9QUk9WSURFUlMgPSBbXG4gIGJpbmQoSU9zRHJpdmVyRXh0ZW5zaW9uKVxuICAgICAgLnRvRmFjdG9yeSgoZHJpdmVyKSA9PiBuZXcgSU9zRHJpdmVyRXh0ZW5zaW9uKGRyaXZlciksIFtXZWJEcml2ZXJBZGFwdGVyXSlcbl07XG4iXX0=