OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 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 "base/task_scheduler/delayed_task_manager.h" | |
6 | |
7 #include <memory> | |
8 #include <utility> | |
9 | |
10 #include "base/bind.h" | |
11 #include "base/bind_helpers.h" | |
12 #include "base/task_scheduler/scheduler_lock.h" | |
13 #include "base/task_scheduler/task.h" | |
14 #include "base/time/time.h" | |
15 #include "testing/gmock/include/gmock/gmock.h" | |
16 #include "testing/gtest/include/gtest/gtest.h" | |
17 | |
18 namespace base { | |
19 namespace internal { | |
20 namespace { | |
21 | |
22 class TestDelayedTaskManager : public DelayedTaskManager { | |
23 public: | |
24 TestDelayedTaskManager() | |
25 : DelayedTaskManager( | |
26 Bind(&TestDelayedTaskManager::OnDelayedTaskReadyTimeChanged, | |
27 Unretained(this))) {} | |
28 | |
29 void SetTime(TimeTicks now) { now_ = now; } | |
robliao
2016/04/01 20:48:25
Maybe SetCurrentTime?
fdoray
2016/04/01 21:21:58
Done.
| |
30 TimeTicks Now() override { return now_; } | |
31 | |
32 MOCK_METHOD0(OnDelayedTaskReadyTimeChanged, void()); | |
33 | |
34 DelayedTaskManager::PostTaskCallback GetPostTaskCallback() { | |
35 return Bind(&TestDelayedTaskManager::PostTaskCallback, Unretained(this)); | |
36 } | |
37 | |
38 void PostTaskCallback(std::unique_ptr<Task> task) { | |
39 PostTaskCallbackMock(task.get()); | |
40 | |
41 // Acquire a SchedulerLock with no predecessor to verify that no lock | |
42 // dependency is imposed on this callback. | |
43 SchedulerLock lock; | |
44 AutoSchedulerLock auto_lock(lock); | |
45 } | |
46 MOCK_METHOD1(PostTaskCallbackMock, void(const Task*)); | |
47 | |
48 private: | |
49 TimeTicks now_; | |
50 }; | |
51 | |
52 // Verify that GetNextDelayedRunTime() returns a null TimeTicks when there are | |
53 // no pending delayed tasks. | |
54 TEST(TaskSchedulerDelayedTaskManagerTest, | |
55 GetNextDelayedRunTimeNoPendingDelayedTasks) { | |
56 TestDelayedTaskManager manager; | |
57 EXPECT_EQ(TimeTicks(), manager.GetNextDelayedRunTime()); | |
58 } | |
59 | |
60 // Verify that a delayed task's callback is invoked when PostReadyTasks() is | |
61 // called with the current time equal to the task's delayed run time. | |
62 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostTask) { | |
63 testing::StrictMock<TestDelayedTaskManager> manager; | |
64 | |
65 std::unique_ptr<Task> task( | |
66 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits())); | |
67 task->delayed_run_time = TimeTicks() + TimeDelta::FromSeconds(1); | |
68 const Task* task_raw = task.get(); | |
69 | |
70 EXPECT_CALL(manager, OnDelayedTaskReadyTimeChanged()); | |
71 manager.AddDelayedTask(std::move(task), manager.GetPostTaskCallback()); | |
72 testing::Mock::VerifyAndClear(&manager); | |
73 EXPECT_EQ(task_raw->delayed_run_time, manager.GetNextDelayedRunTime()); | |
74 | |
75 manager.SetTime(task_raw->delayed_run_time); | |
76 | |
77 EXPECT_CALL(manager, PostTaskCallbackMock(task_raw)); | |
78 manager.PostReadyTasks(); | |
79 testing::Mock::VerifyAndClear(&manager); | |
80 EXPECT_EQ(TimeTicks(), manager.GetNextDelayedRunTime()); | |
81 } | |
82 | |
83 // Verify that a delayed task's callback is invoked when PostReadyTasks() is | |
84 // called with the current time greater than the task's delayed run time. | |
85 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostTaskLate) { | |
86 testing::StrictMock<TestDelayedTaskManager> manager; | |
87 | |
88 std::unique_ptr<Task> task( | |
89 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits())); | |
90 task->delayed_run_time = TimeTicks() + TimeDelta::FromSeconds(1); | |
91 const Task* task_raw = task.get(); | |
92 | |
93 EXPECT_CALL(manager, OnDelayedTaskReadyTimeChanged()); | |
94 manager.AddDelayedTask(std::move(task), manager.GetPostTaskCallback()); | |
95 testing::Mock::VerifyAndClear(&manager); | |
96 EXPECT_EQ(task_raw->delayed_run_time, manager.GetNextDelayedRunTime()); | |
97 | |
98 manager.SetTime(task_raw->delayed_run_time + TimeDelta::FromSeconds(10)); | |
99 | |
100 EXPECT_CALL(manager, PostTaskCallbackMock(task_raw)); | |
101 manager.PostReadyTasks(); | |
102 testing::Mock::VerifyAndClear(&manager); | |
103 EXPECT_EQ(TimeTicks(), manager.GetNextDelayedRunTime()); | |
104 } | |
105 | |
106 // Verify that when multiple tasks are added to a DelayedTaskManager, their | |
107 // respective callback is invoked when they become ripe for execution. | |
108 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostTasks) { | |
109 testing::StrictMock<TestDelayedTaskManager> manager; | |
110 | |
111 std::unique_ptr<Task> task_a( | |
112 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits())); | |
113 task_a->delayed_run_time = TimeTicks() + TimeDelta::FromSeconds(2); | |
114 const Task* task_a_raw = task_a.get(); | |
115 | |
116 std::unique_ptr<Task> task_b( | |
117 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits())); | |
118 task_b->delayed_run_time = TimeTicks() + TimeDelta::FromSeconds(2); | |
119 const Task* task_b_raw = task_b.get(); | |
120 | |
121 std::unique_ptr<Task> task_c( | |
122 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits())); | |
123 task_c->delayed_run_time = TimeTicks() + TimeDelta::FromSeconds(1); | |
124 const Task* task_c_raw = task_c.get(); | |
125 | |
126 EXPECT_CALL(manager, OnDelayedTaskReadyTimeChanged()); | |
127 manager.AddDelayedTask(std::move(task_a), manager.GetPostTaskCallback()); | |
128 testing::Mock::VerifyAndClear(&manager); | |
129 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetNextDelayedRunTime()); | |
130 | |
131 manager.AddDelayedTask(std::move(task_b), manager.GetPostTaskCallback()); | |
132 testing::Mock::VerifyAndClear(&manager); | |
133 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetNextDelayedRunTime()); | |
134 | |
135 EXPECT_CALL(manager, OnDelayedTaskReadyTimeChanged()); | |
136 manager.AddDelayedTask(std::move(task_c), manager.GetPostTaskCallback()); | |
137 testing::Mock::VerifyAndClear(&manager); | |
138 EXPECT_EQ(task_c_raw->delayed_run_time, manager.GetNextDelayedRunTime()); | |
139 | |
140 manager.SetTime(task_c_raw->delayed_run_time); | |
141 | |
142 EXPECT_CALL(manager, PostTaskCallbackMock(task_c_raw)); | |
143 manager.PostReadyTasks(); | |
144 testing::Mock::VerifyAndClear(&manager); | |
145 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetNextDelayedRunTime()); | |
146 | |
147 manager.SetTime(task_a_raw->delayed_run_time); | |
148 | |
149 EXPECT_CALL(manager, PostTaskCallbackMock(task_a_raw)); | |
150 EXPECT_CALL(manager, PostTaskCallbackMock(task_b_raw)); | |
151 manager.PostReadyTasks(); | |
152 testing::Mock::VerifyAndClear(&manager); | |
153 EXPECT_EQ(TimeTicks(), manager.GetNextDelayedRunTime()); | |
154 } | |
155 | |
156 } // namespace | |
157 } // namespace internal | |
158 } // namespace base | |
OLD | NEW |