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

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: win_shared build 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 ORDERERD,
jar (doing other things) 2012/06/18 19:43:21 nit: Although you didn't type this.... I think thi
jbates 2012/06/18 23:14:03 Done.
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
(...skipping 375 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));
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
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(ORDERERD, 5, true));
1074 EXPECT_EQ(order.Get(6), TaskItem(ORDERERD, 5, false)); 1084 EXPECT_EQ(order.Get(6), TaskItem(ORDERERD, 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(ORDERERD, 2, true));
1077 EXPECT_EQ(order.Get(9), TaskItem(ORDERERD, 2, false)); 1087 EXPECT_EQ(order.Get(9), TaskItem(ORDERERD, 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(ORDERERD, 2, true));
1119 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 2, false));
1120 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false));
1121 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 3, true));
1122 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 3, false));
1123 EXPECT_EQ(static_cast<size_t>(task_index), order.Size());
1124 }
1125
1126 // Tests QuitNowWithID only quits the corresponding MessageLoop::Run.
1127 void RunTest_QuitNowWithIDTop(MessageLoop::Type message_loop_type) {
1128 MessageLoop loop(message_loop_type);
1129
1130 TaskList order;
1131
1132 MessageLoop::RunID top_most_run_id = MessageLoop::current()->GetRunID();
1133 MessageLoop::RunID nested_run_id = MessageLoop::current()->GetRunID();
1134
1135 MessageLoop::current()->PostTask(
1136 FROM_HERE, base::Bind(&FuncThatRuns, &order, 1, nested_run_id));
1137 MessageLoop::current()->PostTask(
1138 FROM_HERE, MessageLoop::QuitNowWithIDClosure(top_most_run_id));
1139 MessageLoop::current()->PostTask(
1140 FROM_HERE, base::Bind(&OrderedFunc, &order, 2));
1141 MessageLoop::current()->PostTask(
1142 FROM_HERE, MessageLoop::QuitNowWithIDClosure(nested_run_id));
1143
1144 MessageLoop::current()->RunWithID(top_most_run_id);
1145
1146 ASSERT_EQ(4U, order.Size());
1147 int task_index = 0;
1148 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true));
1149 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 2, true));
1150 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 2, false));
1151 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false));
1152 EXPECT_EQ(static_cast<size_t>(task_index), order.Size());
1153 }
1154
1155 // Tests QuitNowWithID only quits the corresponding MessageLoop::Run.
1156 void RunTest_QuitNowWithIDNested(MessageLoop::Type message_loop_type) {
1157 MessageLoop loop(message_loop_type);
1158
1159 TaskList order;
1160
1161 MessageLoop::RunID top_most_run_id = MessageLoop::current()->GetRunID();
1162 MessageLoop::RunID nested_run_id = MessageLoop::current()->GetRunID();
1163
1164 MessageLoop::current()->PostTask(
1165 FROM_HERE, base::Bind(&FuncThatRuns, &order, 1, nested_run_id));
1166 MessageLoop::current()->PostTask(
1167 FROM_HERE, MessageLoop::QuitNowWithIDClosure(nested_run_id));
1168 MessageLoop::current()->PostTask(
1169 FROM_HERE, base::Bind(&OrderedFunc, &order, 2));
1170 MessageLoop::current()->PostTask(
1171 FROM_HERE, MessageLoop::QuitNowWithIDClosure(top_most_run_id));
1172
1173 MessageLoop::current()->RunWithID(top_most_run_id);
1174
1175 ASSERT_EQ(4U, order.Size());
1176 int task_index = 0;
1177 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true));
1178 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false));
1179 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 2, true));
1180 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 2, false));
1181 EXPECT_EQ(static_cast<size_t>(task_index), order.Size());
1182 }
1183
1184 // Tests QuitNowWithID only quits the corresponding MessageLoop::Run.
1185 void RunTest_QuitNowWithIDBogus(MessageLoop::Type message_loop_type) {
1186 MessageLoop loop(message_loop_type);
1187
1188 TaskList order;
1189
1190 MessageLoop::RunID top_most_run_id = MessageLoop::current()->GetRunID();
1191 MessageLoop::RunID nested_run_id = MessageLoop::current()->GetRunID();
1192 MessageLoop::RunID bogus_run_id = MessageLoop::current()->GetRunID();
1193
1194 MessageLoop::current()->PostTask(
1195 FROM_HERE, base::Bind(&FuncThatRuns, &order, 1, nested_run_id));
1196 MessageLoop::current()->PostTask(
1197 FROM_HERE, MessageLoop::QuitNowWithIDClosure(bogus_run_id));
1198 MessageLoop::current()->PostTask(
1199 FROM_HERE, base::Bind(&OrderedFunc, &order, 2));
1200 MessageLoop::current()->PostTask(
1201 FROM_HERE, MessageLoop::QuitNowWithIDClosure(top_most_run_id));
1202 MessageLoop::current()->PostTask(
1203 FROM_HERE, MessageLoop::QuitNowWithIDClosure(nested_run_id));
1204
1205 MessageLoop::current()->RunWithID(top_most_run_id);
1206
1207 ASSERT_EQ(4U, order.Size());
1208 int task_index = 0;
1209 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true));
1210 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 2, true));
1211 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 2, false));
1212 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false));
1213 EXPECT_EQ(static_cast<size_t>(task_index), order.Size());
1214 }
1215
1216 // Tests QuitNowWithID only quits the corresponding MessageLoop::Run.
1217 void RunTest_QuitNowWithIDDeep(MessageLoop::Type message_loop_type) {
1218 MessageLoop loop(message_loop_type);
1219
1220 TaskList order;
1221
1222 MessageLoop::RunID top_most_run_id = MessageLoop::current()->GetRunID();
1223 MessageLoop::RunID nested_run_id1 = MessageLoop::current()->GetRunID();
1224 MessageLoop::RunID nested_run_id2 = MessageLoop::current()->GetRunID();
1225 MessageLoop::RunID nested_run_id3 = MessageLoop::current()->GetRunID();
1226 MessageLoop::RunID nested_run_id4 = MessageLoop::current()->GetRunID();
1227
1228 MessageLoop::current()->PostTask(
1229 FROM_HERE, base::Bind(&FuncThatRuns, &order, 1, nested_run_id1));
1230 MessageLoop::current()->PostTask(
1231 FROM_HERE, base::Bind(&FuncThatRuns, &order, 2, nested_run_id2));
1232 MessageLoop::current()->PostTask(
1233 FROM_HERE, base::Bind(&FuncThatRuns, &order, 3, nested_run_id3));
1234 MessageLoop::current()->PostTask(
1235 FROM_HERE, base::Bind(&FuncThatRuns, &order, 4, nested_run_id4));
1236 MessageLoop::current()->PostTask(
1237 FROM_HERE, base::Bind(&OrderedFunc, &order, 5));
1238 MessageLoop::current()->PostTask(
1239 FROM_HERE, MessageLoop::QuitNowWithIDClosure(top_most_run_id));
1240 MessageLoop::current()->PostTask(
1241 FROM_HERE, base::Bind(&OrderedFunc, &order, 6));
1242 MessageLoop::current()->PostTask(
1243 FROM_HERE, MessageLoop::QuitNowWithIDClosure(nested_run_id1));
1244 MessageLoop::current()->PostTask(
1245 FROM_HERE, base::Bind(&OrderedFunc, &order, 7));
1246 MessageLoop::current()->PostTask(
1247 FROM_HERE, MessageLoop::QuitNowWithIDClosure(nested_run_id2));
1248 MessageLoop::current()->PostTask(
1249 FROM_HERE, base::Bind(&OrderedFunc, &order, 8));
1250 MessageLoop::current()->PostTask(
1251 FROM_HERE, MessageLoop::QuitNowWithIDClosure(nested_run_id3));
1252 MessageLoop::current()->PostTask(
1253 FROM_HERE, base::Bind(&OrderedFunc, &order, 9));
1254 MessageLoop::current()->PostTask(
1255 FROM_HERE, MessageLoop::QuitNowWithIDClosure(nested_run_id4));
1256 MessageLoop::current()->PostTask(
1257 FROM_HERE, base::Bind(&OrderedFunc, &order, 10));
1258
1259 MessageLoop::current()->RunWithID(top_most_run_id);
1260
1261 ASSERT_EQ(18U, order.Size());
1262 int task_index = 0;
1263 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true));
1264 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 2, true));
1265 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 3, true));
1266 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 4, true));
1267 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 5, true));
1268 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 5, false));
1269 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 6, true));
1270 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 6, false));
1271 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 7, true));
1272 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 7, false));
1273 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 8, true));
1274 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 8, false));
1275 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 9, true));
1276 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERERD, 9, false));
1277 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 4, false));
1278 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 3, false));
1279 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 2, false));
1280 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false));
1281 EXPECT_EQ(static_cast<size_t>(task_index), order.Size());
1282 }
1283
1082 #if defined(OS_WIN) 1284 #if defined(OS_WIN)
1083 1285
1084 class DispatcherImpl : public MessageLoopForUI::Dispatcher { 1286 class DispatcherImpl : public MessageLoopForUI::Dispatcher {
1085 public: 1287 public:
1086 DispatcherImpl() : dispatch_count_(0) {} 1288 DispatcherImpl() : dispatch_count_(0) {}
1087 1289
1088 virtual bool Dispatch(const base::NativeEvent& msg) OVERRIDE { 1290 virtual bool Dispatch(const base::NativeEvent& msg) OVERRIDE {
1089 ::TranslateMessage(&msg); 1291 ::TranslateMessage(&msg);
1090 ::DispatchMessage(&msg); 1292 ::DispatchMessage(&msg);
1091 // Do not count WM_TIMER since it is not what we post and it will cause 1293 // 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); 1629 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_UI, false);
1428 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_IO, false); 1630 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_IO, false);
1429 } 1631 }
1430 1632
1431 TEST(MessageLoopTest, NonNestableDelayedInNestedLoop) { 1633 TEST(MessageLoopTest, NonNestableDelayedInNestedLoop) {
1432 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_DEFAULT, true); 1634 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_DEFAULT, true);
1433 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_UI, true); 1635 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_UI, true);
1434 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_IO, true); 1636 RunTest_NonNestableInNestedLoop(MessageLoop::TYPE_IO, true);
1435 } 1637 }
1436 1638
1639 TEST(MessageLoopTest, QuitNow) {
1640 RunTest_QuitNow(MessageLoop::TYPE_DEFAULT);
1641 RunTest_QuitNow(MessageLoop::TYPE_UI);
1642 RunTest_QuitNow(MessageLoop::TYPE_IO);
1643 }
1644
1645 TEST(MessageLoopTest, QuitNowWithIDTop) {
1646 RunTest_QuitNowWithIDTop(MessageLoop::TYPE_DEFAULT);
1647 RunTest_QuitNowWithIDTop(MessageLoop::TYPE_UI);
1648 RunTest_QuitNowWithIDTop(MessageLoop::TYPE_IO);
1649 }
1650
1651 TEST(MessageLoopTest, QuitNowWithIDNested) {
1652 RunTest_QuitNowWithIDNested(MessageLoop::TYPE_DEFAULT);
1653 RunTest_QuitNowWithIDNested(MessageLoop::TYPE_UI);
1654 RunTest_QuitNowWithIDNested(MessageLoop::TYPE_IO);
1655 }
1656
1657 TEST(MessageLoopTest, QuitNowWithIDBogus) {
1658 RunTest_QuitNowWithIDBogus(MessageLoop::TYPE_DEFAULT);
1659 RunTest_QuitNowWithIDBogus(MessageLoop::TYPE_UI);
1660 RunTest_QuitNowWithIDBogus(MessageLoop::TYPE_IO);
1661 }
1662
1663 TEST(MessageLoopTest, QuitNowWithIDDeep) {
1664 RunTest_QuitNowWithIDDeep(MessageLoop::TYPE_DEFAULT);
1665 RunTest_QuitNowWithIDDeep(MessageLoop::TYPE_UI);
1666 RunTest_QuitNowWithIDDeep(MessageLoop::TYPE_IO);
1667 }
1668
1437 void PostNTasksThenQuit(int posts_remaining) { 1669 void PostNTasksThenQuit(int posts_remaining) {
1438 if (posts_remaining > 1) { 1670 if (posts_remaining > 1) {
1439 MessageLoop::current()->PostTask( 1671 MessageLoop::current()->PostTask(
1440 FROM_HERE, 1672 FROM_HERE,
1441 base::Bind(&PostNTasksThenQuit, posts_remaining - 1)); 1673 base::Bind(&PostNTasksThenQuit, posts_remaining - 1));
1442 } else { 1674 } else {
1443 MessageLoop::current()->Quit(); 1675 MessageLoop::current()->Quit();
1444 } 1676 }
1445 } 1677 }
1446 1678
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
1705 // Post quit task; 1937 // Post quit task;
1706 MessageLoop::current()->PostTask(FROM_HERE, base::Bind( 1938 MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
1707 &MessageLoop::Quit, base::Unretained(MessageLoop::current()))); 1939 &MessageLoop::Quit, base::Unretained(MessageLoop::current())));
1708 1940
1709 // Now kick things off 1941 // Now kick things off
1710 MessageLoop::current()->Run(); 1942 MessageLoop::current()->Run();
1711 1943
1712 EXPECT_EQ(foo->test_count(), 1); 1944 EXPECT_EQ(foo->test_count(), 1);
1713 EXPECT_EQ(foo->result(), "a"); 1945 EXPECT_EQ(foo->result(), "a");
1714 } 1946 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698