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(); |