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" 6ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/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: 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) explicit RepeatingTimerTester(bool* did_run, const TimeDelta& delay) 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : did_run_(did_run), counter_(10), delay_(delay) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Start() { 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timer_.Start(FROM_HERE, delay_, this, &RepeatingTimerTester::Run); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Run() { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (--counter_ == 0) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *did_run_ = true; 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) timer_.Stop(); 79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->QuitWhenIdle(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* did_run_; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int counter_; 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TimeDelta delay_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RepeatingTimer<RepeatingTimerTester> timer_; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RunTest_OneShotTimer(base::MessageLoop::Type message_loop_type) { 89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(message_loop_type); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run = false; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester f(&did_run); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f.Start(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(did_run); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RunTest_OneShotTimer_Cancel(base::MessageLoop::Type message_loop_type) { 101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(message_loop_type); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run_a = false; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester* a = new OneShotTimerTester(&did_run_a); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should run before the timer expires. 107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->DeleteSoon(FROM_HERE, a); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now start the timer. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a->Start(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run_b = false; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester b(&did_run_b); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b.Start(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(did_run_a); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(did_run_b); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RunTest_OneShotSelfDeletingTimer( 123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::Type message_loop_type) { 124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(message_loop_type); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run = false; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotSelfDeletingTimerTester f(&did_run); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f.Start(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(did_run); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RunTest_RepeatingTimer(base::MessageLoop::Type message_loop_type, 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const TimeDelta& delay) { 137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(message_loop_type); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run = false; 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RepeatingTimerTester f(&did_run, delay); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f.Start(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(did_run); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RunTest_RepeatingTimer_Cancel(base::MessageLoop::Type message_loop_type, 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const TimeDelta& delay) { 150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(message_loop_type); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run_a = false; 153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RepeatingTimerTester* a = new RepeatingTimerTester(&did_run_a, delay); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should run before the timer expires. 156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->DeleteSoon(FROM_HERE, a); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now start the timer. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a->Start(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run_b = false; 162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RepeatingTimerTester b(&did_run_b, delay); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b.Start(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(did_run_a); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(did_run_b); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DelayTimerTarget { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DelayTimerTarget() 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : signaled_(false) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool signaled() const { return signaled_; } 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Signal() { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(signaled_); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signaled_ = true; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool signaled_; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RunTest_DelayTimer_NoCall(base::MessageLoop::Type message_loop_type) { 189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(message_loop_type); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If Delay is never called, the timer shouldn't go off. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DelayTimerTarget target; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DelayTimer<DelayTimerTarget> timer(FROM_HERE, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run = false; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester tester(&did_run); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester.Start(); 199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(target.signaled()); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RunTest_DelayTimer_OneCall(base::MessageLoop::Type message_loop_type) { 205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(message_loop_type); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DelayTimerTarget target; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DelayTimer<DelayTimerTarget> timer(FROM_HERE, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Reset(); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run = false; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester tester(&did_run, 100 /* milliseconds */); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester.Start(); 215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(target.signaled()); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ResetHelper { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetHelper(base::DelayTimer<DelayTimerTarget>* timer, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DelayTimerTarget* target) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : timer_(timer), 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(target) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset() { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(target_->signaled()); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer_->Reset(); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DelayTimer<DelayTimerTarget> *const timer_; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DelayTimerTarget *const target_; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RunTest_DelayTimer_Reset(base::MessageLoop::Type message_loop_type) { 238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(message_loop_type); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If Delay is never called, the timer shouldn't go off. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DelayTimerTarget target; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DelayTimer<DelayTimerTarget> timer(FROM_HERE, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeDelta::FromMilliseconds(50), &target, &DelayTimerTarget::Signal); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Reset(); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetHelper reset_helper(&timer, &target); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::OneShotTimer<ResetHelper> timers[20]; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(timers); ++i) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timers[i].Start(FROM_HERE, TimeDelta::FromMilliseconds(i * 10), 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &reset_helper, &ResetHelper::Reset); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run = false; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester tester(&did_run, 300); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tester.Start(); 257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(target.signaled()); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DelayTimerFatalTarget { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Signal() { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(false); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RunTest_DelayTimer_Deleted(base::MessageLoop::Type message_loop_type) { 271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(message_loop_type); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DelayTimerFatalTarget target; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DelayTimer<DelayTimerFatalTarget> timer( 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, TimeDelta::FromMilliseconds(50), &target, 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &DelayTimerFatalTarget::Signal); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Reset(); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the timer is deleted, the DelayTimerFatalTarget should never be 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100)); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//----------------------------------------------------------------------------- 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Each test is run against each type of MessageLoop. That way we are sure 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that timers work properly in all configurations. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, OneShotTimer) { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest_OneShotTimer(testing_message_loops[i]); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, OneShotTimer_Cancel) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest_OneShotTimer_Cancel(testing_message_loops[i]); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If underline timer does not handle properly, we will crash or fail 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in full page heap environment. 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, OneShotSelfDeletingTimer) { 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest_OneShotSelfDeletingTimer(testing_message_loops[i]); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, RepeatingTimer) { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RunTest_RepeatingTimer(testing_message_loops[i], 316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TimeDelta::FromMilliseconds(10)); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, RepeatingTimer_Cancel) { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RunTest_RepeatingTimer_Cancel(testing_message_loops[i], 323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TimeDelta::FromMilliseconds(10)); 324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST(TimerTest, RepeatingTimerZeroDelay) { 328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RunTest_RepeatingTimer(testing_message_loops[i], 330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TimeDelta::FromMilliseconds(0)); 331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST(TimerTest, RepeatingTimerZeroDelay_Cancel) { 335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RunTest_RepeatingTimer_Cancel(testing_message_loops[i], 337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TimeDelta::FromMilliseconds(0)); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, DelayTimer_NoCall) { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest_DelayTimer_NoCall(testing_message_loops[i]); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, DelayTimer_OneCall) { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest_DelayTimer_OneCall(testing_message_loops[i]); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It's flaky on the buildbot, http://crbug.com/25038. 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, DISABLED_DelayTimer_Reset) { 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest_DelayTimer_Reset(testing_message_loops[i]); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, DelayTimer_Deleted) { 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumTestingMessageLoops; i++) { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunTest_DelayTimer_Deleted(testing_message_loops[i]); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, MessageLoopShutdown) { 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This test is designed to verify that shutdown of the 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message loop does not cause crashes if there were pending 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // timers not yet fired. It may only trigger exceptions 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if debug heap checking is enabled. 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_run = false; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester a(&did_run); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester b(&did_run); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester c(&did_run); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OneShotTimerTester d(&did_run); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.Start(); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b.Start(); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } // MessageLoop destructs by falling out of scope. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } // OneShotTimers destruct. SHOULD NOT CRASH, of course. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(did_run); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TimerTestCallback() { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, NonRepeatIsRunning) { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Timer timer(false, false); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Start(FROM_HERE, TimeDelta::FromDays(1), 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TimerTestCallback)); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.IsRunning()); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Stop(); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.user_task().is_null()); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Timer timer(true, false); 405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Start(FROM_HERE, TimeDelta::FromDays(1), 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TimerTestCallback)); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.IsRunning()); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Stop(); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(timer.user_task().is_null()); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Reset(); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.IsRunning()); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, NonRepeatMessageLoopDeath) { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Timer timer(false, false); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Start(FROM_HERE, TimeDelta::FromDays(1), 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TimerTestCallback)); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.IsRunning()); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.user_task().is_null()); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, RetainRepeatIsRunning) { 432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Timer timer(FROM_HERE, TimeDelta::FromDays(1), 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TimerTestCallback), true); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Reset(); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.IsRunning()); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Stop(); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Reset(); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.IsRunning()); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, RetainNonRepeatIsRunning) { 445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Timer timer(FROM_HERE, TimeDelta::FromDays(1), 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TimerTestCallback), false); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Reset(); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.IsRunning()); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Stop(); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(timer.IsRunning()); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Reset(); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(timer.IsRunning()); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool g_callback_happened1 = false; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool g_callback_happened2 = false; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClearAllCallbackHappened() { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_callback_happened1 = false; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_callback_happened2 = false; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetCallbackHappened1() { 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_callback_happened1 = true; 469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->QuitWhenIdle(); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetCallbackHappened2() { 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_callback_happened2 = true; 474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->QuitWhenIdle(); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, ContinuationStopStart) { 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearAllCallbackHappened(); 480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Timer timer(false, false); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SetCallbackHappened1)); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Stop(); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(40), 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SetCallbackHappened2)); 487868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(g_callback_happened1); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(g_callback_happened2); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(TimerTest, ContinuationReset) { 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearAllCallbackHappened(); 496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Timer timer(false, false); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SetCallbackHappened1)); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timer.Reset(); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since Reset happened before task ran, the user_task must not be cleared: 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(timer.user_task().is_null()); 503868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->Run(); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(g_callback_happened1); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 509