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

Side by Side Diff: chromecast/base/alarm_manager_unittest.cc

Issue 2695223008: [Chromecast] Add an alarm manager for firing events on wall clock time. (Closed)
Patch Set: Created 3 years, 10 months 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 2017 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
5 #include "chromecast/base/alarm_manager.h"
6
7 #include "base/memory/ptr_util.h"
8 #include "base/message_loop/message_loop.h"
9 #include "base/test/simple_test_clock.h"
10 #include "base/test/test_mock_time_task_runner.h"
11 #include "base/time/clock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace chromecast {
15 class AlarmManagerTest : public ::testing::Test {
16 protected:
17 class WallClockDependantTask : public AlarmManager::AlarmDelegate {
18 public:
19 WallClockDependantTask() : fired_(false) {}
20 void OnAlarmFire() override { fired_ = true; }
21 bool fired_;
22 };
23 void SetUp() override {
24 message_loop_.reset(new base::MessageLoop);
25 task_runner_ = new base::TestMockTimeTaskRunner;
26 message_loop_->SetTaskRunner(task_runner_);
27 }
28
29 void TearDown() override {
30 task_runner_ = nullptr;
31 message_loop_.reset();
32 }
33
34 std::unique_ptr<base::MessageLoop> message_loop_;
35 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_;
36 };
37
38 TEST_F(AlarmManagerTest, AddAlarm) {
39 WallClockDependantTask task;
40 ASSERT_FALSE(task.fired_);
41 std::unique_ptr<AlarmManager> manager = base::MakeUnique<AlarmManager>();
42 base::Time alarm_time = base::Time::Now() + base::TimeDelta::FromMinutes(10);
43 manager->AddAlarm(&task, alarm_time);
44 manager->RemoveAlarm(&task);
45 ASSERT_FALSE(task.fired_);
46 }
47
48 TEST_F(AlarmManagerTest, AlarmNotFire) {
49 WallClockDependantTask task;
50 ASSERT_FALSE(task.fired_);
51
52 // Create the AlarmManager.
53 base::Time now = base::Time::Now();
54 std::unique_ptr<base::SimpleTestClock> test_clock =
55 base::MakeUnique<base::SimpleTestClock>();
56 test_clock->SetNow(now);
57 base::SimpleTestClock* clock = test_clock.get();
58 std::unique_ptr<AlarmManager> manager =
59 base::MakeUnique<AlarmManager>(std::move(test_clock));
60
61 base::Time alarm_time = now + base::TimeDelta::FromMinutes(10);
62 manager->AddAlarm(&task, alarm_time);
63 task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(9));
64 clock->Advance(base::TimeDelta::FromMinutes(9));
65 task_runner_->RunUntilIdle();
66 ASSERT_FALSE(task.fired_);
67 }
68
69 TEST_F(AlarmManagerTest, AlarmFire) {
70 WallClockDependantTask task;
71 ASSERT_FALSE(task.fired_);
72
73 // Create the AlarmManager.
74 base::Time now = base::Time::Now();
75 std::unique_ptr<base::SimpleTestClock> test_clock =
76 base::MakeUnique<base::SimpleTestClock>();
77 test_clock->SetNow(now);
78 base::SimpleTestClock* clock = test_clock.get();
79 std::unique_ptr<AlarmManager> manager =
80 base::MakeUnique<AlarmManager>(std::move(test_clock));
81
82 // Add an alarm.
83 base::Time alarm_time = now + base::TimeDelta::FromMinutes(10);
84 manager->AddAlarm(&task, alarm_time);
85 clock->Advance(base::TimeDelta::FromMinutes(10));
86 task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(10));
87 task_runner_->RunUntilIdle();
88 ASSERT_TRUE(task.fired_);
89
90 // Fires only once.
91 task.fired_ = false;
92 clock->Advance(base::TimeDelta::FromMinutes(10));
93 task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(10));
94 task_runner_->RunUntilIdle();
95 ASSERT_FALSE(task.fired_);
96 }
97
98 TEST_F(AlarmManagerTest, AlarmPast) {
99 WallClockDependantTask task;
100 ASSERT_FALSE(task.fired_);
101
102 // Create the AlarmManager.
103 base::Time now = base::Time::Now();
104 std::unique_ptr<base::SimpleTestClock> test_clock =
105 base::MakeUnique<base::SimpleTestClock>();
106 test_clock->SetNow(now);
107 std::unique_ptr<AlarmManager> manager =
108 base::MakeUnique<AlarmManager>(std::move(test_clock));
109
110 // Add an alarm in the past. Should fire right away.
111 base::Time alarm_time = base::Time::Now() - base::TimeDelta::FromMinutes(10);
112 manager->AddAlarm(&task, alarm_time);
113 task_runner_->FastForwardBy(base::TimeDelta::FromSeconds(10));
114 task_runner_->RunUntilIdle();
115 ASSERT_TRUE(task.fired_);
116 }
117
118 TEST_F(AlarmManagerTest, AlarmTimeJump) {
119 WallClockDependantTask task;
120 ASSERT_FALSE(task.fired_);
121
122 // Create the AlarmManager.
123 base::Time now = base::Time::Now();
124 std::unique_ptr<base::SimpleTestClock> test_clock =
125 base::MakeUnique<base::SimpleTestClock>();
126 test_clock->SetNow(now);
127 base::SimpleTestClock* clock = test_clock.get();
128 std::unique_ptr<AlarmManager> manager =
129 base::MakeUnique<AlarmManager>(std::move(test_clock));
130
131 // Add an alarm. The time jumps to the future.
132 base::Time alarm_time = now + base::TimeDelta::FromMinutes(10);
133 manager->AddAlarm(&task, alarm_time);
134 clock->Advance(base::TimeDelta::FromMinutes(10));
135 task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1));
136 task_runner_->RunUntilIdle();
137 ASSERT_TRUE(task.fired_);
138 }
139
140 TEST_F(AlarmManagerTest, AlarmJumpFuture) {
141 WallClockDependantTask task;
142 ASSERT_FALSE(task.fired_);
143
144 // Create the AlarmManager.
145 base::Time now = base::Time::Now();
146 std::unique_ptr<base::SimpleTestClock> test_clock =
147 base::MakeUnique<base::SimpleTestClock>();
148 test_clock->SetNow(now);
149 base::SimpleTestClock* clock = test_clock.get();
150 std::unique_ptr<AlarmManager> manager =
151 base::MakeUnique<AlarmManager>(std::move(test_clock));
152
153 // Add an alarm. The time jumps far into the future.
154 base::Time alarm_time = now + base::TimeDelta::FromMinutes(10);
155 manager->AddAlarm(&task, alarm_time);
156 clock->Advance(base::TimeDelta::FromMinutes(60));
157 task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1));
158 task_runner_->RunUntilIdle();
159 ASSERT_TRUE(task.fired_);
160 }
161
162 TEST_F(AlarmManagerTest, AlarmMultiple) {
163 WallClockDependantTask task1;
164 WallClockDependantTask task2;
165 ASSERT_FALSE(task1.fired_);
166 ASSERT_FALSE(task2.fired_);
167
168 // Create the AlarmManager.
169 base::Time now = base::Time::Now();
170 std::unique_ptr<base::SimpleTestClock> test_clock =
171 base::MakeUnique<base::SimpleTestClock>();
172 test_clock->SetNow(now);
173 base::SimpleTestClock* clock = test_clock.get();
174 std::unique_ptr<AlarmManager> manager =
175 base::MakeUnique<AlarmManager>(std::move(test_clock));
176
177 // Add first task.
178 base::Time alarm_time = now + base::TimeDelta::FromMinutes(10);
179 manager->AddAlarm(&task1, alarm_time);
180
181 // Add second task.
182 alarm_time = now + base::TimeDelta::FromMinutes(12);
183 manager->AddAlarm(&task2, alarm_time);
184
185 // First task should fire.
186 clock->Advance(base::TimeDelta::FromMinutes(10));
187 task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1));
188 task_runner_->RunUntilIdle();
189 ASSERT_TRUE(task1.fired_);
190 ASSERT_FALSE(task2.fired_);
191
192 // Reset state;
193 task1.fired_ = false;
194 task2.fired_ = false;
195
196 // Second task should fire.
197 clock->Advance(base::TimeDelta::FromMinutes(2));
198 task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1));
199 task_runner_->RunUntilIdle();
200 ASSERT_FALSE(task1.fired_);
201 ASSERT_TRUE(task2.fired_);
202 }
203
204 TEST_F(AlarmManagerTest, AlarmMultipleReverseOrder) {
205 WallClockDependantTask task1;
206 WallClockDependantTask task2;
207 ASSERT_FALSE(task1.fired_);
208 ASSERT_FALSE(task2.fired_);
209
210 // Create the AlarmManager.
211 base::Time now = base::Time::Now();
212 std::unique_ptr<base::SimpleTestClock> test_clock =
213 base::MakeUnique<base::SimpleTestClock>();
214 test_clock->SetNow(now);
215 base::SimpleTestClock* clock = test_clock.get();
216 std::unique_ptr<AlarmManager> manager =
217 base::MakeUnique<AlarmManager>(std::move(test_clock));
218
219 // Add first task.
220 base::Time alarm_time = now + base::TimeDelta::FromMinutes(12);
221 manager->AddAlarm(&task1, alarm_time);
222
223 // Add second task.
224 alarm_time = now + base::TimeDelta::FromMinutes(10);
225 manager->AddAlarm(&task2, alarm_time);
226
227 // Second task should fire.
228 clock->Advance(base::TimeDelta::FromMinutes(10));
229 task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1));
230 task_runner_->RunUntilIdle();
231 ASSERT_FALSE(task1.fired_);
232 ASSERT_TRUE(task2.fired_);
233
234 // Reset state;
235 task1.fired_ = false;
236 task2.fired_ = false;
237
238 // First task should fire.
239 clock->Advance(base::TimeDelta::FromMinutes(2));
240 task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1));
241 task_runner_->RunUntilIdle();
242 ASSERT_TRUE(task1.fired_);
243 ASSERT_FALSE(task2.fired_);
244 }
245
246 TEST_F(AlarmManagerTest, AlarmMultipleSameTime) {
247 WallClockDependantTask task1;
248 WallClockDependantTask task2;
249 WallClockDependantTask task3;
250 ASSERT_FALSE(task1.fired_);
251 ASSERT_FALSE(task2.fired_);
252 ASSERT_FALSE(task3.fired_);
253
254 // Create the AlarmManager.
255 base::Time now = base::Time::Now();
256 std::unique_ptr<base::SimpleTestClock> test_clock =
257 base::MakeUnique<base::SimpleTestClock>();
258 test_clock->SetNow(now);
259 base::SimpleTestClock* clock = test_clock.get();
260 std::unique_ptr<AlarmManager> manager =
261 base::MakeUnique<AlarmManager>(std::move(test_clock));
262
263 // Add first task.
264 base::Time alarm_time = now + base::TimeDelta::FromMinutes(12);
265 manager->AddAlarm(&task1, alarm_time);
266
267 // Add second task.
268 alarm_time = now + base::TimeDelta::FromMinutes(16);
269 manager->AddAlarm(&task2, alarm_time);
270
271 // Add third task.
272 alarm_time = now + base::TimeDelta::FromMinutes(12);
273 manager->AddAlarm(&task3, alarm_time);
274
275 // First and third task should fire.
276 clock->Advance(base::TimeDelta::FromMinutes(12));
277 task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1));
278 task_runner_->RunUntilIdle();
279 ASSERT_TRUE(task1.fired_);
280 ASSERT_FALSE(task2.fired_);
281 ASSERT_TRUE(task3.fired_);
282 }
283
284 TEST_F(AlarmManagerTest, AlarmMultipleShuffle) {
285 WallClockDependantTask task1;
286 WallClockDependantTask task2;
287 WallClockDependantTask task3;
288 ASSERT_FALSE(task1.fired_);
289 ASSERT_FALSE(task2.fired_);
290 ASSERT_FALSE(task3.fired_);
291
292 // Create the AlarmManager.
293 base::Time now = base::Time::Now();
294 std::unique_ptr<base::SimpleTestClock> test_clock =
295 base::MakeUnique<base::SimpleTestClock>();
296 test_clock->SetNow(now);
297 base::SimpleTestClock* clock = test_clock.get();
298 std::unique_ptr<AlarmManager> manager =
299 base::MakeUnique<AlarmManager>(std::move(test_clock));
300
301 // Add first task.
302 base::Time alarm_time = now + base::TimeDelta::FromMinutes(15);
303 manager->AddAlarm(&task1, alarm_time);
304
305 // Add second task.
306 alarm_time = now + base::TimeDelta::FromMinutes(16);
307 manager->AddAlarm(&task2, alarm_time);
308
309 // Add third task.
310 alarm_time = now + base::TimeDelta::FromMinutes(11);
311 manager->AddAlarm(&task3, alarm_time);
312
313 // Third task should fire.
314 clock->Advance(base::TimeDelta::FromMinutes(12));
315 task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1));
316 task_runner_->RunUntilIdle();
317 ASSERT_FALSE(task1.fired_);
318 ASSERT_FALSE(task2.fired_);
319 ASSERT_TRUE(task3.fired_);
320
321 clock->Advance(base::TimeDelta::FromMinutes(3));
322 task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1));
323 task_runner_->RunUntilIdle();
324 ASSERT_TRUE(task1.fired_);
325 ASSERT_FALSE(task2.fired_);
326 ASSERT_TRUE(task3.fired_);
327 }
328
329 TEST_F(AlarmManagerTest, AlarmReplace) {
330 WallClockDependantTask task1;
331 WallClockDependantTask task2;
332 ASSERT_FALSE(task1.fired_);
333 ASSERT_FALSE(task2.fired_);
334
335 // Create the AlarmManager.
336 base::Time now = base::Time::Now();
337 std::unique_ptr<base::SimpleTestClock> test_clock =
338 base::MakeUnique<base::SimpleTestClock>();
339 test_clock->SetNow(now);
340 base::SimpleTestClock* clock = test_clock.get();
341 std::unique_ptr<AlarmManager> manager =
342 base::MakeUnique<AlarmManager>(std::move(test_clock));
343
344 // Add first task.
345 base::Time alarm_time = now + base::TimeDelta::FromMinutes(15);
346 manager->AddAlarm(&task1, alarm_time);
347
348 // Add it again with less time.
349 alarm_time = now + base::TimeDelta::FromMinutes(1);
350 manager->AddAlarm(&task1, alarm_time);
351
352 // Add second task.
353 alarm_time = now + base::TimeDelta::FromMinutes(16);
354 manager->AddAlarm(&task2, alarm_time);
355
356 // Third task should fire.
357 clock->Advance(base::TimeDelta::FromMinutes(1));
358 task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1));
359 task_runner_->RunUntilIdle();
360 ASSERT_TRUE(task1.fired_);
361 ASSERT_FALSE(task2.fired_);
362
363 task1.fired_ = false;
364 task2.fired_ = false;
365
366 // First task should not fire again at original time.
367 clock->Advance(base::TimeDelta::FromMinutes(14));
368 task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1));
369 task_runner_->RunUntilIdle();
370 ASSERT_FALSE(task1.fired_);
371 ASSERT_FALSE(task2.fired_);
372 }
373
374 TEST_F(AlarmManagerTest, AlarmCancel) {
375 WallClockDependantTask task1;
376 WallClockDependantTask task2;
377 WallClockDependantTask task3;
378 ASSERT_FALSE(task1.fired_);
379 ASSERT_FALSE(task2.fired_);
380 ASSERT_FALSE(task3.fired_);
381
382 // Create the AlarmManager.
383 base::Time now = base::Time::Now();
384 std::unique_ptr<base::SimpleTestClock> test_clock =
385 base::MakeUnique<base::SimpleTestClock>();
386 test_clock->SetNow(now);
387 base::SimpleTestClock* clock = test_clock.get();
388 std::unique_ptr<AlarmManager> manager =
389 base::MakeUnique<AlarmManager>(std::move(test_clock));
390
391 // Add first task.
392 base::Time alarm_time = now + base::TimeDelta::FromMinutes(12);
393 manager->AddAlarm(&task1, alarm_time);
394
395 // Add second task.
396 alarm_time = now + base::TimeDelta::FromMinutes(16);
397 manager->AddAlarm(&task2, alarm_time);
398
399 // Add third task.
400 alarm_time = now + base::TimeDelta::FromMinutes(12);
401 manager->AddAlarm(&task3, alarm_time);
402
403 // Remove the first task.
404 manager->RemoveAlarm(&task1);
405
406 // First and third task should fire.
407 clock->Advance(base::TimeDelta::FromMinutes(15));
408 task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1));
409 task_runner_->RunUntilIdle();
410 ASSERT_FALSE(task1.fired_);
411 ASSERT_FALSE(task2.fired_);
412 ASSERT_TRUE(task3.fired_);
413 }
414 }
OLDNEW
« chromecast/base/alarm_manager.h ('K') | « chromecast/base/alarm_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698