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