OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/test/test_mock_time_task_runner.h" | 5 #include "base/test/test_mock_time_task_runner.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/macros.h" | 8 #include "base/macros.h" |
9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 DCHECK(thread_checker_.CalledOnValidThread()); | 190 DCHECK(thread_checker_.CalledOnValidThread()); |
191 return MakeUnique<MockClock>(this); | 191 return MakeUnique<MockClock>(this); |
192 } | 192 } |
193 | 193 |
194 std::unique_ptr<TickClock> TestMockTimeTaskRunner::GetMockTickClock() const { | 194 std::unique_ptr<TickClock> TestMockTimeTaskRunner::GetMockTickClock() const { |
195 DCHECK(thread_checker_.CalledOnValidThread()); | 195 DCHECK(thread_checker_.CalledOnValidThread()); |
196 return MakeUnique<MockTickClock>(this); | 196 return MakeUnique<MockTickClock>(this); |
197 } | 197 } |
198 | 198 |
199 std::deque<TestPendingTask> TestMockTimeTaskRunner::TakePendingTasks() { | 199 std::deque<TestPendingTask> TestMockTimeTaskRunner::TakePendingTasks() { |
| 200 AutoLock scoped_lock(tasks_lock_); |
200 std::deque<TestPendingTask> tasks; | 201 std::deque<TestPendingTask> tasks; |
201 while (!tasks_.empty()) { | 202 while (!tasks_.empty()) { |
202 // It's safe to remove const and consume |task| here, since |task| is not | 203 // It's safe to remove const and consume |task| here, since |task| is not |
203 // used for ordering the item. | 204 // used for ordering the item. |
204 tasks.push_back( | 205 tasks.push_back( |
205 std::move(const_cast<TestOrderedPendingTask&>(tasks_.top()))); | 206 std::move(const_cast<TestOrderedPendingTask&>(tasks_.top()))); |
206 tasks_.pop(); | 207 tasks_.pop(); |
207 } | 208 } |
208 return tasks; | 209 return tasks; |
209 } | 210 } |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 | 260 |
260 void TestMockTimeTaskRunner::OnAfterTimePassed() { | 261 void TestMockTimeTaskRunner::OnAfterTimePassed() { |
261 // Empty default implementation. | 262 // Empty default implementation. |
262 } | 263 } |
263 | 264 |
264 void TestMockTimeTaskRunner::OnAfterTaskRun() { | 265 void TestMockTimeTaskRunner::OnAfterTaskRun() { |
265 // Empty default implementation. | 266 // Empty default implementation. |
266 } | 267 } |
267 | 268 |
268 void TestMockTimeTaskRunner::ProcessAllTasksNoLaterThan(TimeDelta max_delta) { | 269 void TestMockTimeTaskRunner::ProcessAllTasksNoLaterThan(TimeDelta max_delta) { |
| 270 DCHECK(thread_checker_.CalledOnValidThread()); |
269 DCHECK_GE(max_delta, TimeDelta()); | 271 DCHECK_GE(max_delta, TimeDelta()); |
270 | 272 |
271 // Multiple test task runners can share the same thread for determinism in | 273 // Multiple test task runners can share the same thread for determinism in |
272 // unit tests. Make sure this TestMockTimeTaskRunner's tasks run in its scope. | 274 // unit tests. Make sure this TestMockTimeTaskRunner's tasks run in its scope. |
273 ScopedClosureRunner undo_override; | 275 ScopedClosureRunner undo_override; |
274 if (!ThreadTaskRunnerHandle::IsSet() || | 276 if (!ThreadTaskRunnerHandle::IsSet() || |
275 ThreadTaskRunnerHandle::Get() != this) { | 277 ThreadTaskRunnerHandle::Get() != this) { |
276 undo_override = ThreadTaskRunnerHandle::OverrideForTesting(this); | 278 undo_override = ThreadTaskRunnerHandle::OverrideForTesting(this); |
277 } | 279 } |
278 | 280 |
279 const TimeTicks original_now_ticks = now_ticks_; | 281 const TimeTicks original_now_ticks = now_ticks_; |
280 while (!IsElapsingStopped()) { | 282 while (!IsElapsingStopped()) { |
281 OnBeforeSelectingTask(); | 283 OnBeforeSelectingTask(); |
282 TestPendingTask task_info; | 284 TestPendingTask task_info; |
283 if (!DequeueNextTask(original_now_ticks, max_delta, &task_info)) | 285 if (!DequeueNextTask(original_now_ticks, max_delta, &task_info)) |
284 break; | 286 break; |
285 // If tasks were posted with a negative delay, task_info.GetTimeToRun() will | 287 // If tasks were posted with a negative delay, task_info.GetTimeToRun() will |
286 // be less than |now_ticks_|. ForwardClocksUntilTickTime() takes care of not | 288 // be less than |now_ticks_|. ForwardClocksUntilTickTime() takes care of not |
287 // moving the clock backwards in this case. | 289 // moving the clock backwards in this case. |
288 ForwardClocksUntilTickTime(task_info.GetTimeToRun()); | 290 ForwardClocksUntilTickTime(task_info.GetTimeToRun()); |
289 std::move(task_info.task).Run(); | 291 std::move(task_info.task).Run(); |
290 OnAfterTaskRun(); | 292 OnAfterTaskRun(); |
291 } | 293 } |
292 } | 294 } |
293 | 295 |
294 void TestMockTimeTaskRunner::ForwardClocksUntilTickTime(TimeTicks later_ticks) { | 296 void TestMockTimeTaskRunner::ForwardClocksUntilTickTime(TimeTicks later_ticks) { |
| 297 DCHECK(thread_checker_.CalledOnValidThread()); |
295 if (later_ticks <= now_ticks_) | 298 if (later_ticks <= now_ticks_) |
296 return; | 299 return; |
297 | 300 |
298 now_ += later_ticks - now_ticks_; | 301 now_ += later_ticks - now_ticks_; |
299 now_ticks_ = later_ticks; | 302 now_ticks_ = later_ticks; |
300 OnAfterTimePassed(); | 303 OnAfterTimePassed(); |
301 } | 304 } |
302 | 305 |
303 bool TestMockTimeTaskRunner::DequeueNextTask(const TimeTicks& reference, | 306 bool TestMockTimeTaskRunner::DequeueNextTask(const TimeTicks& reference, |
304 const TimeDelta& max_delta, | 307 const TimeDelta& max_delta, |
305 TestPendingTask* next_task) { | 308 TestPendingTask* next_task) { |
306 AutoLock scoped_lock(tasks_lock_); | 309 AutoLock scoped_lock(tasks_lock_); |
307 if (!tasks_.empty() && | 310 if (!tasks_.empty() && |
308 (tasks_.top().GetTimeToRun() - reference) <= max_delta) { | 311 (tasks_.top().GetTimeToRun() - reference) <= max_delta) { |
309 // It's safe to remove const and consume |task| here, since |task| is not | 312 // It's safe to remove const and consume |task| here, since |task| is not |
310 // used for ordering the item. | 313 // used for ordering the item. |
311 *next_task = std::move(const_cast<TestOrderedPendingTask&>(tasks_.top())); | 314 *next_task = std::move(const_cast<TestOrderedPendingTask&>(tasks_.top())); |
312 tasks_.pop(); | 315 tasks_.pop(); |
313 return true; | 316 return true; |
314 } | 317 } |
315 return false; | 318 return false; |
316 } | 319 } |
317 | 320 |
318 } // namespace base | 321 } // namespace base |
OLD | NEW |