blob: adbfb3bc05bac8085f2f9cd4d6048418193208aa [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright (c) 2015 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="/extras/vsync/vsync_auditor.html">
<link rel="import" href="/model/counter_series.html">
<link rel="import" href="/model/model.html">
<link rel="import" href="/model/thread_slice.html">
<script>
'use strict';
tr.b.unittest.testSuite(function() {
var CounterSeries = tr.model.CounterSeries;
var Model = tr.Model;
var ThreadSlice = tr.model.ThreadSlice;
var VSyncAuditor = tr.e.audits.VSyncAuditor;
function testFindVSyncTimestamps(slices, counters, expectedTimes) {
var model = buildModel(slices, counters);
var auditor = new VSyncAuditor(model);
assert.deepEqual(auditor.findVSyncTimestamps(model), expectedTimes);
}
function buildModel(slices, counters) {
var model = new Model();
var process = model.getOrCreateProcess(1);
for (var i = 0; i < slices.length; i++) {
var thread = process.getOrCreateThread(i);
for (var j = 0; j < slices[i].length; j++)
thread.sliceGroup.pushSlice(slices[i][j]);
}
for (var i = 0; i < counters.length; i++) {
var counter = process.getOrCreateCounter(
counters[i].category,
counters[i].name);
counter.addSeries(counters[i].series);
}
return model;
}
function buildSlice(title, time) {
return new ThreadSlice('', title, 0, time, {});
}
function buildCounterSeries(name, timestamps) {
var series = new CounterSeries(name, '');
for (var i = 0; i < timestamps.length; i++)
series.addCounterSample(timestamps[i], 1);
return series;
}
test('findEmpty', function() {
testFindVSyncTimestamps([], [], []);
});
test('findNoVsync', function() {
testFindVSyncTimestamps([
[buildSlice('MessageLoop::RunTask', 10),
buildSlice('MessageLoop::RunTask', 20)],
[buildSlice('MessageLoop::RunTask', 15)]
], [], []);
});
test('findOneVsync', function() {
testFindVSyncTimestamps([[buildSlice('vblank', 42)]], [], [42]);
});
test('findMultipleVsyncs', function() {
testFindVSyncTimestamps([
[buildSlice('VSYNC', 1), buildSlice('MessageLoop::RunTask', 2)],
[buildSlice('MessageLoop::RunTask', 3)],
[buildSlice('MessageLoop::RunTask', 4), buildSlice('VSYNC', 5)],
[buildSlice('VSYNC', 6), buildSlice('VSYNC', 7)]
], [], [1, 5, 6, 7]);
});
test('findMultipleAndroidVsyncs', function() {
testFindVSyncTimestamps([
[buildSlice('MessageLoop::RunTask', 2)],
[buildSlice('MessageLoop::RunTask', 3)],
[buildSlice('MessageLoop::RunTask', 4)]
],
[
{
category: 'android',
name: 'VSYNC-app',
series: buildCounterSeries('VSYNC-app', [1, 5, 6, 7])
}
], [1, 5, 6, 7]);
});
test('findUnsorted', function() {
testFindVSyncTimestamps([
[buildSlice('RenderWidgetHostViewAndroid::OnVSync', 4),
buildSlice('MessageLoop::RunTask', 2)],
[buildSlice('RenderWidgetHostViewAndroid::OnVSync', 1),
buildSlice('RenderWidgetHostViewAndroid::OnVSync', 3)]
], [], [1, 3, 4]);
});
test('findDifferentPrecisions', function() {
// vblank has higher precision than RenderWidgetHostViewAndroid::OnVSync.
testFindVSyncTimestamps([
[buildSlice('RenderWidgetHostViewAndroid::OnVSync', 1),
buildSlice('vblank', 2),
buildSlice('RenderWidgetHostViewAndroid::OnVSync', 3)]
], [], [2]);
});
});
</script>