[go: nahoru, domu]

blob: d836f75c759a6fe4c25453a5b10975c7f8dd42bd [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 {
Joao Victor Almeida0b3c5a92020-07-07 21:04:4330 average_lag_tracker_gpu_swap_ = std::make_unique<AverageLagTracker>(
31 AverageLagTracker::FinishTimeType::GpuSwapBegin);
32 average_lag_tracker_presentation_ = std::make_unique<AverageLagTracker>(
33 AverageLagTracker::FinishTimeType::PresentationFeedback);
Ella Ge792e4f12019-04-05 17:32:1534 }
35
Joao Victor Almeida917ce172020-07-07 20:56:1236 void SyntheticTouchScrollBegin(base::TimeTicks event_time,
37 base::TimeTicks frame_time,
38 float delta,
39 float predicted_delta = 0) {
40 AverageLagTracker::EventInfo event_info(
41 0, delta, predicted_delta != 0 ? predicted_delta : delta, event_time,
42 AverageLagTracker::EventType::ScrollBegin);
43 event_info.finish_timestamp = frame_time;
Joao Victor Almeida0b3c5a92020-07-07 21:04:4344
45 // Always add the events to both and test if they have the same behavior
46 // regardless of the metrics names.
47 average_lag_tracker_gpu_swap_->AddScrollEventInFrame(event_info);
48 average_lag_tracker_presentation_->AddScrollEventInFrame(event_info);
Ella Ge792e4f12019-04-05 17:32:1549 }
50
Joao Victor Almeida917ce172020-07-07 20:56:1251 void SyntheticTouchScrollUpdate(base::TimeTicks event_time,
52 base::TimeTicks frame_time,
53 float delta,
54 float predicted_delta = 0) {
55 AverageLagTracker::EventInfo event_info(
56 0, delta, predicted_delta != 0 ? predicted_delta : delta, event_time,
57 AverageLagTracker::EventType::ScrollUpdate);
58 event_info.finish_timestamp = frame_time;
Joao Victor Almeida0b3c5a92020-07-07 21:04:4359
60 average_lag_tracker_gpu_swap_->AddScrollEventInFrame(event_info);
61 average_lag_tracker_presentation_->AddScrollEventInFrame(event_info);
62 }
63
64 void CheckScrollBeginHistograms(int bucket_value, int count) {
65 EXPECT_THAT(histogram_tester().GetAllSamples(
66 "Event.Latency.ScrollBegin.Touch.AverageLag"),
67 ElementsAre(Bucket(bucket_value, count)));
68 EXPECT_THAT(histogram_tester().GetAllSamples(
69 "Event.Latency.ScrollBegin.Touch.AverageLagPresentation"),
70 ElementsAre(Bucket(bucket_value, count)));
71 }
72
73 void CheckScrollUpdateHistograms(int bucket_value, int count) {
74 EXPECT_THAT(histogram_tester().GetAllSamples(
75 "Event.Latency.ScrollUpdate.Touch.AverageLag"),
76 ElementsAre(Bucket(bucket_value, count)));
77
78 EXPECT_THAT(histogram_tester().GetAllSamples(
79 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation"),
80 ElementsAre(Bucket(bucket_value, count)));
81 }
82
83 void CheckPredictionPositiveHistograms(int bucket_value, int count) {
84 EXPECT_THAT(
85 histogram_tester().GetAllSamples(
86 "Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionPositive"),
87 ElementsAre(Bucket(bucket_value, count)));
88
89 EXPECT_THAT(histogram_tester().GetAllSamples(
90 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation."
91 "PredictionPositive"),
92 ElementsAre(Bucket(bucket_value, count)));
93 }
94
95 void CheckPredictionNegativeHistograms(int bucket_value, int count) {
96 EXPECT_THAT(
97 histogram_tester().GetAllSamples(
98 "Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionNegative"),
99 ElementsAre(Bucket(bucket_value, count)));
100
101 EXPECT_THAT(histogram_tester().GetAllSamples(
102 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation."
103 "PredictionNegative"),
104 ElementsAre(Bucket(bucket_value, count)));
105 }
106
107 void CheckScrollUpdateHistogramsTotalCount(int count) {
108 histogram_tester().ExpectTotalCount(
109 "Event.Latency.ScrollUpdate.Touch.AverageLag", count);
110 histogram_tester().ExpectTotalCount(
111 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation", count);
112 }
113
114 void CheckPredictionPositiveHistogramsTotalCount(int count) {
115 histogram_tester().ExpectTotalCount(
116 "Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionPositive",
117 count);
118 histogram_tester().ExpectTotalCount(
119 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation."
120 "PredictionPositive",
121 count);
122 }
123
124 void CheckPredictionNegativeHistogramsTotalCount(int count) {
125 histogram_tester().ExpectTotalCount(
126 "Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionNegative",
127 count);
128 histogram_tester().ExpectTotalCount(
129 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation."
130 "PredictionNegative",
131 count);
Ella Ge792e4f12019-04-05 17:32:15132 }
133
134 protected:
Joao Victor Almeida0b3c5a92020-07-07 21:04:43135 std::unique_ptr<AverageLagTracker> average_lag_tracker_gpu_swap_;
136 std::unique_ptr<AverageLagTracker> average_lag_tracker_presentation_;
Ella Ge792e4f12019-04-05 17:32:15137
138 std::unique_ptr<base::HistogramTester> histogram_tester_;
139};
140
141base::TimeTicks MillisecondsToTimeTicks(float t_ms) {
142 return base::TimeTicks() + base::TimeDelta::FromMilliseconds(t_ms);
143}
144
145// Simulate a simple situation that events at every 10ms and start at t=15ms,
146// frame swaps at every 10ms too and start at t=20ms and test we record one
147// UMA for ScrollUpdate in one second.
148TEST_F(AverageLagTrackerTest, OneSecondInterval) {
149 base::TimeTicks event_time =
150 base::TimeTicks() + base::TimeDelta::FromMilliseconds(5);
151 base::TimeTicks frame_time =
152 base::TimeTicks() + base::TimeDelta::FromMilliseconds(10);
153 float scroll_delta = 10;
154
155 // ScrollBegin
156 event_time += base::TimeDelta::FromMilliseconds(10); // 15ms
157 frame_time += base::TimeDelta::FromMilliseconds(10); // 20ms
Joao Victor Almeida917ce172020-07-07 20:56:12158 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15159
160 // Send 101 ScrollUpdate events to verify that there is 1 AverageLag record
161 // per 1 second.
162 const int kUpdates = 101;
163 for (int i = 0; i < kUpdates; i++) {
164 event_time += base::TimeDelta::FromMilliseconds(10);
165 frame_time += base::TimeDelta::FromMilliseconds(10);
166 // First 50 has positive delta, others negetive delta.
167 const int sign = (i < kUpdates / 2) ? 1 : -1;
Joao Victor Almeida917ce172020-07-07 20:56:12168 SyntheticTouchScrollUpdate(event_time, frame_time, sign * scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15169 }
170
171 // ScrollBegin report_time is at 20ms, so the next ScrollUpdate report_time is
172 // at 1020ms. The last event_time that finish this report should be later than
173 // 1020ms.
174 EXPECT_EQ(event_time,
175 base::TimeTicks() + base::TimeDelta::FromMilliseconds(1025));
176 EXPECT_EQ(frame_time,
177 base::TimeTicks() + base::TimeDelta::FromMilliseconds(1030));
178
179 // ScrollBegin AverageLag are the area between the event original component
180 // (time=15ms, delta=10px) to the frame swap time (time=20ms, expect finger
181 // position at delta=15px). The AverageLag scaled to 1 second is
182 // (0.5*(10px+15px)*5ms)/5ms = 12.5px.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43183 CheckScrollBeginHistograms(12, 1);
184
Ella Ge792e4f12019-04-05 17:32:15185 // This ScrollUpdate AverageLag are calculated as the finger uniformly scroll
186 // 10px each frame. For scroll up/down frame, the Lag at the last frame swap
187 // is 5px, and Lag at this frame swap is 15px. For the one changing direction,
188 // the Lag is from 5 to 10 and down to 5 again. So total LagArea is 99 * 100,
189 // plus 75. the AverageLag in 1 second is 9.975px.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43190 CheckScrollUpdateHistograms(9, 1);
191 CheckPredictionPositiveHistograms(0, 1);
192 CheckPredictionNegativeHistogramsTotalCount(0);
193
Ella Ge792e4f12019-04-05 17:32:15194 ResetHistograms();
195
196 // Send another ScrollBegin to end the unfinished ScrollUpdate report.
197 event_time += base::TimeDelta::FromMilliseconds(10);
198 frame_time += base::TimeDelta::FromMilliseconds(10);
Joao Victor Almeida917ce172020-07-07 20:56:12199 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15200
201 // The last ScrollUpdate's lag is 8.75px and truncated to 8.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43202 CheckScrollUpdateHistograms(8, 1);
203 CheckPredictionPositiveHistograms(0, 1);
204 CheckPredictionNegativeHistogramsTotalCount(0);
Ella Ge792e4f12019-04-05 17:32:15205}
206
207// Test the case that event's frame swap time is later than next event's
208// creation time. (i.e, event at t=10ms will be dispatch at t=30ms, while next
209// event is at t=20ms).
210TEST_F(AverageLagTrackerTest, LargerLatency) {
211 base::TimeTicks event_time = MillisecondsToTimeTicks(10);
212 base::TimeTicks frame_time =
213 event_time + base::TimeDelta::FromMilliseconds(20);
214 float scroll_delta = 10;
215
Joao Victor Almeida917ce172020-07-07 20:56:12216 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15217
218 // Send 2 ScrollUpdate. The second one will record AverageLag.ScrollBegin as
219 // it's event_time is larger or equal to ScrollBegin's frame_time.
220 for (int i = 0; i < 2; i++) {
221 event_time += base::TimeDelta::FromMilliseconds(10);
222 frame_time = event_time + base::TimeDelta::FromMilliseconds(20);
Joao Victor Almeida917ce172020-07-07 20:56:12223 SyntheticTouchScrollUpdate(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15224 }
225
226 // ScrollBegin AveragLag are from t=10ms to t=30ms, with absolute scroll
227 // position from 10 to 30. The AverageLag should be:
228 // (0.5*(10px + 30px)*20ms/20ms) = 20px.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43229 CheckScrollBeginHistograms(20, 1);
Ella Ge792e4f12019-04-05 17:32:15230
231 // Another ScrollBegin to flush unfinished frames.
232 // event_time doesn't matter here because the previous frames' lag are
233 // compute from their frame_time.
234 event_time = MillisecondsToTimeTicks(1000);
235 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12236 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15237 // The to unfinished frames' lag are (finger_positon-rendered_position)*time,
238 // AverageLag is ((30px-10px)*10ms+(30px-20px)*10ms)/20ms = 15px.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43239 CheckScrollUpdateHistograms(14, 1);
Ella Ge792e4f12019-04-05 17:32:15240}
241
242// Test that multiple latency being flush in the same frame swap.
243TEST_F(AverageLagTrackerTest, TwoLatencyInfoInSameFrame) {
244 // ScrollBegin
245 base::TimeTicks event_time = MillisecondsToTimeTicks(10);
246 base::TimeTicks frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12247 SyntheticTouchScrollBegin(event_time, frame_time, -10 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15248
249 // ScrollUpdate with event_time >= ScrollBegin frame_time will generate
250 // a histogram for AverageLag.ScrollBegin.
251 event_time = MillisecondsToTimeTicks(20);
252 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12253 SyntheticTouchScrollUpdate(event_time, frame_time, -10 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15254
255 // Absolute position from -10 to -20. The AverageLag should be:
256 // (0.5*(10px + 20px)*10ms/10ms) = 15px.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43257 CheckScrollBeginHistograms(14, 1);
Ella Ge792e4f12019-04-05 17:32:15258
259 event_time = MillisecondsToTimeTicks(25);
260 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12261 SyntheticTouchScrollUpdate(event_time, frame_time, 5 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15262
263 // Another ScrollBegin to flush unfinished frames.
264 event_time = MillisecondsToTimeTicks(1000);
265 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12266 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge792e4f12019-04-05 17:32:15267
268 // The ScrollUpdates are at t=20ms, finger_pos=-20px, rendered_pos=-10px,
269 // at t=25ms, finger_pos=-15px, rendered_pos=-10px;
270 // To t=30ms both events get flush.
271 // AverageLag is (0.5*(10px+5px)*5ms + 5px*5ms)/10ms = 6.25px
Joao Victor Almeida0b3c5a92020-07-07 21:04:43272 CheckScrollUpdateHistograms(6, 1);
Ella Ge792e4f12019-04-05 17:32:15273}
274
275// Test the case that switching direction causes lag at current frame
276// time and previous frame time are in different direction.
277TEST_F(AverageLagTrackerTest, ChangeDirectionInFrame) {
278 // ScrollBegin
279 base::TimeTicks event_time = MillisecondsToTimeTicks(10);
280 base::TimeTicks frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12281 SyntheticTouchScrollBegin(event_time, frame_time, 10 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15282
283 // At t=20, lag = 10px.
284 event_time = MillisecondsToTimeTicks(20);
285 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12286 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15287
288 // At t=30, lag = -10px.
289 event_time = MillisecondsToTimeTicks(30);
290 frame_time = MillisecondsToTimeTicks(40);
Joao Victor Almeida917ce172020-07-07 20:56:12291 SyntheticTouchScrollUpdate(event_time, frame_time, -20 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15292
293 // Another ScrollBegin to flush unfinished frames.
294 event_time = MillisecondsToTimeTicks(1000);
295 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12296 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge792e4f12019-04-05 17:32:15297
298 // From t=20 to t=30, lag_area=2*(0.5*10px*5ms)=50px*ms.
299 // From t=30 to t=40, lag_area=20px*10ms=200px*ms
300 // AverageLag = (50+200)/20 = 12.5px.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43301 CheckScrollUpdateHistograms(12, 1);
Ella Ge792e4f12019-04-05 17:32:15302}
303
Ella Ge7d1d3be202019-04-08 16:47:59304// A simple case without scroll prediction to compare with the two with
305// prediction cases below.
306TEST_F(AverageLagTrackerTest, NoScrollPrediction) {
Daniel Libbyf7cf77382019-05-06 19:23:44307 // ScrollBegin, at t=5, finger_pos=5px.
Ella Ge7d1d3be202019-04-08 16:47:59308 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
309 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12310 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59311
312 // ScrollUpdate, at t=15, finger_pos=15px.
313 event_time = MillisecondsToTimeTicks(15);
314 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12315 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59316
317 // ScrollUpdate, at t=25, finger_pos=25px.
318 event_time = MillisecondsToTimeTicks(25);
319 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12320 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59321
322 // Another ScrollBegin to flush unfinished frames.
323 event_time = MillisecondsToTimeTicks(1000);
324 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12325 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge7d1d3be202019-04-08 16:47:59326
327 // Prediction hasn't take affect on ScrollBegin so it'll stay the same.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43328 CheckScrollBeginHistograms(7, 1);
Ella Ge7d1d3be202019-04-08 16:47:59329 // At t=10, finger_pos = 10px, rendered_pos = 5px.
330 // At t=20, finger_pos = 20px, rendered_pos = 15px.
331 // At t=30, finger_pos = 25px, rendered_pos = 25px.
332 // AverageLag = ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
333 // = 9.375
Joao Victor Almeida0b3c5a92020-07-07 21:04:43334 CheckScrollUpdateHistograms(9, 1);
Ella Ge7d1d3be202019-04-08 16:47:59335}
336
337// Test AverageLag with perfect scroll prediction.
338TEST_F(AverageLagTrackerTest, ScrollPrediction) {
Daniel Libbyf7cf77382019-05-06 19:23:44339 // ScrollBegin, at t=5, finger_pos=5px.
Ella Ge7d1d3be202019-04-08 16:47:59340 // Predict frame_time=10, predicted_pos = 10px.
341 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
342 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12343 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */,
344 10 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59345
346 // ScrollUpdate, at t=15, finger_pos=15px.
347 // Predict frame_time=20, predicted_pos = 20px.
348 event_time = MillisecondsToTimeTicks(15);
349 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12350 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
351 10 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59352
353 // ScrollUpdate, at t=25, finger_pos=25px.
354 // Predict frame_time=30, predicted_pos = 30px.
355 event_time = MillisecondsToTimeTicks(25);
356 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12357 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
358 10 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59359
360 // Another ScrollBegin to flush unfinished frames.
361 event_time = MillisecondsToTimeTicks(1000);
362 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12363 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge7d1d3be202019-04-08 16:47:59364
365 // Prediction hasn't take affect on ScrollBegin so it'll stay the same.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43366 CheckScrollBeginHistograms(7, 1);
Ella Ge7d1d3be202019-04-08 16:47:59367 // At t=10, finger_pos = 10px, rendered_pos = 10px.
368 // At t=20, finger_pos = 20px, rendered_pos = 20px.
369 // At t=30, finger_pos = 25px, rendered_pos = 30px.
370 // AverageLag = ((0px+10px)*10ms/2 + (0px+5px)*10ms/2 + 5px*5ms)/20ms
371 // = 4.375px
Daniel Libbyf7cf77382019-05-06 19:23:44372 // AverageLag (w/o prediction)
373 // ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
374 // = 9.375px
375 // Positive effect of prediction = 5px
Joao Victor Almeida0b3c5a92020-07-07 21:04:43376 CheckScrollUpdateHistograms(4, 1);
377 CheckPredictionPositiveHistograms(5, 1);
378 CheckPredictionNegativeHistogramsTotalCount(0);
Ella Ge7d1d3be202019-04-08 16:47:59379}
380
381// Test AverageLag with imperfect scroll prediction.
382TEST_F(AverageLagTrackerTest, ImperfectScrollPrediction) {
Daniel Libbyf7cf77382019-05-06 19:23:44383 // ScrollBegin, at t=5, finger_pos=5px.
Ella Ge7d1d3be202019-04-08 16:47:59384 // Predict frame_time=10, predicted_pos(over) = 12px.
385 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
386 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12387 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */,
388 12 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59389
390 // ScrollUpdate, at t=15, finger_pos=15px.
391 // Predict frame_time=20, predicted_pos(under) = 17px.
392 event_time = MillisecondsToTimeTicks(15);
393 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12394 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
395 5 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59396
397 // ScrollUpdate, at t=25, finger_pos=25px.
398 // Predict frame_time=30, predicted_pos(over) = 31px.
399 event_time = MillisecondsToTimeTicks(25);
400 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12401 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
402 14 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59403
404 // Another ScrollBegin to flush unfinished frames.
405 event_time = MillisecondsToTimeTicks(1000);
406 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12407 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge7d1d3be202019-04-08 16:47:59408
Joao Victor Almeida0b3c5a92020-07-07 21:04:43409 CheckScrollBeginHistograms(7, 1);
Ella Ge7d1d3be202019-04-08 16:47:59410 // AverageLag = ((2px*2ms/2+8px*8ms/2)+ ((3px+8px)*5ms/2+8px*5ms))/20ms
411 // = 5.075px
Joao Victor Almeida0b3c5a92020-07-07 21:04:43412 CheckScrollUpdateHistograms(5, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44413 // AverageLag (w/o prediction =
414 // ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
415 // = 9.375px
416 // Positive effect of prediction = 4.3px
Joao Victor Almeida0b3c5a92020-07-07 21:04:43417 CheckPredictionPositiveHistograms(4, 1);
418 CheckPredictionNegativeHistogramsTotalCount(0);
Daniel Libbyf7cf77382019-05-06 19:23:44419}
420
421TEST_F(AverageLagTrackerTest, NegativePredictionEffect) {
422 // ScrollBegin, at t=5, finger_pos=5px.
423 // Predict frame_time=10, predicted_pos(over) = 20px.
424 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
425 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12426 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */,
427 20 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44428
429 // ScrollUpdate, at t=15, finger_pos=15px.
430 // Predict frame_time=20, predicted_pos(over) = 60px.
431 event_time = MillisecondsToTimeTicks(15);
432 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12433 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
434 40 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44435
436 // ScrollUpdate, at t=25, finger_pos=25px.
437 // Predict frame_time=30, predicted_pos(over) = 60px.
438 event_time = MillisecondsToTimeTicks(25);
439 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12440 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
441 0 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44442
443 // Another ScrollBegin to flush unfinished frames.
444 event_time = MillisecondsToTimeTicks(1000);
445 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12446 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Daniel Libbyf7cf77382019-05-06 19:23:44447
Joao Victor Almeida0b3c5a92020-07-07 21:04:43448 CheckScrollBeginHistograms(7, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44449 // AverageLag = ((10px+0px)*10ms/2)+ ((40px+35px)*5ms/2+35px*5ms))/20ms
450 // = 20.625px
Joao Victor Almeida0b3c5a92020-07-07 21:04:43451 CheckScrollUpdateHistograms(20, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44452 // AverageLag (w/o prediction =
453 // ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
454 // = 9.375px
455 // Negative effect of prediction = 11.25
Joao Victor Almeida0b3c5a92020-07-07 21:04:43456 CheckPredictionPositiveHistogramsTotalCount(0);
457 CheckPredictionNegativeHistograms(11, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44458}
459
460TEST_F(AverageLagTrackerTest, NoPredictionEffect) {
461 // ScrollBegin, at t=5, finger_pos=5px.
462 // Predict frame_time=10, predicted_pos(over) = 25px.
463 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
464 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12465 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */,
466 25 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44467
468 // ScrollUpdate, at t=15, finger_pos=15px.
469 // Predict frame_time=20, predicted_pos(over) = 32px.
470 event_time = MillisecondsToTimeTicks(15);
471 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12472 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
473 7 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44474
475 // ScrollUpdate, at t=25, finger_pos=25px.
476 // Predict frame_time=30, predicted_pos(over) = 37px.
477 event_time = MillisecondsToTimeTicks(25);
478 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12479 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
480 5 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44481
482 // Another ScrollBegin to flush unfinished frames.
483 event_time = MillisecondsToTimeTicks(1000);
484 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12485 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Daniel Libbyf7cf77382019-05-06 19:23:44486
Joao Victor Almeida0b3c5a92020-07-07 21:04:43487 CheckScrollBeginHistograms(7, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44488 // AverageLag = ((15px+5px)*10ms/2 + (12px+7px)*5ms/2 + 7px*5ms)/20ms
489 // = 9.125px
Joao Victor Almeida0b3c5a92020-07-07 21:04:43490 CheckScrollUpdateHistograms(9, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44491 // AverageLag (w/o prediction) =
492 // ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
493 // = 9.375px
494 // Prediction slightly positive, we should see a 0 bucket in
495 // PredictionPositive UMA
Joao Victor Almeida0b3c5a92020-07-07 21:04:43496 CheckPredictionPositiveHistograms(0, 1);
497 CheckPredictionNegativeHistogramsTotalCount(0);
Ella Ge7d1d3be202019-04-08 16:47:59498}
499
Matt Amert9da83c32019-11-06 06:04:31500// Tests that when an event arrives out-of-order, the average lag tracker
501// properly ignores it.
502TEST_F(AverageLagTrackerTest, EventOutOfOrder) {
503 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
504 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
505 float scroll_delta = 5.f;
Joao Victor Almeida917ce172020-07-07 20:56:12506 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Matt Amert9da83c32019-11-06 06:04:31507
508 event_time = MillisecondsToTimeTicks(15);
509 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12510 SyntheticTouchScrollUpdate(event_time, frame_time, scroll_delta);
Matt Amert9da83c32019-11-06 06:04:31511
512 event_time = MillisecondsToTimeTicks(25);
513 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12514 SyntheticTouchScrollUpdate(event_time, frame_time, scroll_delta);
Matt Amert9da83c32019-11-06 06:04:31515
516 // A ScrollBegin to flush unfinished frames.
517 event_time = MillisecondsToTimeTicks(1000);
518 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12519 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Matt Amert9da83c32019-11-06 06:04:31520
Joao Victor Almeida0b3c5a92020-07-07 21:04:43521 CheckScrollUpdateHistogramsTotalCount(1);
Matt Amert9da83c32019-11-06 06:04:31522
523 // Send an event whose timestamp is earlier than the most recent event,
524 // representing an event that gets process out of order.
525 base::TimeTicks earlier_event_time = MillisecondsToTimeTicks(15);
526 frame_time = MillisecondsToTimeTicks(1010);
Joao Victor Almeida917ce172020-07-07 20:56:12527 SyntheticTouchScrollUpdate(earlier_event_time, frame_time, scroll_delta);
Matt Amert9da83c32019-11-06 06:04:31528
529 // Another ScrollBegin to flush unfinished frames.
530 event_time = MillisecondsToTimeTicks(2000);
531 frame_time = MillisecondsToTimeTicks(2000);
Joao Victor Almeida917ce172020-07-07 20:56:12532 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Matt Amert9da83c32019-11-06 06:04:31533
534 // Ensure that the event was ignored.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43535 CheckScrollUpdateHistogramsTotalCount(1);
Matt Amert9da83c32019-11-06 06:04:31536}
537
Ella Ge792e4f12019-04-05 17:32:15538} // namespace
Joao Victor Almeida917ce172020-07-07 20:56:12539} // namespace cc