blob: 7e69fe4ea7085d951efca8ad590ab2a54d9cabf9 [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright (c) 2013 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.
-->
<link rel="import" href="/core/test_utils.html">
<link rel="import" href="/base/xhr.html">
<link rel="import" href="/extras/importer/linux_perf/ftrace_importer.html">
<script>
'use strict';
tr.b.unittest.testSuite(function() { // @suppress longLineCheck
var LinuxPerfImporter = tr.e.importer.linux_perf.LinuxPerfImporter;
var LinuxPerfImporterTestExports =
tr.e.importer.linux_perf._LinuxPerfImporterTestExports;
test('lineParserWithLegacyFmt', function() {
var p = LinuxPerfImporterTestExports.lineParserWithLegacyFmt; // @suppress longLineCheck
var x = p(' <idle>-0 [001] 4467.843475: sched_switch: ' +
'prev_comm=swapper prev_pid=0 prev_prio=120 prev_state=R ==> ' +
'next_comm=SurfaceFlinger next_pid=178 next_prio=112');
assert.isNotNull(x);
assert.equal(x.threadName, '<idle>');
assert.equal(x.pid, '0');
assert.equal(x.cpuNumber, '001');
assert.equal(x.timestamp, '4467.843475');
assert.equal(x.eventName, 'sched_switch');
assert.equal('prev_comm=swapper prev_pid=0 prev_prio=120 prev_state=R' +
' ==> next_comm=SurfaceFlinger next_pid=178 next_prio=112', x.details);
var x = p('Binder-Thread #-647 [001] 260.464294: sched_switch: ' +
'prev_comm=Binder Thread # prev_pid=647 prev_prio=120 prev_state=D ' +
' ==> next_comm=.android.chrome next_pid=1562 next_prio=120');
assert.isNotNull(x);
assert.equal(x.threadName, 'Binder-Thread #');
assert.equal(x.pid, '647');
});
test('lineParserWithIRQInfo', function() {
var p = LinuxPerfImporterTestExports.lineParserWithIRQInfo; // @suppress longLineCheck
var x = p(' systrace.sh-5441 [001] d... 1031.091570: ' +
'sched_wakeup: comm=debugd pid=4978 prio=120 success=1 target_cpu=000');
assert.isNotNull(x);
assert.equal(x.threadName, 'systrace.sh');
assert.equal(x.pid, '5441');
assert.equal(x.cpuNumber, '001');
assert.equal(x.timestamp, '1031.091570');
assert.equal(x.eventName, 'sched_wakeup');
assert.equal(x.details, 'comm=debugd pid=4978 prio=120 success=1 target_cpu=000'); // @suppress longLineCheck
});
test('lineParserWithTGID', function() {
var p = LinuxPerfImporterTestExports.lineParserWithTGID;
var x = p(' systrace.sh-5441 (54321) [001] d... 1031.091570: ' +
'sched_wakeup: comm=debugd pid=4978 prio=120 success=1 target_cpu=000');
assert.isNotNull(x);
assert.equal(x.threadName, 'systrace.sh');
assert.equal(x.pid, '5441');
assert.equal(x.tgid, '54321');
assert.equal(x.cpuNumber, '001');
assert.equal(x.timestamp, '1031.091570');
assert.equal(x.eventName, 'sched_wakeup');
assert.equal(x.details, 'comm=debugd pid=4978 prio=120 success=1 target_cpu=000'); // @suppress longLineCheck
var x = p(' systrace.sh-5441 ( 321) [001] d... 1031.091570: ' +
'sched_wakeup: comm=debugd pid=4978 prio=120 success=1 target_cpu=000');
assert.isNotNull(x);
assert.equal(x.tgid, '321');
var x = p(' systrace.sh-5441 (-----) [001] d... 1031.091570: ' +
'sched_wakeup: comm=debugd pid=4978 prio=120 success=1 target_cpu=000');
assert.isNotNull(x);
assert.isUndefined(x.tgid);
});
test('autodetectLineCornerCases', function() {
var detectParser =
LinuxPerfImporterTestExports.autoDetectLineParser;
var lineParserWithLegacyFmt =
LinuxPerfImporterTestExports.lineParserWithLegacyFmt;
var lineParserWithIRQInfo =
LinuxPerfImporterTestExports.lineParserWithIRQInfo;
var lineParserWithTGID =
LinuxPerfImporterTestExports.lineParserWithTGID;
var lineWithLegacyFmt =
'systrace.sh-8170 [001] 15180.978813: 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';
var detected = detectParser(lineWithLegacyFmt);
assert.equal(lineParserWithLegacyFmt, detected);
var lineWithIRQInfo =
'systrace.sh-8170 [001] d... 15180.978813: 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';
var detected = detectParser(lineWithIRQInfo);
assert.equal(lineParserWithIRQInfo, detected);
var lineWithTGID =
'systrace.sh-8170 (54321) [001] d... 15180.978813: 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';
var detected = detectParser(lineWithTGID);
assert.equal(lineParserWithTGID, detected);
});
test('traceEventClockSyncRE', function() {
var re = LinuxPerfImporterTestExports.traceEventClockSyncRE; // @suppress longLineCheck
var x = re.exec('trace_event_clock_sync: parent_ts=19581477508');
assert.isNotNull(x);
assert.equal(x[1], '19581477508');
var x = re.exec('trace_event_clock_sync: parent_ts=123.456');
assert.isNotNull(x);
assert.equal(x[1], '123.456');
});
test('genericClockSync', function() {
var lines = [
'# tracer: nop',
'#',
'# TASK-PID CPU# TIMESTAMP FUNCTION',
'# | | | | |',
'sh-26121 [000] ...1 107464.0: tracing_mark_write: trace_event_clock_sync: name=battor regulator=8941_smbb_boost' // @suppress longLineCheck
];
var m = new tr.Model(lines.join('\n'), false);
assert.isFalse(m.hasImportWarnings);
var battorSyncs = m.getClockSyncRecordsNamed('battor');
assert.equal(battorSyncs.length, 1);
assert.equal(battorSyncs[0].ts, 107464000.0);
assert.equal(battorSyncs[0].args.perfTS, 107464000.0);
assert.equal(battorSyncs[0].args.regulator, '8941_smbb_boost');
});
test('canImport', function() {
var lines = [
'# tracer: nop',
'#',
'# TASK-PID CPU# TIMESTAMP FUNCTION',
'# | | | | |',
' <idle>-0 [001] 4467.843475: sched_switch: ' +
'prev_comm=swapper prev_pid=0 prev_prio=120 prev_state=R ==> ' +
'next_comm=SurfaceFlinger next_pid=178 next_prio=112',
' SurfaceFlinger-178 [001] 4467.843536: sched_switch: ' +
'prev_comm=SurfaceFlinger prev_pid=178 prev_prio=112 prev_state=S ' +
'==> next_comm=kworker/u:2 next_pid=2844 next_prio=120',
' kworker/u:2-2844 [001] 4467.843567: sched_switch: ' +
'prev_comm=kworker/u:2 prev_pid=2844 prev_prio=120 prev_state=S ' +
'==> next_comm=swapper next_pid=0 next_prio=120',
' <idle>-0 [001] 4467.844208: sched_switch: ' +
'prev_comm=swapper prev_pid=0 prev_prio=120 prev_state=R ==> ' +
'next_comm=kworker/u:2 next_pid=2844 next_prio=120'
];
assert.isTrue(LinuxPerfImporter.canImport(lines.join('\n')));
var lines = [
' <idle>-0 [001] 4467.843475: sched_switch: ' +
'prev_comm=swapper prev_pid=0 prev_prio=120 prev_state=R ==> ' +
'next_comm=SurfaceFlinger next_pid=178 next_prio=112'
];
assert.isTrue(LinuxPerfImporter.canImport(lines.join('\n')));
var lines = [
' <idle>-0 [001] 4467.843475: sched_switch: ' +
'prev_comm=swapper prev_pid=0 prev_prio=120 prev_state=R ==> ' +
'next_comm=SurfaceFlinger next_pid=178 next_prio=112',
' SurfaceFlinger-178 [001] 4467.843536: sched_switch: ' +
'prev_comm=SurfaceFlinger prev_pid=178 prev_prio=112 ' +
'prev_state=S ==> next_comm=kworker/u:2 next_pid=2844 ' +
'next_prio=120'
];
assert.isTrue(LinuxPerfImporter.canImport(lines.join('\n')));
var lines = [
'SomeRandomText',
'More random text'
];
assert.isFalse(LinuxPerfImporter.canImport(lines.join('\n')));
});
test('canImport34AndLater', function() {
var lines = [
'# tracer: nop',
'#',
'# entries-in-buffer/entries-written: 55191/55191 #P:2',
'#',
'# _-----=> irqs-off',
'# / _----=> need-resched',
'# | / _---=> hardirq/softirq',
'# || / _--=> preempt-depth',
'# ||| / delay',
'# TASK-PID CPU# |||| TIMESTAMP FUNCTION',
'# | | | |||| | |',
' systrace.sh-5441 [001] d... 1031.091570: sched_wakeup: ' +
'comm=debugd pid=4978 prio=120 success=1 target_cpu=000',
' systrace.sh-5441 [001] d... 1031.091584: sched_switch: ' +
'prev_comm=systrace.sh prev_pid=5441 prev_prio=120 prev_state=x ' +
'==> next_comm=chrome next_pid=5418 next_prio=120'
];
assert.isTrue(LinuxPerfImporter.canImport(lines.join('\n')));
var lines = [
' systrace.sh-5441 [001] d... 1031.091570: sched_wakeup: ' +
'comm=debugd pid=4978 prio=120 success=1 target_cpu=000',
' systrace.sh-5441 [001] d... 1031.091584: sched_switch: ' +
'prev_comm=systrace.sh prev_pid=5441 prev_prio=120 prev_state=x ' +
'==> next_comm=chrome next_pid=5418 next_prio=120'
];
assert.isTrue(LinuxPerfImporter.canImport(lines.join('\n')));
});
test('importOneSequence', function() {
var lines = [
' <idle>-0 [001] 4467.843475: sched_switch: ' +
'prev_comm=swapper prev_pid=0 prev_prio=120 prev_state=R ==> ' +
'next_comm=SurfaceFlinger next_pid=178 next_prio=112',
' SurfaceFlinger-178 [001] 4467.843536: sched_switch: ' +
'prev_comm=SurfaceFlinger prev_pid=178 prev_prio=112 ' +
'prev_state=S ==> next_comm=kworker/u:2 next_pid=2844 ' +
'next_prio=120',
' kworker/u:2-2844 [001] 4467.843567: sched_switch: ' +
'prev_comm=kworker/u:2 prev_pid=2844 prev_prio=120 ' +
'prev_state=S ==> next_comm=swapper next_pid=0 next_prio=120'
];
var m = new tr.Model(lines.join('\n'), false);
assert.isFalse(m.hasImportWarnings);
var c = m.kernel.cpus[1];
assert.equal(c.slices.length, 2);
assert.equal(c.slices[0].title, 'SurfaceFlinger');
assert.equal(c.slices[0].start, 4467843.475);
assert.closeTo(.536 - .475, c.slices[0].duration, 1e-5);
});
test('importOneSequenceWithSpacyThreadName', function() {
var lines = [
' <idle>-0 [001] 4467.843475: sched_switch: ' +
'prev_comm=swapper prev_pid=0 prev_prio=120 prev_state=R ==> ' +
'next_comm=Surface Flinger next_pid=178 next_prio=112',
'Surface Flinger -178 [001] 4467.843536: sched_switch: ' +
'prev_comm=Surface Flinger prev_pid=178 prev_prio=112 ' +
'prev_state=S ==> next_comm=kworker/u:2 next_pid=2844 ' +
'next_prio=120',
' kworker/u:2-2844 [001] 4467.843567: sched_switch: ' +
'prev_comm=kworker/u:2 prev_pid=2844 prev_prio=120 ' +
'prev_state=S ==> next_comm=swapper next_pid=0 next_prio=120'
];
var m = new tr.Model(lines.join('\n'), false);
assert.isFalse(m.hasImportWarnings);
var c = m.kernel.cpus[1];
assert.equal(c.slices.length, 2);
assert.equal(c.slices[0].title, 'Surface Flinger ');
assert.equal(c.slices[0].start, 4467843.475);
assert.closeTo(.536 - .475, c.slices[0].duration, 1e-5);
});
test('importWithNewline', function() {
var lines = [
''
];
var m = new tr.Model(lines.join('\n'));
assert.isFalse(m.hasImportWarnings);
});
test('importSystraceHtml', function() {
var p = tr.b.getAsync(
'/test_data/trivial_systrace.html');
return p.then(function(data) {
var m = new tr.Model(data, false);
assert.isFalse(m.hasImportWarnings);
assert.isDefined(m.processes[124]);
assert.isDefined(m.processes[360]);
assert.isDefined(m.processes[124].counters['android.StatusBar']);
assert.equal(m.processes[124].counters['android.StatusBar'].numSamples,
1);
assert.isDefined(m.processes[124].counters['android.VSYNC']);
assert.equal(2, m.processes[124].counters['android.VSYNC'].numSamples);
assert.isDefined(m.processes[360].counters['android.iq']);
assert.equal(1, m.processes[360].counters['android.iq'].numSamples);
}, function(err) {
throw err;
});
});
test('importMultiTraceHtml', function() {
var lines = [
'<!DOCTYPE HTML>',
'<body>',
' <div class="view">',
' <\/div>',
' <script class="trace-data" type="application/text">',
'test1',
'test2',
' <\/script>',
' <script class="trace-data" type="application/text">',
'# tracer: nop',
'#',
'# TASK-PID CPU# TIMESTAMP FUNCTION',
'# | | | | |',
' hwc_eventmon-336 [000] 50260.929925: 0: C|124|VSYNC|1',
' Binder_1-340 [000] 50260.935656: 0: C|124|StatusBar|1',
' hwc_eventmon-336 [000] 50260.946573: 0: C|124|VSYNC|0',
' InputReader-419 [000] 50262.538578: 0: C|360|iq|1',
' <\/script>',
'<\/body>',
'<\/html>'
];
var m = new tr.Model(lines.join('\n'), false);
assert.isFalse(m.hasImportWarnings);
assert.isDefined(m.processes[124]);
assert.isDefined(m.processes[360]);
assert.isDefined(m.processes[124].counters['android.StatusBar']);
assert.equal(m.processes[124].counters['android.StatusBar'].numSamples,
1);
assert.isDefined(m.processes[124].counters['android.VSYNC']);
assert.equal(2, m.processes[124].counters['android.VSYNC'].numSamples);
assert.isDefined(m.processes[360].counters['android.iq']);
assert.equal(1, m.processes[360].counters['android.iq'].numSamples);
});
test('clockSync', function() {
var lines = [
' <idle>-0 [001] 4467.843475: sched_switch: ' +
'prev_comm=swapper prev_pid=0 prev_prio=120 prev_state=R ' +
'==> next_comm=SurfaceFlinger next_pid=178 next_prio=112',
' SurfaceFlinger-178 [001] 4467.843536: sched_switch: ' +
'prev_comm=SurfaceFlinger prev_pid=178 prev_prio=112 ' +
'prev_state=S ==> next_comm=kworker/u:2 next_pid=2844 ' +
'next_prio=120',
' kworker/u:2-2844 [001] 4467.843567: sched_switch: ' +
'prev_comm=kworker/u:2 prev_pid=2844 prev_prio=120 ' +
'prev_state=S ==> next_comm=swapper next_pid=0 ' +
'next_prio=120',
' kworker/u:2-2844 [001] 4467.843000: 0: ' +
'trace_event_clock_sync: parent_ts=0.1'
];
var m = new tr.Model(lines.join('\n'), false);
assert.isFalse(m.hasImportWarnings);
var c = m.kernel.cpus[1];
assert.equal(c.slices.length, 2);
assert.closeTo(
(467.843475 - (467.843 - 0.1)) * 1000,
c.slices[0].start,
1e-5);
});
test('clockSyncMarkWrite', function() {
var lines = [
'systrace.sh-8170 [001] 15180.978813: 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 [001] 15180.978836: 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 [001] 15180.979010: 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] 15186.203900: tracing_mark_write: ' +
'trace_event_clock_sync: parent_ts=0'
];
var m = new tr.Model(lines.join('\n'), false);
assert.isFalse(m.hasImportWarnings);
var c = m.kernel.cpus[1];
assert.equal(c.slices.length, 2);
assert.closeTo((15180.978813 - 0) * 1000, c.slices[0].start, 1e-5);
});
test('tracingMarkWriteEOLCleanup', function() {
var lines = [
'systrace.sh-8182 [001] ...1 2068001.677892: tracing_mark_write: ' +
'B|9304|test\\n\\',
'systrace.sh-8182 [002] ...1 2068991.686415: tracing_mark_write: E\\n\\'
];
var m = new tr.Model(lines.join('\n'), false);
assert.isFalse(m.hasImportWarnings);
var c = m.processes[9304].threads[8182].sliceGroup;
assert.equal(c.slices.length, 1);
assert.closeTo((2068001.677892 - 0) * 1000, c.slices[0].start, 1e-5);
assert.closeTo(
(2068991.686415 - 2068001.677892) * 1000,
c.slices[0].duration,
1e-5);
});
test('cpuCount', function() {
var lines = [
'systrace.sh-8170 [001] 15180.978813: 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 [001] 15180.978836: 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] 15180.979010: sched_switch: prev_comm=debugd ' +
'prev_pid=4404 prev_prio=120 prev_state=S ==> ' +
'next_comm=dbus-daemon next_pid=510 next_prio=120'
];
var m = new tr.Model(lines.join('\n'), false);
assert.isFalse(m.hasImportWarnings);
assert.equal(tr.b.dictionaryLength(m.kernel.cpus), 2);
assert.equal(m.kernel.bestGuessAtCpuCount, 2);
});
});
</script>