OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/task_scheduler/delayed_task_manager.h" | 5 #include "base/task_scheduler/delayed_task_manager.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 GetDelayedRunTimeNoPendingDelayedTasks) { | 80 GetDelayedRunTimeNoPendingDelayedTasks) { |
81 TestDelayedTaskManager manager; | 81 TestDelayedTaskManager manager; |
82 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); | 82 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); |
83 } | 83 } |
84 | 84 |
85 // Verify that a delayed task isn't posted before it is ripe for execution. | 85 // Verify that a delayed task isn't posted before it is ripe for execution. |
86 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTaskBeforeDelayedRunTime) { | 86 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTaskBeforeDelayedRunTime) { |
87 testing::StrictMock<TestDelayedTaskManager> manager; | 87 testing::StrictMock<TestDelayedTaskManager> manager; |
88 | 88 |
89 std::unique_ptr<Task> task( | 89 std::unique_ptr<Task> task( |
90 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), | 90 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta())); |
91 manager.Now() + TimeDelta::FromSeconds(1))); | 91 task->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1); |
92 const Task* task_raw = task.get(); | 92 const Task* task_raw = task.get(); |
93 scoped_refptr<Sequence> sequence(new Sequence); | 93 scoped_refptr<Sequence> sequence(new Sequence); |
94 testing::StrictMock<MockSchedulerThreadPool> thread_pool; | 94 testing::StrictMock<MockSchedulerThreadPool> thread_pool; |
95 | 95 |
96 // Add |task| to the DelayedTaskManager. | 96 // Add |task| to the DelayedTaskManager. |
97 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); | 97 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); |
98 manager.AddDelayedTask(std::move(task), sequence, &thread_pool); | 98 manager.AddDelayedTask(std::move(task), sequence, &thread_pool); |
99 testing::Mock::VerifyAndClear(&manager); | 99 testing::Mock::VerifyAndClear(&manager); |
100 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); | 100 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); |
101 | 101 |
102 // Ask the DelayedTaskManager to post tasks that are ripe for execution. Don't | 102 // Ask the DelayedTaskManager to post tasks that are ripe for execution. Don't |
103 // expect any call to the mock method of |thread_pool|. | 103 // expect any call to the mock method of |thread_pool|. |
104 manager.PostReadyTasks(); | 104 manager.PostReadyTasks(); |
105 | 105 |
106 // The delayed run time shouldn't have changed. | 106 // The delayed run time shouldn't have changed. |
107 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); | 107 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); |
108 } | 108 } |
109 | 109 |
110 // Verify that a delayed task is posted when PostReadyTasks() is called with the | 110 // Verify that a delayed task is posted when PostReadyTasks() is called with the |
111 // current time equal to the task's delayed run time. | 111 // current time equal to the task's delayed run time. |
112 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAtDelayedRunTime) { | 112 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAtDelayedRunTime) { |
113 testing::StrictMock<TestDelayedTaskManager> manager; | 113 testing::StrictMock<TestDelayedTaskManager> manager; |
114 | 114 |
115 std::unique_ptr<Task> task( | 115 std::unique_ptr<Task> task( |
116 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), | 116 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta())); |
117 manager.Now() + TimeDelta::FromSeconds(1))); | 117 task->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1); |
118 const Task* task_raw = task.get(); | 118 const Task* task_raw = task.get(); |
119 scoped_refptr<Sequence> sequence(new Sequence); | 119 scoped_refptr<Sequence> sequence(new Sequence); |
120 testing::StrictMock<MockSchedulerThreadPool> thread_pool; | 120 testing::StrictMock<MockSchedulerThreadPool> thread_pool; |
121 | 121 |
122 // Add |task| to the DelayedTaskManager. | 122 // Add |task| to the DelayedTaskManager. |
123 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); | 123 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); |
124 manager.AddDelayedTask(std::move(task), sequence, &thread_pool); | 124 manager.AddDelayedTask(std::move(task), sequence, &thread_pool); |
125 testing::Mock::VerifyAndClear(&manager); | 125 testing::Mock::VerifyAndClear(&manager); |
126 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); | 126 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); |
127 | 127 |
128 // Fast-forward time to |task_raw|'s delayed run time. | 128 // Fast-forward time to |task_raw|'s delayed run time. |
129 manager.SetCurrentTime(task_raw->delayed_run_time); | 129 manager.SetCurrentTime(task_raw->delayed_run_time); |
130 | 130 |
131 // Ask the DelayedTaskManager to post tasks that are ripe for execution. | 131 // Ask the DelayedTaskManager to post tasks that are ripe for execution. |
132 EXPECT_CALL(thread_pool, | 132 EXPECT_CALL(thread_pool, |
133 PostTaskWithSequenceNowMock(task_raw, sequence.get())); | 133 PostTaskWithSequenceNowMock(task_raw, sequence.get())); |
134 manager.PostReadyTasks(); | 134 manager.PostReadyTasks(); |
135 testing::Mock::VerifyAndClear(&manager); | 135 testing::Mock::VerifyAndClear(&manager); |
136 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); | 136 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); |
137 } | 137 } |
138 | 138 |
139 // Verify that a delayed task is posted when PostReadyTasks() is called with the | 139 // Verify that a delayed task is posted when PostReadyTasks() is called with the |
140 // current time greater than the task's delayed run time. | 140 // current time greater than the task's delayed run time. |
141 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAfterDelayedRunTime) { | 141 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAfterDelayedRunTime) { |
142 testing::StrictMock<TestDelayedTaskManager> manager; | 142 testing::StrictMock<TestDelayedTaskManager> manager; |
143 | 143 |
144 std::unique_ptr<Task> task( | 144 std::unique_ptr<Task> task( |
145 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), | 145 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta())); |
146 manager.Now() + TimeDelta::FromSeconds(1))); | 146 task->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1); |
147 const Task* task_raw = task.get(); | 147 const Task* task_raw = task.get(); |
148 scoped_refptr<Sequence> sequence(new Sequence); | 148 scoped_refptr<Sequence> sequence(new Sequence); |
149 testing::StrictMock<MockSchedulerThreadPool> thread_pool; | 149 testing::StrictMock<MockSchedulerThreadPool> thread_pool; |
150 | 150 |
151 // Add |task| to the DelayedTaskManager. | 151 // Add |task| to the DelayedTaskManager. |
152 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); | 152 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); |
153 manager.AddDelayedTask(std::move(task), sequence, &thread_pool); | 153 manager.AddDelayedTask(std::move(task), sequence, &thread_pool); |
154 testing::Mock::VerifyAndClear(&manager); | 154 testing::Mock::VerifyAndClear(&manager); |
155 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); | 155 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); |
156 | 156 |
(...skipping 11 matching lines...) Expand all Loading... |
168 | 168 |
169 // Verify that when multiple tasks are added to a DelayedTaskManager, they are | 169 // Verify that when multiple tasks are added to a DelayedTaskManager, they are |
170 // posted when they become ripe for execution. | 170 // posted when they become ripe for execution. |
171 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostReadyTasks) { | 171 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostReadyTasks) { |
172 testing::StrictMock<TestDelayedTaskManager> manager; | 172 testing::StrictMock<TestDelayedTaskManager> manager; |
173 | 173 |
174 scoped_refptr<Sequence> sequence(new Sequence); | 174 scoped_refptr<Sequence> sequence(new Sequence); |
175 testing::StrictMock<MockSchedulerThreadPool> thread_pool; | 175 testing::StrictMock<MockSchedulerThreadPool> thread_pool; |
176 | 176 |
177 std::unique_ptr<Task> task_a( | 177 std::unique_ptr<Task> task_a( |
178 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), | 178 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta())); |
179 manager.Now() + TimeDelta::FromSeconds(2))); | 179 task_a->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(2); |
180 const Task* task_a_raw = task_a.get(); | 180 const Task* task_a_raw = task_a.get(); |
181 | 181 |
182 std::unique_ptr<Task> task_b( | 182 std::unique_ptr<Task> task_b( |
183 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), | 183 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta())); |
184 manager.Now() + TimeDelta::FromSeconds(2))); | 184 task_b->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(2); |
185 const Task* task_b_raw = task_b.get(); | 185 const Task* task_b_raw = task_b.get(); |
186 | 186 |
187 std::unique_ptr<Task> task_c( | 187 std::unique_ptr<Task> task_c( |
188 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), | 188 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta())); |
189 manager.Now() + TimeDelta::FromSeconds(1))); | 189 task_c->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1); |
190 const Task* task_c_raw = task_c.get(); | 190 const Task* task_c_raw = task_c.get(); |
191 | 191 |
192 // Add |task_a| to the DelayedTaskManager. The delayed run time should be | 192 // Add |task_a| to the DelayedTaskManager. The delayed run time should be |
193 // updated to |task_a|'s delayed run time. | 193 // updated to |task_a|'s delayed run time. |
194 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); | 194 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); |
195 manager.AddDelayedTask(std::move(task_a), sequence, &thread_pool); | 195 manager.AddDelayedTask(std::move(task_a), sequence, &thread_pool); |
196 testing::Mock::VerifyAndClear(&manager); | 196 testing::Mock::VerifyAndClear(&manager); |
197 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); | 197 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); |
198 | 198 |
199 // Add |task_b| to the DelayedTaskManager. The delayed run time shouldn't | 199 // Add |task_b| to the DelayedTaskManager. The delayed run time shouldn't |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 PostTaskWithSequenceNowMock(task_a_raw, sequence.get())); | 231 PostTaskWithSequenceNowMock(task_a_raw, sequence.get())); |
232 EXPECT_CALL(thread_pool, | 232 EXPECT_CALL(thread_pool, |
233 PostTaskWithSequenceNowMock(task_b_raw, sequence.get())); | 233 PostTaskWithSequenceNowMock(task_b_raw, sequence.get())); |
234 manager.PostReadyTasks(); | 234 manager.PostReadyTasks(); |
235 testing::Mock::VerifyAndClear(&thread_pool); | 235 testing::Mock::VerifyAndClear(&thread_pool); |
236 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); | 236 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); |
237 } | 237 } |
238 | 238 |
239 } // namespace internal | 239 } // namespace internal |
240 } // namespace base | 240 } // namespace base |
OLD | NEW |