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..27082c39691673dced250366cbb973b6da7697bb 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,53 @@ 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(Time intial_time) |
|
Lei Zhang
2015/02/04 20:27:37
typo
engedy
2015/02/05 10:22:57
Removed ctor, thanks for spotting the typo, though
|
| + : now_(intial_time) { |
| } |
| TestMockTimeTaskRunner::~TestMockTimeTaskRunner() { |
| @@ -59,24 +98,17 @@ void TestMockTimeTaskRunner::FastForwardBy(TimeDelta delta) { |
| 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; |
|
Lei Zhang
2015/02/04 20:27:37
Just trying to understand the original code here..
engedy
2015/02/05 10:22:57
You are correct: it has been, and it is still poss
Lei Zhang
2015/02/05 10:52:59
Is is possible to have both FastForwardBy() and Fa
engedy
2015/02/05 12:41:23
I went with a slightly less evil version of the ol
|
| - OnAfterTimePassed(); |
| - } |
| + if (!delta.is_max()) |
| + ForwardClocksUntilTickTime(original_now_ticks + delta); |
| } |
| void TestMockTimeTaskRunner::RunUntilIdle() { |
| @@ -87,11 +119,21 @@ void TestMockTimeTaskRunner::FastForwardUntilNoTasksRemain() { |
| FastForwardBy(TimeDelta::Max()); |
| } |
| -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 +151,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 +163,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 +189,18 @@ void TestMockTimeTaskRunner::OnAfterTaskRun() { |
| // Empty default implementation. |
| } |
| -bool TestMockTimeTaskRunner::DequeueNextTask(const base::TimeTicks& reference, |
| - const base::TimeDelta& max_delta, |
| +void TestMockTimeTaskRunner::ForwardClocksUntilTickTime(TimeTicks later_ticks) { |
| + now_ += later_ticks - now_ticks_; |
|
Lei Zhang
2015/02/04 20:27:37
Can this make time move backwards? In the original
engedy
2015/02/05 10:22:57
Hmm, yes, if the consumer of this class posts task
|
| + if (now_ticks_ < later_ticks) { |
| + 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(); |