UNPKG

benchpress

Version:

Benchpress - a framework for e2e performance tests

116 lines 17.3 kB
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=