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

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

Issue 2428953002: Helper function for get interactive timestamps (Closed)
Patch Set: Return map of timestamps 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, frame: {id_ref: '0xdeadbeef'},
charliea (OOO until 10-5) 2016/10/18 23:27:54 this this should be: 'ptr', 'loading', 'FrameLoad
dproy 2016/10/18 23:38:57 Done.
59 documentLoaderURL: 'http://example.com'});
60 }
61
62 function addNavigationStart(mainThread, startNavTime) {
63 mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
64 cat: 'blink.user_timing',
65 title: 'navigationStart',
66 start: startNavTime,
67 duration: 0.0,
68 args: {frame: '0xdeadbeef'}
69 }));
70 }
71
72 function addFMPCandidate(mainThread, fmpTime) {
73 mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
74 cat: 'loading',
75 title: 'firstMeaningfulPaintCandidate',
76 start: fmpTime,
77 duration: 0.0,
78 args: {frame: '0xdeadbeef'}
79 }));
80 }
81
82 function addSchedulerTask(mainThread, startTime, duration) {
83 mainThread.sliceGroup.pushSlice(newSchedulerTask(startTime, duration));
84 }
85
86 function addDummyTask(mainThread, startTime) {
87 mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({
88 cat: 'dummy',
89 title: 'dummyTitle',
90 start: startTime,
91 duration: 0.0
92 }));
93 }
94
40 test('getNavStartTimestamps', () => { 95 test('getNavStartTimestamps', () => {
41 var model = createTestModel(rendererProcess => { 96 var model = createTestModel(rendererProcess => {
42 var mainThread = rendererProcess.getOrCreateThread(MAIN_THREAD_ID); 97 var mainThread = rendererProcess.getOrCreateThread(MAIN_THREAD_ID);
43 mainThread.sliceGroup.pushSlice(tr.c.TestUtils.newSliceEx({ 98 addNavigationStart(mainThread, 0);
44 cat: 'blink.user_timing', 99 addNavigationStart(mainThread, 10);
45 title: 'navigationStart', 100 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 }); 101 });
67 102
68 var chromeHelper = model.getOrCreateHelper( 103 var chromeHelper = model.getOrCreateHelper(
69 tr.model.helpers.ChromeModelHelper); 104 tr.model.helpers.ChromeModelHelper);
70 var rendererHelper = chromeHelper.rendererHelpers[RENDERER_PROCESS_ID]; 105 var rendererHelper = chromeHelper.rendererHelpers[RENDERER_PROCESS_ID];
71 var navStartTimestamps = getNavStartTimestamps(rendererHelper); 106 var navStartTimestamps = getNavStartTimestamps(rendererHelper);
72 assert.equal(navStartTimestamps.length, 3);
73 107
74 // It is ok to assert equality for floating point numbers here because 108 // It is ok to assert equality for floating point numbers here because
75 // the timestamps should remain unmodified. 109 // the timestamps should remain unmodified.
76 assert.deepEqual(navStartTimestamps, [0, 10, 30]); 110 assert.deepEqual(navStartTimestamps, [0, 10, 30]);
77 }); 111 });
78 112
113 /**
114 * Checks getInteractiveTimestamps works as intended. If the definition of
115 * TTI metric changes, this test may begin to fail and we may need to adjust
116 * our EIL implementation.
117 */
118 test('getInteractiveTimestamps', () => {
119 var model = createTestModel(rendererProcess => {
120 addTestFrame(rendererProcess);
121
122 var mainThread = rendererProcess.getOrCreateThread(MAIN_THREAD_ID);
123 addNavigationStart(mainThread, 0);
124 addFMPCandidate(mainThread, 5000);
125
126 addNavigationStart(mainThread, 100000);
127 addFMPCandidate(mainThread, 110000);
128
129 // To detect when a page has become interactive, we need to find a large
130 // enough window of no long tasks. Adding a dummy task sufficiently far
131 // away extends the bounds of the model so that it can contain this
132 // window. In a non-test scenario, we always record traces for long enough
133 // that this is not an issue.
134 addDummyTask(mainThread, 900000);
135 });
136
137 var interactiveTimestampsMap = getInteractiveTimestamps(model);
138 var interactiveTimestamps =
139 interactiveTimestampsMap.get(RENDERER_PROCESS_ID);
140 assert.deepEqual(
141 interactiveTimestamps.sort((a, b) => a - b), [5000, 110000]);
charliea (OOO until 10-5) 2016/10/18 23:27:53 think this is default sort fn
dproy 2016/10/18 23:38:57 I was surprised to learn it's not: http://stackove
charliea (OOO until 10-5) 2016/10/18 23:48:20 Welp, that's the dumbest thing I've seen today.
142 });
143
144 test('getInteractiveTimestampsMultiRenderer', () => {
145 var model = tr.c.TestUtils.newModel(model => {
146 var rendererProcesses = [];
147 for (var pid = 1; pid <= 5; pid++) {
148 var rendererProcess = model.getOrCreateProcess(pid);
149 var mainThread = rendererProcess.getOrCreateThread(pid + 10);
150 mainThread.name = 'CrRendererMain';
151
152 addTestFrame(rendererProcess);
153 addNavigationStart(mainThread, pid * 1000);
154 addFMPCandidate(mainThread, pid * 1000 + 2000);
155 addNavigationStart(mainThread, pid * 2000);
156 addFMPCandidate(mainThread, pid * 2000 + 2000);
157 addDummyTask(mainThread, 100000);
158 }
159 });
160
161 var interactiveTimestampsMap = getInteractiveTimestamps(model);
162 for (var [pid, interactiveTimestamps] of interactiveTimestampsMap) {
163 assert.deepEqual(
164 interactiveTimestamps.sort((a, b) => a - b),
charliea (OOO until 10-5) 2016/10/18 23:27:54 same
165 [pid * 1000 + 2000, pid * 2000 + 2000]);
166 }
167 });
168
79 test('singlePostInteractiveWindow', () => { 169 test('singlePostInteractiveWindow', () => {
80 var interactiveTimestamps = [50]; 170 var interactiveTimestamps = [50];
81 var navStartTimestamps = [0]; 171 var navStartTimestamps = [0];
82 var traceEndTimestamp = [100]; 172 var traceEndTimestamp = [100];
83 var windows = getPostInteractiveTaskWindows( 173 var windows = getPostInteractiveTaskWindows(
84 interactiveTimestamps, navStartTimestamps, traceEndTimestamp); 174 interactiveTimestamps, navStartTimestamps, traceEndTimestamp);
85 assert.equal(windows.length, 1); 175 assert.equal(windows.length, 1);
86 assertRangeEquals(windows[0], tr.b.Range.fromExplicitRange(50, 100)); 176 assertRangeEquals(windows[0], tr.b.Range.fromExplicitRange(50, 100));
87 }); 177 });
88 178
(...skipping 21 matching lines...) Expand all
110 200
111 test('twoInteractiveTimeStampsWithNoNavStartInBetween', () => { 201 test('twoInteractiveTimeStampsWithNoNavStartInBetween', () => {
112 var interactiveTimestamps = [50, 75]; 202 var interactiveTimestamps = [50, 75];
113 var navStartTimestamps = [0]; 203 var navStartTimestamps = [0];
114 var traceEndTimestamp = [100]; 204 var traceEndTimestamp = [100];
115 assert.throws(() => getPostInteractiveTaskWindows( 205 assert.throws(() => getPostInteractiveTaskWindows(
116 interactiveTimestamps, navStartTimestamps, traceEndTimestamp)); 206 interactiveTimestamps, navStartTimestamps, traceEndTimestamp));
117 }); 207 });
118 }); 208 });
119 </script> 209 </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