[go: nahoru, domu]

blob: 7b0c9b4a43162540be16576a7f392a575cf069b4 [file] [log] [blame]
Ella Ge792e4f12019-04-05 17:32:151// Copyright 2019 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Joao Victor Almeida917ce172020-07-07 20:56:125#include "cc/metrics/average_lag_tracker.h"
6
7#include <memory>
Ella Ge792e4f12019-04-05 17:32:158
9#include "base/test/metrics/histogram_tester.h"
10#include "testing/gmock/include/gmock/gmock.h"
11#include "testing/gtest/include/gtest/gtest.h"
12
13using base::Bucket;
14using testing::ElementsAre;
15
Joao Victor Almeida917ce172020-07-07 20:56:1216namespace cc {
Ella Ge792e4f12019-04-05 17:32:1517namespace {
18
19class AverageLagTrackerTest : public testing::Test {
20 public:
21 AverageLagTrackerTest() { ResetHistograms(); }
22
23 void ResetHistograms() {
Peter Boströmf2381042019-08-27 00:25:0324 histogram_tester_ = std::make_unique<base::HistogramTester>();
Ella Ge792e4f12019-04-05 17:32:1525 }
26
27 const base::HistogramTester& histogram_tester() { return *histogram_tester_; }
28
29 void SetUp() override {
30 average_lag_tracker_ = std::make_unique<AverageLagTracker>();
31 }
32
Joao Victor Almeida917ce172020-07-07 20:56:1233 void SyntheticTouchScrollBegin(base::TimeTicks event_time,
34 base::TimeTicks frame_time,
35 float delta,
36 float predicted_delta = 0) {
37 AverageLagTracker::EventInfo event_info(
38 0, delta, predicted_delta != 0 ? predicted_delta : delta, event_time,
39 AverageLagTracker::EventType::ScrollBegin);
40 event_info.finish_timestamp = frame_time;
41 average_lag_tracker_->AddScrollEventInFrame(event_info);
Ella Ge792e4f12019-04-05 17:32:1542 }
43
Joao Victor Almeida917ce172020-07-07 20:56:1244 void SyntheticTouchScrollUpdate(base::TimeTicks event_time,
45 base::TimeTicks frame_time,
46 float delta,
47 float predicted_delta = 0) {
48 AverageLagTracker::EventInfo event_info(
49 0, delta, predicted_delta != 0 ? predicted_delta : delta, event_time,
50 AverageLagTracker::EventType::ScrollUpdate);
51 event_info.finish_timestamp = frame_time;
52 average_lag_tracker_->AddScrollEventInFrame(event_info);
Ella Ge792e4f12019-04-05 17:32:1553 }
54
55 protected:
56 std::unique_ptr<AverageLagTracker> average_lag_tracker_;
57
58 std::unique_ptr<base::HistogramTester> histogram_tester_;
59};
60
61base::TimeTicks MillisecondsToTimeTicks(float t_ms) {
62 return base::TimeTicks() + base::TimeDelta::FromMilliseconds(t_ms);
63}
64
65// Simulate a simple situation that events at every 10ms and start at t=15ms,
66// frame swaps at every 10ms too and start at t=20ms and test we record one
67// UMA for ScrollUpdate in one second.
68TEST_F(AverageLagTrackerTest, OneSecondInterval) {
69 base::TimeTicks event_time =
70 base::TimeTicks() + base::TimeDelta::FromMilliseconds(5);
71 base::TimeTicks frame_time =
72 base::TimeTicks() + base::TimeDelta::FromMilliseconds(10);
73 float scroll_delta = 10;
74
75 // ScrollBegin
76 event_time += base::TimeDelta::FromMilliseconds(10); // 15ms
77 frame_time += base::TimeDelta::FromMilliseconds(10); // 20ms
Joao Victor Almeida917ce172020-07-07 20:56:1278 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:1579
80 // Send 101 ScrollUpdate events to verify that there is 1 AverageLag record
81 // per 1 second.
82 const int kUpdates = 101;
83 for (int i = 0; i < kUpdates; i++) {
84 event_time += base::TimeDelta::FromMilliseconds(10);
85 frame_time += base::TimeDelta::FromMilliseconds(10);
86 // First 50 has positive delta, others negetive delta.
87 const int sign = (i < kUpdates / 2) ? 1 : -1;
Joao Victor Almeida917ce172020-07-07 20:56:1288 SyntheticTouchScrollUpdate(event_time, frame_time, sign * scroll_delta);
Ella Ge792e4f12019-04-05 17:32:1589 }
90
91 // ScrollBegin report_time is at 20ms, so the next ScrollUpdate report_time is
92 // at 1020ms. The last event_time that finish this report should be later than
93 // 1020ms.
94 EXPECT_EQ(event_time,
95 base::TimeTicks() + base::TimeDelta::FromMilliseconds(1025));
96 EXPECT_EQ(frame_time,
97 base::TimeTicks() + base::TimeDelta::FromMilliseconds(1030));
98
99 // ScrollBegin AverageLag are the area between the event original component
100 // (time=15ms, delta=10px) to the frame swap time (time=20ms, expect finger
101 // position at delta=15px). The AverageLag scaled to 1 second is
102 // (0.5*(10px+15px)*5ms)/5ms = 12.5px.
103 EXPECT_THAT(histogram_tester().GetAllSamples(
104 "Event.Latency.ScrollBegin.Touch.AverageLag"),
105 ElementsAre(Bucket(12, 1)));
106 // This ScrollUpdate AverageLag are calculated as the finger uniformly scroll
107 // 10px each frame. For scroll up/down frame, the Lag at the last frame swap
108 // is 5px, and Lag at this frame swap is 15px. For the one changing direction,
109 // the Lag is from 5 to 10 and down to 5 again. So total LagArea is 99 * 100,
110 // plus 75. the AverageLag in 1 second is 9.975px.
111 EXPECT_THAT(histogram_tester().GetAllSamples(
112 "Event.Latency.ScrollUpdate.Touch.AverageLag"),
113 ElementsAre(Bucket(9, 1)));
Daniel Libbyf7cf77382019-05-06 19:23:44114 EXPECT_THAT(
115 histogram_tester().GetAllSamples(
116 "Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionPositive"),
117 ElementsAre(Bucket(0, 1)));
118 histogram_tester().ExpectTotalCount(
119 "Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionNegative", 0);
Ella Ge792e4f12019-04-05 17:32:15120 ResetHistograms();
121
122 // Send another ScrollBegin to end the unfinished ScrollUpdate report.
123 event_time += base::TimeDelta::FromMilliseconds(10);
124 frame_time += base::TimeDelta::FromMilliseconds(10);
Joao Victor Almeida917ce172020-07-07 20:56:12125 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15126
127 // The last ScrollUpdate's lag is 8.75px and truncated to 8.
128 EXPECT_THAT(histogram_tester().GetAllSamples(
129 "Event.Latency.ScrollUpdate.Touch.AverageLag"),
130 ElementsAre(Bucket(8, 1)));
Daniel Libbyf7cf77382019-05-06 19:23:44131 EXPECT_THAT(
132 histogram_tester().GetAllSamples(
133 "Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionPositive"),
134 ElementsAre(Bucket(0, 1)));
135 histogram_tester().ExpectTotalCount(
136 "Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionNegative", 0);
Ella Ge792e4f12019-04-05 17:32:15137}
138
139// Test the case that event's frame swap time is later than next event's
140// creation time. (i.e, event at t=10ms will be dispatch at t=30ms, while next
141// event is at t=20ms).
142TEST_F(AverageLagTrackerTest, LargerLatency) {
143 base::TimeTicks event_time = MillisecondsToTimeTicks(10);
144 base::TimeTicks frame_time =
145 event_time + base::TimeDelta::FromMilliseconds(20);
146 float scroll_delta = 10;
147
Joao Victor Almeida917ce172020-07-07 20:56:12148 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15149
150 // Send 2 ScrollUpdate. The second one will record AverageLag.ScrollBegin as
151 // it's event_time is larger or equal to ScrollBegin's frame_time.
152 for (int i = 0; i < 2; i++) {
153 event_time += base::TimeDelta::FromMilliseconds(10);
154 frame_time = event_time + base::TimeDelta::FromMilliseconds(20);
Joao Victor Almeida917ce172020-07-07 20:56:12155 SyntheticTouchScrollUpdate(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15156 }
157
158 // ScrollBegin AveragLag are from t=10ms to t=30ms, with absolute scroll
159 // position from 10 to 30. The AverageLag should be:
160 // (0.5*(10px + 30px)*20ms/20ms) = 20px.
161 EXPECT_THAT(histogram_tester().GetAllSamples(
162 "Event.Latency.ScrollBegin.Touch.AverageLag"),
163 ElementsAre(Bucket(20, 1)));
164
165 // Another ScrollBegin to flush unfinished frames.
166 // event_time doesn't matter here because the previous frames' lag are
167 // compute from their frame_time.
168 event_time = MillisecondsToTimeTicks(1000);
169 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12170 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15171 // The to unfinished frames' lag are (finger_positon-rendered_position)*time,
172 // AverageLag is ((30px-10px)*10ms+(30px-20px)*10ms)/20ms = 15px.
173 EXPECT_THAT(histogram_tester().GetAllSamples(
174 "Event.Latency.ScrollUpdate.Touch.AverageLag"),
175 ElementsAre(Bucket(14, 1)));
176}
177
178// Test that multiple latency being flush in the same frame swap.
179TEST_F(AverageLagTrackerTest, TwoLatencyInfoInSameFrame) {
180 // ScrollBegin
181 base::TimeTicks event_time = MillisecondsToTimeTicks(10);
182 base::TimeTicks frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12183 SyntheticTouchScrollBegin(event_time, frame_time, -10 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15184
185 // ScrollUpdate with event_time >= ScrollBegin frame_time will generate
186 // a histogram for AverageLag.ScrollBegin.
187 event_time = MillisecondsToTimeTicks(20);
188 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12189 SyntheticTouchScrollUpdate(event_time, frame_time, -10 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15190
191 // Absolute position from -10 to -20. The AverageLag should be:
192 // (0.5*(10px + 20px)*10ms/10ms) = 15px.
193 EXPECT_THAT(histogram_tester().GetAllSamples(
194 "Event.Latency.ScrollBegin.Touch.AverageLag"),
195 ElementsAre(Bucket(14, 1)));
196
197 event_time = MillisecondsToTimeTicks(25);
198 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12199 SyntheticTouchScrollUpdate(event_time, frame_time, 5 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15200
201 // Another ScrollBegin to flush unfinished frames.
202 event_time = MillisecondsToTimeTicks(1000);
203 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12204 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge792e4f12019-04-05 17:32:15205
206 // The ScrollUpdates are at t=20ms, finger_pos=-20px, rendered_pos=-10px,
207 // at t=25ms, finger_pos=-15px, rendered_pos=-10px;
208 // To t=30ms both events get flush.
209 // AverageLag is (0.5*(10px+5px)*5ms + 5px*5ms)/10ms = 6.25px
210 EXPECT_THAT(histogram_tester().GetAllSamples(
211 "Event.Latency.ScrollUpdate.Touch.AverageLag"),
212 ElementsAre(Bucket(6, 1)));
213}
214
215// Test the case that switching direction causes lag at current frame
216// time and previous frame time are in different direction.
217TEST_F(AverageLagTrackerTest, ChangeDirectionInFrame) {
218 // ScrollBegin
219 base::TimeTicks event_time = MillisecondsToTimeTicks(10);
220 base::TimeTicks frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12221 SyntheticTouchScrollBegin(event_time, frame_time, 10 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15222
223 // At t=20, lag = 10px.
224 event_time = MillisecondsToTimeTicks(20);
225 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12226 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15227
228 // At t=30, lag = -10px.
229 event_time = MillisecondsToTimeTicks(30);
230 frame_time = MillisecondsToTimeTicks(40);
Joao Victor Almeida917ce172020-07-07 20:56:12231 SyntheticTouchScrollUpdate(event_time, frame_time, -20 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15232
233 // Another ScrollBegin to flush unfinished frames.
234 event_time = MillisecondsToTimeTicks(1000);
235 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12236 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge792e4f12019-04-05 17:32:15237
238 // From t=20 to t=30, lag_area=2*(0.5*10px*5ms)=50px*ms.
239 // From t=30 to t=40, lag_area=20px*10ms=200px*ms
240 // AverageLag = (50+200)/20 = 12.5px.
241 EXPECT_THAT(histogram_tester().GetAllSamples(
242 "Event.Latency.ScrollUpdate.Touch.AverageLag"),
243 ElementsAre(Bucket(12, 1)));
244}
245
Ella Ge7d1d3be202019-04-08 16:47:59246// A simple case without scroll prediction to compare with the two with
247// prediction cases below.
248TEST_F(AverageLagTrackerTest, NoScrollPrediction) {
Daniel Libbyf7cf77382019-05-06 19:23:44249 // ScrollBegin, at t=5, finger_pos=5px.
Ella Ge7d1d3be202019-04-08 16:47:59250 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
251 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12252 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59253
254 // ScrollUpdate, at t=15, finger_pos=15px.
255 event_time = MillisecondsToTimeTicks(15);
256 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12257 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59258
259 // ScrollUpdate, at t=25, finger_pos=25px.
260 event_time = MillisecondsToTimeTicks(25);
261 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12262 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59263
264 // Another ScrollBegin to flush unfinished frames.
265 event_time = MillisecondsToTimeTicks(1000);
266 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12267 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge7d1d3be202019-04-08 16:47:59268
269 // Prediction hasn't take affect on ScrollBegin so it'll stay the same.
270 EXPECT_THAT(histogram_tester().GetAllSamples(
271 "Event.Latency.ScrollBegin.Touch.AverageLag"),
272 ElementsAre(Bucket(7, 1)));
273 // At t=10, finger_pos = 10px, rendered_pos = 5px.
274 // At t=20, finger_pos = 20px, rendered_pos = 15px.
275 // At t=30, finger_pos = 25px, rendered_pos = 25px.
276 // AverageLag = ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
277 // = 9.375
278 EXPECT_THAT(histogram_tester().GetAllSamples(
279 "Event.Latency.ScrollUpdate.Touch.AverageLag"),
280 ElementsAre(Bucket(9, 1)));
281}
282
283// Test AverageLag with perfect scroll prediction.
284TEST_F(AverageLagTrackerTest, ScrollPrediction) {
Daniel Libbyf7cf77382019-05-06 19:23:44285 // ScrollBegin, at t=5, finger_pos=5px.
Ella Ge7d1d3be202019-04-08 16:47:59286 // Predict frame_time=10, predicted_pos = 10px.
287 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
288 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12289 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */,
290 10 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59291
292 // ScrollUpdate, at t=15, finger_pos=15px.
293 // Predict frame_time=20, predicted_pos = 20px.
294 event_time = MillisecondsToTimeTicks(15);
295 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12296 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
297 10 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59298
299 // ScrollUpdate, at t=25, finger_pos=25px.
300 // Predict frame_time=30, predicted_pos = 30px.
301 event_time = MillisecondsToTimeTicks(25);
302 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12303 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
304 10 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59305
306 // Another ScrollBegin to flush unfinished frames.
307 event_time = MillisecondsToTimeTicks(1000);
308 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12309 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge7d1d3be202019-04-08 16:47:59310
311 // Prediction hasn't take affect on ScrollBegin so it'll stay the same.
312 EXPECT_THAT(histogram_tester().GetAllSamples(
313 "Event.Latency.ScrollBegin.Touch.AverageLag"),
314 ElementsAre(Bucket(7, 1)));
315 // At t=10, finger_pos = 10px, rendered_pos = 10px.
316 // At t=20, finger_pos = 20px, rendered_pos = 20px.
317 // At t=30, finger_pos = 25px, rendered_pos = 30px.
318 // AverageLag = ((0px+10px)*10ms/2 + (0px+5px)*10ms/2 + 5px*5ms)/20ms
319 // = 4.375px
Daniel Libbyf7cf77382019-05-06 19:23:44320 // AverageLag (w/o prediction)
321 // ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
322 // = 9.375px
323 // Positive effect of prediction = 5px
Ella Ge7d1d3be202019-04-08 16:47:59324 EXPECT_THAT(histogram_tester().GetAllSamples(
325 "Event.Latency.ScrollUpdate.Touch.AverageLag"),
326 ElementsAre(Bucket(4, 1)));
Daniel Libbyf7cf77382019-05-06 19:23:44327 EXPECT_THAT(
328 histogram_tester().GetAllSamples(
329 "Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionPositive"),
330 ElementsAre(Bucket(5, 1)));
331 histogram_tester().ExpectTotalCount(
332 "Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionNegative", 0);
Ella Ge7d1d3be202019-04-08 16:47:59333}
334
335// Test AverageLag with imperfect scroll prediction.
336TEST_F(AverageLagTrackerTest, ImperfectScrollPrediction) {
Daniel Libbyf7cf77382019-05-06 19:23:44337 // ScrollBegin, at t=5, finger_pos=5px.
Ella Ge7d1d3be202019-04-08 16:47:59338 // Predict frame_time=10, predicted_pos(over) = 12px.
339 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
340 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12341 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */,
342 12 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59343
344 // ScrollUpdate, at t=15, finger_pos=15px.
345 // Predict frame_time=20, predicted_pos(under) = 17px.
346 event_time = MillisecondsToTimeTicks(15);
347 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12348 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
349 5 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59350
351 // ScrollUpdate, at t=25, finger_pos=25px.
352 // Predict frame_time=30, predicted_pos(over) = 31px.
353 event_time = MillisecondsToTimeTicks(25);
354 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12355 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
356 14 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59357
358 // Another ScrollBegin to flush unfinished frames.
359 event_time = MillisecondsToTimeTicks(1000);
360 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12361 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge7d1d3be202019-04-08 16:47:59362
363 EXPECT_THAT(histogram_tester().GetAllSamples(
364 "Event.Latency.ScrollBegin.Touch.AverageLag"),
365 ElementsAre(Bucket(7, 1)));
366 // AverageLag = ((2px*2ms/2+8px*8ms/2)+ ((3px+8px)*5ms/2+8px*5ms))/20ms
367 // = 5.075px
368 EXPECT_THAT(histogram_tester().GetAllSamples(
369 "Event.Latency.ScrollUpdate.Touch.AverageLag"),
370 ElementsAre(Bucket(5, 1)));
Daniel Libbyf7cf77382019-05-06 19:23:44371 // AverageLag (w/o prediction =
372 // ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
373 // = 9.375px
374 // Positive effect of prediction = 4.3px
375 EXPECT_THAT(
376 histogram_tester().GetAllSamples(
377 "Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionPositive"),
378 ElementsAre(Bucket(4, 1)));
379 histogram_tester().ExpectTotalCount(
380 "Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionNegative", 0);
381}
382
383TEST_F(AverageLagTrackerTest, NegativePredictionEffect) {
384 // ScrollBegin, at t=5, finger_pos=5px.
385 // Predict frame_time=10, predicted_pos(over) = 20px.
386 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
387 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12388 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */,
389 20 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44390
391 // ScrollUpdate, at t=15, finger_pos=15px.
392 // Predict frame_time=20, predicted_pos(over) = 60px.
393 event_time = MillisecondsToTimeTicks(15);
394 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12395 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
396 40 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44397
398 // ScrollUpdate, at t=25, finger_pos=25px.
399 // Predict frame_time=30, predicted_pos(over) = 60px.
400 event_time = MillisecondsToTimeTicks(25);
401 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12402 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
403 0 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44404
405 // Another ScrollBegin to flush unfinished frames.
406 event_time = MillisecondsToTimeTicks(1000);
407 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12408 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Daniel Libbyf7cf77382019-05-06 19:23:44409
410 EXPECT_THAT(histogram_tester().GetAllSamples(
411 "Event.Latency.ScrollBegin.Touch.AverageLag"),
412 ElementsAre(Bucket(7, 1)));
413 // AverageLag = ((10px+0px)*10ms/2)+ ((40px+35px)*5ms/2+35px*5ms))/20ms
414 // = 20.625px
415 EXPECT_THAT(histogram_tester().GetAllSamples(
416 "Event.Latency.ScrollUpdate.Touch.AverageLag"),
417 ElementsAre(Bucket(20, 1)));
418 // AverageLag (w/o prediction =
419 // ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
420 // = 9.375px
421 // Negative effect of prediction = 11.25
422 histogram_tester().ExpectTotalCount(
423 "Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionPositive", 0);
424 EXPECT_THAT(
425 histogram_tester().GetAllSamples(
426 "Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionNegative"),
427 ElementsAre(Bucket(11, 1)));
428}
429
430TEST_F(AverageLagTrackerTest, NoPredictionEffect) {
431 // ScrollBegin, at t=5, finger_pos=5px.
432 // Predict frame_time=10, predicted_pos(over) = 25px.
433 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
434 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12435 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */,
436 25 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44437
438 // ScrollUpdate, at t=15, finger_pos=15px.
439 // Predict frame_time=20, predicted_pos(over) = 32px.
440 event_time = MillisecondsToTimeTicks(15);
441 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12442 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
443 7 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44444
445 // ScrollUpdate, at t=25, finger_pos=25px.
446 // Predict frame_time=30, predicted_pos(over) = 37px.
447 event_time = MillisecondsToTimeTicks(25);
448 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12449 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
450 5 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44451
452 // Another ScrollBegin to flush unfinished frames.
453 event_time = MillisecondsToTimeTicks(1000);
454 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12455 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Daniel Libbyf7cf77382019-05-06 19:23:44456
457 EXPECT_THAT(histogram_tester().GetAllSamples(
458 "Event.Latency.ScrollBegin.Touch.AverageLag"),
459 ElementsAre(Bucket(7, 1)));
460 // AverageLag = ((15px+5px)*10ms/2 + (12px+7px)*5ms/2 + 7px*5ms)/20ms
461 // = 9.125px
462 EXPECT_THAT(histogram_tester().GetAllSamples(
463 "Event.Latency.ScrollUpdate.Touch.AverageLag"),
464 ElementsAre(Bucket(9, 1)));
465 // AverageLag (w/o prediction) =
466 // ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
467 // = 9.375px
468 // Prediction slightly positive, we should see a 0 bucket in
469 // PredictionPositive UMA
470 EXPECT_THAT(
471 histogram_tester().GetAllSamples(
472 "Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionPositive"),
473 ElementsAre(Bucket(0, 1)));
474 histogram_tester().ExpectTotalCount(
475 "Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionNegative", 0);
Ella Ge7d1d3be202019-04-08 16:47:59476}
477
Matt Amert9da83c32019-11-06 06:04:31478// Tests that when an event arrives out-of-order, the average lag tracker
479// properly ignores it.
480TEST_F(AverageLagTrackerTest, EventOutOfOrder) {
481 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
482 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
483 float scroll_delta = 5.f;
Joao Victor Almeida917ce172020-07-07 20:56:12484 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Matt Amert9da83c32019-11-06 06:04:31485
486 event_time = MillisecondsToTimeTicks(15);
487 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12488 SyntheticTouchScrollUpdate(event_time, frame_time, scroll_delta);
Matt Amert9da83c32019-11-06 06:04:31489
490 event_time = MillisecondsToTimeTicks(25);
491 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12492 SyntheticTouchScrollUpdate(event_time, frame_time, scroll_delta);
Matt Amert9da83c32019-11-06 06:04:31493
494 // A ScrollBegin to flush unfinished frames.
495 event_time = MillisecondsToTimeTicks(1000);
496 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12497 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Matt Amert9da83c32019-11-06 06:04:31498
499 histogram_tester().ExpectTotalCount(
500 "Event.Latency.ScrollUpdate.Touch.AverageLag", 1);
501
502 // Send an event whose timestamp is earlier than the most recent event,
503 // representing an event that gets process out of order.
504 base::TimeTicks earlier_event_time = MillisecondsToTimeTicks(15);
505 frame_time = MillisecondsToTimeTicks(1010);
Joao Victor Almeida917ce172020-07-07 20:56:12506 SyntheticTouchScrollUpdate(earlier_event_time, frame_time, scroll_delta);
Matt Amert9da83c32019-11-06 06:04:31507
508 // Another ScrollBegin to flush unfinished frames.
509 event_time = MillisecondsToTimeTicks(2000);
510 frame_time = MillisecondsToTimeTicks(2000);
Joao Victor Almeida917ce172020-07-07 20:56:12511 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Matt Amert9da83c32019-11-06 06:04:31512
513 // Ensure that the event was ignored.
514 histogram_tester().ExpectTotalCount(
515 "Event.Latency.ScrollUpdate.Touch.AverageLag", 1);
516}
517
Ella Ge792e4f12019-04-05 17:32:15518} // namespace
Joao Victor Almeida917ce172020-07-07 20:56:12519} // namespace cc