1 // Copyright 2022 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "cc/metrics/event_metrics.h"
7 #include "base/test/simple_test_tick_clock.h"
8 #include "testing/gtest/include/gtest/gtest.h"
12 class EventMetricsTest : public testing::Test {
14 base::SimpleTestTickClock test_tick_clock_;
17 base::TimeTicks AdvanceNowByMs(int advance_ms) {
18 test_tick_clock_.Advance(base::Microseconds(advance_ms));
19 return test_tick_clock_.NowTicks();
23 TEST_F(EventMetricsTest, ScrollBeginCreateWithNullBeginRwhTime) {
25 base::TimeTicks event_time = base::TimeTicks::Now() - base::Microseconds(100);
26 base::TimeTicks arrived_in_browser_main_timestamp;
27 base::TimeTicks now = base::TimeTicks::Now();
30 std::unique_ptr<ScrollEventMetrics> scroll_event_metric =
31 ScrollEventMetrics::Create(
32 ui::ET_GESTURE_SCROLL_BEGIN, ui::ScrollInputType::kTouchscreen,
33 /*is_inertial=*/false, event_time, arrived_in_browser_main_timestamp);
36 EXPECT_EQ(event_time, scroll_event_metric->GetDispatchStageTimestamp(
37 EventMetrics::DispatchStage::kGenerated));
39 scroll_event_metric->GetDispatchStageTimestamp(
40 EventMetrics::DispatchStage::kArrivedInRendererCompositor));
42 EXPECT_TRUE(scroll_event_metric
43 ->GetDispatchStageTimestamp(
44 EventMetrics::DispatchStage::kArrivedInBrowserMain)
46 EXPECT_TRUE(scroll_event_metric
47 ->GetDispatchStageTimestamp(
48 EventMetrics::DispatchStage::kRendererCompositorStarted)
50 EXPECT_TRUE(scroll_event_metric
51 ->GetDispatchStageTimestamp(
52 EventMetrics::DispatchStage::kRendererCompositorFinished)
54 EXPECT_TRUE(scroll_event_metric
55 ->GetDispatchStageTimestamp(
56 EventMetrics::DispatchStage::kRendererMainStarted)
58 EXPECT_TRUE(scroll_event_metric
59 ->GetDispatchStageTimestamp(
60 EventMetrics::DispatchStage::kRendererMainFinished)
64 TEST_F(EventMetricsTest, ScrollBeginCreate) {
66 base::TimeTicks event_time = base::TimeTicks::Now() - base::Microseconds(100);
67 base::TimeTicks arrived_in_browser_main_timestamp =
68 base::TimeTicks::Now() - base::Microseconds(50);
69 base::TimeTicks now = base::TimeTicks::Now();
72 std::unique_ptr<ScrollEventMetrics> scroll_event_metric =
73 ScrollEventMetrics::Create(
74 ui::ET_GESTURE_SCROLL_BEGIN, ui::ScrollInputType::kTouchscreen,
75 /*is_inertial=*/false, event_time, arrived_in_browser_main_timestamp);
78 EXPECT_EQ(event_time, scroll_event_metric->GetDispatchStageTimestamp(
79 EventMetrics::DispatchStage::kGenerated));
80 EXPECT_EQ(arrived_in_browser_main_timestamp,
81 scroll_event_metric->GetDispatchStageTimestamp(
82 EventMetrics::DispatchStage::kArrivedInBrowserMain));
84 scroll_event_metric->GetDispatchStageTimestamp(
85 EventMetrics::DispatchStage::kArrivedInRendererCompositor));
87 EXPECT_TRUE(scroll_event_metric
88 ->GetDispatchStageTimestamp(
89 EventMetrics::DispatchStage::kRendererCompositorStarted)
91 EXPECT_TRUE(scroll_event_metric
92 ->GetDispatchStageTimestamp(
93 EventMetrics::DispatchStage::kRendererCompositorFinished)
95 EXPECT_TRUE(scroll_event_metric
96 ->GetDispatchStageTimestamp(
97 EventMetrics::DispatchStage::kRendererMainStarted)
99 EXPECT_TRUE(scroll_event_metric
100 ->GetDispatchStageTimestamp(
101 EventMetrics::DispatchStage::kRendererMainFinished)
105 TEST_F(EventMetricsTest, ScrollBeginCreateFromExisting) {
107 base::TimeTicks event_time = base::TimeTicks::Now() - base::Microseconds(100);
108 base::TimeTicks arrived_in_browser_main_timestamp =
109 base::TimeTicks::Now() - base::Microseconds(50);
110 std::unique_ptr<ScrollEventMetrics> scroll_metric =
111 ScrollEventMetrics::Create(
112 ui::ET_GESTURE_SCROLL_BEGIN, ui::ScrollInputType::kTouchscreen,
113 /*is_inertial=*/false, event_time, arrived_in_browser_main_timestamp);
116 std::unique_ptr<ScrollEventMetrics> copy_scroll_metric =
117 ScrollEventMetrics::CreateFromExisting(
118 ui::ET_GESTURE_SCROLL_BEGIN, ui::ScrollInputType::kTouchscreen,
119 /*is_inertial=*/false,
120 EventMetrics::DispatchStage::kRendererMainFinished,
121 scroll_metric.get());
124 EXPECT_EQ(scroll_metric->GetDispatchStageTimestamp(
125 EventMetrics::DispatchStage::kGenerated),
126 copy_scroll_metric->GetDispatchStageTimestamp(
127 EventMetrics::DispatchStage::kGenerated));
128 EXPECT_EQ(scroll_metric->GetDispatchStageTimestamp(
129 EventMetrics::DispatchStage::kArrivedInBrowserMain),
130 copy_scroll_metric->GetDispatchStageTimestamp(
131 EventMetrics::DispatchStage::kArrivedInBrowserMain));
133 EXPECT_EQ(scroll_metric->GetDispatchStageTimestamp(
134 EventMetrics::DispatchStage::kArrivedInRendererCompositor),
135 copy_scroll_metric->GetDispatchStageTimestamp(
136 EventMetrics::DispatchStage::kArrivedInRendererCompositor));
138 EXPECT_EQ(scroll_metric->GetDispatchStageTimestamp(
139 EventMetrics::DispatchStage::kRendererCompositorStarted),
140 copy_scroll_metric->GetDispatchStageTimestamp(
141 EventMetrics::DispatchStage::kRendererCompositorStarted));
143 EXPECT_EQ(scroll_metric->GetDispatchStageTimestamp(
144 EventMetrics::DispatchStage::kRendererCompositorFinished),
145 copy_scroll_metric->GetDispatchStageTimestamp(
146 EventMetrics::DispatchStage::kRendererCompositorFinished));
148 EXPECT_EQ(scroll_metric->GetDispatchStageTimestamp(
149 EventMetrics::DispatchStage::kRendererMainStarted),
150 copy_scroll_metric->GetDispatchStageTimestamp(
151 EventMetrics::DispatchStage::kRendererMainStarted));
153 EXPECT_EQ(scroll_metric->GetDispatchStageTimestamp(
154 EventMetrics::DispatchStage::kRendererMainFinished),
155 copy_scroll_metric->GetDispatchStageTimestamp(
156 EventMetrics::DispatchStage::kRendererMainFinished));
159 TEST_F(EventMetricsTest, ScrollUpdateCreateWithNullBeginRwhTime) {
161 base::TimeTicks event_time = base::TimeTicks::Now() - base::Microseconds(100);
162 base::TimeTicks arrived_in_browser_main_timestamp;
163 base::TimeTicks now = base::TimeTicks::Now();
166 std::unique_ptr<ScrollUpdateEventMetrics> scroll_event_metric =
167 ScrollUpdateEventMetrics::Create(
168 ui::ET_GESTURE_SCROLL_UPDATE, ui::ScrollInputType::kTouchscreen,
169 /*is_inertial=*/false,
170 ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, /*delta=*/0.4,
171 event_time, arrived_in_browser_main_timestamp);
174 EXPECT_EQ(event_time, scroll_event_metric->GetDispatchStageTimestamp(
175 EventMetrics::DispatchStage::kGenerated));
177 scroll_event_metric->GetDispatchStageTimestamp(
178 EventMetrics::DispatchStage::kArrivedInRendererCompositor));
180 EXPECT_TRUE(scroll_event_metric
181 ->GetDispatchStageTimestamp(
182 EventMetrics::DispatchStage::kArrivedInBrowserMain)
184 EXPECT_TRUE(scroll_event_metric
185 ->GetDispatchStageTimestamp(
186 EventMetrics::DispatchStage::kRendererCompositorStarted)
188 EXPECT_TRUE(scroll_event_metric
189 ->GetDispatchStageTimestamp(
190 EventMetrics::DispatchStage::kRendererCompositorFinished)
192 EXPECT_TRUE(scroll_event_metric
193 ->GetDispatchStageTimestamp(
194 EventMetrics::DispatchStage::kRendererMainStarted)
196 EXPECT_TRUE(scroll_event_metric
197 ->GetDispatchStageTimestamp(
198 EventMetrics::DispatchStage::kRendererMainFinished)
202 TEST_F(EventMetricsTest, ScrollUpdateCreate) {
204 base::TimeTicks event_time = base::TimeTicks::Now() - base::Microseconds(100);
205 base::TimeTicks arrived_in_browser_main_timestamp =
206 base::TimeTicks::Now() - base::Microseconds(50);
207 base::TimeTicks now = base::TimeTicks::Now();
210 std::unique_ptr<ScrollUpdateEventMetrics> scroll_event_metric =
211 ScrollUpdateEventMetrics::Create(
212 ui::ET_GESTURE_SCROLL_UPDATE, ui::ScrollInputType::kTouchscreen,
213 /*is_inertial=*/false,
214 ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, /*delta=*/0.4,
215 event_time, arrived_in_browser_main_timestamp);
218 EXPECT_EQ(event_time, scroll_event_metric->GetDispatchStageTimestamp(
219 EventMetrics::DispatchStage::kGenerated));
220 EXPECT_EQ(arrived_in_browser_main_timestamp,
221 scroll_event_metric->GetDispatchStageTimestamp(
222 EventMetrics::DispatchStage::kArrivedInBrowserMain));
224 scroll_event_metric->GetDispatchStageTimestamp(
225 EventMetrics::DispatchStage::kArrivedInRendererCompositor));
227 EXPECT_TRUE(scroll_event_metric
228 ->GetDispatchStageTimestamp(
229 EventMetrics::DispatchStage::kRendererCompositorStarted)
231 EXPECT_TRUE(scroll_event_metric
232 ->GetDispatchStageTimestamp(
233 EventMetrics::DispatchStage::kRendererCompositorFinished)
235 EXPECT_TRUE(scroll_event_metric
236 ->GetDispatchStageTimestamp(
237 EventMetrics::DispatchStage::kRendererMainStarted)
239 EXPECT_TRUE(scroll_event_metric
240 ->GetDispatchStageTimestamp(
241 EventMetrics::DispatchStage::kRendererMainFinished)
245 TEST_F(EventMetricsTest, ScrollUpdateCreateFromExisting) {
247 base::TimeTicks event_time = base::TimeTicks::Now() - base::Microseconds(100);
248 base::TimeTicks arrived_in_browser_main_timestamp =
249 base::TimeTicks::Now() - base::Microseconds(50);
250 std::unique_ptr<ScrollUpdateEventMetrics> scroll_metric =
251 ScrollUpdateEventMetrics::Create(
252 ui::ET_GESTURE_SCROLL_UPDATE, ui::ScrollInputType::kTouchscreen,
253 /*is_inertial=*/false,
254 ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, /*delta=*/0.4,
255 event_time, arrived_in_browser_main_timestamp);
258 std::unique_ptr<ScrollUpdateEventMetrics> copy_scroll_metric =
259 ScrollUpdateEventMetrics::CreateFromExisting(
260 ui::ET_GESTURE_SCROLL_UPDATE, ui::ScrollInputType::kTouchscreen,
261 /*is_inertial=*/false,
262 ScrollUpdateEventMetrics::ScrollUpdateType::kContinued, /*delta=*/0.4,
263 EventMetrics::DispatchStage::kRendererMainFinished,
264 scroll_metric.get());
267 EXPECT_EQ(scroll_metric->GetDispatchStageTimestamp(
268 EventMetrics::DispatchStage::kGenerated),
269 copy_scroll_metric->GetDispatchStageTimestamp(
270 EventMetrics::DispatchStage::kGenerated));
271 EXPECT_EQ(scroll_metric->GetDispatchStageTimestamp(
272 EventMetrics::DispatchStage::kArrivedInBrowserMain),
273 copy_scroll_metric->GetDispatchStageTimestamp(
274 EventMetrics::DispatchStage::kArrivedInBrowserMain));
276 EXPECT_EQ(scroll_metric->GetDispatchStageTimestamp(
277 EventMetrics::DispatchStage::kArrivedInRendererCompositor),
278 copy_scroll_metric->GetDispatchStageTimestamp(
279 EventMetrics::DispatchStage::kArrivedInRendererCompositor));
281 EXPECT_EQ(scroll_metric->GetDispatchStageTimestamp(
282 EventMetrics::DispatchStage::kRendererCompositorStarted),
283 copy_scroll_metric->GetDispatchStageTimestamp(
284 EventMetrics::DispatchStage::kRendererCompositorStarted));
286 EXPECT_EQ(scroll_metric->GetDispatchStageTimestamp(
287 EventMetrics::DispatchStage::kRendererCompositorFinished),
288 copy_scroll_metric->GetDispatchStageTimestamp(
289 EventMetrics::DispatchStage::kRendererCompositorFinished));
291 EXPECT_EQ(scroll_metric->GetDispatchStageTimestamp(
292 EventMetrics::DispatchStage::kRendererMainStarted),
293 copy_scroll_metric->GetDispatchStageTimestamp(
294 EventMetrics::DispatchStage::kRendererMainStarted));
296 EXPECT_EQ(scroll_metric->GetDispatchStageTimestamp(
297 EventMetrics::DispatchStage::kRendererMainFinished),
298 copy_scroll_metric->GetDispatchStageTimestamp(
299 EventMetrics::DispatchStage::kRendererMainFinished));