14615e0d5aa416ab1a8596bde68f71f7ebe431b86Vitaly Buka// Copyright 2015 The Weave Authors. All rights reserved. 211b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka// Use of this source code is governed by a BSD-style license that can be 311b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka// found in the LICENSE file. 411b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka 5727f3e675fece0ebdcdb0bf0aaf083c374d64d95Vitaly Buka#include <weave/provider/test/fake_task_runner.h> 611b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka 711b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Bukanamespace weave { 81e3636732171afb8cceb9e5cb835ec6a93787dbaVitaly Bukanamespace provider { 90f6b2eccc9ca4aa35cf0ee1e3ac7bc6edc38f0a4Vitaly Bukanamespace test { 1011b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka 11727f3e675fece0ebdcdb0bf0aaf083c374d64d95Vitaly Bukaclass FakeTaskRunner::TestClock : public base::Clock { 1211b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka public: 1311b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka base::Time Now() override { return now_; } 1411b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka 1511b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka void SetNow(base::Time now) { now_ = now; } 1611b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka 1711b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka private: 1811b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka base::Time now_{base::Time::Now()}; 1911b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka}; 2011b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka 21727f3e675fece0ebdcdb0bf0aaf083c374d64d95Vitaly BukaFakeTaskRunner::FakeTaskRunner() : test_clock_{new TestClock} {} 2211b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka 23727f3e675fece0ebdcdb0bf0aaf083c374d64d95Vitaly BukaFakeTaskRunner::~FakeTaskRunner() {} 2411b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka 25727f3e675fece0ebdcdb0bf0aaf083c374d64d95Vitaly Bukabool FakeTaskRunner::RunOnce() { 2611b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka if (queue_.empty()) 2711b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka return false; 2811b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka auto top = queue_.top(); 2911b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka queue_.pop(); 3011b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka test_clock_->SetNow(std::max(test_clock_->Now(), top.first.first)); 3111b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka top.second.Run(); 3211b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka return true; 3311b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka} 3411b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka 35ff32458cae9b985de38c7da009783fd02b8b7cc2Vitaly Bukavoid FakeTaskRunner::Run(size_t number_of_iterations) { 36ca365fb44ec9064043375936c28434b3950a98a3Vitaly Buka break_ = false; 37ff32458cae9b985de38c7da009783fd02b8b7cc2Vitaly Buka for (size_t i = 0; i < number_of_iterations && !break_ && RunOnce(); ++i) { 3811b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka } 3911b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka} 4011b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka 41727f3e675fece0ebdcdb0bf0aaf083c374d64d95Vitaly Bukavoid FakeTaskRunner::Break() { 42ca365fb44ec9064043375936c28434b3950a98a3Vitaly Buka break_ = true; 43ca365fb44ec9064043375936c28434b3950a98a3Vitaly Buka} 44ca365fb44ec9064043375936c28434b3950a98a3Vitaly Buka 45727f3e675fece0ebdcdb0bf0aaf083c374d64d95Vitaly Bukabase::Clock* FakeTaskRunner::GetClock() { 4611b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka return test_clock_.get(); 4711b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka} 4811b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka 49727f3e675fece0ebdcdb0bf0aaf083c374d64d95Vitaly Bukavoid FakeTaskRunner::PostDelayedTask(const tracked_objects::Location& from_here, 50727f3e675fece0ebdcdb0bf0aaf083c374d64d95Vitaly Buka const base::Closure& task, 51727f3e675fece0ebdcdb0bf0aaf083c374d64d95Vitaly Buka base::TimeDelta delay) { 5211b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka queue_.emplace(std::make_pair(test_clock_->Now() + delay, ++counter_), task); 5311b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka} 5411b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka 5598d1fee994302f5e2ad7a7b60de2f2d74f35408bAlex Vakulenkosize_t FakeTaskRunner::GetTaskQueueSize() const { 5698d1fee994302f5e2ad7a7b60de2f2d74f35408bAlex Vakulenko return queue_.size(); 5798d1fee994302f5e2ad7a7b60de2f2d74f35408bAlex Vakulenko} 5898d1fee994302f5e2ad7a7b60de2f2d74f35408bAlex Vakulenko 590f6b2eccc9ca4aa35cf0ee1e3ac7bc6edc38f0a4Vitaly Buka} // namespace test 601e3636732171afb8cceb9e5cb835ec6a93787dbaVitaly Buka} // namespace provider 6111b2f2382db08ce26f4c4875a4e2d77586165720Vitaly Buka} // namespace weave 62