| Index: base/timer_unittest.cc
|
| diff --git a/base/timer_unittest.cc b/base/timer_unittest.cc
|
| index 8c1d58e03c7bca44cd8976db569f6871958a1701..d441636c8bb8d993fa575e9381f99614d891e7d7 100644
|
| --- a/base/timer_unittest.cc
|
| +++ b/base/timer_unittest.cc
|
| @@ -14,10 +14,12 @@ namespace {
|
|
|
| class OneShotTimerTester {
|
| public:
|
| - OneShotTimerTester(bool* did_run) : did_run_(did_run) {
|
| + OneShotTimerTester(bool* did_run, unsigned milliseconds = 10)
|
| + : did_run_(did_run),
|
| + delay_ms_(milliseconds) {
|
| }
|
| void Start() {
|
| - timer_.Start(TimeDelta::FromMilliseconds(10), this,
|
| + timer_.Start(TimeDelta::FromMilliseconds(delay_ms_), this,
|
| &OneShotTimerTester::Run);
|
| }
|
| private:
|
| @@ -27,6 +29,7 @@ class OneShotTimerTester {
|
| }
|
| bool* did_run_;
|
| base::OneShotTimer<OneShotTimerTester> timer_;
|
| + const unsigned delay_ms_;
|
| };
|
|
|
| class OneShotSelfDeletingTimerTester {
|
| @@ -138,7 +141,7 @@ void RunTest_RepeatingTimer_Cancel(MessageLoop::Type message_loop_type) {
|
|
|
| // Now start the timer.
|
| a->Start();
|
| -
|
| +
|
| bool did_run_b = false;
|
| RepeatingTimerTester b(&did_run_b);
|
| b.Start();
|
| @@ -149,6 +152,97 @@ void RunTest_RepeatingTimer_Cancel(MessageLoop::Type message_loop_type) {
|
| EXPECT_TRUE(did_run_b);
|
| }
|
|
|
| +class DelayTimerTarget {
|
| + public:
|
| + DelayTimerTarget()
|
| + : signaled_(false) {
|
| + }
|
| +
|
| + bool signaled() const { return signaled_; }
|
| +
|
| + void Signal() {
|
| + ASSERT_FALSE(signaled_);
|
| + signaled_ = true;
|
| + }
|
| +
|
| + private:
|
| + bool signaled_;
|
| +};
|
| +
|
| +void RunTest_DelayTimer_NoCall(MessageLoop::Type message_loop_type) {
|
| + MessageLoop loop(message_loop_type);
|
| +
|
| + // If Delay is never called, the timer shouldn't go off.
|
| + DelayTimerTarget target;
|
| + base::DelayTimer<DelayTimerTarget> timer(
|
| + TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal);
|
| +
|
| + bool did_run = false;
|
| + OneShotTimerTester tester(&did_run);
|
| + tester.Start();
|
| + MessageLoop::current()->Run();
|
| +
|
| + ASSERT_FALSE(target.signaled());
|
| +}
|
| +
|
| +void RunTest_DelayTimer_OneCall(MessageLoop::Type message_loop_type) {
|
| + MessageLoop loop(message_loop_type);
|
| +
|
| + DelayTimerTarget target;
|
| + base::DelayTimer<DelayTimerTarget> timer(
|
| + TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal);
|
| + timer.Reset();
|
| +
|
| + bool did_run = false;
|
| + OneShotTimerTester tester(&did_run, 100 /* milliseconds */);
|
| + tester.Start();
|
| + MessageLoop::current()->Run();
|
| +
|
| + ASSERT_TRUE(target.signaled());
|
| +}
|
| +
|
| +struct ResetHelper {
|
| + ResetHelper(base::DelayTimer<DelayTimerTarget>* timer,
|
| + DelayTimerTarget* target)
|
| + : timer_(timer),
|
| + target_(target) {
|
| + }
|
| +
|
| + void Reset() {
|
| + ASSERT_FALSE(target_->signaled());
|
| + timer_->Reset();
|
| + }
|
| +
|
| + private:
|
| + base::DelayTimer<DelayTimerTarget> *const timer_;
|
| + DelayTimerTarget *const target_;
|
| +};
|
| +
|
| +void RunTest_DelayTimer_Reset(MessageLoop::Type message_loop_type) {
|
| + MessageLoop loop(message_loop_type);
|
| +
|
| + // If Delay is never called, the timer shouldn't go off.
|
| + DelayTimerTarget target;
|
| + base::DelayTimer<DelayTimerTarget> timer(
|
| + TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal);
|
| + timer.Reset();
|
| +
|
| + ResetHelper reset_helper(&timer, &target);
|
| +
|
| + base::OneShotTimer<ResetHelper> timers[20];
|
| + for (size_t i = 0; i < arraysize(timers); ++i) {
|
| + timers[i].Start(TimeDelta::FromMilliseconds(i * 10), &reset_helper,
|
| + &ResetHelper::Reset);
|
| + }
|
| +
|
| + bool did_run = false;
|
| + OneShotTimerTester tester(&did_run, 300);
|
| + tester.Start();
|
| + MessageLoop::current()->Run();
|
| +
|
| + ASSERT_TRUE(target.signaled());
|
| +}
|
| +
|
| } // namespace
|
|
|
| //-----------------------------------------------------------------------------
|
| @@ -187,6 +281,24 @@ TEST(TimerTest, RepeatingTimer_Cancel) {
|
| RunTest_RepeatingTimer_Cancel(MessageLoop::TYPE_IO);
|
| }
|
|
|
| +TEST(TimerTest, DelayTimer_NoCall) {
|
| + RunTest_DelayTimer_NoCall(MessageLoop::TYPE_DEFAULT);
|
| + RunTest_DelayTimer_NoCall(MessageLoop::TYPE_UI);
|
| + RunTest_DelayTimer_NoCall(MessageLoop::TYPE_IO);
|
| +}
|
| +
|
| +TEST(TimerTest, DelayTimer_OneCall) {
|
| + RunTest_DelayTimer_OneCall(MessageLoop::TYPE_DEFAULT);
|
| + RunTest_DelayTimer_OneCall(MessageLoop::TYPE_UI);
|
| + RunTest_DelayTimer_OneCall(MessageLoop::TYPE_IO);
|
| +}
|
| +
|
| +TEST(TimerTest, DelayTimer_Reset) {
|
| + RunTest_DelayTimer_Reset(MessageLoop::TYPE_DEFAULT);
|
| + RunTest_DelayTimer_Reset(MessageLoop::TYPE_UI);
|
| + RunTest_DelayTimer_Reset(MessageLoop::TYPE_IO);
|
| +}
|
| +
|
| TEST(TimerTest, MessageLoopShutdown) {
|
| // This test is designed to verify that shutdown of the
|
| // message loop does not cause crashes if there were pending
|
|
|