<!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>LinuxPerfImporter tests</title>
<script src="base.js"></script>
</head>
<body>
<script>
'use strict';
base.require('unittest');
base.require('test_utils');
base.require('linux_perf_importer');
function testLineRE() {
var re = tracing._LinuxPerfImporterTestExports.lineRE;
var x = re.exec(' <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');
assertNotNull(x);
assertEquals('<idle>-0', x[1]);
assertEquals('001', x[2]);
assertEquals('4467.843475', x[3]);
assertEquals('sched_switch', x[4]);
assertEquals('prev_comm=swapper prev_pid=0 prev_prio=120 prev_state=R ==> ' +
'next_comm=SurfaceFlinger next_pid=178 next_prio=112', x[5]);
var x = re.exec('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');
assertNotNull(x);
}
function testLineREWithIRQInfo() {
var re = tracing._LinuxPerfImporterTestExports.lineREWithIRQInfo;
var x = re.exec(' systrace.sh-5441 [001] d... 1031.091570: ' +
'sched_wakeup: comm=debugd pid=4978 prio=120 success=1 target_cpu=000');
assertNotNull(x);
assertEquals('systrace.sh-5441', x[1]);
assertEquals('001', x[2]);
assertEquals('1031.091570', x[3]);
assertEquals('sched_wakeup', x[4]);
assertEquals('comm=debugd pid=4978 prio=120 success=1 target_cpu=000', x[5]);
}
function testAutodetectLineCornerCases() {
var line = '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 autoLineRE = tracing._LinuxPerfImporterTestExports.autoDetectLineRE(line);
var lineRE = tracing._LinuxPerfImporterTestExports.lineRE;
assertEquals(autoLineRE, lineRE, 'Mis-detected line format without IRQ info');
}
function testTraceEventClockSyncRE() {
var re = tracing._LinuxPerfImporterTestExports.traceEventClockSyncRE;
var x = re.exec('trace_event_clock_sync: parent_ts=19581477508');
assertNotNull(x);
assertEquals('19581477508', x[1]);
var x = re.exec('trace_event_clock_sync: parent_ts=123.456');
assertNotNull(x);
assertEquals('123.456', x[1]);
}
function testCanImport() {
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'
];
assertTrue(tracing.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'
];
assertTrue(tracing.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'
];
assertTrue(tracing.LinuxPerfImporter.canImport(lines.join('\n')));
var lines = [
'SomeRandomText',
'More random text'
];
assertFalse(tracing.LinuxPerfImporter.canImport(lines.join('\n')));
}
function testCanImport34AndLater() {
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'
];
assertTrue(tracing.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'
];
assertTrue(tracing.LinuxPerfImporter.canImport(lines.join('\n')));
}
function testImportOneSequence() {
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 tracing.TimelineModel(lines.join('\n'), false);
assertEquals(0, m.importErrors.length);
var c = m.cpus[1];
assertEquals(2, c.slices.length);
assertEquals('SurfaceFlinger', c.slices[0].title);
assertEquals(4467843.475, c.slices[0].start);
assertAlmostEquals(.536 - .475, c.slices[0].duration);
}
function testImportOneSequenceWithSpacyThreadName() {
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 tracing.TimelineModel(lines.join('\n'), false);
assertEquals(0, m.importErrors.length);
var c = m.cpus[1];
assertEquals(2, c.slices.length);
assertEquals('Surface Flinger ', c.slices[0].title);
assertEquals(4467843.475, c.slices[0].start);
assertAlmostEquals(.536 - .475, c.slices[0].duration);
}
function testImportWithNewline() {
var lines = [
''
];
var m = new tracing.TimelineModel(lines.join('\n'));
assertEquals(0, m.importErrors.length);
}
function testClockSync() {
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 tracing.TimelineModel(lines.join('\n'), false);
assertEquals(0, m.importErrors.length);
var c = m.cpus[1];
assertEquals(2, c.slices.length);
assertAlmostEquals((467.843475 - (467.843 - 0.1)) * 1000, c.slices[0].start);
}
function testClockSyncMarkWrite() {
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 tracing.TimelineModel(lines.join('\n'), false);
assertEquals(0, m.importErrors.length);
var c = m.cpus[1];
assertEquals(2, c.slices.length);
assertAlmostEquals((15180.978813 - 0) * 1000, c.slices[0].start);
}
function testImportWithoutClockSyncDeletesEverything() {
}
</script>
</body>
</html>