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" |
11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
| 12 #include "base/logging.h" |
12 #include "base/memory/ref_counted.h" | 13 #include "base/memory/ref_counted.h" |
13 #include "base/task_scheduler/scheduler_lock.h" | 14 #include "base/task_scheduler/scheduler_lock.h" |
14 #include "base/task_scheduler/scheduler_task_executor.h" | 15 #include "base/task_scheduler/scheduler_thread_pool.h" |
15 #include "base/task_scheduler/sequence.h" | 16 #include "base/task_scheduler/sequence.h" |
16 #include "base/task_scheduler/task.h" | 17 #include "base/task_scheduler/task.h" |
17 #include "base/time/time.h" | 18 #include "base/time/time.h" |
18 #include "testing/gmock/include/gmock/gmock.h" | 19 #include "testing/gmock/include/gmock/gmock.h" |
19 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
20 | 21 |
21 namespace base { | 22 namespace base { |
22 namespace internal { | 23 namespace internal { |
23 namespace { | 24 namespace { |
24 | 25 |
(...skipping 10 matching lines...) Expand all Loading... |
35 TimeTicks Now() const override { return now_; } | 36 TimeTicks Now() const override { return now_; } |
36 | 37 |
37 MOCK_METHOD0(OnDelayedRunTimeUpdated, void()); | 38 MOCK_METHOD0(OnDelayedRunTimeUpdated, void()); |
38 | 39 |
39 private: | 40 private: |
40 TimeTicks now_ = TimeTicks::Now(); | 41 TimeTicks now_ = TimeTicks::Now(); |
41 | 42 |
42 DISALLOW_COPY_AND_ASSIGN(TestDelayedTaskManager); | 43 DISALLOW_COPY_AND_ASSIGN(TestDelayedTaskManager); |
43 }; | 44 }; |
44 | 45 |
45 class MockSchedulerTaskExecutor : public SchedulerTaskExecutor { | 46 class MockSchedulerThreadPool : public SchedulerThreadPool { |
46 public: | 47 public: |
47 void PostTaskWithSequence(std::unique_ptr<Task> task, | 48 // SchedulerThreadPool: |
48 scoped_refptr<Sequence> sequence) override { | 49 scoped_refptr<TaskRunner> CreateTaskRunnerWithTraits( |
49 PostTaskWithSequenceMock(task.get(), sequence.get()); | 50 const TaskTraits& traits, |
| 51 ExecutionMode execution_mode) override { |
| 52 NOTREACHED(); |
| 53 return nullptr; |
50 } | 54 } |
51 | 55 |
52 MOCK_METHOD2(PostTaskWithSequenceMock, void(const Task*, const Sequence*)); | 56 void ReEnqueueSequence(scoped_refptr<Sequence> sequence, |
| 57 const SequenceSortKey& sequence_sort_key) override { |
| 58 NOTREACHED(); |
| 59 } |
| 60 |
| 61 bool PostTaskWithSequence(std::unique_ptr<Task> task, |
| 62 scoped_refptr<Sequence> sequence) override { |
| 63 NOTREACHED(); |
| 64 return true; |
| 65 } |
| 66 |
| 67 void PostTaskWithSequenceNow(std::unique_ptr<Task> task, |
| 68 scoped_refptr<Sequence> sequence) override { |
| 69 PostTaskWithSequenceNowMock(task.get(), sequence.get()); |
| 70 } |
| 71 |
| 72 MOCK_METHOD2(PostTaskWithSequenceNowMock, void(const Task*, const Sequence*)); |
53 }; | 73 }; |
54 | 74 |
| 75 } // namespace |
| 76 |
55 // Verify that GetDelayedRunTime() returns a null TimeTicks when there are | 77 // Verify that GetDelayedRunTime() returns a null TimeTicks when there are |
56 // no pending delayed tasks. | 78 // no pending delayed tasks. |
57 TEST(TaskSchedulerDelayedTaskManagerTest, | 79 TEST(TaskSchedulerDelayedTaskManagerTest, |
58 GetDelayedRunTimeNoPendingDelayedTasks) { | 80 GetDelayedRunTimeNoPendingDelayedTasks) { |
59 TestDelayedTaskManager manager; | 81 TestDelayedTaskManager manager; |
60 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); | 82 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); |
61 } | 83 } |
62 | 84 |
63 // 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. |
64 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTaskBeforeDelayedRunTime) { | 86 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTaskBeforeDelayedRunTime) { |
65 testing::StrictMock<TestDelayedTaskManager> manager; | 87 testing::StrictMock<TestDelayedTaskManager> manager; |
66 | 88 |
67 std::unique_ptr<Task> task( | 89 std::unique_ptr<Task> task( |
68 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), | 90 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), |
69 manager.Now() + TimeDelta::FromSeconds(1))); | 91 manager.Now() + TimeDelta::FromSeconds(1))); |
70 const Task* task_raw = task.get(); | 92 const Task* task_raw = task.get(); |
71 scoped_refptr<Sequence> sequence(new Sequence); | 93 scoped_refptr<Sequence> sequence(new Sequence); |
72 testing::StrictMock<MockSchedulerTaskExecutor> executor; | 94 testing::StrictMock<MockSchedulerThreadPool> thread_pool; |
73 | 95 |
74 // Add |task| to the DelayedTaskManager. | 96 // Add |task| to the DelayedTaskManager. |
75 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); | 97 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); |
76 manager.AddDelayedTask(std::move(task), sequence, &executor); | 98 manager.AddDelayedTask(std::move(task), sequence, &thread_pool); |
77 testing::Mock::VerifyAndClear(&manager); | 99 testing::Mock::VerifyAndClear(&manager); |
78 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); | 100 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); |
79 | 101 |
80 // 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 |
81 // expect any call to the mock method of |executor|. | 103 // expect any call to the mock method of |thread_pool|. |
82 manager.PostReadyTasks(); | 104 manager.PostReadyTasks(); |
83 | 105 |
84 // The delayed run time shouldn't have changed. | 106 // The delayed run time shouldn't have changed. |
85 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); | 107 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); |
86 } | 108 } |
87 | 109 |
88 // 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 |
89 // current time equal to the task's delayed run time. | 111 // current time equal to the task's delayed run time. |
90 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAtDelayedRunTime) { | 112 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAtDelayedRunTime) { |
91 testing::StrictMock<TestDelayedTaskManager> manager; | 113 testing::StrictMock<TestDelayedTaskManager> manager; |
92 | 114 |
93 std::unique_ptr<Task> task( | 115 std::unique_ptr<Task> task( |
94 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), | 116 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), |
95 manager.Now() + TimeDelta::FromSeconds(1))); | 117 manager.Now() + TimeDelta::FromSeconds(1))); |
96 const Task* task_raw = task.get(); | 118 const Task* task_raw = task.get(); |
97 scoped_refptr<Sequence> sequence(new Sequence); | 119 scoped_refptr<Sequence> sequence(new Sequence); |
98 testing::StrictMock<MockSchedulerTaskExecutor> executor; | 120 testing::StrictMock<MockSchedulerThreadPool> thread_pool; |
99 | 121 |
100 // Add |task| to the DelayedTaskManager. | 122 // Add |task| to the DelayedTaskManager. |
101 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); | 123 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); |
102 manager.AddDelayedTask(std::move(task), sequence, &executor); | 124 manager.AddDelayedTask(std::move(task), sequence, &thread_pool); |
103 testing::Mock::VerifyAndClear(&manager); | 125 testing::Mock::VerifyAndClear(&manager); |
104 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); | 126 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); |
105 | 127 |
106 // Fast-forward time to |task_raw|'s delayed run time. | 128 // Fast-forward time to |task_raw|'s delayed run time. |
107 manager.SetCurrentTime(task_raw->delayed_run_time); | 129 manager.SetCurrentTime(task_raw->delayed_run_time); |
108 | 130 |
109 // Ask the DelayedTaskManager to post tasks that are ripe for execution. | 131 // Ask the DelayedTaskManager to post tasks that are ripe for execution. |
110 EXPECT_CALL(executor, PostTaskWithSequenceMock(task_raw, sequence.get())); | 132 EXPECT_CALL(thread_pool, |
| 133 PostTaskWithSequenceNowMock(task_raw, sequence.get())); |
111 manager.PostReadyTasks(); | 134 manager.PostReadyTasks(); |
112 testing::Mock::VerifyAndClear(&manager); | 135 testing::Mock::VerifyAndClear(&manager); |
113 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); | 136 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); |
114 } | 137 } |
115 | 138 |
116 // 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 |
117 // current time greater than the task's delayed run time. | 140 // current time greater than the task's delayed run time. |
118 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAfterDelayedRunTime) { | 141 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAfterDelayedRunTime) { |
119 testing::StrictMock<TestDelayedTaskManager> manager; | 142 testing::StrictMock<TestDelayedTaskManager> manager; |
120 | 143 |
121 std::unique_ptr<Task> task( | 144 std::unique_ptr<Task> task( |
122 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), | 145 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), |
123 manager.Now() + TimeDelta::FromSeconds(1))); | 146 manager.Now() + TimeDelta::FromSeconds(1))); |
124 const Task* task_raw = task.get(); | 147 const Task* task_raw = task.get(); |
125 scoped_refptr<Sequence> sequence(new Sequence); | 148 scoped_refptr<Sequence> sequence(new Sequence); |
126 testing::StrictMock<MockSchedulerTaskExecutor> executor; | 149 testing::StrictMock<MockSchedulerThreadPool> thread_pool; |
127 | 150 |
128 // Add |task| to the DelayedTaskManager. | 151 // Add |task| to the DelayedTaskManager. |
129 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); | 152 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); |
130 manager.AddDelayedTask(std::move(task), sequence, &executor); | 153 manager.AddDelayedTask(std::move(task), sequence, &thread_pool); |
131 testing::Mock::VerifyAndClear(&manager); | 154 testing::Mock::VerifyAndClear(&manager); |
132 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); | 155 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); |
133 | 156 |
134 // Fast-forward time to |task_raw|'s delayed run time. | 157 // Fast-forward time to |task_raw|'s delayed run time. |
135 manager.SetCurrentTime(task_raw->delayed_run_time + | 158 manager.SetCurrentTime(task_raw->delayed_run_time + |
136 TimeDelta::FromSeconds(10)); | 159 TimeDelta::FromSeconds(10)); |
137 | 160 |
138 // Ask the DelayedTaskManager to post tasks that are ripe for execution. | 161 // Ask the DelayedTaskManager to post tasks that are ripe for execution. |
139 EXPECT_CALL(executor, PostTaskWithSequenceMock(task_raw, sequence.get())); | 162 EXPECT_CALL(thread_pool, |
| 163 PostTaskWithSequenceNowMock(task_raw, sequence.get())); |
140 manager.PostReadyTasks(); | 164 manager.PostReadyTasks(); |
141 testing::Mock::VerifyAndClear(&manager); | 165 testing::Mock::VerifyAndClear(&manager); |
142 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); | 166 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); |
143 } | 167 } |
144 | 168 |
145 // 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 |
146 // posted when they become ripe for execution. | 170 // posted when they become ripe for execution. |
147 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostReadyTasks) { | 171 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostReadyTasks) { |
148 testing::StrictMock<TestDelayedTaskManager> manager; | 172 testing::StrictMock<TestDelayedTaskManager> manager; |
149 | 173 |
150 scoped_refptr<Sequence> sequence(new Sequence); | 174 scoped_refptr<Sequence> sequence(new Sequence); |
151 testing::StrictMock<MockSchedulerTaskExecutor> executor; | 175 testing::StrictMock<MockSchedulerThreadPool> thread_pool; |
152 | 176 |
153 std::unique_ptr<Task> task_a( | 177 std::unique_ptr<Task> task_a( |
154 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), | 178 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), |
155 manager.Now() + TimeDelta::FromSeconds(2))); | 179 manager.Now() + TimeDelta::FromSeconds(2))); |
156 const Task* task_a_raw = task_a.get(); | 180 const Task* task_a_raw = task_a.get(); |
157 | 181 |
158 std::unique_ptr<Task> task_b( | 182 std::unique_ptr<Task> task_b( |
159 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), | 183 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), |
160 manager.Now() + TimeDelta::FromSeconds(2))); | 184 manager.Now() + TimeDelta::FromSeconds(2))); |
161 const Task* task_b_raw = task_b.get(); | 185 const Task* task_b_raw = task_b.get(); |
162 | 186 |
163 std::unique_ptr<Task> task_c( | 187 std::unique_ptr<Task> task_c( |
164 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), | 188 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), |
165 manager.Now() + TimeDelta::FromSeconds(1))); | 189 manager.Now() + TimeDelta::FromSeconds(1))); |
166 const Task* task_c_raw = task_c.get(); | 190 const Task* task_c_raw = task_c.get(); |
167 | 191 |
168 // 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 |
169 // updated to |task_a|'s delayed run time. | 193 // updated to |task_a|'s delayed run time. |
170 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); | 194 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); |
171 manager.AddDelayedTask(std::move(task_a), sequence, &executor); | 195 manager.AddDelayedTask(std::move(task_a), sequence, &thread_pool); |
172 testing::Mock::VerifyAndClear(&manager); | 196 testing::Mock::VerifyAndClear(&manager); |
173 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); | 197 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); |
174 | 198 |
175 // 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 |
176 // change. | 200 // change. |
177 manager.AddDelayedTask(std::move(task_b), sequence, &executor); | 201 manager.AddDelayedTask(std::move(task_b), sequence, &thread_pool); |
178 testing::Mock::VerifyAndClear(&manager); | 202 testing::Mock::VerifyAndClear(&manager); |
179 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); | 203 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); |
180 | 204 |
181 // Add |task_c| to the DelayedTaskManager. The delayed run time should be | 205 // Add |task_c| to the DelayedTaskManager. The delayed run time should be |
182 // updated to |task_c|'s delayed run time. | 206 // updated to |task_c|'s delayed run time. |
183 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); | 207 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); |
184 manager.AddDelayedTask(std::move(task_c), sequence, &executor); | 208 manager.AddDelayedTask(std::move(task_c), sequence, &thread_pool); |
185 testing::Mock::VerifyAndClear(&manager); | 209 testing::Mock::VerifyAndClear(&manager); |
186 EXPECT_EQ(task_c_raw->delayed_run_time, manager.GetDelayedRunTime()); | 210 EXPECT_EQ(task_c_raw->delayed_run_time, manager.GetDelayedRunTime()); |
187 | 211 |
188 // Fast-forward time to |task_c_raw|'s delayed run time. | 212 // Fast-forward time to |task_c_raw|'s delayed run time. |
189 manager.SetCurrentTime(task_c_raw->delayed_run_time); | 213 manager.SetCurrentTime(task_c_raw->delayed_run_time); |
190 | 214 |
191 // Ask the DelayedTaskManager to post tasks that are ripe for execution. | 215 // Ask the DelayedTaskManager to post tasks that are ripe for execution. |
192 // |task_c_raw| should be posted and the delayed run time should become | 216 // |task_c_raw| should be posted and the delayed run time should become |
193 // |task_a_raw|'s delayed run time. | 217 // |task_a_raw|'s delayed run time. |
194 EXPECT_CALL(executor, PostTaskWithSequenceMock(task_c_raw, sequence.get())); | 218 EXPECT_CALL(thread_pool, |
| 219 PostTaskWithSequenceNowMock(task_c_raw, sequence.get())); |
195 manager.PostReadyTasks(); | 220 manager.PostReadyTasks(); |
196 testing::Mock::VerifyAndClear(&executor); | 221 testing::Mock::VerifyAndClear(&thread_pool); |
197 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); | 222 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); |
198 | 223 |
199 // Fast-forward time to |task_a_raw|'s delayed run time. | 224 // Fast-forward time to |task_a_raw|'s delayed run time. |
200 manager.SetCurrentTime(task_a_raw->delayed_run_time); | 225 manager.SetCurrentTime(task_a_raw->delayed_run_time); |
201 | 226 |
202 // Ask the DelayedTaskManager to post tasks that are ripe for execution. | 227 // Ask the DelayedTaskManager to post tasks that are ripe for execution. |
203 // |task_a_raw| and |task_b_raw| should be posted and the delayed run time | 228 // |task_a_raw| and |task_b_raw| should be posted and the delayed run time |
204 // should become a null TimeTicks. | 229 // should become a null TimeTicks. |
205 EXPECT_CALL(executor, PostTaskWithSequenceMock(task_a_raw, sequence.get())); | 230 EXPECT_CALL(thread_pool, |
206 EXPECT_CALL(executor, PostTaskWithSequenceMock(task_b_raw, sequence.get())); | 231 PostTaskWithSequenceNowMock(task_a_raw, sequence.get())); |
| 232 EXPECT_CALL(thread_pool, |
| 233 PostTaskWithSequenceNowMock(task_b_raw, sequence.get())); |
207 manager.PostReadyTasks(); | 234 manager.PostReadyTasks(); |
208 testing::Mock::VerifyAndClear(&executor); | 235 testing::Mock::VerifyAndClear(&thread_pool); |
209 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); | 236 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); |
210 } | 237 } |
211 | 238 |
212 } // namespace | |
213 } // namespace internal | 239 } // namespace internal |
214 } // namespace base | 240 } // namespace base |
OLD | NEW |