Chromium Code Reviews| Index: base/test/test_mock_time_task_runner.cc |
| diff --git a/base/test/test_mock_time_task_runner.cc b/base/test/test_mock_time_task_runner.cc |
| index 442d99190b0b87060337b6b67d9d60f7f1d47051..beb12fcc0ed53e668f40b68350a8b1d6c0766720 100644 |
| --- a/base/test/test_mock_time_task_runner.cc |
| +++ b/base/test/test_mock_time_task_runner.cc |
| @@ -6,13 +6,17 @@ |
| #include "base/logging.h" |
| #include "base/memory/ref_counted.h" |
| +#include "base/time/clock.h" |
| +#include "base/time/tick_clock.h" |
| namespace base { |
| namespace { |
| -// TickClock that always returns the then-current mock time of |task_runner| as |
| -// the current time. |
| +// MockTickClock -------------------------------------------------------------- |
| + |
| +// TickClock that always returns the then-current mock time ticks of |
| +// |task_runner| as the current time ticks. |
| class MockTickClock : public TickClock { |
| public: |
| explicit MockTickClock( |
| @@ -37,18 +41,49 @@ MockTickClock::~MockTickClock() { |
| } |
| TimeTicks MockTickClock::NowTicks() { |
| - return task_runner_->GetCurrentMockTime(); |
| + return task_runner_->NowTicks(); |
| +} |
| + |
| +// MockClock ------------------------------------------------------------------ |
| + |
| +// Clock that always returns the then-current mock time of |task_runner| as the |
| +// current time. |
| +class MockClock : public Clock { |
| + public: |
| + explicit MockClock(scoped_refptr<const TestMockTimeTaskRunner> task_runner); |
| + ~MockClock() override; |
| + |
| + // Clock: |
| + Time Now() override; |
| + |
| + private: |
| + scoped_refptr<const TestMockTimeTaskRunner> task_runner_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(MockClock); |
| +}; |
| + |
| +MockClock::MockClock(scoped_refptr<const TestMockTimeTaskRunner> task_runner) |
| + : task_runner_(task_runner) { |
| +} |
| + |
| +MockClock::~MockClock() { |
| +} |
| + |
| +Time MockClock::Now() { |
| + return task_runner_->Now(); |
| } |
| } // namespace |
| +// TestMockTimeTaskRunner ----------------------------------------------------- |
| + |
| bool TestMockTimeTaskRunner::TemporalOrder::operator()( |
| const TestPendingTask& first_task, |
| const TestPendingTask& second_task) const { |
| return first_task.GetTimeToRun() > second_task.GetTimeToRun(); |
| } |
| -TestMockTimeTaskRunner::TestMockTimeTaskRunner() { |
| +TestMockTimeTaskRunner::TestMockTimeTaskRunner() : now_(Time::UnixEpoch()) { |
| } |
| TestMockTimeTaskRunner::~TestMockTimeTaskRunner() { |
| @@ -56,27 +91,20 @@ TestMockTimeTaskRunner::~TestMockTimeTaskRunner() { |
| void TestMockTimeTaskRunner::FastForwardBy(TimeDelta delta) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| + DCHECK(delta >= TimeDelta()); |
|
Lei Zhang
2015/02/05 10:52:59
DCHECK_GE()
engedy
2015/02/05 12:41:24
Done.
|
| OnBeforeSelectingTask(); |
| - const base::TimeTicks original_now = now_; |
| + const TimeTicks original_now_ticks = now_ticks_; |
| TestPendingTask task_info; |
| - while (DequeueNextTask(original_now, delta, &task_info)) { |
| - if (task_info.GetTimeToRun() - now_ > base::TimeDelta()) { |
| - now_ = task_info.GetTimeToRun(); |
| - OnAfterTimePassed(); |
| - } |
| - |
| + while (DequeueNextTask(original_now_ticks, delta, &task_info)) { |
| + ForwardClocksUntilTickTime(task_info.GetTimeToRun()); |
| task_info.task.Run(); |
| - |
| OnAfterTaskRun(); |
| OnBeforeSelectingTask(); |
| } |
| - if (!delta.is_max() && now_ - original_now < delta) { |
| - now_ = original_now + delta; |
| - OnAfterTimePassed(); |
| - } |
| + ForwardClocksUntilTickTime(original_now_ticks + delta); |
| } |
| void TestMockTimeTaskRunner::RunUntilIdle() { |
| @@ -84,14 +112,34 @@ void TestMockTimeTaskRunner::RunUntilIdle() { |
| } |
| void TestMockTimeTaskRunner::FastForwardUntilNoTasksRemain() { |
| - FastForwardBy(TimeDelta::Max()); |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + |
| + OnBeforeSelectingTask(); |
| + |
| + TestPendingTask task_info; |
| + while (DequeueNextTask(now_ticks_, TimeDelta::Max(), &task_info)) { |
| + ForwardClocksUntilTickTime(task_info.GetTimeToRun()); |
| + task_info.task.Run(); |
| + OnAfterTaskRun(); |
| + OnBeforeSelectingTask(); |
| + } |
| } |
| -TimeTicks TestMockTimeTaskRunner::GetCurrentMockTime() const { |
| +Time TestMockTimeTaskRunner::Now() const { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| return now_; |
| } |
| +TimeTicks TestMockTimeTaskRunner::NowTicks() const { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + return now_ticks_; |
| +} |
| + |
| +scoped_ptr<Clock> TestMockTimeTaskRunner::GetMockClock() const { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + return make_scoped_ptr(new MockClock(this)); |
| +} |
| + |
| scoped_ptr<TickClock> TestMockTimeTaskRunner::GetMockTickClock() const { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| return make_scoped_ptr(new MockTickClock(this)); |
| @@ -109,7 +157,8 @@ size_t TestMockTimeTaskRunner::GetPendingTaskCount() const { |
| TimeDelta TestMockTimeTaskRunner::NextPendingTaskDelay() const { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| - return tasks_.empty() ? TimeDelta::Max() : tasks_.top().GetTimeToRun() - now_; |
| + return tasks_.empty() ? TimeDelta::Max() |
| + : tasks_.top().GetTimeToRun() - now_ticks_; |
| } |
| bool TestMockTimeTaskRunner::RunsTasksOnCurrentThread() const { |
| @@ -120,9 +169,9 @@ bool TestMockTimeTaskRunner::PostDelayedTask( |
| const tracked_objects::Location& from_here, |
| const Closure& task, |
| TimeDelta delay) { |
| - base::AutoLock scoped_lock(tasks_lock_); |
| - tasks_.push( |
| - TestPendingTask(from_here, task, now_, delay, TestPendingTask::NESTABLE)); |
| + AutoLock scoped_lock(tasks_lock_); |
| + tasks_.push(TestPendingTask(from_here, task, now_ticks_, delay, |
| + TestPendingTask::NESTABLE)); |
| return true; |
| } |
| @@ -146,10 +195,21 @@ void TestMockTimeTaskRunner::OnAfterTaskRun() { |
| // Empty default implementation. |
| } |
| -bool TestMockTimeTaskRunner::DequeueNextTask(const base::TimeTicks& reference, |
| - const base::TimeDelta& max_delta, |
| +void TestMockTimeTaskRunner::ForwardClocksUntilTickTime(TimeTicks later_ticks) { |
| + if (later_ticks <= now_ticks_) |
| + return; |
| + |
| + now_ += later_ticks - now_ticks_; |
| + if (now_ticks_ < later_ticks) { |
|
Lei Zhang
2015/02/05 10:52:59
This is always be true now.
engedy
2015/02/05 12:41:24
Ah, sorry, done.
|
| + now_ticks_ = later_ticks; |
| + OnAfterTimePassed(); |
| + } |
| +} |
| + |
| +bool TestMockTimeTaskRunner::DequeueNextTask(const TimeTicks& reference, |
| + const TimeDelta& max_delta, |
| TestPendingTask* next_task) { |
| - base::AutoLock scoped_lock(tasks_lock_); |
| + AutoLock scoped_lock(tasks_lock_); |
| if (!tasks_.empty() && |
| (tasks_.top().GetTimeToRun() - reference) <= max_delta) { |
| *next_task = tasks_.top(); |