Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(400)

Unified Diff: mojo/services/view_manager/view_manager_connection_unittest.cc

Issue 288313002: Tweaks to ViewManager: (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cleanup Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 c1f4d3308da75b201c555f6bec83da3a0dd21884..385fb0551ad2c7b148a1e04ec9772cd875dbf6a1 100644
--- a/mojo/services/view_manager/view_manager_connection_unittest.cc
+++ b/mojo/services/view_manager/view_manager_connection_unittest.cc
@@ -62,10 +62,8 @@ struct TestNode {
TransportNodeId view_id;
};
-// Callback that results in a vector of INodes. The INodes are converted to
-// TestNodes.
-void INodesCallback(std::vector<TestNode>* test_nodes,
- const mojo::Array<INode>& data) {
+void INodesToTestNodes(const mojo::Array<INode>& data,
+ std::vector<TestNode>* test_nodes) {
for (size_t i = 0; i < data.size(); ++i) {
TestNode node;
node.parent_id = data[i].parent_id();
@@ -73,6 +71,13 @@ void INodesCallback(std::vector<TestNode>* test_nodes,
node.view_id = data[i].view_id();
test_nodes->push_back(node);
}
+}
+
+// Callback that results in a vector of INodes. The INodes are converted to
+// TestNodes.
+void INodesCallback(std::vector<TestNode>* test_nodes,
+ const mojo::Array<INode>& data) {
+ INodesToTestNodes(data, test_nodes);
current_run_loop->Quit();
}
@@ -180,6 +185,12 @@ class ViewManagerClientImpl : public IViewManagerClient {
TransportChangeId next_server_change_id() const {
return next_server_change_id_;
}
+ const std::vector<TestNode>& initial_nodes() const {
+ return initial_nodes_;
+ }
+ const std::vector<TestNode>& hierarchy_changed_nodes() const {
+ return hierarchy_changed_nodes_;
+ }
Changes GetAndClearChanges() {
Changes changes;
@@ -203,17 +214,28 @@ class ViewManagerClientImpl : public IViewManagerClient {
// IViewManagerClient overrides:
virtual void OnConnectionEstablished(
TransportConnectionId connection_id,
- TransportChangeId next_server_change_id) OVERRIDE {
+ TransportChangeId next_server_change_id,
+ const mojo::Array<INode>& nodes) OVERRIDE {
id_ = connection_id;
next_server_change_id_ = next_server_change_id;
+ INodesToTestNodes(nodes, &initial_nodes_);
if (current_run_loop)
current_run_loop->Quit();
}
+ virtual void OnServerChangeIdAdvanced(
+ uint32_t next_server_change_id) OVERRIDE {
+ changes_.push_back(
+ base::StringPrintf(
+ "ServerChangeIdAdvanced %d",
+ static_cast<int>(next_server_change_id)));
+ QuitIfNecessary();
+ }
virtual void OnNodeHierarchyChanged(
TransportNodeId node,
TransportNodeId new_parent,
TransportNodeId old_parent,
- TransportChangeId server_change_id) OVERRIDE {
+ TransportChangeId server_change_id,
+ const mojo::Array<INode>& nodes) OVERRIDE {
changes_.push_back(
base::StringPrintf(
"HierarchyChanged change_id=%d node=%s new_parent=%s old_parent=%s",
@@ -221,6 +243,8 @@ class ViewManagerClientImpl : public IViewManagerClient {
NodeIdToString(node).c_str(),
NodeIdToString(new_parent).c_str(),
NodeIdToString(old_parent).c_str()));
+ hierarchy_changed_nodes_.clear();
+ INodesToTestNodes(nodes, &hierarchy_changed_nodes_);
QuitIfNecessary();
}
virtual void OnNodeDeleted(TransportNodeId node,
@@ -264,6 +288,12 @@ class ViewManagerClientImpl : public IViewManagerClient {
Changes changes_;
+ // Set of nodes sent when connection created.
+ std::vector<TestNode> initial_nodes_;
+
+ // Nodes sent from last OnNodeHierarchyChanged.
+ std::vector<TestNode> hierarchy_changed_nodes_;
+
DISALLOW_COPY_AND_ASSIGN(ViewManagerClientImpl);
};
@@ -361,9 +391,7 @@ TEST_F(ViewManagerConnectionTest, AddRemoveNotify) {
client2_.DoRunLoopUntilChangesCount(1);
changes = client2_.GetAndClearChanges();
ASSERT_EQ(1u, changes.size());
- EXPECT_EQ(
- "HierarchyChanged change_id=1 node=1,2 new_parent=1,1 old_parent=null",
- changes[0]);
+ EXPECT_EQ("ServerChangeIdAdvanced 2", changes[0]);
}
// Remove 2 from its parent.
@@ -378,9 +406,7 @@ TEST_F(ViewManagerConnectionTest, AddRemoveNotify) {
client2_.DoRunLoopUntilChangesCount(1);
changes = client2_.GetAndClearChanges();
ASSERT_EQ(1u, changes.size());
- EXPECT_EQ(
- "HierarchyChanged change_id=2 node=1,2 new_parent=null old_parent=1,1",
- changes[0]);
+ EXPECT_EQ("ServerChangeIdAdvanced 3", changes[0]);
}
}
@@ -407,9 +433,7 @@ TEST_F(ViewManagerConnectionTest, AddNodeWithNoChange) {
client2_.DoRunLoopUntilChangesCount(1);
changes = client2_.GetAndClearChanges();
ASSERT_EQ(1u, changes.size());
- EXPECT_EQ(
- "HierarchyChanged change_id=1 node=1,2 new_parent=1,1 old_parent=null",
- changes[0]);
+ EXPECT_EQ("ServerChangeIdAdvanced 2", changes[0]);
}
// Try again, this should fail.
@@ -447,9 +471,7 @@ TEST_F(ViewManagerConnectionTest, AddAncestorFails) {
client2_.DoRunLoopUntilChangesCount(1);
changes = client2_.GetAndClearChanges();
ASSERT_EQ(1u, changes.size());
- EXPECT_EQ(
- "HierarchyChanged change_id=1 node=1,2 new_parent=1,1 old_parent=null",
- changes[0]);
+ EXPECT_EQ("ServerChangeIdAdvanced 2", changes[0]);
}
// Try to make 1 a child of 2, this should fail since 1 is an ancestor of 2.
@@ -504,9 +526,7 @@ TEST_F(ViewManagerConnectionTest, AddToRoot) {
client2_.DoRunLoopUntilChangesCount(1);
changes = client2_.GetAndClearChanges();
ASSERT_EQ(1u, changes.size());
- EXPECT_EQ(
- "HierarchyChanged change_id=1 node=1,3 new_parent=1,21 old_parent=null",
- changes[0]);
+ EXPECT_EQ("ServerChangeIdAdvanced 2", changes[0]);
}
// Make 21 a child of the root.
@@ -528,6 +548,206 @@ TEST_F(ViewManagerConnectionTest, AddToRoot) {
}
}
+// Verifies adding to root sends right notifications.
+TEST_F(ViewManagerConnectionTest, NodeHierarchyChangedNodes) {
+ // Create nodes 1 and 11 with 1 parented to the root and 11 a child of 1.
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 1));
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 11));
+
+ // Make 11 a child of 1.
+ {
+ AllocationScope scope;
+ ASSERT_TRUE(AddNode(view_manager_.get(),
+ CreateNodeId(client_.id(), 1),
+ CreateNodeId(client_.id(), 11),
+ 1));
+ ASSERT_TRUE(client_.GetAndClearChanges().empty());
+ }
+
+ EstablishSecondConnection();
+
+ // Make 1 a child of the root.
+ {
+ AllocationScope scope;
+ ASSERT_TRUE(AddNode(view_manager_.get(),
+ CreateNodeId(0, 1),
+ CreateNodeId(client_.id(), 1),
+ 2));
+ ASSERT_TRUE(client_.GetAndClearChanges().empty());
+
+ // Client 2 should get a hierarchy change that includes the new nodes as it
+ // has not yet seen them.
+ client2_.DoRunLoopUntilChangesCount(1);
+ Changes changes(client2_.GetAndClearChanges());
+ ASSERT_EQ(1u, changes.size());
+ EXPECT_EQ(
+ "HierarchyChanged change_id=2 node=1,1 new_parent=0,1 old_parent=null",
+ changes[0]);
+ const std::vector<TestNode>& nodes(client2_.hierarchy_changed_nodes());
+ ASSERT_EQ(2u, nodes.size());
+ EXPECT_EQ("node=1,1 parent=0,1 view=null", nodes[0].ToString());
+ EXPECT_EQ("node=1,11 parent=1,1 view=null", nodes[1].ToString());
+ }
+
+ // Remove 1 from the root.
+ {
+ AllocationScope scope;
+ ASSERT_TRUE(RemoveNodeFromParent(view_manager_.get(),
+ CreateNodeId(client_.id(), 1),
+ 3));
+ ASSERT_TRUE(client_.GetAndClearChanges().empty());
+
+ client2_.DoRunLoopUntilChangesCount(1);
+ Changes changes(client2_.GetAndClearChanges());
+ ASSERT_EQ(1u, changes.size());
+ EXPECT_EQ(
+ "HierarchyChanged change_id=3 node=1,1 new_parent=null old_parent=0,1",
+ changes[0]);
+ }
+
+ // Create another node, 111, parent it to 11.
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 111));
+ {
+ AllocationScope scope;
+ ASSERT_TRUE(AddNode(view_manager_.get(),
+ CreateNodeId(client_.id(), 11),
+ CreateNodeId(client_.id(), 111),
+ 4));
+ ASSERT_TRUE(client_.GetAndClearChanges().empty());
+
+ client2_.DoRunLoopUntilChangesCount(1);
+ Changes changes(client2_.GetAndClearChanges());
+ ASSERT_EQ(1u, changes.size());
+ // Even though 11 isn't attached to the root client 2 is still notified of
+ // the change because it was told about 11.
+ EXPECT_EQ(
+ "HierarchyChanged change_id=4 node=1,111 new_parent=1,11 "
+ "old_parent=null", changes[0]);
+ const std::vector<TestNode>& nodes(client2_.hierarchy_changed_nodes());
+ ASSERT_EQ(1u, nodes.size());
+ EXPECT_EQ("node=1,111 parent=1,11 view=null", nodes[0].ToString());
+ }
+
+ // Reattach 1 to the root.
+ {
+ ASSERT_TRUE(AddNode(view_manager_.get(),
+ CreateNodeId(0, 1),
+ CreateNodeId(client_.id(), 1),
+ 5));
+ ASSERT_TRUE(client_.GetAndClearChanges().empty());
+
+ client2_.DoRunLoopUntilChangesCount(1);
+ Changes changes = client2_.GetAndClearChanges();
+ ASSERT_EQ(1u, changes.size());
+ EXPECT_EQ(
+ "HierarchyChanged change_id=5 node=1,1 new_parent=0,1 old_parent=null",
+ changes[0]);
+ ASSERT_TRUE(client2_.hierarchy_changed_nodes().empty());
+ }
+}
+
+TEST_F(ViewManagerConnectionTest, NodeHierarchyChangedAddingKnownToUnknown) {
+ // Create the following structure: root -> 1 -> 11 and 2->21 (2 has no
+ // parent).
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 1));
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 11));
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 2));
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 21));
+
+ // Set up the hierarchy.
+ {
+ AllocationScope scope;
+ ASSERT_TRUE(AddNode(view_manager_.get(),
+ CreateNodeId(0, 1),
+ CreateNodeId(client_.id(), 1),
+ 1));
+ ASSERT_TRUE(AddNode(view_manager_.get(),
+ CreateNodeId(client_.id(), 1),
+ CreateNodeId(client_.id(), 11),
+ 2));
+ ASSERT_TRUE(AddNode(view_manager_.get(),
+ CreateNodeId(client_.id(), 2),
+ CreateNodeId(client_.id(), 21),
+ 3));
+ }
+
+ EstablishSecondConnection();
+
+ // Remove 11.
+ {
+ AllocationScope scope;
+ ASSERT_TRUE(RemoveNodeFromParent(view_manager_.get(),
+ CreateNodeId(client_.id(), 11),
+ 4));
+ ASSERT_TRUE(client_.GetAndClearChanges().empty());
+
+ client2_.DoRunLoopUntilChangesCount(1);
+ Changes changes(client2_.GetAndClearChanges());
+ ASSERT_EQ(1u, changes.size());
+ EXPECT_EQ(
+ "HierarchyChanged change_id=4 node=1,11 new_parent=null old_parent=1,1",
+ changes[0]);
+ EXPECT_TRUE(client2_.hierarchy_changed_nodes().empty());
+ }
+
+ // Add 11 to 21. As client2 knows about 11 it should receive the new
+ // hierarchy.
+ {
+ AllocationScope scope;
+ ASSERT_TRUE(AddNode(view_manager_.get(),
+ CreateNodeId(client_.id(), 21),
+ CreateNodeId(client_.id(), 11),
+ 5));
+ ASSERT_TRUE(client_.GetAndClearChanges().empty());
+
+ client2_.DoRunLoopUntilChangesCount(1);
+ Changes changes(client2_.GetAndClearChanges());
+ ASSERT_EQ(1u, changes.size());
+ EXPECT_EQ(
+ "HierarchyChanged change_id=5 node=1,11 new_parent=1,21 "
+ "old_parent=null", changes[0]);
+ const std::vector<TestNode>& nodes(client2_.hierarchy_changed_nodes());
+ ASSERT_EQ(2u, nodes.size());
+ EXPECT_EQ("node=1,2 parent=null view=null", nodes[0].ToString());
+ EXPECT_EQ("node=1,21 parent=1,2 view=null", nodes[1].ToString());
+ }
+}
+
+// Verifies connection on told descendants of the root when connecting.
+TEST_F(ViewManagerConnectionTest, GetInitialNodesOnInit) {
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 21));
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 3));
+ EXPECT_TRUE(client_.GetAndClearChanges().empty());
+
+ // Make 3 a child of 21.
+ {
+ AllocationScope scope;
+ ASSERT_TRUE(AddNode(view_manager_.get(),
+ CreateNodeId(client_.id(), 21),
+ CreateNodeId(client_.id(), 3),
+ 1));
+ ASSERT_TRUE(client_.GetAndClearChanges().empty());
+ }
+
+ // Make 21 a child of the root.
+ {
+ AllocationScope scope;
+ ASSERT_TRUE(AddNode(view_manager_.get(),
+ CreateNodeId(0, 1),
+ CreateNodeId(client_.id(), 21),
+ 2));
+ ASSERT_TRUE(client_.GetAndClearChanges().empty());
+ }
+
+ EstablishSecondConnection();
+ // Should get notification of children of the root.
+ const std::vector<TestNode>& nodes(client2_.initial_nodes());
+ ASSERT_EQ(3u, nodes.size());
+ EXPECT_EQ("node=0,1 parent=null view=null", nodes[0].ToString());
+ EXPECT_EQ("node=1,21 parent=0,1 view=null", nodes[1].ToString());
+ EXPECT_EQ("node=1,3 parent=1,21 view=null", nodes[2].ToString());
+}
+
// Verifies DeleteNode works.
TEST_F(ViewManagerConnectionTest, DeleteNode) {
ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 1));
@@ -550,9 +770,7 @@ TEST_F(ViewManagerConnectionTest, DeleteNode) {
client2_.DoRunLoopUntilChangesCount(1);
changes = client2_.GetAndClearChanges();
ASSERT_EQ(1u, changes.size());
- EXPECT_EQ(
- "HierarchyChanged change_id=1 node=1,2 new_parent=1,1 old_parent=null",
- changes[0]);
+ EXPECT_EQ("ServerChangeIdAdvanced 2", changes[0]);
}
// Add 1 to the root
@@ -573,24 +791,78 @@ TEST_F(ViewManagerConnectionTest, DeleteNode) {
changes[0]);
}
- // Delete 1. Deleting 1 sends out notification of a removal for both nodes (1
- // and 2).
+ // Delete 1.
{
AllocationScope scope;
ASSERT_TRUE(DeleteNode(view_manager_.get(), CreateNodeId(client_.id(), 1)));
Changes changes(client_.GetAndClearChanges());
ASSERT_TRUE(changes.empty());
- client2_.DoRunLoopUntilChangesCount(3);
+ client2_.DoRunLoopUntilChangesCount(1);
changes = client2_.GetAndClearChanges();
- ASSERT_EQ(3u, changes.size());
+ ASSERT_EQ(1u, changes.size());
+ EXPECT_EQ("NodeDeleted change_id=3 node=1,1", changes[0]);
+ }
+}
+
+// Verifies if a node was deleted and then reused that other clients are
+// properly notified.
+TEST_F(ViewManagerConnectionTest, ReusedDeletedId) {
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 1));
+ EXPECT_TRUE(client_.GetAndClearChanges().empty());
+
+ EstablishSecondConnection();
+
+ // Make 1 a child of the root.
+ {
+ AllocationScope scope;
+ ASSERT_TRUE(AddNode(view_manager_.get(),
+ CreateNodeId(0, 1),
+ CreateNodeId(client_.id(), 1),
+ 1));
+ EXPECT_TRUE(client_.GetAndClearChanges().empty());
+
+ client2_.DoRunLoopUntilChangesCount(1);
+ Changes changes = client2_.GetAndClearChanges();
EXPECT_EQ(
- "HierarchyChanged change_id=3 node=1,1 new_parent=null old_parent=0,1",
+ "HierarchyChanged change_id=1 node=1,1 new_parent=0,1 old_parent=null",
changes[0]);
+ const std::vector<TestNode>& nodes(client2_.hierarchy_changed_nodes());
+ ASSERT_EQ(1u, nodes.size());
+ EXPECT_EQ("node=1,1 parent=0,1 view=null", nodes[0].ToString());
+ }
+
+ // Delete 1.
+ {
+ AllocationScope scope;
+ ASSERT_TRUE(DeleteNode(view_manager_.get(), CreateNodeId(client_.id(), 1)));
+ EXPECT_TRUE(client_.GetAndClearChanges().empty());
+
+ client2_.DoRunLoopUntilChangesCount(1);
+ Changes changes = client2_.GetAndClearChanges();
+ ASSERT_EQ(1u, changes.size());
+ EXPECT_EQ("NodeDeleted change_id=2 node=1,1", changes[0]);
+ }
+
+ // Create 1 again, and add it back to the root. Should get the same
+ // notification.
+ ASSERT_TRUE(CreateNode(view_manager_.get(), 1, 1));
+ {
+ AllocationScope scope;
+ ASSERT_TRUE(AddNode(view_manager_.get(),
+ CreateNodeId(0, 1),
+ CreateNodeId(client_.id(), 1),
+ 3));
+ EXPECT_TRUE(client_.GetAndClearChanges().empty());
+
+ client2_.DoRunLoopUntilChangesCount(1);
+ Changes changes = client2_.GetAndClearChanges();
EXPECT_EQ(
- "HierarchyChanged change_id=3 node=1,2 new_parent=null old_parent=1,1",
- changes[1]);
- EXPECT_EQ("NodeDeleted change_id=3 node=1,1", changes[2]);
+ "HierarchyChanged change_id=3 node=1,1 new_parent=0,1 old_parent=null",
+ changes[0]);
+ const std::vector<TestNode>& nodes(client2_.hierarchy_changed_nodes());
+ ASSERT_EQ(1u, nodes.size());
+ EXPECT_EQ("node=1,1 parent=0,1 view=null", nodes[0].ToString());
}
}
@@ -664,9 +936,17 @@ TEST_F(ViewManagerConnectionTest, DeleteNodeWithView) {
changes = client2_.GetAndClearChanges();
ASSERT_EQ(2u, changes.size());
EXPECT_EQ("ViewReplaced node=1,1 new_view=null old_view=1,11", changes[0]);
- EXPECT_EQ("NodeDeleted change_id=1 node=1,1", changes[1]);
+ EXPECT_EQ("ServerChangeIdAdvanced 2", changes[1]);
}
+ // Parent 2 to the root.
+ ASSERT_TRUE(AddNode(view_manager_.get(),
+ CreateNodeId(0, 1),
+ CreateNodeId(client_.id(), 2),
+ 2));
+ client2_.DoRunLoopUntilChangesCount(1);
+ client2_.GetAndClearChanges();
+
// Set view 11 on node 2.
{
ASSERT_TRUE(SetView(view_manager_.get(),
@@ -680,6 +960,19 @@ TEST_F(ViewManagerConnectionTest, DeleteNodeWithView) {
ASSERT_EQ(1u, changes.size());
EXPECT_EQ("ViewReplaced node=1,2 new_view=1,11 old_view=null", changes[0]);
}
+
+ // Delete node.
+ {
+ ASSERT_TRUE(DeleteNode(view_manager_.get(), CreateNodeId(client_.id(), 2)));
+ Changes changes(client_.GetAndClearChanges());
+ ASSERT_TRUE(changes.empty());
+
+ client2_.DoRunLoopUntilChangesCount(2);
+ changes = client2_.GetAndClearChanges();
+ ASSERT_EQ(2u, changes.size());
+ EXPECT_EQ("ViewReplaced node=1,2 new_view=null old_view=1,11", changes[0]);
+ EXPECT_EQ("NodeDeleted change_id=3 node=1,2", changes[1]);
+ }
}
// Sets view from one connection on another.

Powered by Google App Engine
This is Rietveld 408576698