Index: mojo/services/view_manager/view_manager_connection_unittest.cc |
diff --git a/mojo/services/view_manager/view_manager_connection_unittest.cc b/mojo/services/view_manager/view_manager_connection_unittest.cc |
index 063a740e2eb07da72c487f8f552939bc3d86d8a6..56ab6a3b96a199197db536a1b9035427210a49c9 100644 |
--- a/mojo/services/view_manager/view_manager_connection_unittest.cc |
+++ b/mojo/services/view_manager/view_manager_connection_unittest.cc |
@@ -361,6 +361,24 @@ class ViewManagerConnectionTest : public testing::Test { |
client2_.GetAndClearChanges(); |
} |
+ void EstablishSecondConnectionWithRoot(TransportNodeId root_id) { |
+ EstablishSecondConnection(); |
+ client2_.ClearId(); |
+ |
+ AllocationScope scope; |
+ std::vector<uint32_t> roots; |
+ roots.push_back(root_id); |
+ ASSERT_TRUE(SetRoots(view_manager_.get(), 2, roots)); |
+ client2_.DoRunLoopUntilChangesCount(1); |
+ Changes changes(client2_.GetAndClearChanges()); |
+ ASSERT_EQ(1u, changes.size()); |
+ EXPECT_EQ("OnConnectionEstablished", changes[0]); |
+ ASSERT_NE(0u, client2_.id()); |
+ const std::vector<TestNode>& nodes(client2_.initial_nodes()); |
+ ASSERT_EQ(1u, nodes.size()); |
+ EXPECT_EQ("node=1,1 parent=null view=null", nodes[0].ToString()); |
+ } |
+ |
void DestroySecondConnection() { |
view_manager2_.reset(); |
} |
@@ -1128,6 +1146,7 @@ TEST_F(ViewManagerConnectionTest, GetNodeTree) { |
} |
} |
+// Various assertions around SetRoots. |
TEST_F(ViewManagerConnectionTest, SetRoots) { |
// Create 1, 2, and 3 in the first connection. |
ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 1)); |
@@ -1215,7 +1234,156 @@ TEST_F(ViewManagerConnectionTest, SetRoots) { |
} |
} |
-// TODO: add tests that verify can't manipulate trees of uknown nodes. |
+// Verify AddNode fails when trying to manipulate nodes in other roots. |
+TEST_F(ViewManagerConnectionTest, CantMoveNodesFromOtherRoot) { |
+ // Create 1 and 2 in the first connection. |
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 1)); |
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 2)); |
+ |
+ // Establish the second connection and give it the root 1. |
+ ASSERT_NO_FATAL_FAILURE( |
+ EstablishSecondConnectionWithRoot(CreateNodeId(1, 1))); |
+ |
+ // Try to move 2 to be a child of 1 from connection 2. This should fail as 2 |
+ // should not be able to access 1. |
+ ASSERT_FALSE(AddNode(view_manager2_.get(), |
+ CreateNodeId(1, 1), |
+ CreateNodeId(1, 2), |
+ 1)); |
+ |
+ // Try to reparent 1 to the root. A connection is not allowed to reparent its |
+ // roots. |
+ ASSERT_FALSE(AddNode(view_manager2_.get(), |
+ CreateNodeId(0, 1), |
+ CreateNodeId(1, 1), |
+ 1)); |
+} |
+ |
+ |
+// Verify RemoveNodeFromParent fails for nodes that are descendants of the |
+// roots. |
+TEST_F(ViewManagerConnectionTest, CantRemoveNodesInOtherRoots) { |
+ // Create 1 and 2 in the first connection and parent both to the root. |
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 1)); |
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 2)); |
+ |
+ ASSERT_TRUE(AddNode(view_manager_.get(), |
+ CreateNodeId(0, 1), |
+ CreateNodeId(client_.id(), 1), |
+ 1)); |
+ ASSERT_TRUE(AddNode(view_manager_.get(), |
+ CreateNodeId(0, 1), |
+ CreateNodeId(client_.id(), 2), |
+ 2)); |
+ |
+ // Establish the second connection and give it the root 1. |
+ ASSERT_NO_FATAL_FAILURE( |
+ EstablishSecondConnectionWithRoot(CreateNodeId(1, 1))); |
+ |
+ // Connection 2 should not be able to remove node 2 or 1 from its parent. |
+ ASSERT_FALSE(RemoveNodeFromParent(view_manager2_.get(), |
+ CreateNodeId(1, 2), |
+ 3)); |
+ ASSERT_FALSE(RemoveNodeFromParent(view_manager2_.get(), |
+ CreateNodeId(1, 1), |
+ 3)); |
+ |
+ // Create nodes 10 and 11 in 2. |
+ ASSERT_TRUE(CreateNode(view_manager2_.get(), 2, 10)); |
+ ASSERT_TRUE(CreateNode(view_manager2_.get(), 2, 11)); |
+ |
+ // Parent 11 to 10. |
+ ASSERT_TRUE(AddNode(view_manager2_.get(), |
+ CreateNodeId(client2_.id(), 10), |
+ CreateNodeId(client2_.id(), 11), |
+ 3)); |
+ // Remove 11 from 10. |
+ ASSERT_TRUE(RemoveNodeFromParent(view_manager2_.get(), |
+ CreateNodeId(2, 11), |
+ 4)); |
+ |
+ // Verify nothing was actually removed. |
+ { |
+ AllocationScope scope; |
+ std::vector<TestNode> nodes; |
+ GetNodeTree(view_manager_.get(), CreateNodeId(0, 1), &nodes); |
+ ASSERT_EQ(3u, nodes.size()); |
+ EXPECT_EQ("node=0,1 parent=null view=null", nodes[0].ToString()); |
+ EXPECT_EQ("node=1,1 parent=0,1 view=null", nodes[1].ToString()); |
+ EXPECT_EQ("node=1,2 parent=0,1 view=null", nodes[2].ToString()); |
+ } |
+} |
+ |
+// Verify SetView fails for nodes that are not descendants of the roots. |
+TEST_F(ViewManagerConnectionTest, CantRemoveSetViewInOtherRoots) { |
+ // Create 1 and 2 in the first connection and parent both to the root. |
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 1)); |
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 2)); |
+ |
+ ASSERT_TRUE(AddNode(view_manager_.get(), |
+ CreateNodeId(0, 1), |
+ CreateNodeId(client_.id(), 1), |
+ 1)); |
+ ASSERT_TRUE(AddNode(view_manager_.get(), |
+ CreateNodeId(0, 1), |
+ CreateNodeId(client_.id(), 2), |
+ 2)); |
+ |
+ // Establish the second connection and give it the root 1. |
+ ASSERT_NO_FATAL_FAILURE( |
+ EstablishSecondConnectionWithRoot(CreateNodeId(1, 1))); |
+ |
+ // Create a view in the second connection. |
+ ASSERT_TRUE(CreateView(view_manager2_.get(), 2, 51)); |
+ |
+ // Connection 2 should be able to set the view on node 1 (it's root), but not |
+ // on 2. |
+ ASSERT_TRUE(SetView(view_manager2_.get(), |
+ CreateNodeId(client_.id(), 1), |
+ CreateViewId(client2_.id(), 51))); |
+ ASSERT_FALSE(SetView(view_manager2_.get(), |
+ CreateNodeId(client_.id(), 2), |
+ CreateViewId(client2_.id(), 51))); |
+} |
+ |
+// Verify GetNodeTree fails for nodes that are not descendants of the roots. |
+TEST_F(ViewManagerConnectionTest, CantGetNodeTreeOfOtherRoots) { |
+ // Create 1 and 2 in the first connection and parent both to the root. |
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 1)); |
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 2)); |
+ |
+ ASSERT_TRUE(AddNode(view_manager_.get(), |
+ CreateNodeId(0, 1), |
+ CreateNodeId(client_.id(), 1), |
+ 1)); |
+ ASSERT_TRUE(AddNode(view_manager_.get(), |
+ CreateNodeId(0, 1), |
+ CreateNodeId(client_.id(), 2), |
+ 2)); |
+ |
+ // Establish the second connection and give it the root 1. |
+ ASSERT_NO_FATAL_FAILURE( |
+ EstablishSecondConnectionWithRoot(CreateNodeId(1, 1))); |
+ |
+ AllocationScope scope; |
+ std::vector<TestNode> nodes; |
+ |
+ // Should get nothing for the root. |
+ GetNodeTree(view_manager2_.get(), CreateNodeId(0, 1), &nodes); |
+ ASSERT_TRUE(nodes.empty()); |
+ |
+ // Should get nothing for node 2. |
+ GetNodeTree(view_manager2_.get(), CreateNodeId(1, 2), &nodes); |
+ ASSERT_TRUE(nodes.empty()); |
+ |
+ // Should get node 1 if asked for. |
+ GetNodeTree(view_manager2_.get(), CreateNodeId(1, 1), &nodes); |
+ ASSERT_EQ(1u, nodes.size()); |
+ EXPECT_EQ("node=1,1 parent=null view=null", nodes[0].ToString()); |
+} |
+ |
+// TODO(sky): add coverage of test that destroys connections and ensures other |
+// connections get deletion notification (or advanced server id). |
} // namespace service |
} // namespace view_manager |