test_simple_task_runner.cc 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // Copyright (c) 2012 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. #include "base/test/test_simple_task_runner.h"
  5. #include <utility>
  6. #include "base/check.h"
  7. #include "base/memory/ptr_util.h"
  8. #include "base/threading/thread_task_runner_handle.h"
  9. #include "third_party/abseil-cpp/absl/types/optional.h"
  10. namespace base {
  11. TestSimpleTaskRunner::TestSimpleTaskRunner() = default;
  12. TestSimpleTaskRunner::~TestSimpleTaskRunner() = default;
  13. bool TestSimpleTaskRunner::PostDelayedTask(const Location& from_here,
  14. OnceClosure task,
  15. TimeDelta delay) {
  16. AutoLock auto_lock(lock_);
  17. pending_tasks_.push_back(TestPendingTask(from_here, std::move(task),
  18. TimeTicks(), delay,
  19. TestPendingTask::NESTABLE));
  20. return true;
  21. }
  22. bool TestSimpleTaskRunner::PostNonNestableDelayedTask(const Location& from_here,
  23. OnceClosure task,
  24. TimeDelta delay) {
  25. AutoLock auto_lock(lock_);
  26. pending_tasks_.push_back(TestPendingTask(from_here, std::move(task),
  27. TimeTicks(), delay,
  28. TestPendingTask::NON_NESTABLE));
  29. return true;
  30. }
  31. // TODO(gab): Use SequenceToken here to differentiate between tasks running in
  32. // the scope of this TestSimpleTaskRunner and other task runners sharing this
  33. // thread. http://crbug.com/631186
  34. bool TestSimpleTaskRunner::RunsTasksInCurrentSequence() const {
  35. return thread_ref_ == PlatformThread::CurrentRef();
  36. }
  37. base::circular_deque<TestPendingTask> TestSimpleTaskRunner::TakePendingTasks() {
  38. AutoLock auto_lock(lock_);
  39. return std::move(pending_tasks_);
  40. }
  41. size_t TestSimpleTaskRunner::NumPendingTasks() const {
  42. AutoLock auto_lock(lock_);
  43. return pending_tasks_.size();
  44. }
  45. bool TestSimpleTaskRunner::HasPendingTask() const {
  46. AutoLock auto_lock(lock_);
  47. return !pending_tasks_.empty();
  48. }
  49. base::TimeDelta TestSimpleTaskRunner::NextPendingTaskDelay() const {
  50. AutoLock auto_lock(lock_);
  51. return pending_tasks_.front().GetTimeToRun() - base::TimeTicks();
  52. }
  53. base::TimeDelta TestSimpleTaskRunner::FinalPendingTaskDelay() const {
  54. AutoLock auto_lock(lock_);
  55. return pending_tasks_.back().GetTimeToRun() - base::TimeTicks();
  56. }
  57. void TestSimpleTaskRunner::ClearPendingTasks() {
  58. AutoLock auto_lock(lock_);
  59. pending_tasks_.clear();
  60. }
  61. void TestSimpleTaskRunner::RunPendingTasks() {
  62. DCHECK(RunsTasksInCurrentSequence());
  63. // Swap with a local variable to avoid re-entrancy problems.
  64. base::circular_deque<TestPendingTask> tasks_to_run;
  65. {
  66. AutoLock auto_lock(lock_);
  67. tasks_to_run.swap(pending_tasks_);
  68. }
  69. // Multiple test task runners can share the same thread for determinism in
  70. // unit tests. Make sure this TestSimpleTaskRunner's tasks run in its scope.
  71. absl::optional<ThreadTaskRunnerHandleOverrideForTesting> ttrh_override;
  72. if (!ThreadTaskRunnerHandle::IsSet() ||
  73. ThreadTaskRunnerHandle::Get() != this) {
  74. ttrh_override.emplace(this);
  75. }
  76. for (auto& task : tasks_to_run)
  77. std::move(task.task).Run();
  78. }
  79. void TestSimpleTaskRunner::RunUntilIdle() {
  80. while (HasPendingTask())
  81. RunPendingTasks();
  82. }
  83. } // namespace base