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 NodeName node1_name(1, 1); | 693 PortRef x0; |
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; | |
701 EXPECT_EQ(OK, node0.CreateUninitializedPort(&x0)); | 694 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 | |
709 EXPECT_EQ(ERROR_PORT_STATE_UNEXPECTED, | 695 EXPECT_EQ(ERROR_PORT_STATE_UNEXPECTED, |
710 SendStringMessage(&node0, x0, "oops")); | 696 SendStringMessage(&node0, x0, "oops")); |
711 EXPECT_EQ(ERROR_PORT_STATE_UNEXPECTED, | |
712 SendStringMessage(&node1, x1, "oh well")); | |
713 | |
714 EXPECT_EQ(OK, node0.ClosePort(x0)); | 697 EXPECT_EQ(OK, node0.ClosePort(x0)); |
715 EXPECT_EQ(OK, node1.ClosePort(x1)); | |
716 | |
717 EXPECT_TRUE(node0.CanShutdownCleanly(false)); | 698 EXPECT_TRUE(node0.CanShutdownCleanly(false)); |
718 EXPECT_TRUE(node1.CanShutdownCleanly(false)); | |
719 } | 699 } |
720 | 700 |
721 TEST_F(PortsTest, SendFailure) { | 701 TEST_F(PortsTest, SendFailure) { |
722 NodeName node0_name(0, 1); | 702 NodeName node0_name(0, 1); |
723 TestNodeDelegate node0_delegate(node0_name); | 703 TestNodeDelegate node0_delegate(node0_name); |
724 Node node0(node0_name, &node0_delegate); | 704 Node node0(node0_name, &node0_delegate); |
725 node_map[0] = &node0; | 705 node_map[0] = &node0; |
726 | 706 |
727 node0_delegate.set_save_messages(true); | 707 node0_delegate.set_save_messages(true); |
728 | 708 |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1061 EXPECT_FALSE(status.has_messages); | 1041 EXPECT_FALSE(status.has_messages); |
1062 EXPECT_TRUE(status.peer_closed); | 1042 EXPECT_TRUE(status.peer_closed); |
1063 | 1043 |
1064 node0.ClosePort(E); | 1044 node0.ClosePort(E); |
1065 | 1045 |
1066 PumpTasks(); | 1046 PumpTasks(); |
1067 | 1047 |
1068 EXPECT_TRUE(node0.CanShutdownCleanly(false)); | 1048 EXPECT_TRUE(node0.CanShutdownCleanly(false)); |
1069 } | 1049 } |
1070 | 1050 |
| 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 |
1071 } // namespace test | 1367 } // namespace test |
1072 } // namespace ports | 1368 } // namespace ports |
1073 } // namespace edk | 1369 } // namespace edk |
1074 } // namespace mojo | 1370 } // namespace mojo |
OLD | NEW |