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

Side by Side Diff: base/message_loop_unittest.cc

Issue 146006: Fire off work in outer run loops when inner loops exit (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 11 years, 6 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 | « no previous file | base/message_pump_mac.h » ('j') | 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 575 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 const wchar_t* const kMessageBoxTitle = L"MessageLoop Unit Test"; 586 const wchar_t* const kMessageBoxTitle = L"MessageLoop Unit Test";
587 587
588 enum TaskType { 588 enum TaskType {
589 MESSAGEBOX, 589 MESSAGEBOX,
590 ENDDIALOG, 590 ENDDIALOG,
591 RECURSIVE, 591 RECURSIVE,
592 TIMEDMESSAGELOOP, 592 TIMEDMESSAGELOOP,
593 QUITMESSAGELOOP, 593 QUITMESSAGELOOP,
594 ORDERERD, 594 ORDERERD,
595 PUMPS, 595 PUMPS,
596 SLEEP,
596 }; 597 };
597 598
598 // Saves the order in which the tasks executed. 599 // Saves the order in which the tasks executed.
599 struct TaskItem { 600 struct TaskItem {
600 TaskItem(TaskType t, int c, bool s) 601 TaskItem(TaskType t, int c, bool s)
601 : type(t), 602 : type(t),
602 cookie(c), 603 cookie(c),
603 start(s) { 604 start(s) {
604 } 605 }
605 606
(...skipping 10 matching lines...) Expand all
616 617
617 std::ostream& operator <<(std::ostream& os, TaskType type) { 618 std::ostream& operator <<(std::ostream& os, TaskType type) {
618 switch (type) { 619 switch (type) {
619 case MESSAGEBOX: os << "MESSAGEBOX"; break; 620 case MESSAGEBOX: os << "MESSAGEBOX"; break;
620 case ENDDIALOG: os << "ENDDIALOG"; break; 621 case ENDDIALOG: os << "ENDDIALOG"; break;
621 case RECURSIVE: os << "RECURSIVE"; break; 622 case RECURSIVE: os << "RECURSIVE"; break;
622 case TIMEDMESSAGELOOP: os << "TIMEDMESSAGELOOP"; break; 623 case TIMEDMESSAGELOOP: os << "TIMEDMESSAGELOOP"; break;
623 case QUITMESSAGELOOP: os << "QUITMESSAGELOOP"; break; 624 case QUITMESSAGELOOP: os << "QUITMESSAGELOOP"; break;
624 case ORDERERD: os << "ORDERERD"; break; 625 case ORDERERD: os << "ORDERERD"; break;
625 case PUMPS: os << "PUMPS"; break; 626 case PUMPS: os << "PUMPS"; break;
627 case SLEEP: os << "SLEEP"; break;
626 default: 628 default:
627 NOTREACHED(); 629 NOTREACHED();
628 os << "Unknown TaskType"; 630 os << "Unknown TaskType";
629 break; 631 break;
630 } 632 }
631 return os; 633 return os;
632 } 634 }
633 635
634 std::ostream& operator <<(std::ostream& os, const TaskItem& item) { 636 std::ostream& operator <<(std::ostream& os, const TaskItem& item) {
635 if (item.start) 637 if (item.start)
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
758 : OrderedTasks(order, QUITMESSAGELOOP, cookie) { 760 : OrderedTasks(order, QUITMESSAGELOOP, cookie) {
759 } 761 }
760 762
761 virtual void Run() { 763 virtual void Run() {
762 RunStart(); 764 RunStart();
763 MessageLoop::current()->Quit(); 765 MessageLoop::current()->Quit();
764 RunEnd(); 766 RunEnd();
765 } 767 }
766 }; 768 };
767 769
770 class SleepTask : public OrderedTasks {
771 public:
772 SleepTask(TaskList* order, int cookie, int ms)
773 : OrderedTasks(order, SLEEP, cookie), ms_(ms) {
774 }
775
776 virtual void Run() {
777 RunStart();
778 PlatformThread::Sleep(ms_);
779 RunEnd();
780 }
781
782 private:
783 int ms_;
784 };
785
768 #if defined(OS_WIN) 786 #if defined(OS_WIN)
769 787
770 class Recursive2Tasks : public Task { 788 class Recursive2Tasks : public Task {
771 public: 789 public:
772 Recursive2Tasks(MessageLoop* target, 790 Recursive2Tasks(MessageLoop* target,
773 HANDLE event, 791 HANDLE event,
774 bool expect_window, 792 bool expect_window,
775 TaskList* order, 793 TaskList* order,
776 bool is_reentrant) 794 bool is_reentrant)
777 : target_(target), 795 : target_(target),
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
1020 ASSERT_EQ(6U, order.size()); 1038 ASSERT_EQ(6U, order.size());
1021 EXPECT_EQ(order[ 0], TaskItem(ORDERERD, 1, true)); 1039 EXPECT_EQ(order[ 0], TaskItem(ORDERERD, 1, true));
1022 EXPECT_EQ(order[ 1], TaskItem(ORDERERD, 1, false)); 1040 EXPECT_EQ(order[ 1], TaskItem(ORDERERD, 1, false));
1023 EXPECT_EQ(order[ 2], TaskItem(ORDERERD, 2, true)); 1041 EXPECT_EQ(order[ 2], TaskItem(ORDERERD, 2, true));
1024 EXPECT_EQ(order[ 3], TaskItem(ORDERERD, 2, false)); 1042 EXPECT_EQ(order[ 3], TaskItem(ORDERERD, 2, false));
1025 EXPECT_EQ(order[ 4], TaskItem(QUITMESSAGELOOP, 3, true)); 1043 EXPECT_EQ(order[ 4], TaskItem(QUITMESSAGELOOP, 3, true));
1026 EXPECT_EQ(order[ 5], TaskItem(QUITMESSAGELOOP, 3, false)); 1044 EXPECT_EQ(order[ 5], TaskItem(QUITMESSAGELOOP, 3, false));
1027 } 1045 }
1028 1046
1029 // Tests that non nestable tasks don't run when there's code in the call stack. 1047 // Tests that non nestable tasks don't run when there's code in the call stack.
1030 void RunTest_NonNestableInNestedLoop(MessageLoop::Type message_loop_type) { 1048 void RunTest_NonNestableInNestedLoop(MessageLoop::Type message_loop_type,
1049 bool use_delayed) {
1031 MessageLoop loop(message_loop_type); 1050 MessageLoop loop(message_loop_type);
1032 1051
1033 TaskList order; 1052 TaskList order;
1034 1053
1035 MessageLoop::current()->PostTask(FROM_HERE, 1054 MessageLoop::current()->PostTask(FROM_HERE,
1036 new TaskThatPumps(&order, 1)); 1055 new TaskThatPumps(&order, 1));
1037 Task* task = new OrderedTasks(&order, 2); 1056 Task* task = new OrderedTasks(&order, 2);
1038 MessageLoop::current()->PostNonNestableTask(FROM_HERE, task); 1057 if (use_delayed) {
1058 MessageLoop::current()->PostNonNestableDelayedTask(FROM_HERE, task, 1);
1059 } else {
1060 MessageLoop::current()->PostNonNestableTask(FROM_HERE, task);
1061 }
1039 MessageLoop::current()->PostTask(FROM_HERE, new OrderedTasks(&order, 3)); 1062 MessageLoop::current()->PostTask(FROM_HERE, new OrderedTasks(&order, 3));
1040 MessageLoop::current()->PostTask(FROM_HERE, new OrderedTasks(&order, 4)); 1063 MessageLoop::current()->PostTask(FROM_HERE, new SleepTask(&order, 4, 50));
1041 Task* non_nestable_quit = new QuitTask(&order, 5); 1064 MessageLoop::current()->PostTask(FROM_HERE, new OrderedTasks(&order, 5));
1042 MessageLoop::current()->PostNonNestableTask(FROM_HERE, non_nestable_quit); 1065 Task* non_nestable_quit = new QuitTask(&order, 6);
1066 if (use_delayed) {
1067 MessageLoop::current()->PostNonNestableDelayedTask(FROM_HERE,
1068 non_nestable_quit,
1069 2);
1070 } else {
1071 MessageLoop::current()->PostNonNestableTask(FROM_HERE, non_nestable_quit);
1072 }
1043 1073
1044 MessageLoop::current()->Run(); 1074 MessageLoop::current()->Run();
1045 1075
1046 // FIFO order. 1076 // FIFO order.
1047 ASSERT_EQ(10U, order.size()); 1077 ASSERT_EQ(12U, order.size());
1048 EXPECT_EQ(order[ 0], TaskItem(PUMPS, 1, true)); 1078 EXPECT_EQ(order[ 0], TaskItem(PUMPS, 1, true));
1049 EXPECT_EQ(order[ 1], TaskItem(ORDERERD, 3, true)); 1079 EXPECT_EQ(order[ 1], TaskItem(ORDERERD, 3, true));
1050 EXPECT_EQ(order[ 2], TaskItem(ORDERERD, 3, false)); 1080 EXPECT_EQ(order[ 2], TaskItem(ORDERERD, 3, false));
1051 EXPECT_EQ(order[ 3], TaskItem(ORDERERD, 4, true)); 1081 EXPECT_EQ(order[ 3], TaskItem(SLEEP, 4, true));
1052 EXPECT_EQ(order[ 4], TaskItem(ORDERERD, 4, false)); 1082 EXPECT_EQ(order[ 4], TaskItem(SLEEP, 4, false));
1053 EXPECT_EQ(order[ 5], TaskItem(PUMPS, 1, false)); 1083 EXPECT_EQ(order[ 5], TaskItem(ORDERERD, 5, true));
1054 EXPECT_EQ(order[ 6], TaskItem(ORDERERD, 2, true)); 1084 EXPECT_EQ(order[ 6], TaskItem(ORDERERD, 5, false));
1055 EXPECT_EQ(order[ 7], TaskItem(ORDERERD, 2, false)); 1085 EXPECT_EQ(order[ 7], TaskItem(PUMPS, 1, false));
1056 EXPECT_EQ(order[ 8], TaskItem(QUITMESSAGELOOP, 5, true)); 1086 EXPECT_EQ(order[ 8], TaskItem(ORDERERD, 2, true));
1057 EXPECT_EQ(order[ 9], TaskItem(QUITMESSAGELOOP, 5, false)); 1087 EXPECT_EQ(order[ 9], TaskItem(ORDERERD, 2, false));
1088 EXPECT_EQ(order[10], TaskItem(QUITMESSAGELOOP, 6, true));
1089 EXPECT_EQ(order[11], TaskItem(QUITMESSAGELOOP, 6, false));
1058 } 1090 }
1059 1091
1060 #if defined(OS_WIN) 1092 #if defined(OS_WIN)
1061 1093
1062 class DispatcherImpl : public MessageLoopForUI::Dispatcher { 1094 class DispatcherImpl : public MessageLoopForUI::Dispatcher {
1063 public: 1095 public:
1064 DispatcherImpl() : dispatch_count_(0) {} 1096 DispatcherImpl() : dispatch_count_(0) {}
1065 1097
1066 virtual bool Dispatch(const MSG& msg) { 1098 virtual bool Dispatch(const MSG& msg) {
1067 ::TranslateMessage(&msg); 1099 ::TranslateMessage(&msg);
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
1358 } 1390 }
1359 #endif // defined(OS_WIN) 1391 #endif // defined(OS_WIN)
1360 1392
1361 TEST(MessageLoopTest, NonNestableWithNoNesting) { 1393 TEST(MessageLoopTest, NonNestableWithNoNesting) {
1362 RunTest_NonNestableWithNoNesting(MessageLoop::TYPE_DEFAULT); 1394 RunTest_NonNestableWithNoNesting(MessageLoop::TYPE_DEFAULT);
1363 RunTest_NonNestableWithNoNesting(MessageLoop::TYPE_UI); 1395 RunTest_NonNestableWithNoNesting(MessageLoop::TYPE_UI);
1364 RunTest_NonNestableWithNoNesting(MessageLoop::TYPE_IO); 1396 RunTest_NonNestableWithNoNesting(MessageLoop::TYPE_IO);
1365 } 1397 }
1366 1398
1367 TEST(MessageLoopTest, NonNestableInNestedLoop) { 1399 TEST(MessageLoopTest, NonNestableInNestedLoop) {
1368 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_DEFAULT); 1400 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_DEFAULT, false);
1369 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_UI); 1401 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_UI, false);
1370 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_IO); 1402 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_IO, false);
1403 }
1404
1405 TEST(MessageLoopTest, NonNestableDelayedInNestedLoop) {
1406 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_DEFAULT, true);
1407 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_UI, true);
1408 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_IO, true);
1371 } 1409 }
1372 1410
1373 #if defined(OS_WIN) 1411 #if defined(OS_WIN)
1374 TEST(MessageLoopTest, Dispatcher) { 1412 TEST(MessageLoopTest, Dispatcher) {
1375 // This test requires a UI loop 1413 // This test requires a UI loop
1376 RunTest_Dispatcher(MessageLoop::TYPE_UI); 1414 RunTest_Dispatcher(MessageLoop::TYPE_UI);
1377 } 1415 }
1378 1416
1379 TEST(MessageLoopTest, IOHandler) { 1417 TEST(MessageLoopTest, IOHandler) {
1380 RunTest_IOHandler(); 1418 RunTest_IOHandler();
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1449 message_loop.WatchFileDescriptor(fd, 1487 message_loop.WatchFileDescriptor(fd,
1450 true, MessageLoopForIO::WATCH_WRITE, &controller, &delegate); 1488 true, MessageLoopForIO::WATCH_WRITE, &controller, &delegate);
1451 controller.StopWatchingFileDescriptor(); 1489 controller.StopWatchingFileDescriptor();
1452 } 1490 }
1453 } 1491 }
1454 close(pipefds[0]); 1492 close(pipefds[0]);
1455 close(pipefds[1]); 1493 close(pipefds[1]);
1456 } 1494 }
1457 1495
1458 #endif // defined(OS_LINUX) 1496 #endif // defined(OS_LINUX)
OLDNEW
« no previous file with comments | « no previous file | base/message_pump_mac.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698