// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <string>
#include <utility>

#include "base/functional/bind.h"
#include "base/run_loop.h"
#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "components/component_updater/timer.h"
#include "testing/gtest/include/gtest/gtest.h"

using std::string;

namespace component_updater {

class ComponentUpdaterTimerTest : public testing::Test {
 public:
  ComponentUpdaterTimerTest()
      : task_environment_(
            base::test::SingleThreadTaskEnvironment::MainThreadType::UI) {}
  ~ComponentUpdaterTimerTest() override = default;

 private:
  base::test::SingleThreadTaskEnvironment task_environment_;
};

TEST_F(ComponentUpdaterTimerTest, Start) {
  class TimerClientMock {
   public:
    TimerClientMock(int max_count, base::OnceClosure quit_closure)
        : max_count_(max_count),
          quit_closure_(std::move(quit_closure)),
          count_(0) {}

    void OnTimerEvent() {
      ++count_;
      if (count_ >= max_count_)
        std::move(quit_closure_).Run();
    }

    int count() const { return count_; }

   private:
    const int max_count_;
    base::OnceClosure quit_closure_;

    int count_;
  };

  base::RunLoop run_loop;
  TimerClientMock timer_client_fake(3, run_loop.QuitClosure());
  EXPECT_EQ(0, timer_client_fake.count());

  Timer timer;
  const base::TimeDelta delay(base::Milliseconds(1));
  timer.Start(delay, delay,
              base::BindRepeating(&TimerClientMock::OnTimerEvent,
                                  base::Unretained(&timer_client_fake)));
  run_loop.Run();
  timer.Stop();

  EXPECT_EQ(3, timer_client_fake.count());
}

}  // namespace component_updater
