// Copyright 2015 The Chromium 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 <string>

#include "base/run_loop.h"
#include "base/test/scoped_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()
      : scoped_task_environment_(
            base::test::ScopedTaskEnvironment::MainThreadType::UI) {}
  ~ComponentUpdaterTimerTest() override {}

 private:
  base::test::ScopedTaskEnvironment scoped_task_environment_;
};

TEST_F(ComponentUpdaterTimerTest, Start) {
  class TimerClientFake {
   public:
    TimerClientFake(int max_count, const base::Closure& quit_closure)
        : max_count_(max_count), quit_closure_(quit_closure), count_(0) {}

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

    int count() const { return count_; }

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

    int count_;
  };

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

  Timer timer;
  const base::TimeDelta delay(base::TimeDelta::FromMilliseconds(1));
  timer.Start(delay, delay, base::Bind(&TimerClientFake::OnTimerEvent,
                                       base::Unretained(&timer_client_fake)));
  run_loop.Run();
  timer.Stop();

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

}  // namespace component_updater
