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