| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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) |
| OLD | NEW |