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