| <!DOCTYPE html> |
| <!-- |
| Copyright (c) 2014 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/trace_model/thread.html"> |
| <link rel="import" href="/extras/highlighter/vsync_highlighter.html"> |
| |
| <script> |
| 'use strict'; |
| |
| tv.b.unittest.testSuite(function() { |
| |
| var VSyncHighlighter = tv.e.highlighter.VSyncHighlighter; |
| |
| var VIEW_L_WORLD = 100; |
| var VIEW_R_WORLD = 1000; |
| |
| function buildModel(slices) { |
| var model = new tv.c.TraceModel(); |
| 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]); |
| } |
| } |
| return model; |
| } |
| |
| function buildSlice(title, time) { |
| return new tv.c.trace_model.ThreadSlice('', title, 0, time, {}); |
| } |
| |
| function testFindVSyncTimes(slices, expectedTimes) { |
| assert.deepEqual( |
| expectedTimes, VSyncHighlighter.findVSyncTimes(buildModel(slices))); |
| } |
| |
| function testGenerateStripes(times, expectedRanges) { |
| var ranges = VSyncHighlighter.generateStripes( |
| times, VIEW_L_WORLD, VIEW_R_WORLD); |
| ranges.sort(); |
| expectedRanges.sort(); |
| |
| assert.equal(ranges.length, expectedRanges.length); |
| for (var i = 0; i < expectedRanges.length; i++) { |
| assert.deepEqual(ranges[i], expectedRanges[i]); |
| } |
| } |
| |
| test('findEmpty', function() { |
| testFindVSyncTimes([], []); |
| }); |
| |
| test('findNoVsync', function() { |
| testFindVSyncTimes([ |
| [buildSlice('MessageLoop::RunTask', 10), |
| buildSlice('MessageLoop::RunTask', 20)], |
| [buildSlice('MessageLoop::RunTask', 15)] |
| ], []); |
| }); |
| |
| test('findOneVsync', function() { |
| testFindVSyncTimes([[buildSlice('vblank', 42)]], [42]); |
| }); |
| |
| test('findMultipleVsyncs', function() { |
| testFindVSyncTimes([ |
| [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('findUnsorted', function() { |
| testFindVSyncTimes([ |
| [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. |
| testFindVSyncTimes([ |
| [buildSlice('RenderWidgetHostViewAndroid::OnVSync', 1), |
| buildSlice('vblank', 2), |
| buildSlice('RenderWidgetHostViewAndroid::OnVSync', 3)] |
| ], [2]); |
| }); |
| |
| test('generateInside', function() { |
| testGenerateStripes([], []); |
| testGenerateStripes([200, 500], [[200, 500]]); |
| testGenerateStripes([200, 500, 800, 900], [[200, 500], [800, 900]]); |
| testGenerateStripes( |
| [200, 500, 800, 900, 998, 999], |
| [[200, 500], [800, 900], [998, 999]]); |
| }); |
| |
| test('generateOutside', function() { |
| // Far left. |
| testGenerateStripes([0, 99], []); |
| testGenerateStripes([0, 10, 50, 99], []); |
| testGenerateStripes([0, 99, 101, 999], [[101, 999]]); |
| testGenerateStripes([0, 10, 50, 99, 101, 999], [[101, 999]]); |
| |
| // Far right. |
| testGenerateStripes([1001, 2000], []); |
| testGenerateStripes([1001, 2000, 3000, 4000], []); |
| testGenerateStripes([101, 999, 1001, 2000], [[101, 999]]); |
| testGenerateStripes([101, 999, 1001, 2000, 3000, 4000], [[101, 999]]); |
| |
| // Far both. |
| testGenerateStripes([0, 99, 1001, 2000], []); |
| testGenerateStripes([0, 10, 50, 99, 1001, 2000], []); |
| testGenerateStripes([0, 10, 50, 99, 1001, 2000, 3000, 4000], []); |
| testGenerateStripes([0, 99, 101, 999, 1001, 2000], [[101, 999]]); |
| }); |
| |
| test('generateOverlap', function() { |
| // Left overlap. |
| testGenerateStripes([0, 101], [[VIEW_L_WORLD, 101]]); |
| testGenerateStripes([0, 1, 2, 101], [[VIEW_L_WORLD, 101]]); |
| testGenerateStripes( |
| [2, 101, 102, 103], |
| [[VIEW_L_WORLD, 101], [102, 103]]); |
| testGenerateStripes( |
| [0, 1, 2, 101, 102, 103], |
| [[VIEW_L_WORLD, 101], [102, 103]]); |
| testGenerateStripes( |
| [0, 1, 2, 101, 102, 103, 1001, 3000], |
| [[VIEW_L_WORLD, 101], [102, 103]]); |
| |
| // Right overlap. |
| testGenerateStripes([999, 2000], [[999, VIEW_R_WORLD]]); |
| testGenerateStripes([999, 2000, 3000, 4000], [[999, VIEW_R_WORLD]]); |
| testGenerateStripes( |
| [997, 998, 999, 2000], |
| [[997, 998], [999, VIEW_R_WORLD]]); |
| testGenerateStripes( |
| [997, 998, 999, 2000, 3000, 4000], |
| [[997, 998], [999, VIEW_R_WORLD]]); |
| testGenerateStripes( |
| [0, 10, 997, 998, 999, 2000, 3000, 4000], |
| [[997, 998], [999, VIEW_R_WORLD]]); |
| |
| // Both overlap. |
| testGenerateStripes([0, 2000], [[VIEW_L_WORLD, VIEW_R_WORLD]]); |
| testGenerateStripes( |
| [0, 101, 999, 2000], |
| [[VIEW_L_WORLD, 101], [999, VIEW_R_WORLD]]); |
| testGenerateStripes( |
| [0, 101, 200, 900, 999, 2000], |
| [[VIEW_L_WORLD, 101], [200, 900], [999, VIEW_R_WORLD]]); |
| testGenerateStripes( |
| [0, 10, 90, 101, 999, 2000, 3000, 4000], |
| [[VIEW_L_WORLD, 101], [999, VIEW_R_WORLD]]); |
| testGenerateStripes( |
| [0, 10, 90, 101, 200, 900, 999, 2000, 3000, 4000], |
| [[VIEW_L_WORLD, 101], [200, 900], [999, VIEW_R_WORLD]]); |
| }); |
| |
| test('generateOdd', function() { |
| // One VSync. |
| testGenerateStripes([0], [[VIEW_L_WORLD, VIEW_R_WORLD]]); |
| testGenerateStripes([500], [[500, VIEW_R_WORLD]]); |
| testGenerateStripes([1500], []); |
| |
| // Multiple VSyncs. |
| testGenerateStripes([0, 10, 20], [[VIEW_L_WORLD, VIEW_R_WORLD]]); |
| testGenerateStripes([0, 500, 2000], [[VIEW_L_WORLD, 500]]); |
| testGenerateStripes([0, 10, 500], [[500, VIEW_R_WORLD]]); |
| testGenerateStripes([0, 10, 2000], []); |
| testGenerateStripes( |
| [0, 200, 500], |
| [[VIEW_L_WORLD, 200], [500, VIEW_R_WORLD]]); |
| testGenerateStripes( |
| [0, 200, 500, 900], |
| [[VIEW_L_WORLD, 200], [500, 900]]); |
| }); |
| |
| test('generateBorder', function() { |
| testGenerateStripes([0, VIEW_L_WORLD], [[VIEW_L_WORLD, VIEW_L_WORLD]]); |
| testGenerateStripes( |
| [VIEW_L_WORLD, VIEW_L_WORLD], |
| [[VIEW_L_WORLD, VIEW_L_WORLD]]); |
| testGenerateStripes( |
| [VIEW_R_WORLD, 2000], |
| [[VIEW_R_WORLD, VIEW_R_WORLD]]); |
| testGenerateStripes( |
| [VIEW_R_WORLD, VIEW_R_WORLD], |
| [[VIEW_R_WORLD, VIEW_R_WORLD]]); |
| testGenerateStripes( |
| [VIEW_L_WORLD, VIEW_R_WORLD], |
| [[VIEW_L_WORLD, VIEW_R_WORLD]]); |
| testGenerateStripes( |
| [VIEW_L_WORLD, 200, 500, VIEW_R_WORLD], |
| [[VIEW_L_WORLD, 200], [500, VIEW_R_WORLD]]); |
| testGenerateStripes( |
| [0, VIEW_L_WORLD, VIEW_R_WORLD, 2000], |
| [[VIEW_L_WORLD, VIEW_L_WORLD], [VIEW_R_WORLD, VIEW_R_WORLD]]); |
| testGenerateStripes( |
| [0, VIEW_L_WORLD, VIEW_R_WORLD, 2000], |
| [[VIEW_L_WORLD, VIEW_L_WORLD], [VIEW_R_WORLD, VIEW_R_WORLD]]); |
| testGenerateStripes( |
| [0, VIEW_L_WORLD, 200, 500, VIEW_R_WORLD, 2000], |
| [[VIEW_L_WORLD, VIEW_L_WORLD], [200, 500], |
| [VIEW_R_WORLD, VIEW_R_WORLD]]); |
| testGenerateStripes( |
| [0, 10, VIEW_L_WORLD, VIEW_R_WORLD, 2000, 3000], |
| [[VIEW_L_WORLD, VIEW_R_WORLD]]); |
| }); |
| }); |
| </script> |