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

Side by Side Diff: base/message_loop_unittest.cc

Issue 4041: Always use the topmost delayed task as the basis for our WM_TIMER.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « base/message_loop.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/logging.h" 5 #include "base/logging.h"
6 #include "base/message_loop.h" 6 #include "base/message_loop.h"
7 #include "base/platform_thread.h" 7 #include "base/platform_thread.h"
8 #include "base/ref_counted.h" 8 #include "base/ref_counted.h"
9 #include "base/thread.h" 9 #include "base/thread.h"
10 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 283
284 loop.PostDelayedTask( 284 loop.PostDelayedTask(
285 FROM_HERE, new RecordRunTimeTask(&run_time2, &num_tasks), 1); 285 FROM_HERE, new RecordRunTimeTask(&run_time2, &num_tasks), 1);
286 286
287 loop.Run(); 287 loop.Run();
288 EXPECT_EQ(0, num_tasks); 288 EXPECT_EQ(0, num_tasks);
289 289
290 EXPECT_TRUE(run_time2 > run_time1); 290 EXPECT_TRUE(run_time2 > run_time1);
291 } 291 }
292 292
293 void RunTest_PostDelayedTask_SharedTimer(MessageLoop::Type message_loop_type) {
294 MessageLoop loop(message_loop_type);
295
296 // Test that the interval of the timer, used to run the next delayed task, is
297 // set to a value corresponding to when the next delayed task should run.
298
299 // By setting num_tasks to 1, we ensure that the first task to run causes the
300 // run loop to exit.
301 int num_tasks = 1;
302 Time run_time1, run_time2;
303
304 loop.PostDelayedTask(
305 FROM_HERE, new RecordRunTimeTask(&run_time1, &num_tasks), 1000000);
306 loop.PostDelayedTask(
307 FROM_HERE, new RecordRunTimeTask(&run_time2, &num_tasks), 10);
308
309 Time start_time = Time::Now();
310
311 loop.Run();
312 EXPECT_EQ(0, num_tasks);
313
314 // Ensure that we ran in far less time than the slower timer.
315 TimeDelta run_time = Time::Now() - start_time;
316 EXPECT_GT(5000, run_time.InMilliseconds());
317
318 // In case both timers somehow run at nearly the same time, sleep a little
319 // and then run all pending to force them both to have run. This is just
320 // encouraging flakiness if there is any.
321 PlatformThread::Sleep(100);
322 loop.RunAllPending();
323
324 EXPECT_TRUE(run_time1.is_null());
325 EXPECT_FALSE(run_time2.is_null());
326 }
327
328 #if defined(OS_WIN)
329
330 class SubPumpTask : public Task {
331 public:
332 virtual void Run() {
333 MessageLoop::current()->SetNestableTasksAllowed(true);
334 MSG msg;
335 while (GetMessage(&msg, NULL, 0, 0)) {
336 TranslateMessage(&msg);
337 DispatchMessage(&msg);
338 }
339 MessageLoop::current()->Quit();
340 }
341 };
342
343 class SubPumpQuitTask : public Task {
344 public:
345 SubPumpQuitTask() {
346 }
347 virtual void Run() {
348 PostQuitMessage(0);
349 }
350 };
351
352 void RunTest_PostDelayedTask_SharedTimer_SubPump() {
353 MessageLoop loop(MessageLoop::TYPE_UI);
354
355 // Test that the interval of the timer, used to run the next delayed task, is
356 // set to a value corresponding to when the next delayed task should run.
357
358 // By setting num_tasks to 1, we ensure that the first task to run causes the
359 // run loop to exit.
360 int num_tasks = 1;
361 Time run_time;
362
363 loop.PostTask(FROM_HERE, new SubPumpTask());
364
365 // This very delayed task should never run.
366 loop.PostDelayedTask(
367 FROM_HERE, new RecordRunTimeTask(&run_time, &num_tasks), 1000000);
368
369 // This slightly delayed task should run from within SubPumpTask::Run().
370 loop.PostDelayedTask(
371 FROM_HERE, new SubPumpQuitTask(), 10);
372
373 Time start_time = Time::Now();
374
375 loop.Run();
376 EXPECT_EQ(1, num_tasks);
377
378 // Ensure that we ran in far less time than the slower timer.
379 TimeDelta run_time = Time::Now() - start_time;
380 EXPECT_GT(5000, run_time.InMilliseconds());
381
382 // In case both timers somehow run at nearly the same time, sleep a little
383 // and then run all pending to force them both to have run. This is just
384 // encouraging flakiness if there is any.
385 PlatformThread::Sleep(100);
386 loop.RunAllPending();
387
388 EXPECT_TRUE(run_time.is_null());
389 }
390
391 #endif // defined(OS_WIN)
392
293 class RecordDeletionTask : public Task { 393 class RecordDeletionTask : public Task {
294 public: 394 public:
295 RecordDeletionTask(Task* post_on_delete, bool* was_deleted) 395 RecordDeletionTask(Task* post_on_delete, bool* was_deleted)
296 : post_on_delete_(post_on_delete), was_deleted_(was_deleted) { 396 : post_on_delete_(post_on_delete), was_deleted_(was_deleted) {
297 } 397 }
298 ~RecordDeletionTask() { 398 ~RecordDeletionTask() {
299 *was_deleted_ = true; 399 *was_deleted_ = true;
300 if (post_on_delete_) 400 if (post_on_delete_)
301 MessageLoop::current()->PostTask(FROM_HERE, post_on_delete_); 401 MessageLoop::current()->PostTask(FROM_HERE, post_on_delete_);
302 } 402 }
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after
1088 RunTest_PostDelayedTask_InPostOrder_2(MessageLoop::TYPE_UI); 1188 RunTest_PostDelayedTask_InPostOrder_2(MessageLoop::TYPE_UI);
1089 RunTest_PostDelayedTask_InPostOrder_2(MessageLoop::TYPE_IO); 1189 RunTest_PostDelayedTask_InPostOrder_2(MessageLoop::TYPE_IO);
1090 } 1190 }
1091 1191
1092 TEST(MessageLoopTest, PostDelayedTask_InPostOrder_3) { 1192 TEST(MessageLoopTest, PostDelayedTask_InPostOrder_3) {
1093 RunTest_PostDelayedTask_InPostOrder_3(MessageLoop::TYPE_DEFAULT); 1193 RunTest_PostDelayedTask_InPostOrder_3(MessageLoop::TYPE_DEFAULT);
1094 RunTest_PostDelayedTask_InPostOrder_3(MessageLoop::TYPE_UI); 1194 RunTest_PostDelayedTask_InPostOrder_3(MessageLoop::TYPE_UI);
1095 RunTest_PostDelayedTask_InPostOrder_3(MessageLoop::TYPE_IO); 1195 RunTest_PostDelayedTask_InPostOrder_3(MessageLoop::TYPE_IO);
1096 } 1196 }
1097 1197
1198 TEST(MessageLoopTest, PostDelayedTask_SharedTimer) {
1199 RunTest_PostDelayedTask_SharedTimer(MessageLoop::TYPE_DEFAULT);
1200 RunTest_PostDelayedTask_SharedTimer(MessageLoop::TYPE_UI);
1201 RunTest_PostDelayedTask_SharedTimer(MessageLoop::TYPE_IO);
1202 }
1203
1204 #if defined(OS_WIN)
1205 TEST(MessageLoopTest, PostDelayedTask_SharedTimer_SubPump) {
1206 RunTest_PostDelayedTask_SharedTimer_SubPump();
1207 }
1208 #endif
1209
1098 // TODO(darin): re-enable these tests once MessageLoop supports them again. 1210 // TODO(darin): re-enable these tests once MessageLoop supports them again.
1099 #if 0 1211 #if 0
1100 TEST(MessageLoopTest, EnsureTaskDeletion) { 1212 TEST(MessageLoopTest, EnsureTaskDeletion) {
1101 RunTest_EnsureTaskDeletion(MessageLoop::TYPE_DEFAULT); 1213 RunTest_EnsureTaskDeletion(MessageLoop::TYPE_DEFAULT);
1102 RunTest_EnsureTaskDeletion(MessageLoop::TYPE_UI); 1214 RunTest_EnsureTaskDeletion(MessageLoop::TYPE_UI);
1103 RunTest_EnsureTaskDeletion(MessageLoop::TYPE_IO); 1215 RunTest_EnsureTaskDeletion(MessageLoop::TYPE_IO);
1104 } 1216 }
1105 1217
1106 TEST(MessageLoopTest, EnsureTaskDeletion_Chain) { 1218 TEST(MessageLoopTest, EnsureTaskDeletion_Chain) {
1107 RunTest_EnsureTaskDeletion_Chain(MessageLoop::TYPE_DEFAULT); 1219 RunTest_EnsureTaskDeletion_Chain(MessageLoop::TYPE_DEFAULT);
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1171 TEST(MessageLoopTest, AutoresetEvents) { 1283 TEST(MessageLoopTest, AutoresetEvents) {
1172 // This test requires an IO loop 1284 // This test requires an IO loop
1173 RunTest_AutoresetEvents(MessageLoop::TYPE_IO); 1285 RunTest_AutoresetEvents(MessageLoop::TYPE_IO);
1174 } 1286 }
1175 1287
1176 TEST(MessageLoopTest, Dispatcher) { 1288 TEST(MessageLoopTest, Dispatcher) {
1177 // This test requires a UI loop 1289 // This test requires a UI loop
1178 RunTest_Dispatcher(MessageLoop::TYPE_UI); 1290 RunTest_Dispatcher(MessageLoop::TYPE_UI);
1179 } 1291 }
1180 #endif // defined(OS_WIN) 1292 #endif // defined(OS_WIN)
OLDNEW
« no previous file with comments | « base/message_loop.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698