[go: nahoru, domu]

blob: 8bb24239f8392f1eb93b32bea987a5b3b158eb47 [file] [log] [blame]
Avi Drissman3f7a9d82022-09-08 20:55:421// Copyright 2019 The Chromium Authors
Ella Ge792e4f12019-04-05 17:32:152// 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 Almeidaae356d42021-07-06 16:24:3430 average_lag_tracker_ = std::make_unique<AverageLagTracker>();
Ella Ge792e4f12019-04-05 17:32:1531 }
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(
Mohsen Izadi9f0a9f72021-09-08 22:44:3838 delta, predicted_delta != 0 ? predicted_delta : delta, event_time,
Ho Cheung06365192023-09-14 17:09:5439 AverageLagTracker::EventType::kScrollbegin);
Joao Victor Almeida917ce172020-07-07 20:56:1240 event_info.finish_timestamp = frame_time;
Joao Victor Almeidaae356d42021-07-06 16:24:3441 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(
Mohsen Izadi9f0a9f72021-09-08 22:44:3849 delta, predicted_delta != 0 ? predicted_delta : delta, event_time,
Ho Cheung06365192023-09-14 17:09:5450 AverageLagTracker::EventType::kScrollupdate);
Joao Victor Almeida917ce172020-07-07 20:56:1251 event_info.finish_timestamp = frame_time;
Joao Victor Almeidaae356d42021-07-06 16:24:3452 average_lag_tracker_->AddScrollEventInFrame(event_info);
Joao Victor Almeida0b3c5a92020-07-07 21:04:4353 }
54
55 void CheckScrollBeginHistograms(int bucket_value, int count) {
56 EXPECT_THAT(histogram_tester().GetAllSamples(
Joao Victor Almeida0b3c5a92020-07-07 21:04:4357 "Event.Latency.ScrollBegin.Touch.AverageLagPresentation"),
58 ElementsAre(Bucket(bucket_value, count)));
Joao Victor Almeida49b3d6902021-07-06 17:35:5559
60 EXPECT_THAT(
61 histogram_tester().GetAllSamples("Event.Latency.ScrollBegin.Touch."
62 "AverageLagPresentation.NoPrediction"),
63 ElementsAre(Bucket(bucket_value, count)));
Joao Victor Almeida0b3c5a92020-07-07 21:04:4364 }
65
Joao Victor Almeida06f7be72021-10-13 21:48:3466 void CheckScrollUpdateWithPredictionHistograms(int bucket_value, int count) {
Joao Victor Almeida0b3c5a92020-07-07 21:04:4367 EXPECT_THAT(histogram_tester().GetAllSamples(
Joao Victor Almeida0b3c5a92020-07-07 21:04:4368 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation"),
69 ElementsAre(Bucket(bucket_value, count)));
Joao Victor Almeida06f7be72021-10-13 21:48:3470 }
Joao Victor Almeida49b3d6902021-07-06 17:35:5571
Joao Victor Almeida06f7be72021-10-13 21:48:3472 void CheckScrollUpdateNoPredictionHistograms(int bucket_value, int count) {
Joao Victor Almeida49b3d6902021-07-06 17:35:5573 EXPECT_THAT(
74 histogram_tester().GetAllSamples("Event.Latency.ScrollUpdate.Touch."
75 "AverageLagPresentation.NoPrediction"),
76 ElementsAre(Bucket(bucket_value, count)));
Joao Victor Almeida0b3c5a92020-07-07 21:04:4377 }
78
79 void CheckPredictionPositiveHistograms(int bucket_value, int count) {
Joao Victor Almeida0b3c5a92020-07-07 21:04:4380 EXPECT_THAT(histogram_tester().GetAllSamples(
81 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation."
82 "PredictionPositive"),
83 ElementsAre(Bucket(bucket_value, count)));
84 }
85
Joao Victor Almeida49b3d6902021-07-06 17:35:5586 void CheckRemainingLagPercentageHistograms(int bucket_value, int count) {
87 EXPECT_THAT(histogram_tester().GetAllSamples(
88 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation."
89 "RemainingLagPercentage"),
90 ElementsAre(Bucket(bucket_value, count)));
91 }
92
Joao Victor Almeida0b3c5a92020-07-07 21:04:4393 void CheckPredictionNegativeHistograms(int bucket_value, int count) {
Joao Victor Almeida0b3c5a92020-07-07 21:04:4394 EXPECT_THAT(histogram_tester().GetAllSamples(
95 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation."
96 "PredictionNegative"),
97 ElementsAre(Bucket(bucket_value, count)));
98 }
99
100 void CheckScrollUpdateHistogramsTotalCount(int count) {
101 histogram_tester().ExpectTotalCount(
Joao Victor Almeida0b3c5a92020-07-07 21:04:43102 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation", count);
Joao Victor Almeida49b3d6902021-07-06 17:35:55103 histogram_tester().ExpectTotalCount(
104 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation.NoPrediction",
105 count);
Joao Victor Almeida0b3c5a92020-07-07 21:04:43106 }
107
108 void CheckPredictionPositiveHistogramsTotalCount(int count) {
109 histogram_tester().ExpectTotalCount(
Joao Victor Almeida0b3c5a92020-07-07 21:04:43110 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation."
111 "PredictionPositive",
112 count);
113 }
114
115 void CheckPredictionNegativeHistogramsTotalCount(int count) {
116 histogram_tester().ExpectTotalCount(
Joao Victor Almeida0b3c5a92020-07-07 21:04:43117 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation."
118 "PredictionNegative",
119 count);
Ella Ge792e4f12019-04-05 17:32:15120 }
121
122 protected:
Joao Victor Almeidaae356d42021-07-06 16:24:34123 std::unique_ptr<AverageLagTracker> average_lag_tracker_;
Ella Ge792e4f12019-04-05 17:32:15124
125 std::unique_ptr<base::HistogramTester> histogram_tester_;
126};
127
128base::TimeTicks MillisecondsToTimeTicks(float t_ms) {
Peter Kastinge5a38ed2021-10-02 03:06:35129 return base::TimeTicks() + base::Milliseconds(t_ms);
Ella Ge792e4f12019-04-05 17:32:15130}
131
132// Simulate a simple situation that events at every 10ms and start at t=15ms,
133// frame swaps at every 10ms too and start at t=20ms and test we record one
134// UMA for ScrollUpdate in one second.
135TEST_F(AverageLagTrackerTest, OneSecondInterval) {
Peter Kastinge5a38ed2021-10-02 03:06:35136 base::TimeTicks event_time = base::TimeTicks() + base::Milliseconds(5);
137 base::TimeTicks frame_time = base::TimeTicks() + base::Milliseconds(10);
Ella Ge792e4f12019-04-05 17:32:15138 float scroll_delta = 10;
139
140 // ScrollBegin
Peter Kastinge5a38ed2021-10-02 03:06:35141 event_time += base::Milliseconds(10); // 15ms
142 frame_time += base::Milliseconds(10); // 20ms
Joao Victor Almeida917ce172020-07-07 20:56:12143 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15144
145 // Send 101 ScrollUpdate events to verify that there is 1 AverageLag record
146 // per 1 second.
147 const int kUpdates = 101;
148 for (int i = 0; i < kUpdates; i++) {
Peter Kastinge5a38ed2021-10-02 03:06:35149 event_time += base::Milliseconds(10);
150 frame_time += base::Milliseconds(10);
Ella Ge792e4f12019-04-05 17:32:15151 // First 50 has positive delta, others negetive delta.
152 const int sign = (i < kUpdates / 2) ? 1 : -1;
Joao Victor Almeida917ce172020-07-07 20:56:12153 SyntheticTouchScrollUpdate(event_time, frame_time, sign * scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15154 }
155
156 // ScrollBegin report_time is at 20ms, so the next ScrollUpdate report_time is
157 // at 1020ms. The last event_time that finish this report should be later than
158 // 1020ms.
Peter Kastinge5a38ed2021-10-02 03:06:35159 EXPECT_EQ(event_time, base::TimeTicks() + base::Milliseconds(1025));
160 EXPECT_EQ(frame_time, base::TimeTicks() + base::Milliseconds(1030));
Ella Ge792e4f12019-04-05 17:32:15161
162 // ScrollBegin AverageLag are the area between the event original component
163 // (time=15ms, delta=10px) to the frame swap time (time=20ms, expect finger
164 // position at delta=15px). The AverageLag scaled to 1 second is
165 // (0.5*(10px+15px)*5ms)/5ms = 12.5px.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43166 CheckScrollBeginHistograms(12, 1);
167
Ella Ge792e4f12019-04-05 17:32:15168 // This ScrollUpdate AverageLag are calculated as the finger uniformly scroll
169 // 10px each frame. For scroll up/down frame, the Lag at the last frame swap
170 // is 5px, and Lag at this frame swap is 15px. For the one changing direction,
171 // the Lag is from 5 to 10 and down to 5 again. So total LagArea is 99 * 100,
172 // plus 75. the AverageLag in 1 second is 9.975px.
Joao Victor Almeida06f7be72021-10-13 21:48:34173 CheckScrollUpdateWithPredictionHistograms(9, 1);
174 CheckScrollUpdateNoPredictionHistograms(9, 1);
Joao Victor Almeida0b3c5a92020-07-07 21:04:43175 CheckPredictionPositiveHistograms(0, 1);
176 CheckPredictionNegativeHistogramsTotalCount(0);
Joao Victor Almeida49b3d6902021-07-06 17:35:55177 CheckRemainingLagPercentageHistograms(100 - 0, 1);
Joao Victor Almeida0b3c5a92020-07-07 21:04:43178
Ella Ge792e4f12019-04-05 17:32:15179 ResetHistograms();
180
181 // Send another ScrollBegin to end the unfinished ScrollUpdate report.
Peter Kastinge5a38ed2021-10-02 03:06:35182 event_time += base::Milliseconds(10);
183 frame_time += base::Milliseconds(10);
Joao Victor Almeida917ce172020-07-07 20:56:12184 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15185
186 // The last ScrollUpdate's lag is 8.75px and truncated to 8.
Joao Victor Almeida06f7be72021-10-13 21:48:34187 CheckScrollUpdateWithPredictionHistograms(8, 1);
188 CheckScrollUpdateNoPredictionHistograms(8, 1);
Joao Victor Almeida0b3c5a92020-07-07 21:04:43189 CheckPredictionPositiveHistograms(0, 1);
190 CheckPredictionNegativeHistogramsTotalCount(0);
Joao Victor Almeida49b3d6902021-07-06 17:35:55191 CheckRemainingLagPercentageHistograms(100 - 0, 1);
Ella Ge792e4f12019-04-05 17:32:15192}
193
194// Test the case that event's frame swap time is later than next event's
195// creation time. (i.e, event at t=10ms will be dispatch at t=30ms, while next
196// event is at t=20ms).
197TEST_F(AverageLagTrackerTest, LargerLatency) {
198 base::TimeTicks event_time = MillisecondsToTimeTicks(10);
Peter Kastinge5a38ed2021-10-02 03:06:35199 base::TimeTicks frame_time = event_time + base::Milliseconds(20);
Ella Ge792e4f12019-04-05 17:32:15200 float scroll_delta = 10;
201
Joao Victor Almeida917ce172020-07-07 20:56:12202 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15203
204 // Send 2 ScrollUpdate. The second one will record AverageLag.ScrollBegin as
205 // it's event_time is larger or equal to ScrollBegin's frame_time.
206 for (int i = 0; i < 2; i++) {
Peter Kastinge5a38ed2021-10-02 03:06:35207 event_time += base::Milliseconds(10);
208 frame_time = event_time + base::Milliseconds(20);
Joao Victor Almeida917ce172020-07-07 20:56:12209 SyntheticTouchScrollUpdate(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15210 }
211
212 // ScrollBegin AveragLag are from t=10ms to t=30ms, with absolute scroll
213 // position from 10 to 30. The AverageLag should be:
214 // (0.5*(10px + 30px)*20ms/20ms) = 20px.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43215 CheckScrollBeginHistograms(20, 1);
Ella Ge792e4f12019-04-05 17:32:15216
217 // Another ScrollBegin to flush unfinished frames.
218 // event_time doesn't matter here because the previous frames' lag are
219 // compute from their frame_time.
220 event_time = MillisecondsToTimeTicks(1000);
221 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12222 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15223 // The to unfinished frames' lag are (finger_positon-rendered_position)*time,
224 // AverageLag is ((30px-10px)*10ms+(30px-20px)*10ms)/20ms = 15px.
Joao Victor Almeida06f7be72021-10-13 21:48:34225 CheckScrollUpdateWithPredictionHistograms(14, 1);
226 CheckScrollUpdateNoPredictionHistograms(14, 1);
Ella Ge792e4f12019-04-05 17:32:15227}
228
229// Test that multiple latency being flush in the same frame swap.
230TEST_F(AverageLagTrackerTest, TwoLatencyInfoInSameFrame) {
231 // ScrollBegin
232 base::TimeTicks event_time = MillisecondsToTimeTicks(10);
233 base::TimeTicks frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12234 SyntheticTouchScrollBegin(event_time, frame_time, -10 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15235
236 // ScrollUpdate with event_time >= ScrollBegin frame_time will generate
237 // a histogram for AverageLag.ScrollBegin.
238 event_time = MillisecondsToTimeTicks(20);
239 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12240 SyntheticTouchScrollUpdate(event_time, frame_time, -10 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15241
242 // Absolute position from -10 to -20. The AverageLag should be:
243 // (0.5*(10px + 20px)*10ms/10ms) = 15px.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43244 CheckScrollBeginHistograms(14, 1);
Ella Ge792e4f12019-04-05 17:32:15245
246 event_time = MillisecondsToTimeTicks(25);
247 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12248 SyntheticTouchScrollUpdate(event_time, frame_time, 5 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15249
250 // Another ScrollBegin to flush unfinished frames.
251 event_time = MillisecondsToTimeTicks(1000);
252 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12253 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge792e4f12019-04-05 17:32:15254
255 // The ScrollUpdates are at t=20ms, finger_pos=-20px, rendered_pos=-10px,
256 // at t=25ms, finger_pos=-15px, rendered_pos=-10px;
257 // To t=30ms both events get flush.
258 // AverageLag is (0.5*(10px+5px)*5ms + 5px*5ms)/10ms = 6.25px
Joao Victor Almeida06f7be72021-10-13 21:48:34259 CheckScrollUpdateWithPredictionHistograms(6, 1);
260 CheckScrollUpdateNoPredictionHistograms(6, 1);
Ella Ge792e4f12019-04-05 17:32:15261}
262
263// Test the case that switching direction causes lag at current frame
264// time and previous frame time are in different direction.
265TEST_F(AverageLagTrackerTest, ChangeDirectionInFrame) {
266 // ScrollBegin
267 base::TimeTicks event_time = MillisecondsToTimeTicks(10);
268 base::TimeTicks frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12269 SyntheticTouchScrollBegin(event_time, frame_time, 10 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15270
271 // At t=20, lag = 10px.
272 event_time = MillisecondsToTimeTicks(20);
273 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12274 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15275
276 // At t=30, lag = -10px.
277 event_time = MillisecondsToTimeTicks(30);
278 frame_time = MillisecondsToTimeTicks(40);
Joao Victor Almeida917ce172020-07-07 20:56:12279 SyntheticTouchScrollUpdate(event_time, frame_time, -20 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15280
281 // Another ScrollBegin to flush unfinished frames.
282 event_time = MillisecondsToTimeTicks(1000);
283 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12284 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge792e4f12019-04-05 17:32:15285
286 // From t=20 to t=30, lag_area=2*(0.5*10px*5ms)=50px*ms.
287 // From t=30 to t=40, lag_area=20px*10ms=200px*ms
288 // AverageLag = (50+200)/20 = 12.5px.
Joao Victor Almeida06f7be72021-10-13 21:48:34289 CheckScrollUpdateWithPredictionHistograms(12, 1);
290 CheckScrollUpdateNoPredictionHistograms(12, 1);
Ella Ge792e4f12019-04-05 17:32:15291}
292
Ella Ge7d1d3be202019-04-08 16:47:59293// A simple case without scroll prediction to compare with the two with
294// prediction cases below.
295TEST_F(AverageLagTrackerTest, NoScrollPrediction) {
Daniel Libbyf7cf77382019-05-06 19:23:44296 // ScrollBegin, at t=5, finger_pos=5px.
Ella Ge7d1d3be202019-04-08 16:47:59297 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
298 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12299 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59300
301 // ScrollUpdate, at t=15, finger_pos=15px.
302 event_time = MillisecondsToTimeTicks(15);
303 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12304 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59305
306 // ScrollUpdate, at t=25, finger_pos=25px.
307 event_time = MillisecondsToTimeTicks(25);
308 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12309 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59310
311 // Another ScrollBegin to flush unfinished frames.
312 event_time = MillisecondsToTimeTicks(1000);
313 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12314 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge7d1d3be202019-04-08 16:47:59315
316 // Prediction hasn't take affect on ScrollBegin so it'll stay the same.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43317 CheckScrollBeginHistograms(7, 1);
Ella Ge7d1d3be202019-04-08 16:47:59318 // At t=10, finger_pos = 10px, rendered_pos = 5px.
319 // At t=20, finger_pos = 20px, rendered_pos = 15px.
320 // At t=30, finger_pos = 25px, rendered_pos = 25px.
321 // AverageLag = ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
322 // = 9.375
Joao Victor Almeida06f7be72021-10-13 21:48:34323 CheckScrollUpdateWithPredictionHistograms(9, 1);
324 CheckScrollUpdateNoPredictionHistograms(9, 1);
Ella Ge7d1d3be202019-04-08 16:47:59325}
326
327// Test AverageLag with perfect scroll prediction.
328TEST_F(AverageLagTrackerTest, ScrollPrediction) {
Daniel Libbyf7cf77382019-05-06 19:23:44329 // ScrollBegin, at t=5, finger_pos=5px.
Ella Ge7d1d3be202019-04-08 16:47:59330 // Predict frame_time=10, predicted_pos = 10px.
331 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
332 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12333 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */,
334 10 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59335
336 // ScrollUpdate, at t=15, finger_pos=15px.
337 // Predict frame_time=20, predicted_pos = 20px.
338 event_time = MillisecondsToTimeTicks(15);
339 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12340 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
341 10 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59342
343 // ScrollUpdate, at t=25, finger_pos=25px.
344 // Predict frame_time=30, predicted_pos = 30px.
345 event_time = MillisecondsToTimeTicks(25);
346 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12347 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
348 10 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59349
350 // Another ScrollBegin to flush unfinished frames.
351 event_time = MillisecondsToTimeTicks(1000);
352 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12353 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge7d1d3be202019-04-08 16:47:59354
355 // Prediction hasn't take affect on ScrollBegin so it'll stay the same.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43356 CheckScrollBeginHistograms(7, 1);
Ella Ge7d1d3be202019-04-08 16:47:59357 // At t=10, finger_pos = 10px, rendered_pos = 10px.
358 // At t=20, finger_pos = 20px, rendered_pos = 20px.
359 // At t=30, finger_pos = 25px, rendered_pos = 30px.
360 // AverageLag = ((0px+10px)*10ms/2 + (0px+5px)*10ms/2 + 5px*5ms)/20ms
361 // = 4.375px
Joao Victor Almeida06f7be72021-10-13 21:48:34362 CheckScrollUpdateWithPredictionHistograms(4, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44363 // AverageLag (w/o prediction)
364 // ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
365 // = 9.375px
Joao Victor Almeida06f7be72021-10-13 21:48:34366 CheckScrollUpdateNoPredictionHistograms(9, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44367 // Positive effect of prediction = 5px
Joao Victor Almeida0b3c5a92020-07-07 21:04:43368 CheckPredictionPositiveHistograms(5, 1);
369 CheckPredictionNegativeHistogramsTotalCount(0);
Joao Victor Almeida49b3d6902021-07-06 17:35:55370 CheckRemainingLagPercentageHistograms(100 * 4.375 / 9.375, 1);
Ella Ge7d1d3be202019-04-08 16:47:59371}
372
373// Test AverageLag with imperfect scroll prediction.
374TEST_F(AverageLagTrackerTest, ImperfectScrollPrediction) {
Daniel Libbyf7cf77382019-05-06 19:23:44375 // ScrollBegin, at t=5, finger_pos=5px.
Ella Ge7d1d3be202019-04-08 16:47:59376 // Predict frame_time=10, predicted_pos(over) = 12px.
377 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
378 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12379 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */,
380 12 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59381
382 // ScrollUpdate, at t=15, finger_pos=15px.
383 // Predict frame_time=20, predicted_pos(under) = 17px.
384 event_time = MillisecondsToTimeTicks(15);
385 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12386 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
387 5 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59388
389 // ScrollUpdate, at t=25, finger_pos=25px.
390 // Predict frame_time=30, predicted_pos(over) = 31px.
391 event_time = MillisecondsToTimeTicks(25);
392 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12393 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
394 14 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59395
396 // Another ScrollBegin to flush unfinished frames.
397 event_time = MillisecondsToTimeTicks(1000);
398 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12399 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge7d1d3be202019-04-08 16:47:59400
Joao Victor Almeida0b3c5a92020-07-07 21:04:43401 CheckScrollBeginHistograms(7, 1);
Ella Ge7d1d3be202019-04-08 16:47:59402 // AverageLag = ((2px*2ms/2+8px*8ms/2)+ ((3px+8px)*5ms/2+8px*5ms))/20ms
403 // = 5.075px
Joao Victor Almeida06f7be72021-10-13 21:48:34404 CheckScrollUpdateWithPredictionHistograms(5, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44405 // AverageLag (w/o prediction =
406 // ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
407 // = 9.375px
Joao Victor Almeida06f7be72021-10-13 21:48:34408 CheckScrollUpdateNoPredictionHistograms(9, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44409 // Positive effect of prediction = 4.3px
Joao Victor Almeida0b3c5a92020-07-07 21:04:43410 CheckPredictionPositiveHistograms(4, 1);
411 CheckPredictionNegativeHistogramsTotalCount(0);
Joao Victor Almeida49b3d6902021-07-06 17:35:55412 CheckRemainingLagPercentageHistograms(100 * 5.075 / 9.375, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44413}
414
415TEST_F(AverageLagTrackerTest, NegativePredictionEffect) {
416 // ScrollBegin, at t=5, finger_pos=5px.
417 // Predict frame_time=10, predicted_pos(over) = 20px.
418 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
419 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12420 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */,
421 20 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44422
423 // ScrollUpdate, at t=15, finger_pos=15px.
424 // Predict frame_time=20, predicted_pos(over) = 60px.
425 event_time = MillisecondsToTimeTicks(15);
426 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12427 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
428 40 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44429
430 // ScrollUpdate, at t=25, finger_pos=25px.
431 // Predict frame_time=30, predicted_pos(over) = 60px.
432 event_time = MillisecondsToTimeTicks(25);
433 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12434 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
435 0 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44436
437 // Another ScrollBegin to flush unfinished frames.
438 event_time = MillisecondsToTimeTicks(1000);
439 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12440 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Daniel Libbyf7cf77382019-05-06 19:23:44441
Joao Victor Almeida0b3c5a92020-07-07 21:04:43442 CheckScrollBeginHistograms(7, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44443 // AverageLag = ((10px+0px)*10ms/2)+ ((40px+35px)*5ms/2+35px*5ms))/20ms
444 // = 20.625px
Joao Victor Almeida06f7be72021-10-13 21:48:34445 CheckScrollUpdateWithPredictionHistograms(20, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44446 // AverageLag (w/o prediction =
447 // ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
448 // = 9.375px
Joao Victor Almeida06f7be72021-10-13 21:48:34449 CheckScrollUpdateNoPredictionHistograms(9, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44450 // Negative effect of prediction = 11.25
Joao Victor Almeida0b3c5a92020-07-07 21:04:43451 CheckPredictionPositiveHistogramsTotalCount(0);
452 CheckPredictionNegativeHistograms(11, 1);
Joao Victor Almeida49b3d6902021-07-06 17:35:55453
454 // 100 * 20.625 / 9.375 = 220 is logged into bucket 219.
455 CheckRemainingLagPercentageHistograms(219, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44456}
457
458TEST_F(AverageLagTrackerTest, NoPredictionEffect) {
459 // ScrollBegin, at t=5, finger_pos=5px.
460 // Predict frame_time=10, predicted_pos(over) = 25px.
461 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
462 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12463 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */,
464 25 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44465
466 // ScrollUpdate, at t=15, finger_pos=15px.
467 // Predict frame_time=20, predicted_pos(over) = 32px.
468 event_time = MillisecondsToTimeTicks(15);
469 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12470 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
471 7 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44472
473 // ScrollUpdate, at t=25, finger_pos=25px.
474 // Predict frame_time=30, predicted_pos(over) = 37px.
475 event_time = MillisecondsToTimeTicks(25);
476 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12477 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
478 5 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44479
480 // Another ScrollBegin to flush unfinished frames.
481 event_time = MillisecondsToTimeTicks(1000);
482 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12483 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Daniel Libbyf7cf77382019-05-06 19:23:44484
Joao Victor Almeida0b3c5a92020-07-07 21:04:43485 CheckScrollBeginHistograms(7, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44486 // AverageLag = ((15px+5px)*10ms/2 + (12px+7px)*5ms/2 + 7px*5ms)/20ms
487 // = 9.125px
Joao Victor Almeida06f7be72021-10-13 21:48:34488 CheckScrollUpdateWithPredictionHistograms(9, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44489 // AverageLag (w/o prediction) =
490 // ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
491 // = 9.375px
Joao Victor Almeida06f7be72021-10-13 21:48:34492 CheckScrollUpdateNoPredictionHistograms(9, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44493 // Prediction slightly positive, we should see a 0 bucket in
494 // PredictionPositive UMA
Joao Victor Almeida0b3c5a92020-07-07 21:04:43495 CheckPredictionPositiveHistograms(0, 1);
496 CheckPredictionNegativeHistogramsTotalCount(0);
Ella Ge7d1d3be202019-04-08 16:47:59497}
498
Matt Amert9da83c32019-11-06 06:04:31499// Tests that when an event arrives out-of-order, the average lag tracker
500// properly ignores it.
501TEST_F(AverageLagTrackerTest, EventOutOfOrder) {
502 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
503 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
504 float scroll_delta = 5.f;
Joao Victor Almeida917ce172020-07-07 20:56:12505 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Matt Amert9da83c32019-11-06 06:04:31506
507 event_time = MillisecondsToTimeTicks(15);
508 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12509 SyntheticTouchScrollUpdate(event_time, frame_time, scroll_delta);
Matt Amert9da83c32019-11-06 06:04:31510
511 event_time = MillisecondsToTimeTicks(25);
512 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12513 SyntheticTouchScrollUpdate(event_time, frame_time, scroll_delta);
Matt Amert9da83c32019-11-06 06:04:31514
515 // A ScrollBegin to flush unfinished frames.
516 event_time = MillisecondsToTimeTicks(1000);
517 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12518 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Matt Amert9da83c32019-11-06 06:04:31519
Joao Victor Almeida0b3c5a92020-07-07 21:04:43520 CheckScrollUpdateHistogramsTotalCount(1);
Matt Amert9da83c32019-11-06 06:04:31521
522 // Send an event whose timestamp is earlier than the most recent event,
523 // representing an event that gets process out of order.
524 base::TimeTicks earlier_event_time = MillisecondsToTimeTicks(15);
525 frame_time = MillisecondsToTimeTicks(1010);
Joao Victor Almeida917ce172020-07-07 20:56:12526 SyntheticTouchScrollUpdate(earlier_event_time, frame_time, scroll_delta);
Matt Amert9da83c32019-11-06 06:04:31527
528 // Another ScrollBegin to flush unfinished frames.
529 event_time = MillisecondsToTimeTicks(2000);
530 frame_time = MillisecondsToTimeTicks(2000);
Joao Victor Almeida917ce172020-07-07 20:56:12531 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Matt Amert9da83c32019-11-06 06:04:31532
533 // Ensure that the event was ignored.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43534 CheckScrollUpdateHistogramsTotalCount(1);
Matt Amert9da83c32019-11-06 06:04:31535}
536
Ella Ge792e4f12019-04-05 17:32:15537} // namespace
Joao Victor Almeida917ce172020-07-07 20:56:12538} // namespace cc