<!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() {
  test('cpuFreqTargetImport', function() {
    var lines = [
      '<idle>-0     [000] ..s3  1043.718825: cpufreq_interactive_target: ' +
          'cpu=0 load=2 cur=2000000 targ=300000\n',
      '<idle>-0     [000] ..s3  1043.718825: cpufreq_interactive_target: ' +
          'cpu=0 load=12 cur=1000000 actual=1000000 targ=200000\n'
    ];
    var m = new tr.Model(lines.join('\n'), false);
    assert.isFalse(m.hasImportWarnings);

    var threads = m.getAllThreads();
    assert.equal(threads.length, 1);

    var thread = threads[0];
    assert.equal(thread.sliceGroup.slices[0].args['cpu'], 0);
    assert.equal(thread.sliceGroup.slices[0].args['load'], 2);
    assert.equal(thread.sliceGroup.slices[0].args['cur'], 2000000);
    assert.equal(thread.sliceGroup.slices[0].args['targ'], 300000);

    assert.equal(thread.sliceGroup.slices[1].args['cpu'], 0);
    assert.equal(thread.sliceGroup.slices[1].args['load'], 12);
    assert.equal(thread.sliceGroup.slices[1].args['cur'], 1000000);
    assert.equal(thread.sliceGroup.slices[1].args['actual'], 1000000);
    assert.equal(thread.sliceGroup.slices[1].args['targ'], 200000);
  });

  test('cpuFreqNotYetImport', function() {
    var lines = [
      '<idle>-0     [001] ..s3  1043.718832: cpufreq_interactive_notyet: ' +
          'cpu=1 load=10 cur=700000 targ=200000\n',
      '<idle>-0     [001] ..s3  1043.718832: cpufreq_interactive_notyet: ' +
          'cpu=1 load=10 cur=700000 actual=1000000 targ=200000\n'
    ];
    var m = new tr.Model(lines.join('\n'), false);
    assert.isFalse(m.hasImportWarnings);

    var threads = m.getAllThreads();
    assert.equal(threads.length, 1);

    var thread = threads[0];
    assert.equal(thread.sliceGroup.slices[0].args['cpu'], 1);
    assert.equal(thread.sliceGroup.slices[0].args['load'], 10);
    assert.equal(thread.sliceGroup.slices[0].args['cur'], 700000);
    assert.equal(thread.sliceGroup.slices[0].args['targ'], 200000);

    assert.equal(thread.sliceGroup.slices[1].args['cpu'], 1);
    assert.equal(thread.sliceGroup.slices[1].args['load'], 10);
    assert.equal(thread.sliceGroup.slices[1].args['cur'], 700000);
    assert.equal(thread.sliceGroup.slices[1].args['actual'], 1000000);
    assert.equal(thread.sliceGroup.slices[1].args['targ'], 200000);
  });

  test('cpuFreqSetSpeedImport', function() {
    var lines = [
      'cfinteractive-23    [001] ...1  1043.719688: ' +
          'cpufreq_interactive_setspeed: cpu=0 targ=200000 actual=700000\n'
    ];
    var m = new tr.Model(lines.join('\n'), false);
    assert.isFalse(m.hasImportWarnings);

    var threads = m.getAllThreads();
    assert.equal(threads.length, 1);

    var thread = threads[0];
    assert.equal(thread.sliceGroup.slices[0].args['cpu'], 0);
    assert.equal(thread.sliceGroup.slices[0].args['targ'], 200000);
    assert.equal(thread.sliceGroup.slices[0].args['actual'], 700000);
  });

  test('cpuFreqAlreadyImport', function() {
    var lines = [
      '<idle>-0     [000] ..s3  1043.738822: cpufreq_interactive_already: cpu=0 load=18 cur=200000 actual=700000 targ=200000\n' // @suppress longLineCheck
    ];
    var m = new tr.Model(lines.join('\n'), false);
    assert.isFalse(m.hasImportWarnings);

    var threads = m.getAllThreads();
    assert.equal(threads.length, 1);

    var thread = threads[0];
    assert.equal(thread.sliceGroup.slices[0].args['cpu'], 0);
    assert.equal(thread.sliceGroup.slices[0].args['load'], 18);
    assert.equal(thread.sliceGroup.slices[0].args['cur'], 200000);
    assert.equal(thread.sliceGroup.slices[0].args['actual'], 700000);
    assert.equal(thread.sliceGroup.slices[0].args['targ'], 200000);
  });

  test('cpuFreqBoostImport', function() {
    var lines = [
      'InputDispatcher-465   [001] ...1  1044.213948: ' +
          'cpufreq_interactive_boost: pulse\n'
    ];
    var m = new tr.Model(lines.join('\n'), false);
    assert.isFalse(m.hasImportWarnings);

    var threads = m.getAllThreads();
    assert.equal(threads.length, 1);

    var thread = threads[0];
    assert.equal(thread.sliceGroup.slices[0].args['type'], 'pulse');
  });

  test('cpuFreqUnBoostImport', function() {
    var lines = [
      'InputDispatcher-465   [001] ...1  1044.213948: ' +
          'cpufreq_interactive_unboost: pulse\n'
    ];
    var m = new tr.Model(lines.join('\n'), false);
    assert.isFalse(m.hasImportWarnings);

    var threads = m.getAllThreads();
    assert.equal(threads.length, 1);

    var thread = threads[0];
    assert.equal(thread.sliceGroup.slices[0].args['type'], 'pulse');
  });

  test('cpuFreqUpImport', function() {
    var lines = [
      'kinteractive-69    [003] .... 414324.164432: ' +
          'cpufreq_interactive_up: cpu=1 targ=1400000 actual=800000'
    ];
    var m = new tr.Model(lines.join('\n'), false);
    assert.isFalse(m.hasImportWarnings);

    var threads = m.getAllThreads();
    assert.equal(threads.length, 1);

    var thread = threads[0];
    assert.equal(thread.sliceGroup.slices[0].args['cpu'], 1);
    assert.equal(thread.sliceGroup.slices[0].args['targ'], 1400000);
    assert.equal(thread.sliceGroup.slices[0].args['actual'], 800000);
  });

  test('cpuFreqDownImport', function() {
    var lines = [
      'kinteractive-69    [003] .... 414365.834193: ' +
          'cpufreq_interactive_down: cpu=3 targ=800000 actual=1000000'
    ];
    var m = new tr.Model(lines.join('\n'), false);
    assert.isFalse(m.hasImportWarnings);

    var threads = m.getAllThreads();
    assert.equal(threads.length, 1);

    var thread = threads[0];
    assert.equal(thread.sliceGroup.slices[0].args['cpu'], 3);
    assert.equal(thread.sliceGroup.slices[0].args['targ'], 800000);
    assert.equal(thread.sliceGroup.slices[0].args['actual'], 1000000);
  });
});
</script>

