| 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 |