timer_unittest.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h" 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta; 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The message loops on which each timer should be tested. 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const base::MessageLoop::Type testing_message_loops[] = { 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::TYPE_DEFAULT, 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::TYPE_IO, 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_IOS) // iOS does not allow direct running of the UI loop. 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::TYPE_UI, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kNumTestingMessageLoops = arraysize(testing_message_loops); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OneShotTimerTester { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit OneShotTimerTester(bool* did_run, unsigned milliseconds = 10) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : did_run_(did_run), 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delay_ms_(milliseconds) { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Start() { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(delay_ms_), this, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &OneShotTimerTester::Run); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Run() { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *did_run_ = true; 38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->QuitWhenIdle(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* did_run_; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::OneShotTimer<OneShotTimerTester> timer_; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned delay_ms_; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OneShotSelfDeletingTimerTester { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit OneShotSelfDeletingTimerTester(bool* did_run) : 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_run_(did_run), 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer_(new base::OneShotTimer<OneShotSelfDeletingTimerTester>()) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Start() { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer_->Start(FROM_HERE, TimeDelta::FromMilliseconds(10), this, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &OneShotSelfDeletingTimerTester::Run); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Run() { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *did_run_ = true; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer_.reset(); 59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->QuitWhenIdle(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* did_run_; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::OneShotTimer<OneShotSelfDeletingTimerTester> > timer_; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RepeatingTimerTester { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RepeatingTimerTester(bool* did_run) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : did_run_(did_run), counter_(10) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Start() { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), this, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &RepeatingTimerTester::Run); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Run() { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (--counter_ == 0) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *did_run_ = true; 79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->QuitWhenIdle(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* did_run_; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int counter_; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RepeatingTimer<RepeatingTimerTester> timer_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RunTest_OneShotTimer(base::MessageLoop::Type message_loop_type) { 88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(message_loop_type); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run = false; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester f(&did_run); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f.Start(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(did_run); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RunTest_OneShotTimer_Cancel(base::MessageLoop::Type message_loop_type) { 100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(message_loop_type); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run_a = false; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester* a = new OneShotTimerTester(&did_run_a); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should run before the timer expires. 106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->DeleteSoon(FROM_HERE, a); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now start the timer. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a->Start(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run_b = false; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester b(&did_run_b); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b.Start(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(did_run_a); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(did_run_b); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RunTest_OneShotSelfDeletingTimer( 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::Type message_loop_type) { 123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(message_loop_type); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run = false; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotSelfDeletingTimerTester f(&did_run); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f.Start(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(did_run); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RunTest_RepeatingTimer(base::MessageLoop::Type message_loop_type) { 135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(message_loop_type); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run = false; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatingTimerTester f(&did_run); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f.Start(); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(did_run); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RunTest_RepeatingTimer_Cancel(base::MessageLoop::Type message_loop_type) { 147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(message_loop_type); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run_a = false; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatingTimerTester* a = new RepeatingTimerTester(&did_run_a); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should run before the timer expires. 153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->DeleteSoon(FROM_HERE, a); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now start the timer. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a->Start(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run_b = false; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatingTimerTester b(&did_run_b); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b.Start(); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(did_run_a); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(did_run_b); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DelayTimerTarget { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DelayTimerTarget() 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : signaled_(false) { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool signaled() const { return signaled_; } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Signal() { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(signaled_); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signaled_ = true; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool signaled_; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RunTest_DelayTimer_NoCall(base::MessageLoop::Type message_loop_type) { 186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(message_loop_type); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If Delay is never called, the timer shouldn't go off. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DelayTimerTarget target; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DelayTimer<DelayTimerTarget> timer(FROM_HERE, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run = false; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester tester(&did_run); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester.Start(); 196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(target.signaled()); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RunTest_DelayTimer_OneCall(base::MessageLoop::Type message_loop_type) { 202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(message_loop_type); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DelayTimerTarget target; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DelayTimer<DelayTimerTarget> timer(FROM_HERE, 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Reset(); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run = false; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester tester(&did_run, 100 /* milliseconds */); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester.Start(); 212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(target.signaled()); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ResetHelper { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetHelper(base::DelayTimer<DelayTimerTarget>* timer, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DelayTimerTarget* target) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : timer_(timer), 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(target) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset() { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(target_->signaled()); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer_->Reset(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DelayTimer<DelayTimerTarget> *const timer_; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DelayTimerTarget *const target_; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RunTest_DelayTimer_Reset(base::MessageLoop::Type message_loop_type) { 235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(message_loop_type); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If Delay is never called, the timer shouldn't go off. 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DelayTimerTarget target; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DelayTimer<DelayTimerTarget> timer(FROM_HERE, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta::FromMilliseconds(50), &target, &DelayTimerTarget::Signal); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Reset(); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetHelper reset_helper(&timer, &target); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::OneShotTimer<ResetHelper> timers[20]; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(timers); ++i) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timers[i].Start(FROM_HERE, TimeDelta::FromMilliseconds(i * 10), 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &reset_helper, &ResetHelper::Reset); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run = false; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester tester(&did_run, 300); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester.Start(); 254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(target.signaled()); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DelayTimerFatalTarget { 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Signal() { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(false); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RunTest_DelayTimer_Deleted(base::MessageLoop::Type message_loop_type) { 268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(message_loop_type); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DelayTimerFatalTarget target; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DelayTimer<DelayTimerFatalTarget> timer( 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, TimeDelta::FromMilliseconds(50), &target, 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &DelayTimerFatalTarget::Signal); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Reset(); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the timer is deleted, the DelayTimerFatalTarget should never be 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called. 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100)); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//----------------------------------------------------------------------------- 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Each test is run against each type of MessageLoop. That way we are sure 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that timers work properly in all configurations. 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, OneShotTimer) { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest_OneShotTimer(testing_message_loops[i]); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, OneShotTimer_Cancel) { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest_OneShotTimer_Cancel(testing_message_loops[i]); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If underline timer does not handle properly, we will crash or fail 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in full page heap environment. 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, OneShotSelfDeletingTimer) { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest_OneShotSelfDeletingTimer(testing_message_loops[i]); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, RepeatingTimer) { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest_RepeatingTimer(testing_message_loops[i]); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, RepeatingTimer_Cancel) { 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest_RepeatingTimer_Cancel(testing_message_loops[i]); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, DelayTimer_NoCall) { 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest_DelayTimer_NoCall(testing_message_loops[i]); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, DelayTimer_OneCall) { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest_DelayTimer_OneCall(testing_message_loops[i]); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It's flaky on the buildbot, http://crbug.com/25038. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, DISABLED_DelayTimer_Reset) { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest_DelayTimer_Reset(testing_message_loops[i]); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, DelayTimer_Deleted) { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest_DelayTimer_Deleted(testing_message_loops[i]); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, MessageLoopShutdown) { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This test is designed to verify that shutdown of the 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message loop does not cause crashes if there were pending 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // timers not yet fired. It may only trigger exceptions 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if debug heap checking is enabled. 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run = false; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester a(&did_run); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester b(&did_run); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester c(&did_run); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester d(&did_run); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.Start(); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b.Start(); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } // MessageLoop destructs by falling out of scope. 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } // OneShotTimers destruct. SHOULD NOT CRASH, of course. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(did_run); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TimerTestCallback() { 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, NonRepeatIsRunning) { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Timer timer(false, false); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Start(FROM_HERE, TimeDelta::FromDays(1), 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TimerTestCallback)); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.IsRunning()); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Stop(); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.user_task().is_null()); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Timer timer(true, false); 386868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Start(FROM_HERE, TimeDelta::FromDays(1), 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TimerTestCallback)); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.IsRunning()); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Stop(); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(timer.user_task().is_null()); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Reset(); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.IsRunning()); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, NonRepeatMessageLoopDeath) { 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Timer timer(false, false); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Start(FROM_HERE, TimeDelta::FromDays(1), 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TimerTestCallback)); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.IsRunning()); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.user_task().is_null()); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, RetainRepeatIsRunning) { 413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Timer timer(FROM_HERE, TimeDelta::FromDays(1), 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TimerTestCallback), true); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Reset(); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.IsRunning()); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Stop(); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Reset(); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.IsRunning()); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, RetainNonRepeatIsRunning) { 426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Timer timer(FROM_HERE, TimeDelta::FromDays(1), 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TimerTestCallback), false); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Reset(); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.IsRunning()); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Stop(); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Reset(); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.IsRunning()); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool g_callback_happened1 = false; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool g_callback_happened2 = false; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClearAllCallbackHappened() { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_callback_happened1 = false; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_callback_happened2 = false; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetCallbackHappened1() { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_callback_happened1 = true; 450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->QuitWhenIdle(); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetCallbackHappened2() { 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_callback_happened2 = true; 455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->QuitWhenIdle(); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, ContinuationStopStart) { 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearAllCallbackHappened(); 461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Timer timer(false, false); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SetCallbackHappened1)); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Stop(); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(40), 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SetCallbackHappened2)); 468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(g_callback_happened1); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(g_callback_happened2); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, ContinuationReset) { 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearAllCallbackHappened(); 477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Timer timer(false, false); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SetCallbackHappened1)); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Reset(); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since Reset happened before task ran, the user_task must not be cleared: 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(timer.user_task().is_null()); 484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(g_callback_happened1); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 490