Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(149)

Side by Side Diff: chrome/browser/page_load_metrics/user_input_tracker_unittest.cc

Issue 2540183003: Add UserInputTracker, which keeps track of recent user input events. (Closed)
Patch Set: address comments Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved.
Charlie Harrison 2016/12/05 19:17:46 Copyright 2016 no (c)
Bryan McQuade 2016/12/06 01:52:25 Ah, sure. I fixed a couple other tests in the same
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/page_load_metrics/user_input_tracker.h"
6
7 #include "base/time/time.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 #include "third_party/WebKit/public/platform/WebInputEvent.h"
10
Charlie Harrison 2016/12/05 19:17:46 Shouldn't these tests be in namespace page_load_me
Bryan McQuade 2016/12/06 01:52:25 I don't think so. Most of our tests don't follow t
Charlie Harrison 2016/12/06 18:43:09 That was because originally the namespace was conf
Bryan McQuade 2016/12/06 20:10:03 Ah, ok, I went ahead and made this change. I took
11 namespace {
12
13 // UserInputTracker allows events to be at most 2 seconds old. Thus we use
14 // 2100ms to make sure the age is greater than 2 seconds.
15 const int kTooOldMilliseconds = 2100;
16
17 double ToMonotonicallyIncreasingSeconds(base::TimeTicks t) {
18 return t.ToInternalValue() /
Charlie Harrison 2016/12/05 19:17:46 Use (t - base::TimeTicks()).InSecondsF()
Bryan McQuade 2016/12/06 01:52:25 Ah, nice, much better, thanks!
19 static_cast<double>(base::Time::kMicrosecondsPerSecond);
20 }
21
22 class FakeInputEvent : public blink::WebInputEvent {
23 public:
24 FakeInputEvent() : WebInputEvent(sizeof(FakeInputEvent)) {
25 timeStampSeconds = ToMonotonicallyIncreasingSeconds(base::TimeTicks::Now());
26 type = blink::WebInputEvent::Char;
Charlie Harrison 2016/12/05 19:17:47 Should we vary on this to ensure we aren't recordi
Bryan McQuade 2016/12/06 01:52:25 Added a test.
27 }
28
29 base::TimeTicks GetTimeStamp() {
30 return page_load_metrics::UserInputTracker::GetEventTime(*this);
31 }
32
33 base::TimeTicks GetTimeStampRounded() {
34 return page_load_metrics::UserInputTracker::RoundToRateLimitedOffset(
35 GetTimeStamp());
36 }
37 };
38
39 } // namespace
40
41 class UserInputTrackerTest : public testing::Test {};
42
43 TEST_F(UserInputTrackerTest, Basic) {
44 page_load_metrics::UserInputTracker tracker;
45 EXPECT_EQ(base::TimeTicks(),
46 tracker.FindMostRecentUserInputEventBefore(base::TimeTicks()));
47 EXPECT_EQ(base::TimeTicks(),
48 tracker.FindMostRecentUserInputEventBefore(base::TimeTicks::Now()));
49 }
50
51 TEST_F(UserInputTrackerTest, SingleEvent) {
52 page_load_metrics::UserInputTracker tracker;
53 FakeInputEvent e;
54 tracker.OnInputEvent(e);
55
56 EXPECT_EQ(base::TimeTicks(), tracker.FindMostRecentUserInputEventBefore(
57 e.GetTimeStampRounded()));
58
59 base::TimeTicks after =
60 e.GetTimeStampRounded() + base::TimeDelta::FromMicroseconds(1);
61
62 EXPECT_EQ(e.GetTimeStampRounded(),
63 tracker.FindMostRecentUserInputEventBefore(after));
64
65 EXPECT_TRUE(tracker.FindAndConsumeInputEventsBefore(e.GetTimeStamp()));
66
67 EXPECT_EQ(base::TimeTicks(),
68 tracker.FindMostRecentUserInputEventBefore(after));
69 }
70
71 TEST_F(UserInputTrackerTest, MultipleEvents) {
72 FakeInputEvent e1;
73 FakeInputEvent e2;
74
75 // Make sure that the two events are monotonically increasing, and that both
76 // are in the past.
77 e1.timeStampSeconds = ToMonotonicallyIncreasingSeconds(
78 e2.GetTimeStamp() - base::TimeDelta::FromMilliseconds(100));
79
80 base::TimeTicks after =
81 e2.GetTimeStampRounded() + base::TimeDelta::FromMicroseconds(1);
82
83 {
84 page_load_metrics::UserInputTracker tracker;
85 tracker.OnInputEvent(e1);
86 tracker.OnInputEvent(e2);
87
88 EXPECT_EQ(base::TimeTicks(), tracker.FindMostRecentUserInputEventBefore(
89 e1.GetTimeStampRounded()));
90 EXPECT_EQ(
91 e1.GetTimeStampRounded(),
92 tracker.FindMostRecentUserInputEventBefore(e2.GetTimeStampRounded()));
93
94 EXPECT_EQ(e2.GetTimeStampRounded(),
95 tracker.FindMostRecentUserInputEventBefore(after));
96
97 EXPECT_TRUE(tracker.FindAndConsumeInputEventsBefore(e1.GetTimeStamp()));
Charlie Harrison 2016/12/05 19:17:46 Why is this always true? Shouldn't e1 == event_tim
Bryan McQuade 2016/12/06 01:52:25 Wow, this is just a straight up test bug, thanks f
98 EXPECT_EQ(base::TimeTicks(), tracker.FindMostRecentUserInputEventBefore(
99 e1.GetTimeStampRounded()));
100 EXPECT_EQ(base::TimeTicks(), tracker.FindMostRecentUserInputEventBefore(
101 e2.GetTimeStampRounded()));
102 EXPECT_EQ(e2.GetTimeStampRounded(),
103 tracker.FindMostRecentUserInputEventBefore(after));
104
105 EXPECT_TRUE(tracker.FindAndConsumeInputEventsBefore(e2.GetTimeStamp()));
106 EXPECT_EQ(base::TimeTicks(), tracker.FindMostRecentUserInputEventBefore(
107 e1.GetTimeStampRounded()));
108 EXPECT_EQ(base::TimeTicks(), tracker.FindMostRecentUserInputEventBefore(
109 e2.GetTimeStampRounded()));
110 EXPECT_EQ(base::TimeTicks(),
111 tracker.FindMostRecentUserInputEventBefore(after));
112 }
113
114 {
115 page_load_metrics::UserInputTracker tracker;
116 tracker.OnInputEvent(e1);
117 tracker.OnInputEvent(e2);
118 EXPECT_EQ(e2.GetTimeStampRounded(),
119 tracker.FindMostRecentUserInputEventBefore(after));
120 EXPECT_TRUE(tracker.FindAndConsumeInputEventsBefore(e2.GetTimeStamp()));
121 EXPECT_EQ(base::TimeTicks(),
122 tracker.FindMostRecentUserInputEventBefore(after));
123 }
124 }
125
126 TEST_F(UserInputTrackerTest, IgnoreEventsOlderThanConsumed) {
127 FakeInputEvent e1;
128 FakeInputEvent e2;
129
130 // Make sure that the two events are monotonically increasing, and that both
131 // are in the past.
132 e1.timeStampSeconds = ToMonotonicallyIncreasingSeconds(
133 e2.GetTimeStamp() - base::TimeDelta::FromMilliseconds(100));
134
135 base::TimeTicks after =
136 e2.GetTimeStampRounded() + base::TimeDelta::FromMicroseconds(1);
137
138 page_load_metrics::UserInputTracker tracker;
139 tracker.OnInputEvent(e2);
140
141 EXPECT_EQ(base::TimeTicks(), tracker.FindMostRecentUserInputEventBefore(
142 e1.GetTimeStampRounded()));
143 EXPECT_EQ(base::TimeTicks(), tracker.FindMostRecentUserInputEventBefore(
144 e2.GetTimeStampRounded()));
145 EXPECT_EQ(e2.GetTimeStampRounded(),
146 tracker.FindMostRecentUserInputEventBefore(after));
147
148 EXPECT_TRUE(tracker.FindAndConsumeInputEventsBefore(e2.GetTimeStamp()));
149 EXPECT_EQ(base::TimeTicks(),
150 tracker.FindMostRecentUserInputEventBefore(after));
151
152 tracker.OnInputEvent(e1);
153 EXPECT_EQ(base::TimeTicks(), tracker.FindMostRecentUserInputEventBefore(
154 e1.GetTimeStampRounded()));
155 EXPECT_EQ(base::TimeTicks(), tracker.FindMostRecentUserInputEventBefore(
156 e1.GetTimeStampRounded() +
157 base::TimeDelta::FromMicroseconds(1)));
158 }
159
160 TEST_F(UserInputTrackerTest, ExcludeOldEvents) {
161 page_load_metrics::UserInputTracker tracker;
162 FakeInputEvent e1;
163 FakeInputEvent e2;
164 // make sure e1 is too old to be considered.
165 e1.timeStampSeconds = ToMonotonicallyIncreasingSeconds(
166 e2.GetTimeStamp() -
167 base::TimeDelta::FromMilliseconds(kTooOldMilliseconds));
168
169 tracker.OnInputEvent(e1);
170 tracker.OnInputEvent(e2);
171
172 EXPECT_EQ(base::TimeTicks(), tracker.FindMostRecentUserInputEventBefore(
173 e1.GetTimeStampRounded() +
174 base::TimeDelta::FromMilliseconds(1)));
175 EXPECT_EQ(base::TimeTicks(),
176 tracker.FindMostRecentUserInputEventBefore(
177 e2.GetTimeStampRounded() +
178 base::TimeDelta::FromMilliseconds(kTooOldMilliseconds)));
179 EXPECT_EQ(
180 e2.GetTimeStampRounded(),
181 tracker.FindMostRecentUserInputEventBefore(
182 e2.GetTimeStampRounded() + base::TimeDelta::FromMilliseconds(1)));
Charlie Harrison 2016/12/05 19:17:47 Add test: EXPECT_EQ(base::TimeTicks(), tracker.Fid
Bryan McQuade 2016/12/06 01:52:25 Done
183 }
184
185 TEST_F(UserInputTrackerTest, RateLimit) {
186 const size_t kTooManyEntries =
187 page_load_metrics::UserInputTracker::kMaxEntries * 5;
188
189 page_load_metrics::UserInputTracker tracker;
190 FakeInputEvent e;
191
192 // UserInputTracker DCHECKs that event timestamps aren't after the current
193 // time, so to be safe, we use a starting timestamp that is twice
194 // kTooManyEntries milliseconds in the past, and then synthesize one event for
195 // each of kTooManyEntries after this start point. This guarantees that all
196 // events are in the past.
197 e.timeStampSeconds = ToMonotonicallyIncreasingSeconds(
198 e.GetTimeStamp() -
199 base::TimeDelta::FromMilliseconds(kTooManyEntries * 2));
200
201 // Insert more than kMaxEntries entries. The rate limiting logic should
202 // prevent more than kMaxEntries entries from actually being inserted. A
203 // DCHECK in OnInputEvent verifies that we don't exceed the expected capacity.
204 for (size_t i = 0; i < kTooManyEntries; ++i) {
205 tracker.OnInputEvent(e);
206 e.timeStampSeconds += base::TimeDelta::FromMilliseconds(1).InSecondsF();
207 }
208
209 // Do a basic sanity check to make sure we can find events in the tracker.
210 EXPECT_NE(base::TimeTicks(),
211 tracker.FindMostRecentUserInputEventBefore(base::TimeTicks::Now()));
212 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698