blob: 41789902ad3a067ebe1f4b9d30f3564f9dccbf32 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
(async function() {
TestRunner.addResult(`Tests tracing based Timeline save/load functionality.\n`);
await TestRunner.loadModule('performance_test_runner');
await TestRunner.showPanel('timeline');
TestRunner.TestTimelineLoaderClient = function() {
this._completePromise = new Promise(resolve => this._resolve = resolve);
};
TestRunner.TestTimelineLoaderClient.prototype = {
loadingStarted: function() {
TestRunner.addResult('TimelineLoaderClient.loadingStarted()');
},
loadingProgress: function() {},
processingStarted: function() {
TestRunner.addResult('TimelineLoaderClient.processingStarted()');
},
loadingComplete: function(model) {
TestRunner.addResult(`TimelineLoaderClient.loadingComplete(${!!model})`);
this._resolve(model);
},
modelPromise: function() {
return this._completePromise;
}
};
async function runTestWithDataAndCheck(input, expectedOutput, callback) {
function checkSaveData(output) {
var saveData = JSON.parse(output);
TestRunner.addResult(
'Saved data is equal to restored data: ' + (JSON.stringify(expectedOutput) === JSON.stringify(saveData)));
callback();
}
var client = new TestRunner.TestTimelineLoaderClient();
var blob = new Blob([input], {type: 'text/pain'});
var loader = Timeline.TimelineLoader.loadFromFile(blob, client);
var stream = new TestRunner.StringOutputStream(TestRunner.safeWrap(checkSaveData));
var model = await client.modelPromise();
var storage = model.backingStorage();
await stream.open('');
storage.writeToStream(stream);
}
async function runTestOnMalformedInput(input, callback) {
var client = new TestRunner.TestTimelineLoaderClient();
var blob = new Blob([input], {type: 'text/pain'});
var loader = Timeline.TimelineLoader.loadFromFile(blob, client);
var model = await client.modelPromise();
TestRunner.addResult('Model is empty: ' + (!model || (!model.minimumRecordTime() && !model.maximumRecordTime())));
callback();
}
var data = [
{'args': {'number': 32}, 'cat': '__metadata', 'name': 'num_cpus', 'ph': 'M', 'pid': 32127, 'tid': 0, 'ts': 0},
{
'args': {'sort_index': -5},
'cat': '__metadata',
'name': 'process_sort_index',
'ph': 'M',
'pid': 32127,
'tid': 12,
'ts': 0
},
{
'args': {'name': 'Renderer'},
'cat': '__metadata',
'name': 'process_name',
'ph': 'M',
'pid': 32127,
'tid': 12,
'ts': 0
},
{
'args': {'sort_index': -1},
'cat': '__metadata',
'name': 'thread_sort_index',
'ph': 'M',
'pid': 32127,
'tid': 11,
'ts': 0
},
{
'args': {},
'cat': 'disabled-by-default-devtools.timeline',
'name': 'Program',
'ph': 'B',
'pid': 32120,
'tid': 9,
'ts': 95904702436,
'tts': 1161841
},
{'args': {'number': 32}, 'cat': '__metadata', 'name': 'num_cpus', 'ph': 'M', 'pid': 32120, 'tid': 0, 'ts': 0},
{
'args': {'sort_index': -5},
'cat': '__metadata',
'name': 'process_sort_index',
'ph': 'M',
'pid': 32120,
'tid': 10,
'ts': 0
},
{
'args': {'name': 'Renderer'},
'cat': '__metadata',
'name': 'process_name',
'ph': 'M',
'pid': 32120,
'tid': 10,
'ts': 0
},
{
'args': {'sort_index': -1},
'cat': '__metadata',
'name': 'thread_sort_index',
'ph': 'M',
'pid': 32120,
'tid': 9,
'ts': 0
},
{
'args': {'name': 'CrRendererMain'},
'cat': '__metadata',
'name': 'thread_name',
'ph': 'M',
'pid': 32120,
'tid': 9,
'ts': 0
},
{
'args': {
'data': {
'frame': '0x1cfa1f6a4000',
'scriptId': '52',
'scriptLine': 664,
'scriptName': 'http://example.com/foo.js'
}
},
'cat': 'disabled-by-default-devtools.timeline',
'dur': 21,
'name': 'FunctionCall',
'ph': 'X',
'pid': 32169,
'tdur': 20,
'tid': 35,
'ts': 95904848776,
'tts': 2613659
},
{
'args': {'stack': []},
'cat': 'disabled-by-default-devtools.timeline.stack',
'name': 'CallStack',
'ph': 'I',
'pid': 32169,
's': 'g',
'tid': 35,
'ts': 95904848783,
'tts': 2613665
},
{
'args': {
'data': {
'frame': '0x1cfa1f6a4000',
'scriptId': '52',
'scriptLine': 664,
'scriptName': 'http://example.com/foo.js'
}
},
'cat': 'disabled-by-default-devtools.timeline',
'dur': 20,
'name': 'FunctionCall',
'ph': 'X',
'pid': 32169,
'tdur': 18,
'tid': 35,
'ts': 95904848821,
'tts': 2613704
},
{
'args': {'stack': []},
'cat': 'disabled-by-default-devtools.timeline.stack',
'name': 'CallStack',
'ph': 'I',
'pid': 32169,
's': 'g',
'tid': 35,
'ts': 95904848827,
'tts': 2613710
},
{
'args': {
'data': {
'frame': '0x1cfa1f6a4000',
'scriptId': '52',
'scriptLine': 664,
'scriptName': 'http://example.com/foo.js'
}
},
'cat': 'disabled-by-default-devtools.timeline',
'dur': 19,
'name': 'FunctionCall',
'ph': 'X',
'pid': 32169,
'tdur': 18,
'tid': 35,
'ts': 95904848866,
'tts': 2613749
},
{
'args': {'stack': []},
'cat': 'disabled-by-default-devtools.timeline.stack',
'name': 'CallStack',
'ph': 'I',
'pid': 32169,
's': 'g',
'tid': 35,
'ts': 95904848872,
'tts': 2613755
},
{
'args': {
'data': {
'frame': '0x1cfa1f6a4000',
'scriptId': '52',
'scriptLine': 664,
'scriptName': 'http://example.com/foo.js'
}
},
'cat': 'disabled-by-default-devtools.timeline',
'dur': 19,
'name': 'FunctionCall',
'ph': 'X',
'pid': 32169,
'tdur': 19,
'tid': 35,
'ts': 95904848909,
'tts': 2613791
},
{
'args': {'stack': []},
'cat': 'disabled-by-default-devtools.timeline.stack',
'name': 'CallStack',
'ph': 'I',
'pid': 32169,
's': 'g',
'tid': 35,
'ts': 95904848915,
'tts': 2613797
},
{
'args': {
'data': {
'frame': '0x1cfa1f6a4000',
'scriptId': '52',
'scriptLine': 664,
'scriptName': 'http://example.com/foo.js'
}
},
'cat': 'disabled-by-default-devtools.timeline',
'dur': 21,
'name': 'FunctionCall',
'ph': 'X',
'pid': 32169,
'tdur': 19,
'tid': 35,
'ts': 95904848954,
'tts': 2613837
},
{
'args': {'stack': []},
'cat': 'disabled-by-default-devtools.timeline.stack',
'name': 'CallStack',
'ph': 'I',
'pid': 32169,
's': 'g',
'tid': 35,
'ts': 95904848961,
'tts': 2613843
},
{
'args': {'data': {'sessionId': '26.5', 'frames': [
{'frame': 'frame1', 'url': 'frameurl', 'name': 'frame-name'}
]}},
'cat': 'disabled-by-default-devtools.timeline',
'name': 'TracingStartedInPage',
'ph': 'I',
'pid': 32157,
's': 'g',
'tid': 26,
'ts': 95904694459,
'tts': 1432596
},
{
'args': {'data': {'layerTreeId': 1, 'frame': 'frame1'}},
'cat': 'disabled-by-default-devtools.timeline',
'name': 'SetLayerTreeId',
'ph': 'I',
'pid': 32157,
's': 'g',
'tid': 26,
'ts': 95904694693,
'tts': 1432692
},
{
'args': {},
'cat': 'disabled-by-default-devtools.timeline',
'name': 'Program',
'ph': 'E',
'pid': 32157,
'tid': 26,
'ts': 95904694731,
'tts': 1432729
},
{
'args': {},
'cat': 'disabled-by-default-devtools.timeline',
'name': 'Program',
'ph': 'B',
'pid': 32157,
'tid': 26,
'ts': 95904694789,
'tts': 1432787
},
{
'args': {'data': {'type': 'beforeunload'}},
'cat': 'disabled-by-default-devtools.timeline',
'dur': 16,
'name': 'EventDispatch',
'ph': 'X',
'pid': 32157,
'tdur': 13,
'tid': 26,
'ts': 95904695027,
'tts': 1433025
},
{
'args': {
'data': {
'frame': '0x30acf4ca4000',
'requestId': '26.422',
'requestMethod': 'GET',
'url': 'http://localhost/bar.html?ws=E16865E8B9D1'
}
},
'cat': 'disabled-by-default-devtools.timeline',
'name': 'ResourceSendRequest',
'ph': 'I',
'pid': 32157,
's': 'g',
'tid': 26,
'ts': 95904695434,
'tts': 1433433
},
{
'args': {'stack': null},
'cat': 'disabled-by-default-devtools.timeline.stack',
'name': 'CallStack',
'ph': 'I',
'pid': 32157,
's': 'g',
'tid': 26,
'ts': 95904695455,
'tts': 1433453
},
{
'args': {},
'cat': 'disabled-by-default-devtools.timeline',
'name': 'Program',
'ph': 'E',
'pid': 32157,
'tid': 26,
'ts': 95904695551,
'tts': 1433549
},
{
'args': {},
'cat': 'disabled-by-default-devtools.timeline',
'name': 'Program',
'ph': 'B',
'pid': 32157,
'tid': 26,
'ts': 95904696695,
'tts': 1433692
},
{
'args': {},
'cat': 'disabled-by-default-devtools.timeline',
'name': 'Program',
'ph': 'E',
'pid': 32157,
'tid': 26,
'ts': 95904696737,
'tts': 1433733
},
{
'args': {'data': {'frame': '0x30acf4ca4000', 'mimeType': 'text/html', 'requestId': '26.422', 'statusCode': 200}},
'cat': 'disabled-by-default-devtools.timeline',
'name': 'ResourceReceiveResponse',
'ph': 'I',
'pid': 32157,
's': 'g',
'tid': 26,
'ts': 95904699823,
'tts': 1433961
},
{
'args': {'data': {'frame': '0x30acf4ca4000', 'identifier': 406}},
'cat': 'disabled-by-default-devtools.timeline',
'name': 'WebSocketDestroy',
'ph': 'I',
'pid': 32157,
's': 'g',
'tid': 26,
'ts': 95904701483,
'tts': 1435612
},
{
'args': {'stack': null},
'cat': 'disabled-by-default-devtools.timeline.stack',
'name': 'CallStack',
'ph': 'I',
'pid': 32157,
's': 'g',
'tid': 26,
'ts': 95904701489,
'tts': 1435618
},
{'args': {'number': 32}, 'cat': '__metadata', 'name': 'num_cpus', 'ph': 'M', 'pid': 32072, 'tid': 0, 'ts': 0},
{
'args': {'sort_index': -6},
'cat': '__metadata',
'name': 'process_sort_index',
'ph': 'M',
'pid': 32072,
'tid': 32096,
'ts': 0
},
{
'args': {'name': 'Browser'},
'cat': '__metadata',
'name': 'process_name',
'ph': 'M',
'pid': 32072,
'tid': 32096,
'ts': 0
},
{
'args': {'name': 'CrBrowserMain'},
'cat': '__metadata',
'name': 'thread_name',
'ph': 'M',
'pid': 32072,
'tid': 32072,
'ts': 0
}
];
TestRunner.runTestSuite([
function testNormal(next) {
var input = JSON.stringify(data);
runTestWithDataAndCheck(input, data, next);
},
function testJSONObjectFormat(next) {
var json = JSON.stringify(data);
var input = '{"traceEvents":' + json + '}';
runTestWithDataAndCheck(input, data, next);
},
function testJSONObjectFormatWithMetadata(next) {
var json = JSON.stringify(data);
var input = '{"traceEvents":' + json + ', metadata: {"foo": "bar", "baz": "quz"}';
runTestWithDataAndCheck(input, data, next);
},
function testBroken(next) {
var data = [{
'args': {'number': 32},
'cat': '__metadata',
'name': 'num_cpus',
'ph': 'M',
'pid': 32127,
'tid': 0,
'ts': 0,
't"y}p}e\\': 'UnknownRecordType'
}];
runTestOnMalformedInput(JSON.stringify(data), next);
},
function testMalformedJSON(next) {
runTestOnMalformedInput(']', next);
}
]);
})();