Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(654)

Side by Side Diff: base/timer_unittest.cc

Issue 21485: Bitmap transport (Closed)
Patch Set: Fix some mac crashes Created 11 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/message_loop.h" 5 #include "base/message_loop.h"
6 #include "base/scoped_ptr.h" 6 #include "base/scoped_ptr.h"
7 #include "base/task.h" 7 #include "base/task.h"
8 #include "base/timer.h" 8 #include "base/timer.h"
9 #include "testing/gtest/include/gtest/gtest.h" 9 #include "testing/gtest/include/gtest/gtest.h"
10 10
11 using base::TimeDelta; 11 using base::TimeDelta;
12 12
13 namespace { 13 namespace {
14 14
15 class OneShotTimerTester { 15 class OneShotTimerTester {
16 public: 16 public:
17 OneShotTimerTester(bool* did_run) : did_run_(did_run) { 17 OneShotTimerTester(bool* did_run, unsigned milliseconds = 10)
18 : did_run_(did_run),
19 delay_ms_(milliseconds) {
18 } 20 }
19 void Start() { 21 void Start() {
20 timer_.Start(TimeDelta::FromMilliseconds(10), this, 22 timer_.Start(TimeDelta::FromMilliseconds(delay_ms_), this,
21 &OneShotTimerTester::Run); 23 &OneShotTimerTester::Run);
22 } 24 }
23 private: 25 private:
24 void Run() { 26 void Run() {
25 *did_run_ = true; 27 *did_run_ = true;
26 MessageLoop::current()->Quit(); 28 MessageLoop::current()->Quit();
27 } 29 }
28 bool* did_run_; 30 bool* did_run_;
29 base::OneShotTimer<OneShotTimerTester> timer_; 31 base::OneShotTimer<OneShotTimerTester> timer_;
32 const unsigned delay_ms_;
30 }; 33 };
31 34
32 class OneShotSelfDeletingTimerTester { 35 class OneShotSelfDeletingTimerTester {
33 public: 36 public:
34 OneShotSelfDeletingTimerTester(bool* did_run) : 37 OneShotSelfDeletingTimerTester(bool* did_run) :
35 did_run_(did_run), 38 did_run_(did_run),
36 timer_(new base::OneShotTimer<OneShotSelfDeletingTimerTester>()) { 39 timer_(new base::OneShotTimer<OneShotSelfDeletingTimerTester>()) {
37 } 40 }
38 void Start() { 41 void Start() {
39 timer_->Start(TimeDelta::FromMilliseconds(10), this, 42 timer_->Start(TimeDelta::FromMilliseconds(10), this,
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 MessageLoop loop(message_loop_type); 134 MessageLoop loop(message_loop_type);
132 135
133 bool did_run_a = false; 136 bool did_run_a = false;
134 RepeatingTimerTester* a = new RepeatingTimerTester(&did_run_a); 137 RepeatingTimerTester* a = new RepeatingTimerTester(&did_run_a);
135 138
136 // This should run before the timer expires. 139 // This should run before the timer expires.
137 MessageLoop::current()->DeleteSoon(FROM_HERE, a); 140 MessageLoop::current()->DeleteSoon(FROM_HERE, a);
138 141
139 // Now start the timer. 142 // Now start the timer.
140 a->Start(); 143 a->Start();
141 144
142 bool did_run_b = false; 145 bool did_run_b = false;
143 RepeatingTimerTester b(&did_run_b); 146 RepeatingTimerTester b(&did_run_b);
144 b.Start(); 147 b.Start();
145 148
146 MessageLoop::current()->Run(); 149 MessageLoop::current()->Run();
147 150
148 EXPECT_FALSE(did_run_a); 151 EXPECT_FALSE(did_run_a);
149 EXPECT_TRUE(did_run_b); 152 EXPECT_TRUE(did_run_b);
150 } 153 }
151 154
155 class DelayTimerTarget {
156 public:
157 DelayTimerTarget()
158 : signaled_(false) {
159 }
160
161 bool signaled() const { return signaled_; }
162
163 void Signal() {
164 ASSERT_FALSE(signaled_);
165 signaled_ = true;
166 }
167
168 private:
169 bool signaled_;
170 };
171
172 void RunTest_DelayTimer_NoCall(MessageLoop::Type message_loop_type) {
173 MessageLoop loop(message_loop_type);
174
175 // If Delay is never called, the timer shouldn't go off.
176 DelayTimerTarget target;
177 base::DelayTimer<DelayTimerTarget> timer(
178 TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal);
179
180 bool did_run = false;
181 OneShotTimerTester tester(&did_run);
182 tester.Start();
183 MessageLoop::current()->Run();
184
185 ASSERT_FALSE(target.signaled());
186 }
187
188 void RunTest_DelayTimer_OneCall(MessageLoop::Type message_loop_type) {
189 MessageLoop loop(message_loop_type);
190
191 DelayTimerTarget target;
192 base::DelayTimer<DelayTimerTarget> timer(
193 TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal);
194 timer.Reset();
195
196 bool did_run = false;
197 OneShotTimerTester tester(&did_run, 100 /* milliseconds */);
198 tester.Start();
199 MessageLoop::current()->Run();
200
201 ASSERT_TRUE(target.signaled());
202 }
203
204 struct ResetHelper {
205 ResetHelper(base::DelayTimer<DelayTimerTarget>* timer,
206 DelayTimerTarget* target)
207 : timer_(timer),
208 target_(target) {
209 }
210
211 void Reset() {
212 ASSERT_FALSE(target_->signaled());
213 timer_->Reset();
214 }
215
216 private:
217 base::DelayTimer<DelayTimerTarget> *const timer_;
218 DelayTimerTarget *const target_;
219 };
220
221 void RunTest_DelayTimer_Reset(MessageLoop::Type message_loop_type) {
222 MessageLoop loop(message_loop_type);
223
224 // If Delay is never called, the timer shouldn't go off.
225 DelayTimerTarget target;
226 base::DelayTimer<DelayTimerTarget> timer(
227 TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal);
228 timer.Reset();
229
230 ResetHelper reset_helper(&timer, &target);
231
232 base::OneShotTimer<ResetHelper> timers[20];
233 for (size_t i = 0; i < arraysize(timers); ++i) {
234 timers[i].Start(TimeDelta::FromMilliseconds(i * 10), &reset_helper,
235 &ResetHelper::Reset);
236 }
237
238 bool did_run = false;
239 OneShotTimerTester tester(&did_run, 300);
240 tester.Start();
241 MessageLoop::current()->Run();
242
243 ASSERT_TRUE(target.signaled());
244 }
245
152 } // namespace 246 } // namespace
153 247
154 //----------------------------------------------------------------------------- 248 //-----------------------------------------------------------------------------
155 // Each test is run against each type of MessageLoop. That way we are sure 249 // Each test is run against each type of MessageLoop. That way we are sure
156 // that timers work properly in all configurations. 250 // that timers work properly in all configurations.
157 251
158 TEST(TimerTest, OneShotTimer) { 252 TEST(TimerTest, OneShotTimer) {
159 RunTest_OneShotTimer(MessageLoop::TYPE_DEFAULT); 253 RunTest_OneShotTimer(MessageLoop::TYPE_DEFAULT);
160 RunTest_OneShotTimer(MessageLoop::TYPE_UI); 254 RunTest_OneShotTimer(MessageLoop::TYPE_UI);
161 RunTest_OneShotTimer(MessageLoop::TYPE_IO); 255 RunTest_OneShotTimer(MessageLoop::TYPE_IO);
(...skipping 18 matching lines...) Expand all
180 RunTest_RepeatingTimer(MessageLoop::TYPE_UI); 274 RunTest_RepeatingTimer(MessageLoop::TYPE_UI);
181 RunTest_RepeatingTimer(MessageLoop::TYPE_IO); 275 RunTest_RepeatingTimer(MessageLoop::TYPE_IO);
182 } 276 }
183 277
184 TEST(TimerTest, RepeatingTimer_Cancel) { 278 TEST(TimerTest, RepeatingTimer_Cancel) {
185 RunTest_RepeatingTimer_Cancel(MessageLoop::TYPE_DEFAULT); 279 RunTest_RepeatingTimer_Cancel(MessageLoop::TYPE_DEFAULT);
186 RunTest_RepeatingTimer_Cancel(MessageLoop::TYPE_UI); 280 RunTest_RepeatingTimer_Cancel(MessageLoop::TYPE_UI);
187 RunTest_RepeatingTimer_Cancel(MessageLoop::TYPE_IO); 281 RunTest_RepeatingTimer_Cancel(MessageLoop::TYPE_IO);
188 } 282 }
189 283
284 TEST(TimerTest, DelayTimer_NoCall) {
285 RunTest_DelayTimer_NoCall(MessageLoop::TYPE_DEFAULT);
286 RunTest_DelayTimer_NoCall(MessageLoop::TYPE_UI);
287 RunTest_DelayTimer_NoCall(MessageLoop::TYPE_IO);
288 }
289
290 TEST(TimerTest, DelayTimer_OneCall) {
291 RunTest_DelayTimer_OneCall(MessageLoop::TYPE_DEFAULT);
292 RunTest_DelayTimer_OneCall(MessageLoop::TYPE_UI);
293 RunTest_DelayTimer_OneCall(MessageLoop::TYPE_IO);
294 }
295
296 TEST(TimerTest, DelayTimer_Reset) {
297 RunTest_DelayTimer_Reset(MessageLoop::TYPE_DEFAULT);
298 RunTest_DelayTimer_Reset(MessageLoop::TYPE_UI);
299 RunTest_DelayTimer_Reset(MessageLoop::TYPE_IO);
300 }
301
190 TEST(TimerTest, MessageLoopShutdown) { 302 TEST(TimerTest, MessageLoopShutdown) {
191 // This test is designed to verify that shutdown of the 303 // This test is designed to verify that shutdown of the
192 // message loop does not cause crashes if there were pending 304 // message loop does not cause crashes if there were pending
193 // timers not yet fired. It may only trigger exceptions 305 // timers not yet fired. It may only trigger exceptions
194 // if debug heap checking (or purify) is enabled. 306 // if debug heap checking (or purify) is enabled.
195 bool did_run = false; 307 bool did_run = false;
196 { 308 {
197 OneShotTimerTester a(&did_run); 309 OneShotTimerTester a(&did_run);
198 OneShotTimerTester b(&did_run); 310 OneShotTimerTester b(&did_run);
199 OneShotTimerTester c(&did_run); 311 OneShotTimerTester c(&did_run);
200 OneShotTimerTester d(&did_run); 312 OneShotTimerTester d(&did_run);
201 { 313 {
202 MessageLoop loop(MessageLoop::TYPE_DEFAULT); 314 MessageLoop loop(MessageLoop::TYPE_DEFAULT);
203 a.Start(); 315 a.Start();
204 b.Start(); 316 b.Start();
205 } // MessageLoop destructs by falling out of scope. 317 } // MessageLoop destructs by falling out of scope.
206 } // OneShotTimers destruct. SHOULD NOT CRASH, of course. 318 } // OneShotTimers destruct. SHOULD NOT CRASH, of course.
207 319
208 EXPECT_EQ(false, did_run); 320 EXPECT_EQ(false, did_run);
209 } 321 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698