Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(150)

Side by Side Diff: tracing/tracing/extras/chrome/estimated_input_latency_test.html

Issue 2428953002: Helper function for get interactive timestamps (Closed)
Patch Set: Address charliea@ comments Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tracing/tracing/extras/chrome/estimated_input_latency.html ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 <!DOCTYPE html> 1 <!DOCTYPE html>
2 <!-- 2 <!--
3 Copyright 2016 The Chromium Authors. All rights reserved. 3 Copyright 2016 The Chromium Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style license that can be 4 Use of this source code is governed by a BSD-style license that can be
5 found in the LICENSE file. 5 found in the LICENSE file.
6 --> 6 -->
7 7
8 <link rel="import" href="/tracing/base/assert_utils.html"> 8 <link rel="import" href="/tracing/base/assert_utils.html">
9 <link rel="import" href="/tracing/core/test_utils.html"> 9 <link rel="import" href="/tracing/core/test_utils.html">
10 <link rel="import" href="/tracing/extras/chrome/estimated_input_latency.html"> 10 <link rel="import" href="/tracing/extras/chrome/estimated_input_latency.html">
11 <link rel="import" href="/tracing/metrics/system_health/loading_metric.html">
11 <link rel="import" href="/tracing/model/helpers/chrome_model_helper.html"> 12 <link rel="import" href="/tracing/model/helpers/chrome_model_helper.html">
12 13
13 <script> 14 <script>
14 'use strict'; 15 'use strict';
15 16
16 tr.b.unittest.testSuite(function() { 17 tr.b.unittest.testSuite(function() {
17 18
19 var getInteractiveTimestamps = tr.e.chrome.getInteractiveTimestamps;
18 var getPostInteractiveTaskWindows = tr.e.chrome.getPostInteractiveTaskWindows; 20 var getPostInteractiveTaskWindows = tr.e.chrome.getPostInteractiveTaskWindows;
19 var getNavStartTimestamps = tr.e.chrome.getNavStartTimestamps; 21 var getNavStartTimestamps = tr.e.chrome.getNavStartTimestamps;
20 var assertRangeEquals = tr.b.assertRangeEquals; 22 var assertRangeEquals = tr.b.assertRangeEquals;
21 23
22 // Default renderer process ID for tests that use only one renderer process. 24 // Default renderer process ID for tests that use only one renderer process.
23 var RENDERER_PROCESS_ID = 1; 25 var RENDERER_PROCESS_ID = 1;
24 26
25 var MAIN_THREAD_ID = 2; 27 var MAIN_THREAD_ID = 2;
26 28
27 function createTestModel(rendererCallback) { 29 function createTestModel(rendererCallback) {
28 return tr.c.TestUtils.newModel(model => { 30 return tr.c.TestUtils.newModel(model => {
29 var rendererProcess = model.getOrCreateProcess(RENDERER_PROCESS_ID); 31 var rendererProcess = model.getOrCreateProcess(RENDERER_PROCESS_ID);
30 var mainThread = rendererProcess.getOrCreateThread(MAIN_THREAD_ID); 32 var mainThread = rendererProcess.getOrCreateThread(MAIN_THREAD_ID);
31 33
32 // The name is required because the Chrome model helper checks for it to 34 // The name is required because the Chrome model helper checks for it to
33 // decide if it supports the model. 35 // decide if it supports the model.
34 mainThread.name = 'CrRendererMain'; 36 mainThread.name = 'CrRendererMain';
35 37
36 rendererCallback(rendererProcess); 38 rendererCallback(rendererProcess);
37 }); 39 });
38 } 40 }
39 41
42 function newSchedulerTask(startTime, duration) {
43 return tr.c.TestUtils.newSliceEx({
44 cat: 'toplevel',
45 title: 'TaskQueueManager::ProcessTaskFromWorkQueue',
46 start: startTime,
47 duration: duration
48 });
49 }
50
51 /**
52 * Adds a FrameLoader snapshot to rendererProcess that is used by test FMP
53 * candidate slices.
54 */
55 function addTestFrame(rendererProcess) {
56 rendererProcess.objects.addSnapshot(
57 'ptr', 'loading', 'FrameLoader', 300, {
58 isLoadingMainFrame: true,
59 frame: {id_ref: '0xdeadbeef'},
60 documentLoaderURL: 'http://example.com'
61 });
62 }
63
64 function addNavigationStart(mainThread, startNavTime) {
65 mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
66 cat: 'blink.user_timing',
67 title: 'navigationStart',
68 start: startNavTime,
69 duration: 0.0,
70 args: {frame: '0xdeadbeef'}
71 }));
72 }
73
74 function addFMPCandidate(mainThread, fmpTime) {
75 mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
76 cat: 'loading',
77 title: 'firstMeaningfulPaintCandidate',
78 start: fmpTime,
79 duration: 0.0,
80 args: {frame: '0xdeadbeef'}
81 }));
82 }
83
84 function addSchedulerTask(mainThread, startTime, duration) {
85 mainThread.sliceGroup.pushSlice(newSchedulerTask(startTime, duration));
86 }
87
88 function addDummyTask(mainThread, startTime) {
89 mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
90 cat: 'dummy',
91 title: 'dummyTitle',
92 start: startTime,
93 duration: 0.0
94 }));
95 }
96
40 test('getNavStartTimestamps', () => { 97 test('getNavStartTimestamps', () => {
41 var model = createTestModel(rendererProcess => { 98 var model = createTestModel(rendererProcess => {
42 var mainThread = rendererProcess.getOrCreateThread(MAIN_THREAD_ID); 99 var mainThread = rendererProcess.getOrCreateThread(MAIN_THREAD_ID);
43 mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ 100 addNavigationStart(mainThread, 0);
44 cat: 'blink.user_timing', 101 addNavigationStart(mainThread, 10);
45 title: 'navigationStart', 102 addNavigationStart(mainThread, 30);
46 start: 0,
47 duration: 0.0,
48 args: {frame: '0xdeadbeef'}
49 }));
50
51 mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
52 cat: 'blink.user_timing',
53 title: 'navigationStart',
54 start: 10,
55 duration: 0.0,
56 args: {frame: '0xdeadbeef'}
57 }));
58
59 mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
60 cat: 'blink.user_timing',
61 title: 'navigationStart',
62 start: 30,
63 duration: 0.0,
64 args: {frame: '0xdeadbeef'}
65 }));
66 }); 103 });
67 104
68 var chromeHelper = model.getOrCreateHelper( 105 var chromeHelper = model.getOrCreateHelper(
69 tr.model.helpers.ChromeModelHelper); 106 tr.model.helpers.ChromeModelHelper);
70 var rendererHelper = chromeHelper.rendererHelpers[RENDERER_PROCESS_ID]; 107 var rendererHelper = chromeHelper.rendererHelpers[RENDERER_PROCESS_ID];
71 var navStartTimestamps = getNavStartTimestamps(rendererHelper); 108 var navStartTimestamps = getNavStartTimestamps(rendererHelper);
72 assert.equal(navStartTimestamps.length, 3);
73 109
74 // It is ok to assert equality for floating point numbers here because 110 // It is ok to assert equality for floating point numbers here because
75 // the timestamps should remain unmodified. 111 // the timestamps should remain unmodified.
76 assert.deepEqual(navStartTimestamps, [0, 10, 30]); 112 assert.deepEqual(navStartTimestamps, [0, 10, 30]);
77 }); 113 });
78 114
115 /**
116 * Checks getInteractiveTimestamps works as intended. If the definition of
117 * TTI metric changes, this test may begin to fail and we may need to adjust
118 * our EIL implementation.
119 */
120 test('getInteractiveTimestamps', () => {
121 var model = createTestModel(rendererProcess => {
122 addTestFrame(rendererProcess);
123
124 var mainThread = rendererProcess.getOrCreateThread(MAIN_THREAD_ID);
125 addNavigationStart(mainThread, 0);
126 addFMPCandidate(mainThread, 5000);
127
128 addNavigationStart(mainThread, 100000);
129 addFMPCandidate(mainThread, 110000);
130
131 // To detect when a page has become interactive, we need to find a large
132 // enough window of no long tasks. Adding a dummy task sufficiently far
133 // away extends the bounds of the model so that it can contain this
134 // window. In a non-test scenario, we always record traces for long enough
135 // that this is not an issue.
136 addDummyTask(mainThread, 900000);
137 });
138
139 var interactiveTimestampsMap = getInteractiveTimestamps(model);
140 var interactiveTimestamps =
141 interactiveTimestampsMap.get(RENDERER_PROCESS_ID);
142 assert.deepEqual(
143 interactiveTimestamps.sort((a, b) => a - b), [5000, 110000]);
144 });
145
146 test('getInteractiveTimestampsMultiRenderer', () => {
147 var model = tr.c.TestUtils.newModel(model => {
148 var rendererProcesses = [];
149 for (var pid = 1; pid <= 5; pid++) {
150 var rendererProcess = model.getOrCreateProcess(pid);
151 var mainThread = rendererProcess.getOrCreateThread(pid + 10);
152 mainThread.name = 'CrRendererMain';
153
154 addTestFrame(rendererProcess);
155 addNavigationStart(mainThread, pid * 1000);
156 addFMPCandidate(mainThread, pid * 1000 + 2000);
157 addNavigationStart(mainThread, pid * 2000);
158 addFMPCandidate(mainThread, pid * 2000 + 2000);
159 addDummyTask(mainThread, 100000);
160 }
161 });
162
163 var interactiveTimestampsMap = getInteractiveTimestamps(model);
164 for (var [pid, interactiveTimestamps] of interactiveTimestampsMap) {
165 assert.deepEqual(
166 interactiveTimestamps.sort((a, b) => a - b),
167 [pid * 1000 + 2000, pid * 2000 + 2000]);
168 }
169 });
170
79 test('singlePostInteractiveWindow', () => { 171 test('singlePostInteractiveWindow', () => {
80 var interactiveTimestamps = [50]; 172 var interactiveTimestamps = [50];
81 var navStartTimestamps = [0]; 173 var navStartTimestamps = [0];
82 var traceEndTimestamp = [100]; 174 var traceEndTimestamp = [100];
83 var windows = getPostInteractiveTaskWindows( 175 var windows = getPostInteractiveTaskWindows(
84 interactiveTimestamps, navStartTimestamps, traceEndTimestamp); 176 interactiveTimestamps, navStartTimestamps, traceEndTimestamp);
85 assert.equal(windows.length, 1); 177 assert.equal(windows.length, 1);
86 assertRangeEquals(windows[0], tr.b.Range.fromExplicitRange(50, 100)); 178 assertRangeEquals(windows[0], tr.b.Range.fromExplicitRange(50, 100));
87 }); 179 });
88 180
(...skipping 21 matching lines...) Expand all
110 202
111 test('twoInteractiveTimeStampsWithNoNavStartInBetween', () => { 203 test('twoInteractiveTimeStampsWithNoNavStartInBetween', () => {
112 var interactiveTimestamps = [50, 75]; 204 var interactiveTimestamps = [50, 75];
113 var navStartTimestamps = [0]; 205 var navStartTimestamps = [0];
114 var traceEndTimestamp = [100]; 206 var traceEndTimestamp = [100];
115 assert.throws(() => getPostInteractiveTaskWindows( 207 assert.throws(() => getPostInteractiveTaskWindows(
116 interactiveTimestamps, navStartTimestamps, traceEndTimestamp)); 208 interactiveTimestamps, navStartTimestamps, traceEndTimestamp));
117 }); 209 });
118 }); 210 });
119 </script> 211 </script>
OLDNEW
« no previous file with comments | « tracing/tracing/extras/chrome/estimated_input_latency.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698