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

Side by Side Diff: base/message_loop_unittest.cc

Issue 10479018: Add base::RunLoop and update ui_test_utils to use it to reduce flakiness (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: jar, phajdan feedback Created 8 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
OLDNEW
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
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
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
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
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
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
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
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 }
OLDNEW
« base/message_loop.h ('K') | « base/message_loop.cc ('k') | base/message_pump_android.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698