<!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="/extras/importer/linux_perf/ftrace_importer.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() { // @suppress longLineCheck
  test('schedSwitchRE', function() {
    var re = tr.e.importer.linux_perf._SchedParserTestExports.schedSwitchRE;
    var x = re.exec('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[1], 'swapper');
    assert.equal(x[2], '0');
    assert.equal(x[3], '120');
    assert.equal(x[4], 'R');
    assert.equal(x[5], 'SurfaceFlinger');
    assert.equal(x[6], '178');
    assert.equal(x[7], '112');

    var x = re.exec('prev_comm=.android.chrome prev_pid=1562 prev_prio=120 prev_state=R ==> next_comm=Binder Thread # next_pid=195 next_prio=120'); // @suppress longLineCheck
    assert.isNotNull(x);
    assert.equal(x[1], '.android.chrome');
    assert.equal(x[5], 'Binder Thread #');

    var x = re.exec('prev_comm=Binder Thread # prev_pid=1562 prev_prio=120 prev_state=R ==> next_comm=.android.chrome next_pid=195 next_prio=120'); // @suppress longLineCheck
    assert.isNotNull(x);
    assert.equal(x[1], 'Binder Thread #');
    assert.equal(x[5], '.android.chrome');

    // explicit test for prev_state of D|W
    var x = re.exec('prev_comm=.android.chrome prev_pid=1562 prev_prio=120 ' +
        'prev_state=D|W ==> next_comm=Binder Thread # next_pid=195 ' +
        'next_prio=120');
    assert.isNotNull(x);
    assert.equal(x[4], 'D|W');
  });

  test('schedWakeupRE', function() {
    var re = tr.e.importer.linux_perf._SchedParserTestExports.schedWakeupRE;
    var x = re.exec(
        'comm=SensorService pid=207 prio=112 success=1 target_cpu=000');
    assert.isNotNull(x);
    assert.equal(x[1], 'SensorService');
    assert.equal(x[2], '207');
    assert.equal(x[3], '112');
    assert.equal(x[4], '1');
    assert.equal(x[5], '000');
  });

  test('importOneSequenceWithSchedWakeUp', function() {
    var lines = [
      'ndroid.launcher-584   [001] d..3 12622.506890: sched_switch: prev_comm=ndroid.launcher prev_pid=584 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=217 next_prio=120', // @suppress longLineCheck
      '       Binder_1-217   [001] d..3 12622.506918: sched_switch: prev_comm=Binder_1 prev_pid=217 prev_prio=120 prev_state=D ==> next_comm=ndroid.launcher next_pid=584 next_prio=120', // @suppress longLineCheck
      'ndroid.launcher-584   [001] d..4 12622.506936: sched_wakeup: comm=Binder_1 pid=217 prio=120 success=1 target_cpu=001', // @suppress longLineCheck
      'ndroid.launcher-584   [001] d..3 12622.506950: sched_switch: prev_comm=ndroid.launcher prev_pid=584 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=217 next_prio=120', // @suppress longLineCheck
      '       Binder_1-217   [001] ...1 12622.507057: tracing_mark_write: B|128|queueBuffer', // @suppress longLineCheck
      '       Binder_1-217   [001] ...1 12622.507175: tracing_mark_write: E',
      '       Binder_1-217   [001] d..3 12622.507253: sched_switch: prev_comm=Binder_1 prev_pid=217 prev_prio=120 prev_state=S ==> next_comm=ndroid.launcher next_pid=584 next_prio=120' // @suppress longLineCheck
    ];

    var m = new tr.Model(lines.join('\n'), false);
    assert.isFalse(m.hasImportWarnings);

    var thread = m.findAllThreadsNamed('Binder_1')[0];
    var timeSlices = thread.timeSlices;
    assert.equal(timeSlices.length, 4);

    var runningSlice = timeSlices[0];
    assert.equal(runningSlice.title, 'Running');
    assert.closeTo(12622506.890, runningSlice.start, 1e-5);
    assert.closeTo(.918 - .890, runningSlice.duration, 1e-5);

    var sleepSlice = timeSlices[1];
    assert.equal(sleepSlice.title, 'Uninterruptible Sleep');
    assert.closeTo(12622506.918, sleepSlice.start, 1e-5);
    assert.closeTo(.936 - .918, sleepSlice.duration, 1e-5);

    var wakeupSlice = timeSlices[2];
    assert.equal(wakeupSlice.title, 'Runnable');
    assert.closeTo(12622506.936, wakeupSlice.start, 1e-5);
    assert.closeTo(.950 - .936, wakeupSlice.duration, 1e-5);
    assert.equal(wakeupSlice.args['wakeup from tid'], 584);

    var runningSlice2 = timeSlices[3];
    assert.equal(runningSlice2.title, 'Running');
    assert.closeTo(12622506.950, runningSlice2.start, 1e-5);
    assert.closeTo(7.253 - 6.950, runningSlice2.duration, 1e-5);
  });

  test('importWithUnknownSleepState', function() {
    var lines = [
      'ndroid.launcher-584   [001] d..3 12622.506890: sched_switch: prev_comm=ndroid.launcher prev_pid=584 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=217 next_prio=120', // @suppress longLineCheck
      '       Binder_1-217   [001] d..3 12622.506918: sched_switch: prev_comm=Binder_1 prev_pid=217 prev_prio=120 prev_state=F|O ==> next_comm=ndroid.launcher next_pid=584 next_prio=120', // @suppress longLineCheck
      'ndroid.launcher-584   [001] d..4 12622.506936: sched_wakeup: comm=Binder_1 pid=217 prio=120 success=1 target_cpu=001', // @suppress longLineCheck
      'ndroid.launcher-584   [001] d..3 12622.506950: sched_switch: prev_comm=ndroid.launcher prev_pid=584 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=217 next_prio=120', // @suppress longLineCheck
      '       Binder_1-217   [001] ...1 12622.507057: tracing_mark_write: B|128|queueBuffer', // @suppress longLineCheck
      '       Binder_1-217   [001] ...1 12622.507175: tracing_mark_write: E',
      '       Binder_1-217   [001] d..3 12622.507253: sched_switch: prev_comm=Binder_1 prev_pid=217 prev_prio=120 prev_state=F|O ==> next_comm=ndroid.launcher next_pid=584 next_prio=120' // @suppress longLineCheck
    ];

    var m;
    assert.doesNotThrow(function() {
      m = new tr.Model(lines.join('\n'), false);
    });
    assert.isTrue(m.hasImportWarnings);
    assert.equal(m.importWarnings[0].message, 'Unrecognized sleep state: F|O');

    var thread = m.findAllThreadsNamed('Binder_1')[0];
    var timeSlices = thread.timeSlices;

    assert.equal(timeSlices[1].title, 'UNKNOWN');
  });

  test('importWithUninterruptibleSleep', function() {
    var lines = [
      'ndroid.launcher-584   [001] d..3 12622.506890: sched_switch: ' +
          'prev_comm=ndroid.launcher prev_pid=584 ' +
          'prev_prio=120 prev_state=R+ ' +
          '==> next_comm=Binder_1 next_pid=217 next_prio=120',

      '       Binder_1-217   [001] d..3 12622.506918: sched_switch: ' +
          'prev_comm=Binder_1 prev_pid=217 prev_prio=120 prev_state=D|K ' +
          '==> next_comm=ndroid.launcher next_pid=584 next_prio=120',

      'ndroid.launcher-584   [001] d..4 12622.506936: sched_wakeup: ' +
          'comm=Binder_1 pid=217 prio=120 success=1 target_cpu=001',

      'ndroid.launcher-584   [001] d..3 12622.506950: sched_switch: ' +
          'prev_comm=ndroid.launcher prev_pid=584 ' +
          'prev_prio=120 prev_state=R+ ' +
          '==> next_comm=Binder_1 next_pid=217 next_prio=120',

      '       Binder_1-217   [001] ...1 12622.507057: tracing_mark_write: ' +
          'B|128|queueBuffer',

      '       Binder_1-217   [001] ...1 12622.507175: tracing_mark_write: E',

      '       Binder_1-217   [001] d..3 12622.507253: sched_switch: ' +
          'prev_comm=Binder_1 prev_pid=217 prev_prio=120 prev_state=S ' +
          '==> next_comm=ndroid.launcher next_pid=584 next_prio=120'
    ];

    var m = new tr.Model(lines.join('\n'), false);
    assert.isFalse(m.hasImportWarnings);

    var thread = m.findAllThreadsNamed('Binder_1')[0];
    var timeSlices = thread.timeSlices;
    assert.equal(timeSlices.length, 4);

    var wakeKillSlice = timeSlices[1];
    assert.equal(wakeKillSlice.title, 'Uninterruptible Sleep | WakeKill');
    assert.closeTo(12622506.918, wakeKillSlice.start, 1e-5);
    assert.closeTo(.936 - .918, wakeKillSlice.duration, 1e-5);
  });
});
</script>

