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

Side by Side Diff: mojo/edk/system/ports/ports_unittest.cc

Issue 1678333003: Revert of [mojo-edk] Simplify multiprocess pipe bootstrap (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 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
« no previous file with comments | « mojo/edk/system/ports/node.cc ('k') | mojo/edk/system/remote_message_pipe_bootstrap.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 <stdio.h> 5 #include <stdio.h>
6 #include <stdlib.h> 6 #include <stdlib.h>
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <map> 9 #include <map>
10 #include <queue> 10 #include <queue>
(...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after
683 EXPECT_TRUE(node0.CanShutdownCleanly(false)); 683 EXPECT_TRUE(node0.CanShutdownCleanly(false));
684 EXPECT_TRUE(node1.CanShutdownCleanly(false)); 684 EXPECT_TRUE(node1.CanShutdownCleanly(false));
685 } 685 }
686 686
687 TEST_F(PortsTest, SendUninitialized) { 687 TEST_F(PortsTest, SendUninitialized) {
688 NodeName node0_name(0, 1); 688 NodeName node0_name(0, 1);
689 TestNodeDelegate node0_delegate(node0_name); 689 TestNodeDelegate node0_delegate(node0_name);
690 Node node0(node0_name, &node0_delegate); 690 Node node0(node0_name, &node0_delegate);
691 node_map[0] = &node0; 691 node_map[0] = &node0;
692 692
693 PortRef x0; 693 NodeName node1_name(1, 1);
694 TestNodeDelegate node1_delegate(node1_name);
695 Node node1(node1_name, &node1_delegate);
696 node_map[1] = &node1;
697
698 // Begin to setup a pipe between node0 and node1, but don't initialize either
699 // endpoint.
700 PortRef x0, x1;
694 EXPECT_EQ(OK, node0.CreateUninitializedPort(&x0)); 701 EXPECT_EQ(OK, node0.CreateUninitializedPort(&x0));
702 EXPECT_EQ(OK, node1.CreateUninitializedPort(&x1));
703
704 node0_delegate.set_save_messages(true);
705 node1_delegate.set_save_messages(true);
706
707 // Send a message on each port and expect neither to arrive yet.
708
695 EXPECT_EQ(ERROR_PORT_STATE_UNEXPECTED, 709 EXPECT_EQ(ERROR_PORT_STATE_UNEXPECTED,
696 SendStringMessage(&node0, x0, "oops")); 710 SendStringMessage(&node0, x0, "oops"));
711 EXPECT_EQ(ERROR_PORT_STATE_UNEXPECTED,
712 SendStringMessage(&node1, x1, "oh well"));
713
697 EXPECT_EQ(OK, node0.ClosePort(x0)); 714 EXPECT_EQ(OK, node0.ClosePort(x0));
715 EXPECT_EQ(OK, node1.ClosePort(x1));
716
698 EXPECT_TRUE(node0.CanShutdownCleanly(false)); 717 EXPECT_TRUE(node0.CanShutdownCleanly(false));
718 EXPECT_TRUE(node1.CanShutdownCleanly(false));
699 } 719 }
700 720
701 TEST_F(PortsTest, SendFailure) { 721 TEST_F(PortsTest, SendFailure) {
702 NodeName node0_name(0, 1); 722 NodeName node0_name(0, 1);
703 TestNodeDelegate node0_delegate(node0_name); 723 TestNodeDelegate node0_delegate(node0_name);
704 Node node0(node0_name, &node0_delegate); 724 Node node0(node0_name, &node0_delegate);
705 node_map[0] = &node0; 725 node_map[0] = &node0;
706 726
707 node0_delegate.set_save_messages(true); 727 node0_delegate.set_save_messages(true);
708 728
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
1041 EXPECT_FALSE(status.has_messages); 1061 EXPECT_FALSE(status.has_messages);
1042 EXPECT_TRUE(status.peer_closed); 1062 EXPECT_TRUE(status.peer_closed);
1043 1063
1044 node0.ClosePort(E); 1064 node0.ClosePort(E);
1045 1065
1046 PumpTasks(); 1066 PumpTasks();
1047 1067
1048 EXPECT_TRUE(node0.CanShutdownCleanly(false)); 1068 EXPECT_TRUE(node0.CanShutdownCleanly(false));
1049 } 1069 }
1050 1070
1051 TEST_F(PortsTest, MergePorts) {
1052 NodeName node0_name(0, 1);
1053 TestNodeDelegate node0_delegate(node0_name);
1054 Node node0(node0_name, &node0_delegate);
1055 node_map[0] = &node0;
1056
1057 NodeName node1_name(1, 1);
1058 TestNodeDelegate node1_delegate(node1_name);
1059 Node node1(node1_name, &node1_delegate);
1060 node_map[1] = &node1;
1061
1062 // Setup two independent port pairs, A-B on node0 and C-D on node1.
1063 PortRef A, B, C, D;
1064 EXPECT_EQ(OK, node0.CreatePortPair(&A, &B));
1065 EXPECT_EQ(OK, node1.CreatePortPair(&C, &D));
1066
1067 node0_delegate.set_read_messages(false);
1068 node1_delegate.set_save_messages(true);
1069
1070 // Write a message on A.
1071 EXPECT_EQ(OK, SendStringMessage(&node0, A, "hey"));
1072
1073 PumpTasks();
1074
1075 // Initiate a merge between B and C.
1076 EXPECT_EQ(OK, node0.MergePorts(B, node1_name, C.name()));
1077
1078 PumpTasks();
1079
1080 // Expect only two receiving ports to be left after pumping tasks.
1081 EXPECT_TRUE(node0.CanShutdownCleanly(true));
1082 EXPECT_TRUE(node1.CanShutdownCleanly(true));
1083
1084 // Expect D to have received the message sent on A.
1085 ScopedMessage message;
1086 ASSERT_TRUE(node1_delegate.GetSavedMessage(&message));
1087 EXPECT_EQ(0, strcmp("hey", ToString(message)));
1088
1089 EXPECT_EQ(OK, node0.ClosePort(A));
1090 EXPECT_EQ(OK, node1.ClosePort(D));
1091
1092 // No more ports should be open.
1093 EXPECT_TRUE(node0.CanShutdownCleanly(false));
1094 EXPECT_TRUE(node1.CanShutdownCleanly(false));
1095 }
1096
1097 TEST_F(PortsTest, MergePortWithClosedPeer1) {
1098 // This tests that the right thing happens when initiating a merge on a port
1099 // whose peer has already been closed.
1100
1101 NodeName node0_name(0, 1);
1102 TestNodeDelegate node0_delegate(node0_name);
1103 Node node0(node0_name, &node0_delegate);
1104 node_map[0] = &node0;
1105
1106 NodeName node1_name(1, 1);
1107 TestNodeDelegate node1_delegate(node1_name);
1108 Node node1(node1_name, &node1_delegate);
1109 node_map[1] = &node1;
1110
1111 // Setup two independent port pairs, A-B on node0 and C-D on node1.
1112 PortRef A, B, C, D;
1113 EXPECT_EQ(OK, node0.CreatePortPair(&A, &B));
1114 EXPECT_EQ(OK, node1.CreatePortPair(&C, &D));
1115
1116 node0_delegate.set_read_messages(false);
1117 node1_delegate.set_save_messages(true);
1118
1119 // Write a message on A.
1120 EXPECT_EQ(OK, SendStringMessage(&node0, A, "hey"));
1121
1122 PumpTasks();
1123
1124 // Close A.
1125 EXPECT_EQ(OK, node0.ClosePort(A));
1126
1127 // Initiate a merge between B and C.
1128 EXPECT_EQ(OK, node0.MergePorts(B, node1_name, C.name()));
1129
1130 PumpTasks();
1131
1132 // Expect only one receiving port to be left after pumping tasks.
1133 EXPECT_TRUE(node0.CanShutdownCleanly(false));
1134 EXPECT_TRUE(node1.CanShutdownCleanly(true));
1135
1136 // Expect D to have received the message sent on A.
1137 ScopedMessage message;
1138 ASSERT_TRUE(node1_delegate.GetSavedMessage(&message));
1139 EXPECT_EQ(0, strcmp("hey", ToString(message)));
1140
1141 EXPECT_EQ(OK, node1.ClosePort(D));
1142
1143 // No more ports should be open.
1144 EXPECT_TRUE(node0.CanShutdownCleanly(false));
1145 EXPECT_TRUE(node1.CanShutdownCleanly(false));
1146 }
1147
1148 TEST_F(PortsTest, MergePortWithClosedPeer2) {
1149 // This tests that the right thing happens when merging into a port whose peer
1150 // has already been closed.
1151
1152 NodeName node0_name(0, 1);
1153 TestNodeDelegate node0_delegate(node0_name);
1154 Node node0(node0_name, &node0_delegate);
1155 node_map[0] = &node0;
1156
1157 NodeName node1_name(1, 1);
1158 TestNodeDelegate node1_delegate(node1_name);
1159 Node node1(node1_name, &node1_delegate);
1160 node_map[1] = &node1;
1161
1162 // Setup two independent port pairs, A-B on node0 and C-D on node1.
1163 PortRef A, B, C, D;
1164 EXPECT_EQ(OK, node0.CreatePortPair(&A, &B));
1165 EXPECT_EQ(OK, node1.CreatePortPair(&C, &D));
1166
1167 node0_delegate.set_save_messages(true);
1168 node1_delegate.set_read_messages(false);
1169
1170 // Write a message on D.
1171 EXPECT_EQ(OK, SendStringMessage(&node0, D, "hey"));
1172
1173 PumpTasks();
1174
1175 // Close D.
1176 EXPECT_EQ(OK, node1.ClosePort(D));
1177
1178 // Initiate a merge between B and C.
1179 EXPECT_EQ(OK, node0.MergePorts(B, node1_name, C.name()));
1180
1181 PumpTasks();
1182
1183 // Expect only one receiving port to be left after pumping tasks.
1184 EXPECT_TRUE(node0.CanShutdownCleanly(true));
1185 EXPECT_TRUE(node1.CanShutdownCleanly(false));
1186
1187 // Expect A to have received the message sent on D.
1188 ScopedMessage message;
1189 ASSERT_TRUE(node0_delegate.GetSavedMessage(&message));
1190 EXPECT_EQ(0, strcmp("hey", ToString(message)));
1191
1192 EXPECT_EQ(OK, node0.ClosePort(A));
1193
1194 // No more ports should be open.
1195 EXPECT_TRUE(node0.CanShutdownCleanly(false));
1196 EXPECT_TRUE(node1.CanShutdownCleanly(false));
1197 }
1198
1199 TEST_F(PortsTest, MergePortsWithClosedPeers) {
1200 // This tests that no residual ports are left behind if two ports are merged
1201 // when both of their peers have been closed.
1202
1203 NodeName node0_name(0, 1);
1204 TestNodeDelegate node0_delegate(node0_name);
1205 Node node0(node0_name, &node0_delegate);
1206 node_map[0] = &node0;
1207
1208 NodeName node1_name(1, 1);
1209 TestNodeDelegate node1_delegate(node1_name);
1210 Node node1(node1_name, &node1_delegate);
1211 node_map[1] = &node1;
1212
1213 // Setup two independent port pairs, A-B on node0 and C-D on node1.
1214 PortRef A, B, C, D;
1215 EXPECT_EQ(OK, node0.CreatePortPair(&A, &B));
1216 EXPECT_EQ(OK, node1.CreatePortPair(&C, &D));
1217
1218 node0_delegate.set_save_messages(true);
1219 node1_delegate.set_read_messages(false);
1220
1221 // Close A and D.
1222 EXPECT_EQ(OK, node0.ClosePort(A));
1223 EXPECT_EQ(OK, node1.ClosePort(D));
1224
1225 PumpTasks();
1226
1227 // Initiate a merge between B and C.
1228 EXPECT_EQ(OK, node0.MergePorts(B, node1_name, C.name()));
1229
1230 PumpTasks();
1231
1232 // Expect everything to have gone away.
1233 EXPECT_TRUE(node0.CanShutdownCleanly(false));
1234 EXPECT_TRUE(node1.CanShutdownCleanly(false));
1235 }
1236
1237 TEST_F(PortsTest, MergePortsWithMovedPeers) {
1238 // This tests that no ports can be merged successfully even if their peers
1239 // are moved around.
1240
1241 NodeName node0_name(0, 1);
1242 TestNodeDelegate node0_delegate(node0_name);
1243 Node node0(node0_name, &node0_delegate);
1244 node_map[0] = &node0;
1245
1246 NodeName node1_name(1, 1);
1247 TestNodeDelegate node1_delegate(node1_name);
1248 Node node1(node1_name, &node1_delegate);
1249 node_map[1] = &node1;
1250
1251 node0_delegate.set_save_messages(true);
1252 node1_delegate.set_read_messages(false);
1253
1254 // Setup two independent port pairs, A-B on node0 and C-D on node1.
1255 PortRef A, B, C, D;
1256 EXPECT_EQ(OK, node0.CreatePortPair(&A, &B));
1257 EXPECT_EQ(OK, node1.CreatePortPair(&C, &D));
1258
1259 // Set up another pair X-Y for moving ports on node0.
1260 PortRef X, Y;
1261 EXPECT_EQ(OK, node0.CreatePortPair(&X, &Y));
1262
1263 ScopedMessage message;
1264
1265 // Move A to new port E.
1266 EXPECT_EQ(OK, SendStringMessageWithPort(&node0, X, "foo", A));
1267 ASSERT_TRUE(node0_delegate.GetSavedMessage(&message));
1268 ASSERT_EQ(1u, message->num_ports());
1269 PortRef E;
1270 ASSERT_EQ(OK, node0.GetPort(message->ports()[0], &E));
1271
1272 EXPECT_EQ(OK, node0.ClosePort(X));
1273 EXPECT_EQ(OK, node0.ClosePort(Y));
1274
1275 node0_delegate.set_read_messages(false);
1276
1277 // Write messages on E and D.
1278 EXPECT_EQ(OK, SendStringMessage(&node0, E, "hey"));
1279 EXPECT_EQ(OK, SendStringMessage(&node1, D, "hi"));
1280
1281 // Initiate a merge between B and C.
1282 EXPECT_EQ(OK, node0.MergePorts(B, node1_name, C.name()));
1283
1284 node0_delegate.set_read_messages(true);
1285 node1_delegate.set_read_messages(true);
1286 node1_delegate.set_save_messages(true);
1287
1288 PumpTasks();
1289
1290 // Expect to receive D's message on E and E's message on D.
1291 ASSERT_TRUE(node0_delegate.GetSavedMessage(&message));
1292 EXPECT_EQ(0, strcmp("hi", ToString(message)));
1293 ASSERT_TRUE(node1_delegate.GetSavedMessage(&message));
1294 EXPECT_EQ(0, strcmp("hey", ToString(message)));
1295
1296 // Close E and D.
1297 EXPECT_EQ(OK, node0.ClosePort(E));
1298 EXPECT_EQ(OK, node1.ClosePort(D));
1299
1300 PumpTasks();
1301
1302 // Expect everything to have gone away.
1303 EXPECT_TRUE(node0.CanShutdownCleanly(false));
1304 EXPECT_TRUE(node1.CanShutdownCleanly(false));
1305 }
1306
1307
1308 TEST_F(PortsTest, MergePortsFailsGracefully) {
1309 // This tests that the system remains in a well-defined state if something
1310 // goes wrong during port merge.
1311
1312 NodeName node0_name(0, 1);
1313 TestNodeDelegate node0_delegate(node0_name);
1314 Node node0(node0_name, &node0_delegate);
1315 node_map[0] = &node0;
1316
1317 NodeName node1_name(1, 1);
1318 TestNodeDelegate node1_delegate(node1_name);
1319 Node node1(node1_name, &node1_delegate);
1320 node_map[1] = &node1;
1321
1322 // Setup two independent port pairs, A-B on node0 and C-D on node1.
1323 PortRef A, B, C, D;
1324 EXPECT_EQ(OK, node0.CreatePortPair(&A, &B));
1325 EXPECT_EQ(OK, node1.CreatePortPair(&C, &D));
1326
1327 PumpTasks();
1328
1329 // Initiate a merge between B and C.
1330 EXPECT_EQ(OK, node0.MergePorts(B, node1_name, C.name()));
1331
1332 // Move C to a new port E. This is dumb and nobody should do it, but it's
1333 // possible. MergePorts will fail as a result because C won't be in a
1334 // receiving state when the event arrives at node1, so B should be closed.
1335 ScopedMessage message;
1336 PortRef X, Y;
1337 EXPECT_EQ(OK, node1.CreatePortPair(&X, &Y));
1338 node1_delegate.set_save_messages(true);
1339 EXPECT_EQ(OK, SendStringMessageWithPort(&node1, X, "foo", C));
1340 ASSERT_TRUE(node1_delegate.GetSavedMessage(&message));
1341 ASSERT_EQ(1u, message->num_ports());
1342 PortRef E;
1343 ASSERT_EQ(OK, node1.GetPort(message->ports()[0], &E));
1344 EXPECT_EQ(OK, node1.ClosePort(X));
1345 EXPECT_EQ(OK, node1.ClosePort(Y));
1346
1347 // C goes away as a result of normal proxy removal.
1348 PumpTasks();
1349
1350 EXPECT_EQ(ERROR_PORT_UNKNOWN, node1.GetPort(C.name(), &C));
1351
1352 // B should have been closed cleanly.
1353 EXPECT_EQ(ERROR_PORT_UNKNOWN, node0.GetPort(B.name(), &B));
1354
1355 // Close A, D, and E.
1356 EXPECT_EQ(OK, node0.ClosePort(A));
1357 EXPECT_EQ(OK, node1.ClosePort(D));
1358 EXPECT_EQ(OK, node1.ClosePort(E));
1359
1360 PumpTasks();
1361
1362 // Expect everything to have gone away.
1363 EXPECT_TRUE(node0.CanShutdownCleanly(false));
1364 EXPECT_TRUE(node1.CanShutdownCleanly(false));
1365 }
1366
1367 } // namespace test 1071 } // namespace test
1368 } // namespace ports 1072 } // namespace ports
1369 } // namespace edk 1073 } // namespace edk
1370 } // namespace mojo 1074 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/ports/node.cc ('k') | mojo/edk/system/remote_message_pipe_bootstrap.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698