Index: mojo/edk/system/ports/ports_unittest.cc |
diff --git a/mojo/edk/system/ports/ports_unittest.cc b/mojo/edk/system/ports/ports_unittest.cc |
index 1bdca3ff8cb65cd96ebbe9f9f0244d366c968da7..95e2a630af8195044fcffdc8b92cb149f1b5c6ea 100644 |
--- a/mojo/edk/system/ports/ports_unittest.cc |
+++ b/mojo/edk/system/ports/ports_unittest.cc |
@@ -690,12 +690,32 @@ |
Node node0(node0_name, &node0_delegate); |
node_map[0] = &node0; |
- PortRef x0; |
+ NodeName node1_name(1, 1); |
+ TestNodeDelegate node1_delegate(node1_name); |
+ Node node1(node1_name, &node1_delegate); |
+ node_map[1] = &node1; |
+ |
+ // Begin to setup a pipe between node0 and node1, but don't initialize either |
+ // endpoint. |
+ PortRef x0, x1; |
EXPECT_EQ(OK, node0.CreateUninitializedPort(&x0)); |
+ EXPECT_EQ(OK, node1.CreateUninitializedPort(&x1)); |
+ |
+ node0_delegate.set_save_messages(true); |
+ node1_delegate.set_save_messages(true); |
+ |
+ // Send a message on each port and expect neither to arrive yet. |
+ |
EXPECT_EQ(ERROR_PORT_STATE_UNEXPECTED, |
SendStringMessage(&node0, x0, "oops")); |
+ EXPECT_EQ(ERROR_PORT_STATE_UNEXPECTED, |
+ SendStringMessage(&node1, x1, "oh well")); |
+ |
EXPECT_EQ(OK, node0.ClosePort(x0)); |
- EXPECT_TRUE(node0.CanShutdownCleanly(false)); |
+ EXPECT_EQ(OK, node1.ClosePort(x1)); |
+ |
+ EXPECT_TRUE(node0.CanShutdownCleanly(false)); |
+ EXPECT_TRUE(node1.CanShutdownCleanly(false)); |
} |
TEST_F(PortsTest, SendFailure) { |
@@ -1048,322 +1068,6 @@ |
EXPECT_TRUE(node0.CanShutdownCleanly(false)); |
} |
-TEST_F(PortsTest, MergePorts) { |
- NodeName node0_name(0, 1); |
- TestNodeDelegate node0_delegate(node0_name); |
- Node node0(node0_name, &node0_delegate); |
- node_map[0] = &node0; |
- |
- NodeName node1_name(1, 1); |
- TestNodeDelegate node1_delegate(node1_name); |
- Node node1(node1_name, &node1_delegate); |
- node_map[1] = &node1; |
- |
- // Setup two independent port pairs, A-B on node0 and C-D on node1. |
- PortRef A, B, C, D; |
- EXPECT_EQ(OK, node0.CreatePortPair(&A, &B)); |
- EXPECT_EQ(OK, node1.CreatePortPair(&C, &D)); |
- |
- node0_delegate.set_read_messages(false); |
- node1_delegate.set_save_messages(true); |
- |
- // Write a message on A. |
- EXPECT_EQ(OK, SendStringMessage(&node0, A, "hey")); |
- |
- PumpTasks(); |
- |
- // Initiate a merge between B and C. |
- EXPECT_EQ(OK, node0.MergePorts(B, node1_name, C.name())); |
- |
- PumpTasks(); |
- |
- // Expect only two receiving ports to be left after pumping tasks. |
- EXPECT_TRUE(node0.CanShutdownCleanly(true)); |
- EXPECT_TRUE(node1.CanShutdownCleanly(true)); |
- |
- // Expect D to have received the message sent on A. |
- ScopedMessage message; |
- ASSERT_TRUE(node1_delegate.GetSavedMessage(&message)); |
- EXPECT_EQ(0, strcmp("hey", ToString(message))); |
- |
- EXPECT_EQ(OK, node0.ClosePort(A)); |
- EXPECT_EQ(OK, node1.ClosePort(D)); |
- |
- // No more ports should be open. |
- EXPECT_TRUE(node0.CanShutdownCleanly(false)); |
- EXPECT_TRUE(node1.CanShutdownCleanly(false)); |
-} |
- |
-TEST_F(PortsTest, MergePortWithClosedPeer1) { |
- // This tests that the right thing happens when initiating a merge on a port |
- // whose peer has already been closed. |
- |
- NodeName node0_name(0, 1); |
- TestNodeDelegate node0_delegate(node0_name); |
- Node node0(node0_name, &node0_delegate); |
- node_map[0] = &node0; |
- |
- NodeName node1_name(1, 1); |
- TestNodeDelegate node1_delegate(node1_name); |
- Node node1(node1_name, &node1_delegate); |
- node_map[1] = &node1; |
- |
- // Setup two independent port pairs, A-B on node0 and C-D on node1. |
- PortRef A, B, C, D; |
- EXPECT_EQ(OK, node0.CreatePortPair(&A, &B)); |
- EXPECT_EQ(OK, node1.CreatePortPair(&C, &D)); |
- |
- node0_delegate.set_read_messages(false); |
- node1_delegate.set_save_messages(true); |
- |
- // Write a message on A. |
- EXPECT_EQ(OK, SendStringMessage(&node0, A, "hey")); |
- |
- PumpTasks(); |
- |
- // Close A. |
- EXPECT_EQ(OK, node0.ClosePort(A)); |
- |
- // Initiate a merge between B and C. |
- EXPECT_EQ(OK, node0.MergePorts(B, node1_name, C.name())); |
- |
- PumpTasks(); |
- |
- // Expect only one receiving port to be left after pumping tasks. |
- EXPECT_TRUE(node0.CanShutdownCleanly(false)); |
- EXPECT_TRUE(node1.CanShutdownCleanly(true)); |
- |
- // Expect D to have received the message sent on A. |
- ScopedMessage message; |
- ASSERT_TRUE(node1_delegate.GetSavedMessage(&message)); |
- EXPECT_EQ(0, strcmp("hey", ToString(message))); |
- |
- EXPECT_EQ(OK, node1.ClosePort(D)); |
- |
- // No more ports should be open. |
- EXPECT_TRUE(node0.CanShutdownCleanly(false)); |
- EXPECT_TRUE(node1.CanShutdownCleanly(false)); |
-} |
- |
-TEST_F(PortsTest, MergePortWithClosedPeer2) { |
- // This tests that the right thing happens when merging into a port whose peer |
- // has already been closed. |
- |
- NodeName node0_name(0, 1); |
- TestNodeDelegate node0_delegate(node0_name); |
- Node node0(node0_name, &node0_delegate); |
- node_map[0] = &node0; |
- |
- NodeName node1_name(1, 1); |
- TestNodeDelegate node1_delegate(node1_name); |
- Node node1(node1_name, &node1_delegate); |
- node_map[1] = &node1; |
- |
- // Setup two independent port pairs, A-B on node0 and C-D on node1. |
- PortRef A, B, C, D; |
- EXPECT_EQ(OK, node0.CreatePortPair(&A, &B)); |
- EXPECT_EQ(OK, node1.CreatePortPair(&C, &D)); |
- |
- node0_delegate.set_save_messages(true); |
- node1_delegate.set_read_messages(false); |
- |
- // Write a message on D. |
- EXPECT_EQ(OK, SendStringMessage(&node0, D, "hey")); |
- |
- PumpTasks(); |
- |
- // Close D. |
- EXPECT_EQ(OK, node1.ClosePort(D)); |
- |
- // Initiate a merge between B and C. |
- EXPECT_EQ(OK, node0.MergePorts(B, node1_name, C.name())); |
- |
- PumpTasks(); |
- |
- // Expect only one receiving port to be left after pumping tasks. |
- EXPECT_TRUE(node0.CanShutdownCleanly(true)); |
- EXPECT_TRUE(node1.CanShutdownCleanly(false)); |
- |
- // Expect A to have received the message sent on D. |
- ScopedMessage message; |
- ASSERT_TRUE(node0_delegate.GetSavedMessage(&message)); |
- EXPECT_EQ(0, strcmp("hey", ToString(message))); |
- |
- EXPECT_EQ(OK, node0.ClosePort(A)); |
- |
- // No more ports should be open. |
- EXPECT_TRUE(node0.CanShutdownCleanly(false)); |
- EXPECT_TRUE(node1.CanShutdownCleanly(false)); |
-} |
- |
-TEST_F(PortsTest, MergePortsWithClosedPeers) { |
- // This tests that no residual ports are left behind if two ports are merged |
- // when both of their peers have been closed. |
- |
- NodeName node0_name(0, 1); |
- TestNodeDelegate node0_delegate(node0_name); |
- Node node0(node0_name, &node0_delegate); |
- node_map[0] = &node0; |
- |
- NodeName node1_name(1, 1); |
- TestNodeDelegate node1_delegate(node1_name); |
- Node node1(node1_name, &node1_delegate); |
- node_map[1] = &node1; |
- |
- // Setup two independent port pairs, A-B on node0 and C-D on node1. |
- PortRef A, B, C, D; |
- EXPECT_EQ(OK, node0.CreatePortPair(&A, &B)); |
- EXPECT_EQ(OK, node1.CreatePortPair(&C, &D)); |
- |
- node0_delegate.set_save_messages(true); |
- node1_delegate.set_read_messages(false); |
- |
- // Close A and D. |
- EXPECT_EQ(OK, node0.ClosePort(A)); |
- EXPECT_EQ(OK, node1.ClosePort(D)); |
- |
- PumpTasks(); |
- |
- // Initiate a merge between B and C. |
- EXPECT_EQ(OK, node0.MergePorts(B, node1_name, C.name())); |
- |
- PumpTasks(); |
- |
- // Expect everything to have gone away. |
- EXPECT_TRUE(node0.CanShutdownCleanly(false)); |
- EXPECT_TRUE(node1.CanShutdownCleanly(false)); |
-} |
- |
-TEST_F(PortsTest, MergePortsWithMovedPeers) { |
- // This tests that no ports can be merged successfully even if their peers |
- // are moved around. |
- |
- NodeName node0_name(0, 1); |
- TestNodeDelegate node0_delegate(node0_name); |
- Node node0(node0_name, &node0_delegate); |
- node_map[0] = &node0; |
- |
- NodeName node1_name(1, 1); |
- TestNodeDelegate node1_delegate(node1_name); |
- Node node1(node1_name, &node1_delegate); |
- node_map[1] = &node1; |
- |
- node0_delegate.set_save_messages(true); |
- node1_delegate.set_read_messages(false); |
- |
- // Setup two independent port pairs, A-B on node0 and C-D on node1. |
- PortRef A, B, C, D; |
- EXPECT_EQ(OK, node0.CreatePortPair(&A, &B)); |
- EXPECT_EQ(OK, node1.CreatePortPair(&C, &D)); |
- |
- // Set up another pair X-Y for moving ports on node0. |
- PortRef X, Y; |
- EXPECT_EQ(OK, node0.CreatePortPair(&X, &Y)); |
- |
- ScopedMessage message; |
- |
- // Move A to new port E. |
- EXPECT_EQ(OK, SendStringMessageWithPort(&node0, X, "foo", A)); |
- ASSERT_TRUE(node0_delegate.GetSavedMessage(&message)); |
- ASSERT_EQ(1u, message->num_ports()); |
- PortRef E; |
- ASSERT_EQ(OK, node0.GetPort(message->ports()[0], &E)); |
- |
- EXPECT_EQ(OK, node0.ClosePort(X)); |
- EXPECT_EQ(OK, node0.ClosePort(Y)); |
- |
- node0_delegate.set_read_messages(false); |
- |
- // Write messages on E and D. |
- EXPECT_EQ(OK, SendStringMessage(&node0, E, "hey")); |
- EXPECT_EQ(OK, SendStringMessage(&node1, D, "hi")); |
- |
- // Initiate a merge between B and C. |
- EXPECT_EQ(OK, node0.MergePorts(B, node1_name, C.name())); |
- |
- node0_delegate.set_read_messages(true); |
- node1_delegate.set_read_messages(true); |
- node1_delegate.set_save_messages(true); |
- |
- PumpTasks(); |
- |
- // Expect to receive D's message on E and E's message on D. |
- ASSERT_TRUE(node0_delegate.GetSavedMessage(&message)); |
- EXPECT_EQ(0, strcmp("hi", ToString(message))); |
- ASSERT_TRUE(node1_delegate.GetSavedMessage(&message)); |
- EXPECT_EQ(0, strcmp("hey", ToString(message))); |
- |
- // Close E and D. |
- EXPECT_EQ(OK, node0.ClosePort(E)); |
- EXPECT_EQ(OK, node1.ClosePort(D)); |
- |
- PumpTasks(); |
- |
- // Expect everything to have gone away. |
- EXPECT_TRUE(node0.CanShutdownCleanly(false)); |
- EXPECT_TRUE(node1.CanShutdownCleanly(false)); |
-} |
- |
- |
-TEST_F(PortsTest, MergePortsFailsGracefully) { |
- // This tests that the system remains in a well-defined state if something |
- // goes wrong during port merge. |
- |
- NodeName node0_name(0, 1); |
- TestNodeDelegate node0_delegate(node0_name); |
- Node node0(node0_name, &node0_delegate); |
- node_map[0] = &node0; |
- |
- NodeName node1_name(1, 1); |
- TestNodeDelegate node1_delegate(node1_name); |
- Node node1(node1_name, &node1_delegate); |
- node_map[1] = &node1; |
- |
- // Setup two independent port pairs, A-B on node0 and C-D on node1. |
- PortRef A, B, C, D; |
- EXPECT_EQ(OK, node0.CreatePortPair(&A, &B)); |
- EXPECT_EQ(OK, node1.CreatePortPair(&C, &D)); |
- |
- PumpTasks(); |
- |
- // Initiate a merge between B and C. |
- EXPECT_EQ(OK, node0.MergePorts(B, node1_name, C.name())); |
- |
- // Move C to a new port E. This is dumb and nobody should do it, but it's |
- // possible. MergePorts will fail as a result because C won't be in a |
- // receiving state when the event arrives at node1, so B should be closed. |
- ScopedMessage message; |
- PortRef X, Y; |
- EXPECT_EQ(OK, node1.CreatePortPair(&X, &Y)); |
- node1_delegate.set_save_messages(true); |
- EXPECT_EQ(OK, SendStringMessageWithPort(&node1, X, "foo", C)); |
- ASSERT_TRUE(node1_delegate.GetSavedMessage(&message)); |
- ASSERT_EQ(1u, message->num_ports()); |
- PortRef E; |
- ASSERT_EQ(OK, node1.GetPort(message->ports()[0], &E)); |
- EXPECT_EQ(OK, node1.ClosePort(X)); |
- EXPECT_EQ(OK, node1.ClosePort(Y)); |
- |
- // C goes away as a result of normal proxy removal. |
- PumpTasks(); |
- |
- EXPECT_EQ(ERROR_PORT_UNKNOWN, node1.GetPort(C.name(), &C)); |
- |
- // B should have been closed cleanly. |
- EXPECT_EQ(ERROR_PORT_UNKNOWN, node0.GetPort(B.name(), &B)); |
- |
- // Close A, D, and E. |
- EXPECT_EQ(OK, node0.ClosePort(A)); |
- EXPECT_EQ(OK, node1.ClosePort(D)); |
- EXPECT_EQ(OK, node1.ClosePort(E)); |
- |
- PumpTasks(); |
- |
- // Expect everything to have gone away. |
- EXPECT_TRUE(node0.CanShutdownCleanly(false)); |
- EXPECT_TRUE(node1.CanShutdownCleanly(false)); |
-} |
- |
} // namespace test |
} // namespace ports |
} // namespace edk |