| Index: base/timer/timer_unittest.cc
|
| diff --git a/base/timer/timer_unittest.cc b/base/timer/timer_unittest.cc
|
| index 6fcd25b93a3af6491be0df785136f28bdf4fe86f..b34da20ba3f1ce4170303054aa1dea668ad15448 100644
|
| --- a/base/timer/timer_unittest.cc
|
| +++ b/base/timer/timer_unittest.cc
|
| @@ -8,11 +8,15 @@
|
|
|
| #include <memory>
|
|
|
| +#include "base/bind.h"
|
| +#include "base/bind_helpers.h"
|
| #include "base/macros.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/run_loop.h"
|
| +#include "base/test/test_mock_time_task_runner.h"
|
| #include "base/test/test_simple_task_runner.h"
|
| #include "base/threading/thread_task_runner_handle.h"
|
| +#include "base/time/tick_clock.h"
|
| #include "build/build_config.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| @@ -32,6 +36,17 @@ const base::MessageLoop::Type testing_message_loops[] = {
|
|
|
| const int kNumTestingMessageLoops = arraysize(testing_message_loops);
|
|
|
| +class Receiver {
|
| + public:
|
| + Receiver() : count_(0) {}
|
| + void OnCalled() { count_++; }
|
| + bool WasCalled() { return count_ > 0; }
|
| + int TimesCalled() { return count_; }
|
| +
|
| + private:
|
| + int count_;
|
| +};
|
| +
|
| class OneShotTimerTester {
|
| public:
|
| explicit OneShotTimerTester(bool* did_run, unsigned milliseconds = 10)
|
| @@ -341,6 +356,21 @@ TEST(TimerTest, OneShotTimer_CustomTaskRunner) {
|
| EXPECT_TRUE(did_run);
|
| }
|
|
|
| +TEST(TimerTest, OneShotTimerWithTickClock) {
|
| + scoped_refptr<base::TestMockTimeTaskRunner> task_runner(
|
| + new base::TestMockTimeTaskRunner(base::Time::Now(),
|
| + base::TimeTicks::Now()));
|
| + std::unique_ptr<base::TickClock> tick_clock(task_runner->GetMockTickClock());
|
| + base::MessageLoop message_loop;
|
| + message_loop.SetTaskRunner(task_runner);
|
| + Receiver receiver;
|
| + base::OneShotTimer timer(tick_clock.get());
|
| + timer.Start(FROM_HERE, base::TimeDelta::FromSeconds(1),
|
| + base::Bind(&Receiver::OnCalled, base::Unretained(&receiver)));
|
| + task_runner->FastForwardBy(base::TimeDelta::FromSeconds(1));
|
| + EXPECT_TRUE(receiver.WasCalled());
|
| +}
|
| +
|
| TEST(TimerTest, RepeatingTimer) {
|
| for (int i = 0; i < kNumTestingMessageLoops; i++) {
|
| RunTest_RepeatingTimer(testing_message_loops[i],
|
| @@ -369,6 +399,24 @@ TEST(TimerTest, RepeatingTimerZeroDelay_Cancel) {
|
| }
|
| }
|
|
|
| +TEST(TimerTest, RepeatingTimerWithTickClock) {
|
| + scoped_refptr<base::TestMockTimeTaskRunner> task_runner(
|
| + new base::TestMockTimeTaskRunner(base::Time::Now(),
|
| + base::TimeTicks::Now()));
|
| + std::unique_ptr<base::TickClock> tick_clock(task_runner->GetMockTickClock());
|
| + base::MessageLoop message_loop;
|
| + message_loop.SetTaskRunner(task_runner);
|
| + Receiver receiver;
|
| + const int expected_times_called = 10;
|
| + base::RepeatingTimer timer(tick_clock.get());
|
| + timer.Start(FROM_HERE, base::TimeDelta::FromSeconds(1),
|
| + base::Bind(&Receiver::OnCalled, base::Unretained(&receiver)));
|
| + task_runner->FastForwardBy(
|
| + base::TimeDelta::FromSeconds(expected_times_called));
|
| + timer.Stop();
|
| + EXPECT_EQ(expected_times_called, receiver.TimesCalled());
|
| +}
|
| +
|
| TEST(TimerTest, DelayTimer_NoCall) {
|
| for (int i = 0; i < kNumTestingMessageLoops; i++) {
|
| RunTest_DelayTimer_NoCall(testing_message_loops[i]);
|
| @@ -394,6 +442,26 @@ TEST(TimerTest, DelayTimer_Deleted) {
|
| }
|
| }
|
|
|
| +TEST(TimerTest, DelayTimerWithTickClock) {
|
| + scoped_refptr<base::TestMockTimeTaskRunner> task_runner(
|
| + new base::TestMockTimeTaskRunner(base::Time::Now(),
|
| + base::TimeTicks::Now()));
|
| + std::unique_ptr<base::TickClock> tick_clock(task_runner->GetMockTickClock());
|
| + base::MessageLoop message_loop;
|
| + message_loop.SetTaskRunner(task_runner);
|
| + Receiver receiver;
|
| + base::DelayTimer timer(FROM_HERE, base::TimeDelta::FromSeconds(1), &receiver,
|
| + &Receiver::OnCalled, tick_clock.get());
|
| + task_runner->FastForwardBy(base::TimeDelta::FromMilliseconds(999));
|
| + EXPECT_FALSE(receiver.WasCalled());
|
| + timer.Reset();
|
| + task_runner->FastForwardBy(base::TimeDelta::FromMilliseconds(999));
|
| + EXPECT_FALSE(receiver.WasCalled());
|
| + timer.Reset();
|
| + task_runner->FastForwardBy(base::TimeDelta::FromSeconds(1));
|
| + EXPECT_TRUE(receiver.WasCalled());
|
| +}
|
| +
|
| TEST(TimerTest, MessageLoopShutdown) {
|
| // This test is designed to verify that shutdown of the
|
| // message loop does not cause crashes if there were pending
|
|
|