| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/eintr_wrapper.h" | 10 #include "base/eintr_wrapper.h" |
| (...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 592 } | 592 } |
| 593 | 593 |
| 594 const wchar_t* const kMessageBoxTitle = L"MessageLoop Unit Test"; | 594 const wchar_t* const kMessageBoxTitle = L"MessageLoop Unit Test"; |
| 595 | 595 |
| 596 enum TaskType { | 596 enum TaskType { |
| 597 MESSAGEBOX, | 597 MESSAGEBOX, |
| 598 ENDDIALOG, | 598 ENDDIALOG, |
| 599 RECURSIVE, | 599 RECURSIVE, |
| 600 TIMEDMESSAGELOOP, | 600 TIMEDMESSAGELOOP, |
| 601 QUITMESSAGELOOP, | 601 QUITMESSAGELOOP, |
| 602 ORDERERD, | 602 ORDERED, |
| 603 PUMPS, | 603 PUMPS, |
| 604 SLEEP, | 604 SLEEP, |
| 605 RUNS, |
| 605 }; | 606 }; |
| 606 | 607 |
| 607 // Saves the order in which the tasks executed. | 608 // Saves the order in which the tasks executed. |
| 608 struct TaskItem { | 609 struct TaskItem { |
| 609 TaskItem(TaskType t, int c, bool s) | 610 TaskItem(TaskType t, int c, bool s) |
| 610 : type(t), | 611 : type(t), |
| 611 cookie(c), | 612 cookie(c), |
| 612 start(s) { | 613 start(s) { |
| 613 } | 614 } |
| 614 | 615 |
| 615 TaskType type; | 616 TaskType type; |
| 616 int cookie; | 617 int cookie; |
| 617 bool start; | 618 bool start; |
| 618 | 619 |
| 619 bool operator == (const TaskItem& other) const { | 620 bool operator == (const TaskItem& other) const { |
| 620 return type == other.type && cookie == other.cookie && start == other.start; | 621 return type == other.type && cookie == other.cookie && start == other.start; |
| 621 } | 622 } |
| 622 }; | 623 }; |
| 623 | 624 |
| 624 std::ostream& operator <<(std::ostream& os, TaskType type) { | 625 std::ostream& operator <<(std::ostream& os, TaskType type) { |
| 625 switch (type) { | 626 switch (type) { |
| 626 case MESSAGEBOX: os << "MESSAGEBOX"; break; | 627 case MESSAGEBOX: os << "MESSAGEBOX"; break; |
| 627 case ENDDIALOG: os << "ENDDIALOG"; break; | 628 case ENDDIALOG: os << "ENDDIALOG"; break; |
| 628 case RECURSIVE: os << "RECURSIVE"; break; | 629 case RECURSIVE: os << "RECURSIVE"; break; |
| 629 case TIMEDMESSAGELOOP: os << "TIMEDMESSAGELOOP"; break; | 630 case TIMEDMESSAGELOOP: os << "TIMEDMESSAGELOOP"; break; |
| 630 case QUITMESSAGELOOP: os << "QUITMESSAGELOOP"; break; | 631 case QUITMESSAGELOOP: os << "QUITMESSAGELOOP"; break; |
| 631 case ORDERERD: os << "ORDERERD"; break; | 632 case ORDERED: os << "ORDERED"; break; |
| 632 case PUMPS: os << "PUMPS"; break; | 633 case PUMPS: os << "PUMPS"; break; |
| 633 case SLEEP: os << "SLEEP"; break; | 634 case SLEEP: os << "SLEEP"; break; |
| 634 default: | 635 default: |
| 635 NOTREACHED(); | 636 NOTREACHED(); |
| 636 os << "Unknown TaskType"; | 637 os << "Unknown TaskType"; |
| 637 break; | 638 break; |
| 638 } | 639 } |
| 639 return os; | 640 return os; |
| 640 } | 641 } |
| 641 | 642 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 667 TaskItem Get(int n) { | 668 TaskItem Get(int n) { |
| 668 return task_list_[n]; | 669 return task_list_[n]; |
| 669 } | 670 } |
| 670 | 671 |
| 671 private: | 672 private: |
| 672 std::vector<TaskItem> task_list_; | 673 std::vector<TaskItem> task_list_; |
| 673 }; | 674 }; |
| 674 | 675 |
| 675 // Saves the order the tasks ran. | 676 // Saves the order the tasks ran. |
| 676 void OrderedFunc(TaskList* order, int cookie) { | 677 void OrderedFunc(TaskList* order, int cookie) { |
| 677 order->RecordStart(ORDERERD, cookie); | 678 order->RecordStart(ORDERED, cookie); |
| 678 order->RecordEnd(ORDERERD, cookie); | 679 order->RecordEnd(ORDERED, cookie); |
| 679 } | 680 } |
| 680 | 681 |
| 681 #if defined(OS_WIN) | 682 #if defined(OS_WIN) |
| 682 | 683 |
| 683 // MessageLoop implicitly start a "modal message loop". Modal dialog boxes, | 684 // MessageLoop implicitly start a "modal message loop". Modal dialog boxes, |
| 684 // common controls (like OpenFile) and StartDoc printing function can cause | 685 // common controls (like OpenFile) and StartDoc printing function can cause |
| 685 // implicit message loops. | 686 // implicit message loops. |
| 686 void MessageBoxFunc(TaskList* order, int cookie, bool is_reentrant) { | 687 void MessageBoxFunc(TaskList* order, int cookie, bool is_reentrant) { |
| 687 order->RecordStart(MESSAGEBOX, cookie); | 688 order->RecordStart(MESSAGEBOX, cookie); |
| 688 if (is_reentrant) | 689 if (is_reentrant) |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 840 MessageLoop::current()->Run(); | 841 MessageLoop::current()->Run(); |
| 841 | 842 |
| 842 // FIFO order. | 843 // FIFO order. |
| 843 ASSERT_EQ(16U, order.Size()); | 844 ASSERT_EQ(16U, order.Size()); |
| 844 EXPECT_EQ(order.Get(0), TaskItem(RECURSIVE, 1, true)); | 845 EXPECT_EQ(order.Get(0), TaskItem(RECURSIVE, 1, true)); |
| 845 EXPECT_EQ(order.Get(1), TaskItem(RECURSIVE, 1, false)); | 846 EXPECT_EQ(order.Get(1), TaskItem(RECURSIVE, 1, false)); |
| 846 EXPECT_EQ(order.Get(2), TaskItem(RECURSIVE, 2, true)); | 847 EXPECT_EQ(order.Get(2), TaskItem(RECURSIVE, 2, true)); |
| 847 EXPECT_EQ(order.Get(3), TaskItem(RECURSIVE, 2, false)); | 848 EXPECT_EQ(order.Get(3), TaskItem(RECURSIVE, 2, false)); |
| 848 EXPECT_EQ(order.Get(4), TaskItem(RECURSIVE, 1, true)); | 849 EXPECT_EQ(order.Get(4), TaskItem(RECURSIVE, 1, true)); |
| 849 EXPECT_EQ(order.Get(5), TaskItem(RECURSIVE, 1, false)); | 850 EXPECT_EQ(order.Get(5), TaskItem(RECURSIVE, 1, false)); |
| 850 EXPECT_EQ(order.Get(6), TaskItem(ORDERERD, 3, true)); | 851 EXPECT_EQ(order.Get(6), TaskItem(ORDERED, 3, true)); |
| 851 EXPECT_EQ(order.Get(7), TaskItem(ORDERERD, 3, false)); | 852 EXPECT_EQ(order.Get(7), TaskItem(ORDERED, 3, false)); |
| 852 EXPECT_EQ(order.Get(8), TaskItem(RECURSIVE, 2, true)); | 853 EXPECT_EQ(order.Get(8), TaskItem(RECURSIVE, 2, true)); |
| 853 EXPECT_EQ(order.Get(9), TaskItem(RECURSIVE, 2, false)); | 854 EXPECT_EQ(order.Get(9), TaskItem(RECURSIVE, 2, false)); |
| 854 EXPECT_EQ(order.Get(10), TaskItem(QUITMESSAGELOOP, 4, true)); | 855 EXPECT_EQ(order.Get(10), TaskItem(QUITMESSAGELOOP, 4, true)); |
| 855 EXPECT_EQ(order.Get(11), TaskItem(QUITMESSAGELOOP, 4, false)); | 856 EXPECT_EQ(order.Get(11), TaskItem(QUITMESSAGELOOP, 4, false)); |
| 856 EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 1, true)); | 857 EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 1, true)); |
| 857 EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 1, false)); | 858 EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 1, false)); |
| 858 EXPECT_EQ(order.Get(14), TaskItem(RECURSIVE, 2, true)); | 859 EXPECT_EQ(order.Get(14), TaskItem(RECURSIVE, 2, true)); |
| 859 EXPECT_EQ(order.Get(15), TaskItem(RECURSIVE, 2, false)); | 860 EXPECT_EQ(order.Get(15), TaskItem(RECURSIVE, 2, false)); |
| 860 } | 861 } |
| 861 | 862 |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 990 | 991 |
| 991 void FuncThatPumps(TaskList* order, int cookie) { | 992 void FuncThatPumps(TaskList* order, int cookie) { |
| 992 order->RecordStart(PUMPS, cookie); | 993 order->RecordStart(PUMPS, cookie); |
| 993 { | 994 { |
| 994 MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); | 995 MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); |
| 995 MessageLoop::current()->RunAllPending(); | 996 MessageLoop::current()->RunAllPending(); |
| 996 } | 997 } |
| 997 order->RecordEnd(PUMPS, cookie); | 998 order->RecordEnd(PUMPS, cookie); |
| 998 } | 999 } |
| 999 | 1000 |
| 1001 void FuncThatRuns(TaskList* order, int cookie, MessageLoop::RunID run_id) { |
| 1002 order->RecordStart(RUNS, cookie); |
| 1003 { |
| 1004 MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); |
| 1005 MessageLoop::current()->RunWithID(run_id); |
| 1006 } |
| 1007 order->RecordEnd(RUNS, cookie); |
| 1008 } |
| 1009 |
| 1000 // Tests that non nestable tasks run in FIFO if there are no nested loops. | 1010 // Tests that non nestable tasks run in FIFO if there are no nested loops. |
| 1001 void RunTest_NonNestableWithNoNesting( | 1011 void RunTest_NonNestableWithNoNesting( |
| 1002 MessageLoop::Type message_loop_type) { | 1012 MessageLoop::Type message_loop_type) { |
| 1003 MessageLoop loop(message_loop_type); | 1013 MessageLoop loop(message_loop_type); |
| 1004 | 1014 |
| 1005 TaskList order; | 1015 TaskList order; |
| 1006 | 1016 |
| 1007 MessageLoop::current()->PostNonNestableTask( | 1017 MessageLoop::current()->PostNonNestableTask( |
| 1008 FROM_HERE, | 1018 FROM_HERE, |
| 1009 base::Bind(&OrderedFunc, &order, 1)); | 1019 base::Bind(&OrderedFunc, &order, 1)); |
| 1010 MessageLoop::current()->PostTask(FROM_HERE, | 1020 MessageLoop::current()->PostTask(FROM_HERE, |
| 1011 base::Bind(&OrderedFunc, &order, 2)); | 1021 base::Bind(&OrderedFunc, &order, 2)); |
| 1012 MessageLoop::current()->PostTask(FROM_HERE, | 1022 MessageLoop::current()->PostTask(FROM_HERE, |
| 1013 base::Bind(&QuitFunc, &order, 3)); | 1023 base::Bind(&QuitFunc, &order, 3)); |
| 1014 MessageLoop::current()->Run(); | 1024 MessageLoop::current()->Run(); |
| 1015 | 1025 |
| 1016 // FIFO order. | 1026 // FIFO order. |
| 1017 ASSERT_EQ(6U, order.Size()); | 1027 ASSERT_EQ(6U, order.Size()); |
| 1018 EXPECT_EQ(order.Get(0), TaskItem(ORDERERD, 1, true)); | 1028 EXPECT_EQ(order.Get(0), TaskItem(ORDERED, 1, true)); |
| 1019 EXPECT_EQ(order.Get(1), TaskItem(ORDERERD, 1, false)); | 1029 EXPECT_EQ(order.Get(1), TaskItem(ORDERED, 1, false)); |
| 1020 EXPECT_EQ(order.Get(2), TaskItem(ORDERERD, 2, true)); | 1030 EXPECT_EQ(order.Get(2), TaskItem(ORDERED, 2, true)); |
| 1021 EXPECT_EQ(order.Get(3), TaskItem(ORDERERD, 2, false)); | 1031 EXPECT_EQ(order.Get(3), TaskItem(ORDERED, 2, false)); |
| 1022 EXPECT_EQ(order.Get(4), TaskItem(QUITMESSAGELOOP, 3, true)); | 1032 EXPECT_EQ(order.Get(4), TaskItem(QUITMESSAGELOOP, 3, true)); |
| 1023 EXPECT_EQ(order.Get(5), TaskItem(QUITMESSAGELOOP, 3, false)); | 1033 EXPECT_EQ(order.Get(5), TaskItem(QUITMESSAGELOOP, 3, false)); |
| 1024 } | 1034 } |
| 1025 | 1035 |
| 1026 // Tests that non nestable tasks don't run when there's code in the call stack. | 1036 // Tests that non nestable tasks don't run when there's code in the call stack. |
| 1027 void RunTest_NonNestableInNestedLoop(MessageLoop::Type message_loop_type, | 1037 void RunTest_NonNestableInNestedLoop(MessageLoop::Type message_loop_type, |
| 1028 bool use_delayed) { | 1038 bool use_delayed) { |
| 1029 MessageLoop loop(message_loop_type); | 1039 MessageLoop loop(message_loop_type); |
| 1030 | 1040 |
| 1031 TaskList order; | 1041 TaskList order; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1059 MessageLoop::current()->PostNonNestableTask( | 1069 MessageLoop::current()->PostNonNestableTask( |
| 1060 FROM_HERE, | 1070 FROM_HERE, |
| 1061 base::Bind(&QuitFunc, &order, 6)); | 1071 base::Bind(&QuitFunc, &order, 6)); |
| 1062 } | 1072 } |
| 1063 | 1073 |
| 1064 MessageLoop::current()->Run(); | 1074 MessageLoop::current()->Run(); |
| 1065 | 1075 |
| 1066 // FIFO order. | 1076 // FIFO order. |
| 1067 ASSERT_EQ(12U, order.Size()); | 1077 ASSERT_EQ(12U, order.Size()); |
| 1068 EXPECT_EQ(order.Get(0), TaskItem(PUMPS, 1, true)); | 1078 EXPECT_EQ(order.Get(0), TaskItem(PUMPS, 1, true)); |
| 1069 EXPECT_EQ(order.Get(1), TaskItem(ORDERERD, 3, true)); | 1079 EXPECT_EQ(order.Get(1), TaskItem(ORDERED, 3, true)); |
| 1070 EXPECT_EQ(order.Get(2), TaskItem(ORDERERD, 3, false)); | 1080 EXPECT_EQ(order.Get(2), TaskItem(ORDERED, 3, false)); |
| 1071 EXPECT_EQ(order.Get(3), TaskItem(SLEEP, 4, true)); | 1081 EXPECT_EQ(order.Get(3), TaskItem(SLEEP, 4, true)); |
| 1072 EXPECT_EQ(order.Get(4), TaskItem(SLEEP, 4, false)); | 1082 EXPECT_EQ(order.Get(4), TaskItem(SLEEP, 4, false)); |
| 1073 EXPECT_EQ(order.Get(5), TaskItem(ORDERERD, 5, true)); | 1083 EXPECT_EQ(order.Get(5), TaskItem(ORDERED, 5, true)); |
| 1074 EXPECT_EQ(order.Get(6), TaskItem(ORDERERD, 5, false)); | 1084 EXPECT_EQ(order.Get(6), TaskItem(ORDERED, 5, false)); |
| 1075 EXPECT_EQ(order.Get(7), TaskItem(PUMPS, 1, false)); | 1085 EXPECT_EQ(order.Get(7), TaskItem(PUMPS, 1, false)); |
| 1076 EXPECT_EQ(order.Get(8), TaskItem(ORDERERD, 2, true)); | 1086 EXPECT_EQ(order.Get(8), TaskItem(ORDERED, 2, true)); |
| 1077 EXPECT_EQ(order.Get(9), TaskItem(ORDERERD, 2, false)); | 1087 EXPECT_EQ(order.Get(9), TaskItem(ORDERED, 2, false)); |
| 1078 EXPECT_EQ(order.Get(10), TaskItem(QUITMESSAGELOOP, 6, true)); | 1088 EXPECT_EQ(order.Get(10), TaskItem(QUITMESSAGELOOP, 6, true)); |
| 1079 EXPECT_EQ(order.Get(11), TaskItem(QUITMESSAGELOOP, 6, false)); | 1089 EXPECT_EQ(order.Get(11), TaskItem(QUITMESSAGELOOP, 6, false)); |
| 1080 } | 1090 } |
| 1081 | 1091 |
| 1092 // Tests QuitNowWithID only quits the corresponding MessageLoop::Run. |
| 1093 void RunTest_QuitNow(MessageLoop::Type message_loop_type) { |
| 1094 MessageLoop loop(message_loop_type); |
| 1095 |
| 1096 TaskList order; |
| 1097 |
| 1098 MessageLoop::RunID nested_run_id = MessageLoop::current()->GetRunID(); |
| 1099 |
| 1100 MessageLoop::current()->PostTask( |
| 1101 FROM_HERE, base::Bind(&FuncThatRuns, &order, 1, nested_run_id)); |
| 1102 MessageLoop::current()->PostTask( |
| 1103 FROM_HERE, base::Bind(&OrderedFunc, &order, 2)); |
| 1104 MessageLoop::current()->PostTask( |
| 1105 FROM_HERE, MessageLoop::QuitNowClosure()); |
| 1106 MessageLoop::current()->PostTask( |
| 1107 FROM_HERE, base::Bind(&OrderedFunc, &order, 3)); |
| 1108 MessageLoop::current()->PostTask( |
| 1109 FROM_HERE, MessageLoop::QuitNowClosure()); |
| 1110 MessageLoop::current()->PostTask( |
| 1111 FROM_HERE, base::Bind(&OrderedFunc, &order, 4)); // never runs |
| 1112 |
| 1113 MessageLoop::current()->Run(); |
| 1114 |
| 1115 ASSERT_EQ(6U, order.Size()); |
| 1116 int task_index = 0; |
| 1117 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true)); |
| 1118 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true)); |
| 1119 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false)); |
| 1120 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false)); |
| 1121 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 3, true)); |
| 1122 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 3, false)); |
| 1123 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); |
| 1124 } |
| 1125 |
| 1126 // Tests QuitNowWithID works before RunWithID. |
| 1127 void RunTest_QuitNowWithIDOrderBefore(MessageLoop::Type message_loop_type) { |
| 1128 MessageLoop loop(message_loop_type); |
| 1129 |
| 1130 TaskList order; |
| 1131 |
| 1132 MessageLoop::RunID run_id = MessageLoop::current()->GetRunID(); |
| 1133 |
| 1134 MessageLoop::current()->QuitNowWithID(run_id); |
| 1135 |
| 1136 MessageLoop::current()->PostTask( |
| 1137 FROM_HERE, base::Bind(&OrderedFunc, &order, 1)); // never runs |
| 1138 MessageLoop::current()->PostTask( |
| 1139 FROM_HERE, MessageLoop::QuitNowClosure()); // never runs |
| 1140 |
| 1141 MessageLoop::current()->RunWithID(run_id); |
| 1142 |
| 1143 ASSERT_EQ(0U, order.Size()); |
| 1144 } |
| 1145 |
| 1146 // Tests QuitNowWithID works during RunWithID. |
| 1147 void RunTest_QuitNowWithIDOrderDuring(MessageLoop::Type message_loop_type) { |
| 1148 MessageLoop loop(message_loop_type); |
| 1149 |
| 1150 TaskList order; |
| 1151 |
| 1152 MessageLoop::RunID run_id = MessageLoop::current()->GetRunID(); |
| 1153 |
| 1154 MessageLoop::current()->PostTask( |
| 1155 FROM_HERE, base::Bind(&OrderedFunc, &order, 1)); |
| 1156 MessageLoop::current()->PostTask( |
| 1157 FROM_HERE, MessageLoop::QuitNowWithIDClosure(run_id)); |
| 1158 MessageLoop::current()->PostTask( |
| 1159 FROM_HERE, base::Bind(&OrderedFunc, &order, 2)); // never runs |
| 1160 MessageLoop::current()->PostTask( |
| 1161 FROM_HERE, MessageLoop::QuitNowClosure()); // never runs |
| 1162 |
| 1163 MessageLoop::current()->RunWithID(run_id); |
| 1164 |
| 1165 ASSERT_EQ(2U, order.Size()); |
| 1166 int task_index = 0; |
| 1167 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 1, true)); |
| 1168 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 1, false)); |
| 1169 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); |
| 1170 } |
| 1171 |
| 1172 // Tests QuitNowWithID works after RunWithID. |
| 1173 void RunTest_QuitNowWithIDOrderAfter(MessageLoop::Type message_loop_type) { |
| 1174 MessageLoop loop(message_loop_type); |
| 1175 |
| 1176 TaskList order; |
| 1177 |
| 1178 MessageLoop::RunID run_id = MessageLoop::current()->GetRunID(); |
| 1179 |
| 1180 MessageLoop::current()->PostTask( |
| 1181 FROM_HERE, base::Bind(&FuncThatRuns, &order, 1, run_id)); |
| 1182 MessageLoop::current()->PostTask( |
| 1183 FROM_HERE, base::Bind(&OrderedFunc, &order, 2)); |
| 1184 MessageLoop::current()->PostTask( |
| 1185 FROM_HERE, MessageLoop::QuitNowClosure()); |
| 1186 MessageLoop::current()->PostTask( |
| 1187 FROM_HERE, base::Bind(&OrderedFunc, &order, 3)); |
| 1188 MessageLoop::current()->PostTask( |
| 1189 FROM_HERE, MessageLoop::QuitNowWithIDClosure(run_id)); // has no affect |
| 1190 MessageLoop::current()->PostTask( |
| 1191 FROM_HERE, base::Bind(&OrderedFunc, &order, 4)); |
| 1192 MessageLoop::current()->PostTask( |
| 1193 FROM_HERE, MessageLoop::QuitNowClosure()); |
| 1194 |
| 1195 MessageLoop::current()->Run(); |
| 1196 |
| 1197 ASSERT_EQ(8U, order.Size()); |
| 1198 int task_index = 0; |
| 1199 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true)); |
| 1200 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true)); |
| 1201 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false)); |
| 1202 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false)); |
| 1203 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 3, true)); |
| 1204 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 3, false)); |
| 1205 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 4, true)); |
| 1206 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 4, false)); |
| 1207 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); |
| 1208 } |
| 1209 |
| 1210 // Tests QuitNowWithID only quits the corresponding MessageLoop::Run. |
| 1211 void RunTest_QuitNowWithIDTop(MessageLoop::Type message_loop_type) { |
| 1212 MessageLoop loop(message_loop_type); |
| 1213 |
| 1214 TaskList order; |
| 1215 |
| 1216 MessageLoop::RunID top_most_run_id = MessageLoop::current()->GetRunID(); |
| 1217 MessageLoop::RunID nested_run_id = MessageLoop::current()->GetRunID(); |
| 1218 |
| 1219 MessageLoop::current()->PostTask( |
| 1220 FROM_HERE, base::Bind(&FuncThatRuns, &order, 1, nested_run_id)); |
| 1221 MessageLoop::current()->PostTask( |
| 1222 FROM_HERE, MessageLoop::QuitNowWithIDClosure(top_most_run_id)); |
| 1223 MessageLoop::current()->PostTask( |
| 1224 FROM_HERE, base::Bind(&OrderedFunc, &order, 2)); |
| 1225 MessageLoop::current()->PostTask( |
| 1226 FROM_HERE, MessageLoop::QuitNowWithIDClosure(nested_run_id)); |
| 1227 |
| 1228 MessageLoop::current()->RunWithID(top_most_run_id); |
| 1229 |
| 1230 ASSERT_EQ(4U, order.Size()); |
| 1231 int task_index = 0; |
| 1232 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true)); |
| 1233 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true)); |
| 1234 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false)); |
| 1235 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false)); |
| 1236 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); |
| 1237 } |
| 1238 |
| 1239 // Tests QuitNowWithID only quits the corresponding MessageLoop::Run. |
| 1240 void RunTest_QuitNowWithIDNested(MessageLoop::Type message_loop_type) { |
| 1241 MessageLoop loop(message_loop_type); |
| 1242 |
| 1243 TaskList order; |
| 1244 |
| 1245 MessageLoop::RunID top_most_run_id = MessageLoop::current()->GetRunID(); |
| 1246 MessageLoop::RunID nested_run_id = MessageLoop::current()->GetRunID(); |
| 1247 |
| 1248 MessageLoop::current()->PostTask( |
| 1249 FROM_HERE, base::Bind(&FuncThatRuns, &order, 1, nested_run_id)); |
| 1250 MessageLoop::current()->PostTask( |
| 1251 FROM_HERE, MessageLoop::QuitNowWithIDClosure(nested_run_id)); |
| 1252 MessageLoop::current()->PostTask( |
| 1253 FROM_HERE, base::Bind(&OrderedFunc, &order, 2)); |
| 1254 MessageLoop::current()->PostTask( |
| 1255 FROM_HERE, MessageLoop::QuitNowWithIDClosure(top_most_run_id)); |
| 1256 |
| 1257 MessageLoop::current()->RunWithID(top_most_run_id); |
| 1258 |
| 1259 ASSERT_EQ(4U, order.Size()); |
| 1260 int task_index = 0; |
| 1261 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true)); |
| 1262 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false)); |
| 1263 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true)); |
| 1264 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false)); |
| 1265 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); |
| 1266 } |
| 1267 |
| 1268 // Tests QuitNowWithID only quits the corresponding MessageLoop::Run. |
| 1269 void RunTest_QuitNowWithIDBogus(MessageLoop::Type message_loop_type) { |
| 1270 MessageLoop loop(message_loop_type); |
| 1271 |
| 1272 TaskList order; |
| 1273 |
| 1274 MessageLoop::RunID top_most_run_id = MessageLoop::current()->GetRunID(); |
| 1275 MessageLoop::RunID nested_run_id = MessageLoop::current()->GetRunID(); |
| 1276 MessageLoop::RunID bogus_run_id = MessageLoop::current()->GetRunID(); |
| 1277 |
| 1278 MessageLoop::current()->PostTask( |
| 1279 FROM_HERE, base::Bind(&FuncThatRuns, &order, 1, nested_run_id)); |
| 1280 MessageLoop::current()->PostTask( |
| 1281 FROM_HERE, MessageLoop::QuitNowWithIDClosure(bogus_run_id)); |
| 1282 MessageLoop::current()->PostTask( |
| 1283 FROM_HERE, base::Bind(&OrderedFunc, &order, 2)); |
| 1284 MessageLoop::current()->PostTask( |
| 1285 FROM_HERE, MessageLoop::QuitNowWithIDClosure(top_most_run_id)); |
| 1286 MessageLoop::current()->PostTask( |
| 1287 FROM_HERE, MessageLoop::QuitNowWithIDClosure(nested_run_id)); |
| 1288 |
| 1289 MessageLoop::current()->RunWithID(top_most_run_id); |
| 1290 |
| 1291 ASSERT_EQ(4U, order.Size()); |
| 1292 int task_index = 0; |
| 1293 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true)); |
| 1294 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true)); |
| 1295 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false)); |
| 1296 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false)); |
| 1297 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); |
| 1298 } |
| 1299 |
| 1300 // Tests QuitNowWithID only quits the corresponding MessageLoop::Run. |
| 1301 void RunTest_QuitNowWithIDDeep(MessageLoop::Type message_loop_type) { |
| 1302 MessageLoop loop(message_loop_type); |
| 1303 |
| 1304 TaskList order; |
| 1305 |
| 1306 MessageLoop::RunID top_most_run_id = MessageLoop::current()->GetRunID(); |
| 1307 MessageLoop::RunID nested_run_id1 = MessageLoop::current()->GetRunID(); |
| 1308 MessageLoop::RunID nested_run_id2 = MessageLoop::current()->GetRunID(); |
| 1309 MessageLoop::RunID nested_run_id3 = MessageLoop::current()->GetRunID(); |
| 1310 MessageLoop::RunID nested_run_id4 = MessageLoop::current()->GetRunID(); |
| 1311 |
| 1312 MessageLoop::current()->PostTask( |
| 1313 FROM_HERE, base::Bind(&FuncThatRuns, &order, 1, nested_run_id1)); |
| 1314 MessageLoop::current()->PostTask( |
| 1315 FROM_HERE, base::Bind(&FuncThatRuns, &order, 2, nested_run_id2)); |
| 1316 MessageLoop::current()->PostTask( |
| 1317 FROM_HERE, base::Bind(&FuncThatRuns, &order, 3, nested_run_id3)); |
| 1318 MessageLoop::current()->PostTask( |
| 1319 FROM_HERE, base::Bind(&FuncThatRuns, &order, 4, nested_run_id4)); |
| 1320 MessageLoop::current()->PostTask( |
| 1321 FROM_HERE, base::Bind(&OrderedFunc, &order, 5)); |
| 1322 MessageLoop::current()->PostTask( |
| 1323 FROM_HERE, MessageLoop::QuitNowWithIDClosure(top_most_run_id)); |
| 1324 MessageLoop::current()->PostTask( |
| 1325 FROM_HERE, base::Bind(&OrderedFunc, &order, 6)); |
| 1326 MessageLoop::current()->PostTask( |
| 1327 FROM_HERE, MessageLoop::QuitNowWithIDClosure(nested_run_id1)); |
| 1328 MessageLoop::current()->PostTask( |
| 1329 FROM_HERE, base::Bind(&OrderedFunc, &order, 7)); |
| 1330 MessageLoop::current()->PostTask( |
| 1331 FROM_HERE, MessageLoop::QuitNowWithIDClosure(nested_run_id2)); |
| 1332 MessageLoop::current()->PostTask( |
| 1333 FROM_HERE, base::Bind(&OrderedFunc, &order, 8)); |
| 1334 MessageLoop::current()->PostTask( |
| 1335 FROM_HERE, MessageLoop::QuitNowWithIDClosure(nested_run_id3)); |
| 1336 MessageLoop::current()->PostTask( |
| 1337 FROM_HERE, base::Bind(&OrderedFunc, &order, 9)); |
| 1338 MessageLoop::current()->PostTask( |
| 1339 FROM_HERE, MessageLoop::QuitNowWithIDClosure(nested_run_id4)); |
| 1340 MessageLoop::current()->PostTask( |
| 1341 FROM_HERE, base::Bind(&OrderedFunc, &order, 10)); |
| 1342 |
| 1343 MessageLoop::current()->RunWithID(top_most_run_id); |
| 1344 |
| 1345 ASSERT_EQ(18U, order.Size()); |
| 1346 int task_index = 0; |
| 1347 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true)); |
| 1348 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 2, true)); |
| 1349 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 3, true)); |
| 1350 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 4, true)); |
| 1351 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 5, true)); |
| 1352 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 5, false)); |
| 1353 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 6, true)); |
| 1354 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 6, false)); |
| 1355 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 7, true)); |
| 1356 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 7, false)); |
| 1357 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 8, true)); |
| 1358 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 8, false)); |
| 1359 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 9, true)); |
| 1360 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 9, false)); |
| 1361 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 4, false)); |
| 1362 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 3, false)); |
| 1363 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 2, false)); |
| 1364 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false)); |
| 1365 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); |
| 1366 } |
| 1367 |
| 1082 #if defined(OS_WIN) | 1368 #if defined(OS_WIN) |
| 1083 | 1369 |
| 1084 class DispatcherImpl : public MessageLoopForUI::Dispatcher { | 1370 class DispatcherImpl : public MessageLoopForUI::Dispatcher { |
| 1085 public: | 1371 public: |
| 1086 DispatcherImpl() : dispatch_count_(0) {} | 1372 DispatcherImpl() : dispatch_count_(0) {} |
| 1087 | 1373 |
| 1088 virtual bool Dispatch(const base::NativeEvent& msg) OVERRIDE { | 1374 virtual bool Dispatch(const base::NativeEvent& msg) OVERRIDE { |
| 1089 ::TranslateMessage(&msg); | 1375 ::TranslateMessage(&msg); |
| 1090 ::DispatchMessage(&msg); | 1376 ::DispatchMessage(&msg); |
| 1091 // Do not count WM_TIMER since it is not what we post and it will cause | 1377 // Do not count WM_TIMER since it is not what we post and it will cause |
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1427 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_UI, false); | 1713 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_UI, false); |
| 1428 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_IO, false); | 1714 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_IO, false); |
| 1429 } | 1715 } |
| 1430 | 1716 |
| 1431 TEST(MessageLoopTest, NonNestableDelayedInNestedLoop) { | 1717 TEST(MessageLoopTest, NonNestableDelayedInNestedLoop) { |
| 1432 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_DEFAULT, true); | 1718 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_DEFAULT, true); |
| 1433 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_UI, true); | 1719 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_UI, true); |
| 1434 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_IO, true); | 1720 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_IO, true); |
| 1435 } | 1721 } |
| 1436 | 1722 |
| 1723 TEST(MessageLoopTest, QuitNow) { |
| 1724 RunTest_QuitNow(MessageLoop::TYPE_DEFAULT); |
| 1725 RunTest_QuitNow(MessageLoop::TYPE_UI); |
| 1726 RunTest_QuitNow(MessageLoop::TYPE_IO); |
| 1727 } |
| 1728 |
| 1729 TEST(MessageLoopTest, QuitNowWithIDTop) { |
| 1730 RunTest_QuitNowWithIDTop(MessageLoop::TYPE_DEFAULT); |
| 1731 RunTest_QuitNowWithIDTop(MessageLoop::TYPE_UI); |
| 1732 RunTest_QuitNowWithIDTop(MessageLoop::TYPE_IO); |
| 1733 } |
| 1734 |
| 1735 TEST(MessageLoopTest, QuitNowWithIDNested) { |
| 1736 RunTest_QuitNowWithIDNested(MessageLoop::TYPE_DEFAULT); |
| 1737 RunTest_QuitNowWithIDNested(MessageLoop::TYPE_UI); |
| 1738 RunTest_QuitNowWithIDNested(MessageLoop::TYPE_IO); |
| 1739 } |
| 1740 |
| 1741 TEST(MessageLoopTest, QuitNowWithIDBogus) { |
| 1742 RunTest_QuitNowWithIDBogus(MessageLoop::TYPE_DEFAULT); |
| 1743 RunTest_QuitNowWithIDBogus(MessageLoop::TYPE_UI); |
| 1744 RunTest_QuitNowWithIDBogus(MessageLoop::TYPE_IO); |
| 1745 } |
| 1746 |
| 1747 TEST(MessageLoopTest, QuitNowWithIDDeep) { |
| 1748 RunTest_QuitNowWithIDDeep(MessageLoop::TYPE_DEFAULT); |
| 1749 RunTest_QuitNowWithIDDeep(MessageLoop::TYPE_UI); |
| 1750 RunTest_QuitNowWithIDDeep(MessageLoop::TYPE_IO); |
| 1751 } |
| 1752 |
| 1753 TEST(MessageLoopTest, QuitNowWithIDOrderBefore) { |
| 1754 RunTest_QuitNowWithIDOrderBefore(MessageLoop::TYPE_DEFAULT); |
| 1755 RunTest_QuitNowWithIDOrderBefore(MessageLoop::TYPE_UI); |
| 1756 RunTest_QuitNowWithIDOrderBefore(MessageLoop::TYPE_IO); |
| 1757 } |
| 1758 |
| 1759 TEST(MessageLoopTest, QuitNowWithIDOrderDuring) { |
| 1760 RunTest_QuitNowWithIDOrderDuring(MessageLoop::TYPE_DEFAULT); |
| 1761 RunTest_QuitNowWithIDOrderDuring(MessageLoop::TYPE_UI); |
| 1762 RunTest_QuitNowWithIDOrderDuring(MessageLoop::TYPE_IO); |
| 1763 } |
| 1764 |
| 1765 TEST(MessageLoopTest, QuitNowWithIDOrderAfter) { |
| 1766 RunTest_QuitNowWithIDOrderAfter(MessageLoop::TYPE_DEFAULT); |
| 1767 RunTest_QuitNowWithIDOrderAfter(MessageLoop::TYPE_UI); |
| 1768 RunTest_QuitNowWithIDOrderAfter(MessageLoop::TYPE_IO); |
| 1769 } |
| 1770 |
| 1437 void PostNTasksThenQuit(int posts_remaining) { | 1771 void PostNTasksThenQuit(int posts_remaining) { |
| 1438 if (posts_remaining > 1) { | 1772 if (posts_remaining > 1) { |
| 1439 MessageLoop::current()->PostTask( | 1773 MessageLoop::current()->PostTask( |
| 1440 FROM_HERE, | 1774 FROM_HERE, |
| 1441 base::Bind(&PostNTasksThenQuit, posts_remaining - 1)); | 1775 base::Bind(&PostNTasksThenQuit, posts_remaining - 1)); |
| 1442 } else { | 1776 } else { |
| 1443 MessageLoop::current()->Quit(); | 1777 MessageLoop::current()->Quit(); |
| 1444 } | 1778 } |
| 1445 } | 1779 } |
| 1446 | 1780 |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1705 // Post quit task; | 2039 // Post quit task; |
| 1706 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( | 2040 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
| 1707 &MessageLoop::Quit, base::Unretained(MessageLoop::current()))); | 2041 &MessageLoop::Quit, base::Unretained(MessageLoop::current()))); |
| 1708 | 2042 |
| 1709 // Now kick things off | 2043 // Now kick things off |
| 1710 MessageLoop::current()->Run(); | 2044 MessageLoop::current()->Run(); |
| 1711 | 2045 |
| 1712 EXPECT_EQ(foo->test_count(), 1); | 2046 EXPECT_EQ(foo->test_count(), 1); |
| 1713 EXPECT_EQ(foo->result(), "a"); | 2047 EXPECT_EQ(foo->result(), "a"); |
| 1714 } | 2048 } |
| OLD | NEW |