[go: nahoru, domu]

blob: 9889ba185f1a4412bbf954f7db6a879bc7a6829b [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 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,
Joao Victor Almeida917ce172020-07-07 20:56:1239 AverageLagTracker::EventType::ScrollBegin);
40 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,
Joao Victor Almeida917ce172020-07-07 20:56:1250 AverageLagTracker::EventType::ScrollUpdate);
51 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
66 void CheckScrollUpdateHistograms(int bucket_value, int count) {
67 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 Almeida49b3d6902021-07-06 17:35:5570
71 EXPECT_THAT(
72 histogram_tester().GetAllSamples("Event.Latency.ScrollUpdate.Touch."
73 "AverageLagPresentation.NoPrediction"),
74 ElementsAre(Bucket(bucket_value, count)));
Joao Victor Almeida0b3c5a92020-07-07 21:04:4375 }
76
77 void CheckPredictionPositiveHistograms(int bucket_value, int count) {
Joao Victor Almeida0b3c5a92020-07-07 21:04:4378 EXPECT_THAT(histogram_tester().GetAllSamples(
79 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation."
80 "PredictionPositive"),
81 ElementsAre(Bucket(bucket_value, count)));
82 }
83
Joao Victor Almeida49b3d6902021-07-06 17:35:5584 void CheckRemainingLagPercentageHistograms(int bucket_value, int count) {
85 EXPECT_THAT(histogram_tester().GetAllSamples(
86 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation."
87 "RemainingLagPercentage"),
88 ElementsAre(Bucket(bucket_value, count)));
89 }
90
Joao Victor Almeida0b3c5a92020-07-07 21:04:4391 void CheckPredictionNegativeHistograms(int bucket_value, int count) {
Joao Victor Almeida0b3c5a92020-07-07 21:04:4392 EXPECT_THAT(histogram_tester().GetAllSamples(
93 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation."
94 "PredictionNegative"),
95 ElementsAre(Bucket(bucket_value, count)));
96 }
97
98 void CheckScrollUpdateHistogramsTotalCount(int count) {
99 histogram_tester().ExpectTotalCount(
Joao Victor Almeida0b3c5a92020-07-07 21:04:43100 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation", count);
Joao Victor Almeida49b3d6902021-07-06 17:35:55101 histogram_tester().ExpectTotalCount(
102 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation.NoPrediction",
103 count);
Joao Victor Almeida0b3c5a92020-07-07 21:04:43104 }
105
106 void CheckPredictionPositiveHistogramsTotalCount(int count) {
107 histogram_tester().ExpectTotalCount(
Joao Victor Almeida0b3c5a92020-07-07 21:04:43108 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation."
109 "PredictionPositive",
110 count);
111 }
112
113 void CheckPredictionNegativeHistogramsTotalCount(int count) {
114 histogram_tester().ExpectTotalCount(
Joao Victor Almeida0b3c5a92020-07-07 21:04:43115 "Event.Latency.ScrollUpdate.Touch.AverageLagPresentation."
116 "PredictionNegative",
117 count);
Ella Ge792e4f12019-04-05 17:32:15118 }
119
120 protected:
Joao Victor Almeidaae356d42021-07-06 16:24:34121 std::unique_ptr<AverageLagTracker> average_lag_tracker_;
Ella Ge792e4f12019-04-05 17:32:15122
123 std::unique_ptr<base::HistogramTester> histogram_tester_;
124};
125
126base::TimeTicks MillisecondsToTimeTicks(float t_ms) {
Peter Kastinge5a38ed2021-10-02 03:06:35127 return base::TimeTicks() + base::Milliseconds(t_ms);
Ella Ge792e4f12019-04-05 17:32:15128}
129
130// Simulate a simple situation that events at every 10ms and start at t=15ms,
131// frame swaps at every 10ms too and start at t=20ms and test we record one
132// UMA for ScrollUpdate in one second.
133TEST_F(AverageLagTrackerTest, OneSecondInterval) {
Peter Kastinge5a38ed2021-10-02 03:06:35134 base::TimeTicks event_time = base::TimeTicks() + base::Milliseconds(5);
135 base::TimeTicks frame_time = base::TimeTicks() + base::Milliseconds(10);
Ella Ge792e4f12019-04-05 17:32:15136 float scroll_delta = 10;
137
138 // ScrollBegin
Peter Kastinge5a38ed2021-10-02 03:06:35139 event_time += base::Milliseconds(10); // 15ms
140 frame_time += base::Milliseconds(10); // 20ms
Joao Victor Almeida917ce172020-07-07 20:56:12141 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15142
143 // Send 101 ScrollUpdate events to verify that there is 1 AverageLag record
144 // per 1 second.
145 const int kUpdates = 101;
146 for (int i = 0; i < kUpdates; i++) {
Peter Kastinge5a38ed2021-10-02 03:06:35147 event_time += base::Milliseconds(10);
148 frame_time += base::Milliseconds(10);
Ella Ge792e4f12019-04-05 17:32:15149 // First 50 has positive delta, others negetive delta.
150 const int sign = (i < kUpdates / 2) ? 1 : -1;
Joao Victor Almeida917ce172020-07-07 20:56:12151 SyntheticTouchScrollUpdate(event_time, frame_time, sign * scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15152 }
153
154 // ScrollBegin report_time is at 20ms, so the next ScrollUpdate report_time is
155 // at 1020ms. The last event_time that finish this report should be later than
156 // 1020ms.
Peter Kastinge5a38ed2021-10-02 03:06:35157 EXPECT_EQ(event_time, base::TimeTicks() + base::Milliseconds(1025));
158 EXPECT_EQ(frame_time, base::TimeTicks() + base::Milliseconds(1030));
Ella Ge792e4f12019-04-05 17:32:15159
160 // ScrollBegin AverageLag are the area between the event original component
161 // (time=15ms, delta=10px) to the frame swap time (time=20ms, expect finger
162 // position at delta=15px). The AverageLag scaled to 1 second is
163 // (0.5*(10px+15px)*5ms)/5ms = 12.5px.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43164 CheckScrollBeginHistograms(12, 1);
165
Ella Ge792e4f12019-04-05 17:32:15166 // This ScrollUpdate AverageLag are calculated as the finger uniformly scroll
167 // 10px each frame. For scroll up/down frame, the Lag at the last frame swap
168 // is 5px, and Lag at this frame swap is 15px. For the one changing direction,
169 // the Lag is from 5 to 10 and down to 5 again. So total LagArea is 99 * 100,
170 // plus 75. the AverageLag in 1 second is 9.975px.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43171 CheckScrollUpdateHistograms(9, 1);
172 CheckPredictionPositiveHistograms(0, 1);
173 CheckPredictionNegativeHistogramsTotalCount(0);
Joao Victor Almeida49b3d6902021-07-06 17:35:55174 CheckRemainingLagPercentageHistograms(100 - 0, 1);
Joao Victor Almeida0b3c5a92020-07-07 21:04:43175
Ella Ge792e4f12019-04-05 17:32:15176 ResetHistograms();
177
178 // Send another ScrollBegin to end the unfinished ScrollUpdate report.
Peter Kastinge5a38ed2021-10-02 03:06:35179 event_time += base::Milliseconds(10);
180 frame_time += base::Milliseconds(10);
Joao Victor Almeida917ce172020-07-07 20:56:12181 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15182
183 // The last ScrollUpdate's lag is 8.75px and truncated to 8.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43184 CheckScrollUpdateHistograms(8, 1);
185 CheckPredictionPositiveHistograms(0, 1);
186 CheckPredictionNegativeHistogramsTotalCount(0);
Joao Victor Almeida49b3d6902021-07-06 17:35:55187 CheckRemainingLagPercentageHistograms(100 - 0, 1);
Ella Ge792e4f12019-04-05 17:32:15188}
189
190// Test the case that event's frame swap time is later than next event's
191// creation time. (i.e, event at t=10ms will be dispatch at t=30ms, while next
192// event is at t=20ms).
193TEST_F(AverageLagTrackerTest, LargerLatency) {
194 base::TimeTicks event_time = MillisecondsToTimeTicks(10);
Peter Kastinge5a38ed2021-10-02 03:06:35195 base::TimeTicks frame_time = event_time + base::Milliseconds(20);
Ella Ge792e4f12019-04-05 17:32:15196 float scroll_delta = 10;
197
Joao Victor Almeida917ce172020-07-07 20:56:12198 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15199
200 // Send 2 ScrollUpdate. The second one will record AverageLag.ScrollBegin as
201 // it's event_time is larger or equal to ScrollBegin's frame_time.
202 for (int i = 0; i < 2; i++) {
Peter Kastinge5a38ed2021-10-02 03:06:35203 event_time += base::Milliseconds(10);
204 frame_time = event_time + base::Milliseconds(20);
Joao Victor Almeida917ce172020-07-07 20:56:12205 SyntheticTouchScrollUpdate(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15206 }
207
208 // ScrollBegin AveragLag are from t=10ms to t=30ms, with absolute scroll
209 // position from 10 to 30. The AverageLag should be:
210 // (0.5*(10px + 30px)*20ms/20ms) = 20px.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43211 CheckScrollBeginHistograms(20, 1);
Ella Ge792e4f12019-04-05 17:32:15212
213 // Another ScrollBegin to flush unfinished frames.
214 // event_time doesn't matter here because the previous frames' lag are
215 // compute from their frame_time.
216 event_time = MillisecondsToTimeTicks(1000);
217 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12218 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Ella Ge792e4f12019-04-05 17:32:15219 // The to unfinished frames' lag are (finger_positon-rendered_position)*time,
220 // AverageLag is ((30px-10px)*10ms+(30px-20px)*10ms)/20ms = 15px.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43221 CheckScrollUpdateHistograms(14, 1);
Ella Ge792e4f12019-04-05 17:32:15222}
223
224// Test that multiple latency being flush in the same frame swap.
225TEST_F(AverageLagTrackerTest, TwoLatencyInfoInSameFrame) {
226 // ScrollBegin
227 base::TimeTicks event_time = MillisecondsToTimeTicks(10);
228 base::TimeTicks frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12229 SyntheticTouchScrollBegin(event_time, frame_time, -10 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15230
231 // ScrollUpdate with event_time >= ScrollBegin frame_time will generate
232 // a histogram for AverageLag.ScrollBegin.
233 event_time = MillisecondsToTimeTicks(20);
234 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12235 SyntheticTouchScrollUpdate(event_time, frame_time, -10 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15236
237 // Absolute position from -10 to -20. The AverageLag should be:
238 // (0.5*(10px + 20px)*10ms/10ms) = 15px.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43239 CheckScrollBeginHistograms(14, 1);
Ella Ge792e4f12019-04-05 17:32:15240
241 event_time = MillisecondsToTimeTicks(25);
242 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12243 SyntheticTouchScrollUpdate(event_time, frame_time, 5 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15244
245 // Another ScrollBegin to flush unfinished frames.
246 event_time = MillisecondsToTimeTicks(1000);
247 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12248 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge792e4f12019-04-05 17:32:15249
250 // The ScrollUpdates are at t=20ms, finger_pos=-20px, rendered_pos=-10px,
251 // at t=25ms, finger_pos=-15px, rendered_pos=-10px;
252 // To t=30ms both events get flush.
253 // AverageLag is (0.5*(10px+5px)*5ms + 5px*5ms)/10ms = 6.25px
Joao Victor Almeida0b3c5a92020-07-07 21:04:43254 CheckScrollUpdateHistograms(6, 1);
Ella Ge792e4f12019-04-05 17:32:15255}
256
257// Test the case that switching direction causes lag at current frame
258// time and previous frame time are in different direction.
259TEST_F(AverageLagTrackerTest, ChangeDirectionInFrame) {
260 // ScrollBegin
261 base::TimeTicks event_time = MillisecondsToTimeTicks(10);
262 base::TimeTicks frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12263 SyntheticTouchScrollBegin(event_time, frame_time, 10 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15264
265 // At t=20, lag = 10px.
266 event_time = MillisecondsToTimeTicks(20);
267 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12268 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15269
270 // At t=30, lag = -10px.
271 event_time = MillisecondsToTimeTicks(30);
272 frame_time = MillisecondsToTimeTicks(40);
Joao Victor Almeida917ce172020-07-07 20:56:12273 SyntheticTouchScrollUpdate(event_time, frame_time, -20 /* scroll_delta */);
Ella Ge792e4f12019-04-05 17:32:15274
275 // Another ScrollBegin to flush unfinished frames.
276 event_time = MillisecondsToTimeTicks(1000);
277 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12278 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge792e4f12019-04-05 17:32:15279
280 // From t=20 to t=30, lag_area=2*(0.5*10px*5ms)=50px*ms.
281 // From t=30 to t=40, lag_area=20px*10ms=200px*ms
282 // AverageLag = (50+200)/20 = 12.5px.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43283 CheckScrollUpdateHistograms(12, 1);
Ella Ge792e4f12019-04-05 17:32:15284}
285
Ella Ge7d1d3be202019-04-08 16:47:59286// A simple case without scroll prediction to compare with the two with
287// prediction cases below.
288TEST_F(AverageLagTrackerTest, NoScrollPrediction) {
Daniel Libbyf7cf77382019-05-06 19:23:44289 // ScrollBegin, at t=5, finger_pos=5px.
Ella Ge7d1d3be202019-04-08 16:47:59290 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
291 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12292 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59293
294 // ScrollUpdate, at t=15, finger_pos=15px.
295 event_time = MillisecondsToTimeTicks(15);
296 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12297 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59298
299 // ScrollUpdate, at t=25, finger_pos=25px.
300 event_time = MillisecondsToTimeTicks(25);
301 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12302 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59303
304 // Another ScrollBegin to flush unfinished frames.
305 event_time = MillisecondsToTimeTicks(1000);
306 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12307 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge7d1d3be202019-04-08 16:47:59308
309 // Prediction hasn't take affect on ScrollBegin so it'll stay the same.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43310 CheckScrollBeginHistograms(7, 1);
Ella Ge7d1d3be202019-04-08 16:47:59311 // At t=10, finger_pos = 10px, rendered_pos = 5px.
312 // At t=20, finger_pos = 20px, rendered_pos = 15px.
313 // At t=30, finger_pos = 25px, rendered_pos = 25px.
314 // AverageLag = ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
315 // = 9.375
Joao Victor Almeida0b3c5a92020-07-07 21:04:43316 CheckScrollUpdateHistograms(9, 1);
Ella Ge7d1d3be202019-04-08 16:47:59317}
318
319// Test AverageLag with perfect scroll prediction.
320TEST_F(AverageLagTrackerTest, ScrollPrediction) {
Daniel Libbyf7cf77382019-05-06 19:23:44321 // ScrollBegin, at t=5, finger_pos=5px.
Ella Ge7d1d3be202019-04-08 16:47:59322 // Predict frame_time=10, predicted_pos = 10px.
323 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
324 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12325 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */,
326 10 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59327
328 // ScrollUpdate, at t=15, finger_pos=15px.
329 // Predict frame_time=20, predicted_pos = 20px.
330 event_time = MillisecondsToTimeTicks(15);
331 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12332 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
333 10 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59334
335 // ScrollUpdate, at t=25, finger_pos=25px.
336 // Predict frame_time=30, predicted_pos = 30px.
337 event_time = MillisecondsToTimeTicks(25);
338 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12339 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
340 10 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59341
342 // Another ScrollBegin to flush unfinished frames.
343 event_time = MillisecondsToTimeTicks(1000);
344 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12345 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge7d1d3be202019-04-08 16:47:59346
347 // Prediction hasn't take affect on ScrollBegin so it'll stay the same.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43348 CheckScrollBeginHistograms(7, 1);
Ella Ge7d1d3be202019-04-08 16:47:59349 // At t=10, finger_pos = 10px, rendered_pos = 10px.
350 // At t=20, finger_pos = 20px, rendered_pos = 20px.
351 // At t=30, finger_pos = 25px, rendered_pos = 30px.
352 // AverageLag = ((0px+10px)*10ms/2 + (0px+5px)*10ms/2 + 5px*5ms)/20ms
353 // = 4.375px
Daniel Libbyf7cf77382019-05-06 19:23:44354 // AverageLag (w/o prediction)
355 // ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
356 // = 9.375px
357 // Positive effect of prediction = 5px
Joao Victor Almeida0b3c5a92020-07-07 21:04:43358 CheckScrollUpdateHistograms(4, 1);
359 CheckPredictionPositiveHistograms(5, 1);
360 CheckPredictionNegativeHistogramsTotalCount(0);
Joao Victor Almeida49b3d6902021-07-06 17:35:55361 CheckRemainingLagPercentageHistograms(100 * 4.375 / 9.375, 1);
Ella Ge7d1d3be202019-04-08 16:47:59362}
363
364// Test AverageLag with imperfect scroll prediction.
365TEST_F(AverageLagTrackerTest, ImperfectScrollPrediction) {
Daniel Libbyf7cf77382019-05-06 19:23:44366 // ScrollBegin, at t=5, finger_pos=5px.
Ella Ge7d1d3be202019-04-08 16:47:59367 // Predict frame_time=10, predicted_pos(over) = 12px.
368 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
369 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12370 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */,
371 12 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59372
373 // ScrollUpdate, at t=15, finger_pos=15px.
374 // Predict frame_time=20, predicted_pos(under) = 17px.
375 event_time = MillisecondsToTimeTicks(15);
376 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12377 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
378 5 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59379
380 // ScrollUpdate, at t=25, finger_pos=25px.
381 // Predict frame_time=30, predicted_pos(over) = 31px.
382 event_time = MillisecondsToTimeTicks(25);
383 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12384 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
385 14 /* predicted_delta */);
Ella Ge7d1d3be202019-04-08 16:47:59386
387 // Another ScrollBegin to flush unfinished frames.
388 event_time = MillisecondsToTimeTicks(1000);
389 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12390 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Ella Ge7d1d3be202019-04-08 16:47:59391
Joao Victor Almeida0b3c5a92020-07-07 21:04:43392 CheckScrollBeginHistograms(7, 1);
Ella Ge7d1d3be202019-04-08 16:47:59393 // AverageLag = ((2px*2ms/2+8px*8ms/2)+ ((3px+8px)*5ms/2+8px*5ms))/20ms
394 // = 5.075px
Joao Victor Almeida0b3c5a92020-07-07 21:04:43395 CheckScrollUpdateHistograms(5, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44396 // AverageLag (w/o prediction =
397 // ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
398 // = 9.375px
399 // Positive effect of prediction = 4.3px
Joao Victor Almeida0b3c5a92020-07-07 21:04:43400 CheckPredictionPositiveHistograms(4, 1);
401 CheckPredictionNegativeHistogramsTotalCount(0);
Joao Victor Almeida49b3d6902021-07-06 17:35:55402 CheckRemainingLagPercentageHistograms(100 * 5.075 / 9.375, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44403}
404
405TEST_F(AverageLagTrackerTest, NegativePredictionEffect) {
406 // ScrollBegin, at t=5, finger_pos=5px.
407 // Predict frame_time=10, predicted_pos(over) = 20px.
408 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
409 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12410 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */,
411 20 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44412
413 // ScrollUpdate, at t=15, finger_pos=15px.
414 // Predict frame_time=20, predicted_pos(over) = 60px.
415 event_time = MillisecondsToTimeTicks(15);
416 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12417 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
418 40 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44419
420 // ScrollUpdate, at t=25, finger_pos=25px.
421 // Predict frame_time=30, predicted_pos(over) = 60px.
422 event_time = MillisecondsToTimeTicks(25);
423 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12424 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
425 0 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44426
427 // Another ScrollBegin to flush unfinished frames.
428 event_time = MillisecondsToTimeTicks(1000);
429 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12430 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Daniel Libbyf7cf77382019-05-06 19:23:44431
Joao Victor Almeida0b3c5a92020-07-07 21:04:43432 CheckScrollBeginHistograms(7, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44433 // AverageLag = ((10px+0px)*10ms/2)+ ((40px+35px)*5ms/2+35px*5ms))/20ms
434 // = 20.625px
Joao Victor Almeida0b3c5a92020-07-07 21:04:43435 CheckScrollUpdateHistograms(20, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44436 // AverageLag (w/o prediction =
437 // ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
438 // = 9.375px
439 // Negative effect of prediction = 11.25
Joao Victor Almeida0b3c5a92020-07-07 21:04:43440 CheckPredictionPositiveHistogramsTotalCount(0);
441 CheckPredictionNegativeHistograms(11, 1);
Joao Victor Almeida49b3d6902021-07-06 17:35:55442
443 // 100 * 20.625 / 9.375 = 220 is logged into bucket 219.
444 CheckRemainingLagPercentageHistograms(219, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44445}
446
447TEST_F(AverageLagTrackerTest, NoPredictionEffect) {
448 // ScrollBegin, at t=5, finger_pos=5px.
449 // Predict frame_time=10, predicted_pos(over) = 25px.
450 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
451 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
Joao Victor Almeida917ce172020-07-07 20:56:12452 SyntheticTouchScrollBegin(event_time, frame_time, 5 /* scroll_delta */,
453 25 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44454
455 // ScrollUpdate, at t=15, finger_pos=15px.
456 // Predict frame_time=20, predicted_pos(over) = 32px.
457 event_time = MillisecondsToTimeTicks(15);
458 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12459 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
460 7 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44461
462 // ScrollUpdate, at t=25, finger_pos=25px.
463 // Predict frame_time=30, predicted_pos(over) = 37px.
464 event_time = MillisecondsToTimeTicks(25);
465 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12466 SyntheticTouchScrollUpdate(event_time, frame_time, 10 /* scroll_delta */,
467 5 /* predicted_delta */);
Daniel Libbyf7cf77382019-05-06 19:23:44468
469 // Another ScrollBegin to flush unfinished frames.
470 event_time = MillisecondsToTimeTicks(1000);
471 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12472 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Daniel Libbyf7cf77382019-05-06 19:23:44473
Joao Victor Almeida0b3c5a92020-07-07 21:04:43474 CheckScrollBeginHistograms(7, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44475 // AverageLag = ((15px+5px)*10ms/2 + (12px+7px)*5ms/2 + 7px*5ms)/20ms
476 // = 9.125px
Joao Victor Almeida0b3c5a92020-07-07 21:04:43477 CheckScrollUpdateHistograms(9, 1);
Daniel Libbyf7cf77382019-05-06 19:23:44478 // AverageLag (w/o prediction) =
479 // ((5px+15px)*10ms/2 + (5px+10px)*5ms/2 + 10px*5ms)/20ms
480 // = 9.375px
481 // Prediction slightly positive, we should see a 0 bucket in
482 // PredictionPositive UMA
Joao Victor Almeida0b3c5a92020-07-07 21:04:43483 CheckPredictionPositiveHistograms(0, 1);
484 CheckPredictionNegativeHistogramsTotalCount(0);
Ella Ge7d1d3be202019-04-08 16:47:59485}
486
Matt Amert9da83c32019-11-06 06:04:31487// Tests that when an event arrives out-of-order, the average lag tracker
488// properly ignores it.
489TEST_F(AverageLagTrackerTest, EventOutOfOrder) {
490 base::TimeTicks event_time = MillisecondsToTimeTicks(5);
491 base::TimeTicks frame_time = MillisecondsToTimeTicks(10);
492 float scroll_delta = 5.f;
Joao Victor Almeida917ce172020-07-07 20:56:12493 SyntheticTouchScrollBegin(event_time, frame_time, scroll_delta);
Matt Amert9da83c32019-11-06 06:04:31494
495 event_time = MillisecondsToTimeTicks(15);
496 frame_time = MillisecondsToTimeTicks(20);
Joao Victor Almeida917ce172020-07-07 20:56:12497 SyntheticTouchScrollUpdate(event_time, frame_time, scroll_delta);
Matt Amert9da83c32019-11-06 06:04:31498
499 event_time = MillisecondsToTimeTicks(25);
500 frame_time = MillisecondsToTimeTicks(30);
Joao Victor Almeida917ce172020-07-07 20:56:12501 SyntheticTouchScrollUpdate(event_time, frame_time, scroll_delta);
Matt Amert9da83c32019-11-06 06:04:31502
503 // A ScrollBegin to flush unfinished frames.
504 event_time = MillisecondsToTimeTicks(1000);
505 frame_time = MillisecondsToTimeTicks(1000);
Joao Victor Almeida917ce172020-07-07 20:56:12506 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Matt Amert9da83c32019-11-06 06:04:31507
Joao Victor Almeida0b3c5a92020-07-07 21:04:43508 CheckScrollUpdateHistogramsTotalCount(1);
Matt Amert9da83c32019-11-06 06:04:31509
510 // Send an event whose timestamp is earlier than the most recent event,
511 // representing an event that gets process out of order.
512 base::TimeTicks earlier_event_time = MillisecondsToTimeTicks(15);
513 frame_time = MillisecondsToTimeTicks(1010);
Joao Victor Almeida917ce172020-07-07 20:56:12514 SyntheticTouchScrollUpdate(earlier_event_time, frame_time, scroll_delta);
Matt Amert9da83c32019-11-06 06:04:31515
516 // Another ScrollBegin to flush unfinished frames.
517 event_time = MillisecondsToTimeTicks(2000);
518 frame_time = MillisecondsToTimeTicks(2000);
Joao Victor Almeida917ce172020-07-07 20:56:12519 SyntheticTouchScrollBegin(event_time, frame_time, 0);
Matt Amert9da83c32019-11-06 06:04:31520
521 // Ensure that the event was ignored.
Joao Victor Almeida0b3c5a92020-07-07 21:04:43522 CheckScrollUpdateHistogramsTotalCount(1);
Matt Amert9da83c32019-11-06 06:04:31523}
524
Ella Ge792e4f12019-04-05 17:32:15525} // namespace
Joao Victor Almeida917ce172020-07-07 20:56:12526} // namespace cc