blob: bc7a2caa0469f56d3fba154248528494c9100da9 [file] [log] [blame]
<!DOCTYPE HTML>
<html>
<!--
Copyright (c) 2012 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.
-->
<head>
<title>ProfilingView tests</title>
<script src="base.js"></script>
<style>
.profiling-view {
border: 1px solid black;
}
</style>
</head>
<body>
<script>
base.require('unittest');
base.require('test_utils');
base.require('profiling_view');
base.require('tracing_controller');
</script>
<script>
'use strict';
var testData = [
{name: 'a', args: {}, pid: 52, ts: 15000, cat: 'foo', tid: 53, ph: 'B'},
{name: 'a', args: {}, pid: 52, ts: 19000, cat: 'foo', tid: 53, ph: 'E'},
{name: 'b', args: {}, pid: 52, ts: 32000, cat: 'foo', tid: 53, ph: 'B'},
{name: 'b', args: {}, pid: 52, ts: 54000, cat: 'foo', tid: 53, ph: 'E'}
];
var systemTraceTestData = [
'systrace.sh-8170 [000] 0.013: sched_switch: ' +
'prev_comm=systrace.sh prev_pid=8170 prev_prio=120 ' +
'prev_state=x ==> next_comm=kworker/1:0 next_pid=7873 ' +
'next_prio=120',
' kworker/1:0-7873 [000] 0.036: sched_switch: ' +
'prev_comm=kworker/1:0 prev_pid=7873 prev_prio=120 ' +
'prev_state=S ==> next_comm=debugd next_pid=4404 next_prio=120',
' debugd-4404 [000] 0.070: sched_switch: prev_comm=debugd ' +
'prev_pid=4404 prev_prio=120 prev_state=S ==> ' +
'next_comm=dbus-daemon next_pid=510 next_prio=120',
'systrace.sh-8182 [000] 0.000: tracing_mark_write: ' +
'trace_event_clock_sync: parent_ts=0.0'
].join('\n');
/* This test just instantiates a ProflingView and adds it to the DOM
* to help with non-unittest UI work.
*/
function testInstantiate() {
var view = new tracing.ProfilingView();
var tracingController;
// This code emulates Chrome's responses to sendFn enough that the real
// tracing controller can be used to interactively test the UI.
var systemTraceRequested = false;
function send(message, opt_args) {
var args = opt_args || [];
if (message == 'beginTracing') {
systemTraceRequested = opt_args[0];
} else if (message == 'beginRequestBufferPercentFull') {
setTimeout(function() {
view.tracingController.onRequestBufferPercentFullComplete(0.5);
}, 1);
} else if (message == 'endTracingAsync') {
setTimeout(function() {
if (systemTraceRequested) {
view.tracingController.onSystemTraceDataCollected(
systemTraceTestData);
}
view.tracingController.onTraceDataCollected(testData);
view.tracingController.onEndTracingComplete();
}, 1);
} else if (message == 'loadTraceFile') {
setTimeout(function() {
view.tracingController.onLoadTraceFileComplete(
JSON.stringify(testData));
}, 150);
} else if (message == 'saveTraceFile') {
setTimeout(function() {
view.tracingController.onSaveTraceFileComplete();
}, 1);
}
}
tracingController = new tracing.TracingController(send);
tracingController.supportsSystemTracing_ = true;
view.tracingController = tracingController;
view.focusElement = view;
this.addHTMLOutput(undefined, view);
}
/*
* Just enough of the TracingController to support the tests below.
*/
function FakeTracingController() {
}
FakeTracingController.prototype = {
__proto__: base.EventTarget.prototype,
get supportsSystemTracing() {
return base.isChromeOS;
},
beginTracing: function(opt_systemTracingEnabled,
opt_continuousTracingEnabled,
opt_traceCategories) {
this.wasBeginTracingCalled = true;
this.wasBeginTracingCalledWithSystemTracingEnabled =
opt_systemTracingEnabled;
this.wasBeginTracingCalledWithContinuousTracingEnabled =
opt_continuousTracingEnabled;
this.beginTracingCategories = opt_traceCategories;
},
collectCategories: function() {
this.wasCollectCategoriesCalled = true;
},
get traceEvents() {
if (!this.wasBeginTracingCalled)
return undefined;
return testData;
},
get systemTraceEvents() {
if (!this.wasBeginTracingCalled)
return [];
if (!this.wasBeginTracingCalledWithSystemTracingEnabled)
return [];
return systemTraceTestData;
}
};
function recordTestCommon() {
var view = new tracing.ProfilingView();
var tracingController = new FakeTracingController();
view.tracingController = tracingController;
view.querySelector('button.record').click();
assertTrue(tracingController.wasCollectCategoriesCalled);
var e = new base.Event('categoriesCollected');
e.categories = ['skia', 'gpu'];
tracingController.dispatchEvent(e);
view.categorySelectionDialog_.querySelector(
'button.record-categories').click();
assertTrue(tracingController.wasBeginTracingCalled);
assertEquals(base.isChromeOS,
tracingController.wasBeginTracingCalledWithSystemTracingEnabled);
var e = new base.Event('traceEnded');
e.events = tracingController.traceEvents;
tracingController.dispatchEvent(e);
assertTrue(!!view.timelineView.model);
}
function testSelectedCategoriesSentToTracing() {
var view = new tracing.ProfilingView();
view.timelineView_.settings.set('cc', 'true', 'record_categories');
view.timelineView_.settings.set('renderer', 'false', 'record_categories');
var tracingController = new FakeTracingController();
view.tracingController = tracingController;
view.querySelector('button.record').click();
assertTrue(tracingController.wasCollectCategoriesCalled);
var e = new base.Event('categoriesCollected');
e.categories = ['skia', 'gpu', 'cc', 'renderer'];
tracingController.dispatchEvent(e);
view.categorySelectionDialog_.querySelector('input#skia').click();
view.categorySelectionDialog_.querySelector(
'button.record-categories').click();
var categories = tracingController.beginTracingCategories;
// Renderer is disabled in settings, skia is clicked off.
assertEquals('-renderer,-skia', categories);
}
function testBadCategories() {
var view = new tracing.ProfilingView();
view.timelineView_.settings.set('foo,bar', 'false', 'record_categories');
var tracingController = new FakeTracingController();
view.tracingController = tracingController;
view.querySelector('button.record').click();
assertTrue(tracingController.wasCollectCategoriesCalled);
var e = new base.Event('categoriesCollected');
e.categories = ['baz,zap', 'gpu'];
tracingController.dispatchEvent(e);
view.categorySelectionDialog_.querySelector(
'button.record-categories').click();
var inputs = view.categorySelectionDialog_.querySelectorAll('input');
var inputs_length = inputs.length;
for (var i = 0; i < inputs_length; ++i) {
// Comes from categories and should be split before getting
// to the category selection dialog.
assertNotEquals('baz,zap', inputs[i].id);
}
var categories = tracingController.beginTracingCategories;
assertEquals('', categories);
}
function testRecordNonCros() {
var old = base.isChromeOS;
base.isChromeOS = false;
try {
recordTestCommon();
} finally {
base.isChromeOS = old;
}
}
function testRecordCros() {
var old = base.isChromeOS;
base.isChromeOS = true;
try {
recordTestCommon();
} finally {
base.isChromeOS = old;
}
}
</script>
</body>
</html>