1// Copyright (c) 2009 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/common/worker_thread_ticker.h" 6 7#include "base/message_loop.h" 8#include "base/threading/platform_thread.h" 9#include "testing/gtest/include/gtest/gtest.h" 10 11namespace { 12 13class TestCallback : public WorkerThreadTicker::Callback { 14 public: 15 TestCallback() : counter_(0), message_loop_(MessageLoop::current()) { 16 } 17 18 virtual void OnTick() { 19 counter_++; 20 21 // Finish the test faster. 22 message_loop_->PostTask(FROM_HERE, new MessageLoop::QuitTask()); 23 } 24 25 int counter() const { return counter_; } 26 27 private: 28 int counter_; 29 MessageLoop* message_loop_; 30}; 31 32class LongCallback : public WorkerThreadTicker::Callback { 33 public: 34 virtual void OnTick() { 35 base::PlatformThread::Sleep(1500); 36 } 37}; 38 39void RunMessageLoopForAWhile() { 40 MessageLoop::current()->PostDelayedTask(FROM_HERE, 41 new MessageLoop::QuitTask(), 500); 42 MessageLoop::current()->Run(); 43} 44 45} // namespace 46 47TEST(WorkerThreadTickerTest, Basic) { 48 MessageLoop loop; 49 50 TestCallback callback; 51 WorkerThreadTicker ticker(50); 52 EXPECT_FALSE(ticker.IsRunning()); 53 EXPECT_TRUE(ticker.RegisterTickHandler(&callback)); 54 EXPECT_TRUE(ticker.UnregisterTickHandler(&callback)); 55 EXPECT_TRUE(ticker.Start()); 56 EXPECT_FALSE(ticker.RegisterTickHandler(&callback)); 57 EXPECT_FALSE(ticker.UnregisterTickHandler(&callback)); 58 EXPECT_TRUE(ticker.IsRunning()); 59 EXPECT_FALSE(ticker.Start()); // Can't start when it is running. 60 EXPECT_TRUE(ticker.Stop()); 61 EXPECT_FALSE(ticker.IsRunning()); 62 EXPECT_FALSE(ticker.Stop()); // Can't stop when it isn't running. 63} 64 65TEST(WorkerThreadTickerTest, Callback) { 66 MessageLoop loop; 67 68 TestCallback callback; 69 WorkerThreadTicker ticker(50); 70 ASSERT_TRUE(ticker.RegisterTickHandler(&callback)); 71 72 ASSERT_TRUE(ticker.Start()); 73 RunMessageLoopForAWhile(); 74 EXPECT_TRUE(callback.counter() > 0); 75 76 ASSERT_TRUE(ticker.Stop()); 77 const int counter_value = callback.counter(); 78 RunMessageLoopForAWhile(); 79 EXPECT_EQ(counter_value, callback.counter()); 80} 81 82TEST(WorkerThreadTickerTest, OutOfScope) { 83 MessageLoop loop; 84 85 TestCallback callback; 86 { 87 WorkerThreadTicker ticker(50); 88 ASSERT_TRUE(ticker.RegisterTickHandler(&callback)); 89 90 ASSERT_TRUE(ticker.Start()); 91 RunMessageLoopForAWhile(); 92 EXPECT_TRUE(callback.counter() > 0); 93 } 94 const int counter_value = callback.counter(); 95 RunMessageLoopForAWhile(); 96 EXPECT_EQ(counter_value, callback.counter()); 97} 98 99TEST(WorkerThreadTickerTest, LongCallback) { 100 MessageLoop loop; 101 102 LongCallback callback; 103 WorkerThreadTicker ticker(50); 104 ASSERT_TRUE(ticker.RegisterTickHandler(&callback)); 105 106 ASSERT_TRUE(ticker.Start()); 107 RunMessageLoopForAWhile(); 108} 109