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

Side by Side Diff: base/task_scheduler/delayed_task_manager_unittest.cc

Issue 1876363004: TaskScheduler [11] Support ExecutionMode::SINGLE_THREADED. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@8_delayed
Patch Set: add #include <algorithm> Created 4 years, 7 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
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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 NOTREACHED(); 52 NOTREACHED();
53 return nullptr; 53 return nullptr;
54 } 54 }
55 55
56 void ReEnqueueSequence(scoped_refptr<Sequence> sequence, 56 void ReEnqueueSequence(scoped_refptr<Sequence> sequence,
57 const SequenceSortKey& sequence_sort_key) override { 57 const SequenceSortKey& sequence_sort_key) override {
58 NOTREACHED(); 58 NOTREACHED();
59 } 59 }
60 60
61 bool PostTaskWithSequence(std::unique_ptr<Task> task, 61 bool PostTaskWithSequence(std::unique_ptr<Task> task,
62 scoped_refptr<Sequence> sequence) override { 62 scoped_refptr<Sequence> sequence,
63 SchedulerWorkerThread* worker_thread) override {
63 NOTREACHED(); 64 NOTREACHED();
64 return true; 65 return true;
65 } 66 }
66 67
67 void PostTaskWithSequenceNow(std::unique_ptr<Task> task, 68 void PostTaskWithSequenceNow(std::unique_ptr<Task> task,
68 scoped_refptr<Sequence> sequence) override { 69 scoped_refptr<Sequence> sequence,
69 PostTaskWithSequenceNowMock(task.get(), sequence.get()); 70 SchedulerWorkerThread* worker_thread) override {
71 PostTaskWithSequenceNowMock(task.get(), sequence.get(), worker_thread);
70 } 72 }
71 73
72 MOCK_METHOD2(PostTaskWithSequenceNowMock, void(const Task*, const Sequence*)); 74 MOCK_METHOD3(PostTaskWithSequenceNowMock,
75 void(const Task*,
76 const Sequence*,
77 const SchedulerWorkerThread* worker_thread));
73 }; 78 };
74 79
75 } // namespace 80 } // namespace
76 81
77 // Verify that GetDelayedRunTime() returns a null TimeTicks when there are 82 // Verify that GetDelayedRunTime() returns a null TimeTicks when there are
78 // no pending delayed tasks. 83 // no pending delayed tasks.
79 TEST(TaskSchedulerDelayedTaskManagerTest, 84 TEST(TaskSchedulerDelayedTaskManagerTest,
80 GetDelayedRunTimeNoPendingDelayedTasks) { 85 GetDelayedRunTimeNoPendingDelayedTasks) {
81 TestDelayedTaskManager manager; 86 TestDelayedTaskManager manager;
82 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); 87 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
83 } 88 }
84 89
85 // Verify that a delayed task isn't posted before it is ripe for execution. 90 // Verify that a delayed task isn't posted before it is ripe for execution.
86 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTaskBeforeDelayedRunTime) { 91 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTaskBeforeDelayedRunTime) {
87 testing::StrictMock<TestDelayedTaskManager> manager; 92 testing::StrictMock<TestDelayedTaskManager> manager;
88 93
89 std::unique_ptr<Task> task( 94 std::unique_ptr<Task> task(
90 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta())); 95 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta()));
91 task->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1); 96 task->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1);
92 const Task* task_raw = task.get(); 97 const Task* task_raw = task.get();
93 scoped_refptr<Sequence> sequence(new Sequence); 98 scoped_refptr<Sequence> sequence(new Sequence);
94 testing::StrictMock<MockSchedulerThreadPool> thread_pool; 99 testing::StrictMock<MockSchedulerThreadPool> thread_pool;
95 100
96 // Add |task| to the DelayedTaskManager. 101 // Add |task| to the DelayedTaskManager.
97 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 102 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
98 manager.AddDelayedTask(std::move(task), sequence, &thread_pool); 103 manager.AddDelayedTask(std::move(task), sequence, nullptr, &thread_pool);
99 testing::Mock::VerifyAndClear(&manager); 104 testing::Mock::VerifyAndClear(&manager);
100 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); 105 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
101 106
102 // Ask the DelayedTaskManager to post tasks that are ripe for execution. Don't 107 // Ask the DelayedTaskManager to post tasks that are ripe for execution. Don't
103 // expect any call to the mock method of |thread_pool|. 108 // expect any call to the mock method of |thread_pool|.
104 manager.PostReadyTasks(); 109 manager.PostReadyTasks();
105 110
106 // The delayed run time shouldn't have changed. 111 // The delayed run time shouldn't have changed.
107 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); 112 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
108 } 113 }
109 114
110 // Verify that a delayed task is posted when PostReadyTasks() is called with the 115 // Verify that a delayed task is posted when PostReadyTasks() is called with the
111 // current time equal to the task's delayed run time. 116 // current time equal to the task's delayed run time.
112 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAtDelayedRunTime) { 117 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAtDelayedRunTime) {
113 testing::StrictMock<TestDelayedTaskManager> manager; 118 testing::StrictMock<TestDelayedTaskManager> manager;
114 119
115 std::unique_ptr<Task> task( 120 std::unique_ptr<Task> task(
116 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta())); 121 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta()));
117 task->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1); 122 task->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1);
118 const Task* task_raw = task.get(); 123 const Task* task_raw = task.get();
119 scoped_refptr<Sequence> sequence(new Sequence); 124 scoped_refptr<Sequence> sequence(new Sequence);
120 testing::StrictMock<MockSchedulerThreadPool> thread_pool; 125 testing::StrictMock<MockSchedulerThreadPool> thread_pool;
121 126
122 // Add |task| to the DelayedTaskManager. 127 // Add |task| to the DelayedTaskManager.
123 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 128 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
124 manager.AddDelayedTask(std::move(task), sequence, &thread_pool); 129 manager.AddDelayedTask(std::move(task), sequence, nullptr, &thread_pool);
125 testing::Mock::VerifyAndClear(&manager); 130 testing::Mock::VerifyAndClear(&manager);
126 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); 131 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
127 132
128 // Fast-forward time to |task_raw|'s delayed run time. 133 // Fast-forward time to |task_raw|'s delayed run time.
129 manager.SetCurrentTime(task_raw->delayed_run_time); 134 manager.SetCurrentTime(task_raw->delayed_run_time);
130 135
131 // Ask the DelayedTaskManager to post tasks that are ripe for execution. 136 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
132 EXPECT_CALL(thread_pool, 137 EXPECT_CALL(thread_pool,
133 PostTaskWithSequenceNowMock(task_raw, sequence.get())); 138 PostTaskWithSequenceNowMock(task_raw, sequence.get(), nullptr));
134 manager.PostReadyTasks(); 139 manager.PostReadyTasks();
135 testing::Mock::VerifyAndClear(&manager); 140 testing::Mock::VerifyAndClear(&manager);
136 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); 141 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
137 } 142 }
138 143
139 // Verify that a delayed task is posted when PostReadyTasks() is called with the 144 // Verify that a delayed task is posted when PostReadyTasks() is called with the
140 // current time greater than the task's delayed run time. 145 // current time greater than the task's delayed run time.
141 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAfterDelayedRunTime) { 146 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAfterDelayedRunTime) {
142 testing::StrictMock<TestDelayedTaskManager> manager; 147 testing::StrictMock<TestDelayedTaskManager> manager;
143 148
144 std::unique_ptr<Task> task( 149 std::unique_ptr<Task> task(
145 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta())); 150 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta()));
146 task->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1); 151 task->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1);
147 const Task* task_raw = task.get(); 152 const Task* task_raw = task.get();
148 scoped_refptr<Sequence> sequence(new Sequence); 153 scoped_refptr<Sequence> sequence(new Sequence);
149 testing::StrictMock<MockSchedulerThreadPool> thread_pool; 154 testing::StrictMock<MockSchedulerThreadPool> thread_pool;
150 155
151 // Add |task| to the DelayedTaskManager. 156 // Add |task| to the DelayedTaskManager.
152 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 157 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
153 manager.AddDelayedTask(std::move(task), sequence, &thread_pool); 158 manager.AddDelayedTask(std::move(task), sequence, nullptr, &thread_pool);
154 testing::Mock::VerifyAndClear(&manager); 159 testing::Mock::VerifyAndClear(&manager);
155 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); 160 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
156 161
157 // Fast-forward time to |task_raw|'s delayed run time. 162 // Fast-forward time to |task_raw|'s delayed run time.
158 manager.SetCurrentTime(task_raw->delayed_run_time + 163 manager.SetCurrentTime(task_raw->delayed_run_time +
159 TimeDelta::FromSeconds(10)); 164 TimeDelta::FromSeconds(10));
160 165
161 // Ask the DelayedTaskManager to post tasks that are ripe for execution. 166 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
162 EXPECT_CALL(thread_pool, 167 EXPECT_CALL(thread_pool,
163 PostTaskWithSequenceNowMock(task_raw, sequence.get())); 168 PostTaskWithSequenceNowMock(task_raw, sequence.get(), nullptr));
164 manager.PostReadyTasks(); 169 manager.PostReadyTasks();
165 testing::Mock::VerifyAndClear(&manager); 170 testing::Mock::VerifyAndClear(&manager);
166 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); 171 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
167 } 172 }
168 173
169 // Verify that when multiple tasks are added to a DelayedTaskManager, they are 174 // Verify that when multiple tasks are added to a DelayedTaskManager, they are
170 // posted when they become ripe for execution. 175 // posted when they become ripe for execution.
171 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostReadyTasks) { 176 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostReadyTasks) {
172 testing::StrictMock<TestDelayedTaskManager> manager; 177 testing::StrictMock<TestDelayedTaskManager> manager;
173 178
(...skipping 11 matching lines...) Expand all
185 const Task* task_b_raw = task_b.get(); 190 const Task* task_b_raw = task_b.get();
186 191
187 std::unique_ptr<Task> task_c( 192 std::unique_ptr<Task> task_c(
188 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta())); 193 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta()));
189 task_c->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1); 194 task_c->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1);
190 const Task* task_c_raw = task_c.get(); 195 const Task* task_c_raw = task_c.get();
191 196
192 // Add |task_a| to the DelayedTaskManager. The delayed run time should be 197 // Add |task_a| to the DelayedTaskManager. The delayed run time should be
193 // updated to |task_a|'s delayed run time. 198 // updated to |task_a|'s delayed run time.
194 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 199 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
195 manager.AddDelayedTask(std::move(task_a), sequence, &thread_pool); 200 manager.AddDelayedTask(std::move(task_a), sequence, nullptr, &thread_pool);
196 testing::Mock::VerifyAndClear(&manager); 201 testing::Mock::VerifyAndClear(&manager);
197 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); 202 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime());
198 203
199 // Add |task_b| to the DelayedTaskManager. The delayed run time shouldn't 204 // Add |task_b| to the DelayedTaskManager. The delayed run time shouldn't
200 // change. 205 // change.
201 manager.AddDelayedTask(std::move(task_b), sequence, &thread_pool); 206 manager.AddDelayedTask(std::move(task_b), sequence, nullptr, &thread_pool);
202 testing::Mock::VerifyAndClear(&manager); 207 testing::Mock::VerifyAndClear(&manager);
203 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); 208 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime());
204 209
205 // Add |task_c| to the DelayedTaskManager. The delayed run time should be 210 // Add |task_c| to the DelayedTaskManager. The delayed run time should be
206 // updated to |task_c|'s delayed run time. 211 // updated to |task_c|'s delayed run time.
207 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 212 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
208 manager.AddDelayedTask(std::move(task_c), sequence, &thread_pool); 213 manager.AddDelayedTask(std::move(task_c), sequence, nullptr, &thread_pool);
209 testing::Mock::VerifyAndClear(&manager); 214 testing::Mock::VerifyAndClear(&manager);
210 EXPECT_EQ(task_c_raw->delayed_run_time, manager.GetDelayedRunTime()); 215 EXPECT_EQ(task_c_raw->delayed_run_time, manager.GetDelayedRunTime());
211 216
212 // Fast-forward time to |task_c_raw|'s delayed run time. 217 // Fast-forward time to |task_c_raw|'s delayed run time.
213 manager.SetCurrentTime(task_c_raw->delayed_run_time); 218 manager.SetCurrentTime(task_c_raw->delayed_run_time);
214 219
215 // Ask the DelayedTaskManager to post tasks that are ripe for execution. 220 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
216 // |task_c_raw| should be posted and the delayed run time should become 221 // |task_c_raw| should be posted and the delayed run time should become
217 // |task_a_raw|'s delayed run time. 222 // |task_a_raw|'s delayed run time.
218 EXPECT_CALL(thread_pool, 223 EXPECT_CALL(thread_pool,
219 PostTaskWithSequenceNowMock(task_c_raw, sequence.get())); 224 PostTaskWithSequenceNowMock(task_c_raw, sequence.get(), nullptr));
220 manager.PostReadyTasks(); 225 manager.PostReadyTasks();
221 testing::Mock::VerifyAndClear(&thread_pool); 226 testing::Mock::VerifyAndClear(&thread_pool);
222 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); 227 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime());
223 228
224 // Fast-forward time to |task_a_raw|'s delayed run time. 229 // Fast-forward time to |task_a_raw|'s delayed run time.
225 manager.SetCurrentTime(task_a_raw->delayed_run_time); 230 manager.SetCurrentTime(task_a_raw->delayed_run_time);
226 231
227 // Ask the DelayedTaskManager to post tasks that are ripe for execution. 232 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
228 // |task_a_raw| and |task_b_raw| should be posted and the delayed run time 233 // |task_a_raw| and |task_b_raw| should be posted and the delayed run time
229 // should become a null TimeTicks. 234 // should become a null TimeTicks.
230 EXPECT_CALL(thread_pool, 235 EXPECT_CALL(thread_pool,
231 PostTaskWithSequenceNowMock(task_a_raw, sequence.get())); 236 PostTaskWithSequenceNowMock(task_a_raw, sequence.get(), nullptr));
232 EXPECT_CALL(thread_pool, 237 EXPECT_CALL(thread_pool,
233 PostTaskWithSequenceNowMock(task_b_raw, sequence.get())); 238 PostTaskWithSequenceNowMock(task_b_raw, sequence.get(), nullptr));
234 manager.PostReadyTasks(); 239 manager.PostReadyTasks();
235 testing::Mock::VerifyAndClear(&thread_pool); 240 testing::Mock::VerifyAndClear(&thread_pool);
236 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); 241 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
237 } 242 }
238 243
239 } // namespace internal 244 } // namespace internal
240 } // namespace base 245 } // namespace base
OLDNEW
« no previous file with comments | « base/task_scheduler/delayed_task_manager.cc ('k') | base/task_scheduler/scheduler_thread_pool.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698