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

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

Powered by Google App Engine
This is Rietveld 408576698