Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1451)

Unified Diff: base/test/test_mock_time_task_runner.cc

Issue 899863002: Add support in TestMockTimeTaskRunner for vending out mock Time and mock Clocks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix ash_unittests missing header. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();

Powered by Google App Engine
This is Rietveld 408576698