| // Copyright 2015 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <weave/provider/test/mock_task_runner.h> |
| |
| using testing::_; |
| using testing::Invoke; |
| using testing::AnyNumber; |
| |
| namespace weave { |
| namespace provider { |
| namespace test { |
| |
| class MockTaskRunner::TestClock : public base::Clock { |
| public: |
| base::Time Now() override { return now_; } |
| |
| void SetNow(base::Time now) { now_ = now; } |
| |
| private: |
| base::Time now_{base::Time::Now()}; |
| }; |
| |
| MockTaskRunner::MockTaskRunner() : test_clock_{new TestClock} { |
| ON_CALL(*this, PostDelayedTask(_, _, _)) |
| .WillByDefault(Invoke(this, &MockTaskRunner::SaveTask)); |
| EXPECT_CALL(*this, PostDelayedTask(_, _, _)).Times(AnyNumber()); |
| } |
| |
| MockTaskRunner::~MockTaskRunner() {} |
| |
| bool MockTaskRunner::RunOnce() { |
| if (queue_.empty()) |
| return false; |
| auto top = queue_.top(); |
| queue_.pop(); |
| test_clock_->SetNow(std::max(test_clock_->Now(), top.first.first)); |
| top.second.Run(); |
| return true; |
| } |
| |
| void MockTaskRunner::Run() { |
| break_ = false; |
| while (!break_ && RunOnce()) { |
| } |
| } |
| |
| void MockTaskRunner::Break() { |
| break_ = true; |
| } |
| |
| base::Clock* MockTaskRunner::GetClock() { |
| return test_clock_.get(); |
| } |
| |
| void MockTaskRunner::SaveTask(const tracked_objects::Location& from_here, |
| const base::Closure& task, |
| base::TimeDelta delay) { |
| queue_.emplace(std::make_pair(test_clock_->Now() + delay, ++counter_), task); |
| } |
| |
| } // namespace test |
| } // namespace provider |
| } // namespace weave |