OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <string> | 5 #include <string> |
6 #include <vector> | 6 #include <vector> |
7 | 7 |
8 #include "base/at_exit.h" | 8 #include "base/at_exit.h" |
9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 run_loop.Run(); | 442 run_loop.Run(); |
443 return result; | 443 return result; |
444 } | 444 } |
445 | 445 |
446 } // namespace | 446 } // namespace |
447 | 447 |
448 typedef std::vector<std::string> Changes; | 448 typedef std::vector<std::string> Changes; |
449 | 449 |
450 class ViewManagerTest : public testing::Test { | 450 class ViewManagerTest : public testing::Test { |
451 public: | 451 public: |
452 ViewManagerTest() : connection_(NULL), connection2_(NULL) {} | 452 ViewManagerTest() |
| 453 : connection_(NULL), |
| 454 connection2_(NULL), |
| 455 connection3_(NULL) {} |
453 | 456 |
454 virtual void SetUp() OVERRIDE { | 457 virtual void SetUp() OVERRIDE { |
455 test_helper_.Init(); | 458 test_helper_.Init(); |
456 | 459 |
457 test_helper_.SetLoaderForURL( | 460 test_helper_.SetLoaderForURL( |
458 scoped_ptr<ServiceLoader>(new EmbedServiceLoader()), | 461 scoped_ptr<ServiceLoader>(new EmbedServiceLoader()), |
459 GURL(kTestServiceURL)); | 462 GURL(kTestServiceURL)); |
460 | 463 |
461 test_helper_.SetLoaderForURL( | 464 test_helper_.SetLoaderForURL( |
462 scoped_ptr<ServiceLoader>(new EmbedServiceLoader()), | 465 scoped_ptr<ServiceLoader>(new EmbedServiceLoader()), |
463 GURL(kTestServiceURL2)); | 466 GURL(kTestServiceURL2)); |
464 | 467 |
465 test_helper_.service_manager()->ConnectToService( | 468 test_helper_.service_manager()->ConnectToService( |
466 GURL("mojo:mojo_view_manager"), | 469 GURL("mojo:mojo_view_manager"), |
467 &view_manager_init_); | 470 &view_manager_init_); |
468 ASSERT_TRUE(InitEmbed(view_manager_init_.get(), kTestServiceURL, 1)); | 471 ASSERT_TRUE(InitEmbed(view_manager_init_.get(), kTestServiceURL, 1)); |
469 | 472 |
470 connection_ = ViewManagerProxy::WaitForInstance(); | 473 connection_ = ViewManagerProxy::WaitForInstance(); |
471 ASSERT_TRUE(connection_ != NULL); | 474 ASSERT_TRUE(connection_ != NULL); |
472 connection_->DoRunLoopUntilChangesCount(1); | 475 connection_->DoRunLoopUntilChangesCount(1); |
473 } | 476 } |
474 | 477 |
475 virtual void TearDown() OVERRIDE { | 478 virtual void TearDown() OVERRIDE { |
| 479 if (connection3_) |
| 480 connection3_->Destroy(); |
476 if (connection2_) | 481 if (connection2_) |
477 connection2_->Destroy(); | 482 connection2_->Destroy(); |
478 if (connection_) | 483 if (connection_) |
479 connection_->Destroy(); | 484 connection_->Destroy(); |
480 } | 485 } |
481 | 486 |
482 protected: | 487 protected: |
483 void EstablishSecondConnectionWithRoot(Id root_id) { | 488 void EstablishSecondConnectionWithRoot(Id root_id) { |
484 ASSERT_TRUE(connection_->Embed(root_id, kTestServiceURL)); | 489 ASSERT_TRUE(connection_->Embed(root_id, kTestServiceURL)); |
485 connection2_ = ViewManagerProxy::WaitForInstance(); | 490 connection2_ = ViewManagerProxy::WaitForInstance(); |
(...skipping 11 matching lines...) Expand all Loading... |
497 const std::vector<Change>& changes(connection2_->changes()); | 502 const std::vector<Change>& changes(connection2_->changes()); |
498 ASSERT_EQ(1u, changes.size()); | 503 ASSERT_EQ(1u, changes.size()); |
499 EXPECT_EQ("OnConnectionEstablished creator=mojo:test_url", | 504 EXPECT_EQ("OnConnectionEstablished creator=mojo:test_url", |
500 ChangesToDescription1(changes)[0]); | 505 ChangesToDescription1(changes)[0]); |
501 if (create_initial_node) { | 506 if (create_initial_node) { |
502 EXPECT_EQ("[node=1,1 parent=null view=null]", | 507 EXPECT_EQ("[node=1,1 parent=null view=null]", |
503 ChangeNodeDescription(changes)); | 508 ChangeNodeDescription(changes)); |
504 } | 509 } |
505 } | 510 } |
506 | 511 |
| 512 void EstablishThirdConnection(ViewManagerProxy* owner, Id root_id) { |
| 513 ASSERT_TRUE(connection3_ == NULL); |
| 514 ASSERT_TRUE(owner->Embed(root_id, kTestServiceURL2)); |
| 515 connection3_ = ViewManagerProxy::WaitForInstance(); |
| 516 ASSERT_TRUE(connection3_ != NULL); |
| 517 connection3_->DoRunLoopUntilChangesCount(1); |
| 518 ASSERT_EQ(1u, connection3_->changes().size()); |
| 519 EXPECT_EQ("OnConnectionEstablished creator=mojo:test_url", |
| 520 ChangesToDescription1(connection3_->changes())[0]); |
| 521 } |
| 522 |
507 void DestroySecondConnection() { | 523 void DestroySecondConnection() { |
508 connection2_->Destroy(); | 524 connection2_->Destroy(); |
509 connection2_ = NULL; | 525 connection2_ = NULL; |
510 } | 526 } |
511 | 527 |
512 base::ShadowingAtExitManager at_exit_; | 528 base::ShadowingAtExitManager at_exit_; |
513 base::MessageLoop loop_; | 529 base::MessageLoop loop_; |
514 shell::ShellTestHelper test_helper_; | 530 shell::ShellTestHelper test_helper_; |
515 | 531 |
516 ViewManagerInitServicePtr view_manager_init_; | 532 ViewManagerInitServicePtr view_manager_init_; |
517 | 533 |
| 534 // NOTE: this connection is the root. As such, it has special permissions. |
518 ViewManagerProxy* connection_; | 535 ViewManagerProxy* connection_; |
519 ViewManagerProxy* connection2_; | 536 ViewManagerProxy* connection2_; |
| 537 ViewManagerProxy* connection3_; |
520 | 538 |
521 DISALLOW_COPY_AND_ASSIGN(ViewManagerTest); | 539 DISALLOW_COPY_AND_ASSIGN(ViewManagerTest); |
522 }; | 540 }; |
523 | 541 |
524 TEST_F(ViewManagerTest, SecondEmbedRoot_InitService) { | 542 TEST_F(ViewManagerTest, SecondEmbedRoot_InitService) { |
525 ASSERT_TRUE(InitEmbed(view_manager_init_.get(), kTestServiceURL, 1)); | 543 ASSERT_TRUE(InitEmbed(view_manager_init_.get(), kTestServiceURL, 1)); |
526 connection_->DoRunLoopUntilChangesCount(1); | 544 connection_->DoRunLoopUntilChangesCount(1); |
527 EXPECT_EQ(kTestServiceURL, connection_->changes()[0].embed_url); | 545 EXPECT_EQ(kTestServiceURL, connection_->changes()[0].embed_url); |
528 } | 546 } |
529 | 547 |
(...skipping 27 matching lines...) Expand all Loading... |
557 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); | 575 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
558 EXPECT_EQ("OnConnectionEstablished creator=mojo:test_url", | 576 EXPECT_EQ("OnConnectionEstablished creator=mojo:test_url", |
559 ChangesToDescription1(connection2_->changes())[0]); | 577 ChangesToDescription1(connection2_->changes())[0]); |
560 | 578 |
561 // It isn't strictly necessary that the second connection gets 2, but these | 579 // It isn't strictly necessary that the second connection gets 2, but these |
562 // tests are written assuming that is the case. The key thing is the | 580 // tests are written assuming that is the case. The key thing is the |
563 // connection ids of |connection_| and |connection2_| differ. | 581 // connection ids of |connection_| and |connection2_| differ. |
564 EXPECT_EQ(2, connection2_->changes()[0].connection_id); | 582 EXPECT_EQ(2, connection2_->changes()[0].connection_id); |
565 } | 583 } |
566 | 584 |
| 585 // Verifies when Embed() is invoked any child nodes are removed. |
| 586 TEST_F(ViewManagerTest, NodesRemovedWhenEmbedding) { |
| 587 // Two nodes 1 and 2. 2 is parented to 1. |
| 588 ASSERT_TRUE(connection_->CreateNode(BuildNodeId(1, 1))); |
| 589 ASSERT_TRUE(connection_->CreateNode(BuildNodeId(1, 2))); |
| 590 ASSERT_TRUE(connection_->AddNode(BuildNodeId(1, 1), BuildNodeId(1, 2))); |
| 591 |
| 592 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(false)); |
| 593 |
| 594 // Because |connection_| is the root, the embed call doesn't remove. |
| 595 { |
| 596 std::vector<TestNode> nodes; |
| 597 connection_->GetNodeTree(BuildNodeId(1, 2), &nodes); |
| 598 ASSERT_EQ(1u, nodes.size()); |
| 599 EXPECT_EQ("node=1,2 parent=1,1 view=null", nodes[0].ToString()); |
| 600 } |
| 601 |
| 602 // But |connection2_| should not see node 2. |
| 603 { |
| 604 std::vector<TestNode> nodes; |
| 605 connection2_->GetNodeTree(BuildNodeId(1, 1), &nodes); |
| 606 ASSERT_EQ(1u, nodes.size()); |
| 607 EXPECT_EQ("node=1,1 parent=null view=null", nodes[0].ToString()); |
| 608 } |
| 609 { |
| 610 std::vector<TestNode> nodes; |
| 611 connection2_->GetNodeTree(BuildNodeId(1, 2), &nodes); |
| 612 EXPECT_TRUE(nodes.empty()); |
| 613 } |
| 614 |
| 615 // Nodes 3 and 4 in connection 2. |
| 616 ASSERT_TRUE(connection2_->CreateNode(BuildNodeId(2, 3))); |
| 617 ASSERT_TRUE(connection2_->CreateNode(BuildNodeId(2, 4))); |
| 618 ASSERT_TRUE(connection2_->AddNode(BuildNodeId(2, 3), BuildNodeId(2, 4))); |
| 619 |
| 620 // Connection 3 rooted at 2. |
| 621 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(connection2_, |
| 622 BuildNodeId(2, 3))); |
| 623 |
| 624 // Node 4 should no longer have a parent. |
| 625 { |
| 626 std::vector<TestNode> nodes; |
| 627 connection2_->GetNodeTree(BuildNodeId(2, 3), &nodes); |
| 628 ASSERT_EQ(1u, nodes.size()); |
| 629 EXPECT_EQ("node=2,3 parent=null view=null", nodes[0].ToString()); |
| 630 |
| 631 nodes.clear(); |
| 632 connection2_->GetNodeTree(BuildNodeId(2, 4), &nodes); |
| 633 ASSERT_EQ(1u, nodes.size()); |
| 634 EXPECT_EQ("node=2,4 parent=null view=null", nodes[0].ToString()); |
| 635 } |
| 636 |
| 637 // And node 4 should not be visible to connection 3. |
| 638 { |
| 639 std::vector<TestNode> nodes; |
| 640 connection3_->GetNodeTree(BuildNodeId(2, 3), &nodes); |
| 641 ASSERT_EQ(1u, nodes.size()); |
| 642 EXPECT_EQ("node=2,3 parent=null view=null", nodes[0].ToString()); |
| 643 } |
| 644 } |
| 645 |
| 646 // Verifies once Embed() has been invoked the parent connection can't see any |
| 647 // children. |
| 648 TEST_F(ViewManagerTest, CantAccessChildrenOfEmbeddedNode) { |
| 649 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
| 650 |
| 651 ASSERT_TRUE(connection2_->CreateNode(BuildNodeId(2, 2))); |
| 652 ASSERT_TRUE(connection2_->AddNode(BuildNodeId(1, 1), BuildNodeId(2, 2))); |
| 653 |
| 654 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(connection2_, |
| 655 BuildNodeId(2, 2))); |
| 656 |
| 657 ASSERT_TRUE(connection3_->CreateNode(BuildNodeId(3, 3))); |
| 658 ASSERT_TRUE(connection3_->AddNode(BuildNodeId(2, 2), BuildNodeId(3, 3))); |
| 659 |
| 660 // Even though 3 is a child of 2 connection 2 can't see 3 as it's from a |
| 661 // different connection. |
| 662 { |
| 663 std::vector<TestNode> nodes; |
| 664 connection2_->GetNodeTree(BuildNodeId(2, 2), &nodes); |
| 665 ASSERT_EQ(1u, nodes.size()); |
| 666 EXPECT_EQ("node=2,2 parent=1,1 view=null", nodes[0].ToString()); |
| 667 } |
| 668 |
| 669 { |
| 670 std::vector<TestNode> nodes; |
| 671 connection2_->GetNodeTree(BuildNodeId(3, 3), &nodes); |
| 672 EXPECT_TRUE(nodes.empty()); |
| 673 } |
| 674 |
| 675 // Connection 2 shouldn't be able to get node 3 at all. |
| 676 { |
| 677 std::vector<TestNode> nodes; |
| 678 connection2_->GetNodeTree(BuildNodeId(3, 3), &nodes); |
| 679 EXPECT_TRUE(nodes.empty()); |
| 680 } |
| 681 |
| 682 // Connection 1 should be able to see it all (its the root). |
| 683 { |
| 684 std::vector<TestNode> nodes; |
| 685 connection_->GetNodeTree(BuildNodeId(1, 1), &nodes); |
| 686 ASSERT_EQ(3u, nodes.size()); |
| 687 EXPECT_EQ("node=1,1 parent=null view=null", nodes[0].ToString()); |
| 688 EXPECT_EQ("node=2,2 parent=1,1 view=null", nodes[1].ToString()); |
| 689 EXPECT_EQ("node=3,3 parent=2,2 view=null", nodes[2].ToString()); |
| 690 } |
| 691 } |
| 692 |
| 693 // Verifies once Embed() has been invoked the parent can't mutate the children. |
| 694 TEST_F(ViewManagerTest, CantModifyChildrenOfEmbeddedNode) { |
| 695 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
| 696 |
| 697 ASSERT_TRUE(connection2_->CreateNode(BuildNodeId(2, 2))); |
| 698 ASSERT_TRUE(connection2_->AddNode(BuildNodeId(1, 1), BuildNodeId(2, 2))); |
| 699 |
| 700 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(connection2_, |
| 701 BuildNodeId(2, 2))); |
| 702 |
| 703 ASSERT_TRUE(connection2_->CreateNode(BuildNodeId(2, 3))); |
| 704 // Connection 2 shouldn't be able to add anything to the node anymore. |
| 705 ASSERT_FALSE(connection2_->AddNode(BuildNodeId(2, 2), BuildNodeId(2, 3))); |
| 706 |
| 707 // Create node 3 in connection 3 and add it to node 3. |
| 708 ASSERT_TRUE(connection3_->CreateNode(BuildNodeId(3, 3))); |
| 709 ASSERT_TRUE(connection3_->AddNode(BuildNodeId(2, 2), BuildNodeId(3, 3))); |
| 710 |
| 711 // Connection 2 shouldn't be able to remove node 3. |
| 712 ASSERT_FALSE(connection2_->RemoveNodeFromParent(BuildNodeId(3, 3))); |
| 713 } |
| 714 |
567 // Verifies client gets a valid id. | 715 // Verifies client gets a valid id. |
568 TEST_F(ViewManagerTest, CreateNode) { | 716 TEST_F(ViewManagerTest, CreateNode) { |
569 ASSERT_TRUE(connection_->CreateNode(BuildNodeId(1, 1))); | 717 ASSERT_TRUE(connection_->CreateNode(BuildNodeId(1, 1))); |
570 EXPECT_TRUE(connection_->changes().empty()); | 718 EXPECT_TRUE(connection_->changes().empty()); |
571 | 719 |
572 // Can't create a node with the same id. | 720 // Can't create a node with the same id. |
573 ASSERT_EQ(ERROR_CODE_VALUE_IN_USE, | 721 ASSERT_EQ(ERROR_CODE_VALUE_IN_USE, |
574 connection_->CreateNodeWithErrorCode(BuildNodeId(1, 1))); | 722 connection_->CreateNodeWithErrorCode(BuildNodeId(1, 1))); |
575 EXPECT_TRUE(connection_->changes().empty()); | 723 EXPECT_TRUE(connection_->changes().empty()); |
576 | 724 |
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1028 // Create two nodes in second connection, 2 and 3, both children of 1. | 1176 // Create two nodes in second connection, 2 and 3, both children of 1. |
1029 ASSERT_TRUE(connection2_->CreateNode(BuildNodeId(2, 2))); | 1177 ASSERT_TRUE(connection2_->CreateNode(BuildNodeId(2, 2))); |
1030 ASSERT_TRUE(connection2_->CreateNode(BuildNodeId(2, 3))); | 1178 ASSERT_TRUE(connection2_->CreateNode(BuildNodeId(2, 3))); |
1031 ASSERT_TRUE(connection2_->AddNode(BuildNodeId(1, 1), BuildNodeId(2, 2))); | 1179 ASSERT_TRUE(connection2_->AddNode(BuildNodeId(1, 1), BuildNodeId(2, 2))); |
1032 ASSERT_TRUE(connection2_->AddNode(BuildNodeId(1, 1), BuildNodeId(2, 3))); | 1180 ASSERT_TRUE(connection2_->AddNode(BuildNodeId(1, 1), BuildNodeId(2, 3))); |
1033 | 1181 |
1034 // Attach view to node 11 in the first connection. | 1182 // Attach view to node 11 in the first connection. |
1035 ASSERT_TRUE(connection_->CreateView(BuildViewId(1, 51))); | 1183 ASSERT_TRUE(connection_->CreateView(BuildViewId(1, 51))); |
1036 ASSERT_TRUE(connection_->SetView(BuildNodeId(1, 11), BuildViewId(1, 51))); | 1184 ASSERT_TRUE(connection_->SetView(BuildNodeId(1, 11), BuildViewId(1, 51))); |
1037 | 1185 |
1038 // Verifies GetNodeTree() on the root. | 1186 // Verifies GetNodeTree() on the root. The root connection sees all. |
1039 { | 1187 { |
1040 std::vector<TestNode> nodes; | 1188 std::vector<TestNode> nodes; |
1041 connection_->GetNodeTree(BuildNodeId(0, 1), &nodes); | 1189 connection_->GetNodeTree(BuildNodeId(0, 1), &nodes); |
1042 ASSERT_EQ(5u, nodes.size()); | 1190 ASSERT_EQ(5u, nodes.size()); |
1043 EXPECT_EQ("node=0,1 parent=null view=null", nodes[0].ToString()); | 1191 EXPECT_EQ("node=0,1 parent=null view=null", nodes[0].ToString()); |
1044 EXPECT_EQ("node=1,1 parent=0,1 view=null", nodes[1].ToString()); | 1192 EXPECT_EQ("node=1,1 parent=0,1 view=null", nodes[1].ToString()); |
1045 EXPECT_EQ("node=1,11 parent=1,1 view=1,51", nodes[2].ToString()); | 1193 EXPECT_EQ("node=1,11 parent=1,1 view=1,51", nodes[2].ToString()); |
1046 EXPECT_EQ("node=2,2 parent=1,1 view=null", nodes[3].ToString()); | 1194 EXPECT_EQ("node=2,2 parent=1,1 view=null", nodes[3].ToString()); |
1047 EXPECT_EQ("node=2,3 parent=1,1 view=null", nodes[4].ToString()); | 1195 EXPECT_EQ("node=2,3 parent=1,1 view=null", nodes[4].ToString()); |
1048 } | 1196 } |
1049 | 1197 |
1050 // Verifies GetNodeTree() on the node 1,1. | 1198 // Verifies GetNodeTree() on the node 1,1. This does not include 1,11 as it's |
| 1199 // from a different connection. |
1051 { | 1200 { |
1052 std::vector<TestNode> nodes; | 1201 std::vector<TestNode> nodes; |
1053 connection2_->GetNodeTree(BuildNodeId(1, 1), &nodes); | 1202 connection2_->GetNodeTree(BuildNodeId(1, 1), &nodes); |
1054 ASSERT_EQ(4u, nodes.size()); | 1203 ASSERT_EQ(3u, nodes.size()); |
1055 EXPECT_EQ("node=1,1 parent=null view=null", nodes[0].ToString()); | 1204 EXPECT_EQ("node=1,1 parent=null view=null", nodes[0].ToString()); |
1056 EXPECT_EQ("node=1,11 parent=1,1 view=1,51", nodes[1].ToString()); | 1205 EXPECT_EQ("node=2,2 parent=1,1 view=null", nodes[1].ToString()); |
1057 EXPECT_EQ("node=2,2 parent=1,1 view=null", nodes[2].ToString()); | 1206 EXPECT_EQ("node=2,3 parent=1,1 view=null", nodes[2].ToString()); |
1058 EXPECT_EQ("node=2,3 parent=1,1 view=null", nodes[3].ToString()); | |
1059 } | 1207 } |
1060 | 1208 |
1061 // Connection 2 shouldn't be able to get the root tree. | 1209 // Connection 2 shouldn't be able to get the root tree. |
1062 { | 1210 { |
1063 std::vector<TestNode> nodes; | 1211 std::vector<TestNode> nodes; |
1064 connection2_->GetNodeTree(BuildNodeId(0, 1), &nodes); | 1212 connection2_->GetNodeTree(BuildNodeId(0, 1), &nodes); |
1065 ASSERT_EQ(0u, nodes.size()); | 1213 ASSERT_EQ(0u, nodes.size()); |
1066 } | 1214 } |
1067 } | 1215 } |
1068 | 1216 |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1286 connection2_->DoRunLoopUntilChangesCount(1); | 1434 connection2_->DoRunLoopUntilChangesCount(1); |
1287 const Changes changes(ChangesToDescription1(connection2_->changes())); | 1435 const Changes changes(ChangesToDescription1(connection2_->changes())); |
1288 ASSERT_EQ(1u, changes.size()); | 1436 ASSERT_EQ(1u, changes.size()); |
1289 EXPECT_EQ("InputEvent view=2,11 event_action=1", changes[0]); | 1437 EXPECT_EQ("InputEvent view=2,11 event_action=1", changes[0]); |
1290 } | 1438 } |
1291 } | 1439 } |
1292 | 1440 |
1293 TEST_F(ViewManagerTest, EmbedWithSameNodeId) { | 1441 TEST_F(ViewManagerTest, EmbedWithSameNodeId) { |
1294 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); | 1442 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
1295 | 1443 |
1296 // Create a third connection. | 1444 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(connection_, |
1297 ViewManagerProxy* connection3 = NULL; | 1445 BuildNodeId(1, 1))); |
1298 { | |
1299 ASSERT_TRUE(connection_->Embed(BuildNodeId(1, 1), kTestServiceURL2)); | |
1300 connection3 = ViewManagerProxy::WaitForInstance(); | |
1301 ASSERT_TRUE(connection3 != NULL); | |
1302 connection3->DoRunLoopUntilChangesCount(1); | |
1303 const Changes changes(ChangesToDescription1(connection3->changes())); | |
1304 ASSERT_EQ(1u, changes.size()); | |
1305 EXPECT_EQ("OnConnectionEstablished creator=mojo:test_url", changes[0]); | |
1306 } | |
1307 | 1446 |
1308 // Connection2 should have been told the node was deleted. | 1447 // Connection2 should have been told the node was deleted. |
1309 { | 1448 { |
1310 connection2_->DoRunLoopUntilChangesCount(1); | 1449 connection2_->DoRunLoopUntilChangesCount(1); |
1311 const Changes changes(ChangesToDescription1(connection2_->changes())); | 1450 const Changes changes(ChangesToDescription1(connection2_->changes())); |
1312 ASSERT_EQ(1u, changes.size()); | 1451 ASSERT_EQ(1u, changes.size()); |
1313 EXPECT_EQ("NodeDeleted node=1,1", changes[0]); | 1452 EXPECT_EQ("NodeDeleted node=1,1", changes[0]); |
1314 } | 1453 } |
1315 | 1454 |
1316 // Connection2 has no root. Verify it can't see node 1,1 anymore. | 1455 // Connection2 has no root. Verify it can't see node 1,1 anymore. |
1317 { | 1456 { |
1318 std::vector<TestNode> nodes; | 1457 std::vector<TestNode> nodes; |
1319 connection2_->GetNodeTree(BuildNodeId(1, 1), &nodes); | 1458 connection2_->GetNodeTree(BuildNodeId(1, 1), &nodes); |
1320 EXPECT_TRUE(nodes.empty()); | 1459 EXPECT_TRUE(nodes.empty()); |
1321 } | 1460 } |
1322 | |
1323 connection3->Destroy(); | |
1324 } | 1461 } |
1325 | 1462 |
1326 TEST_F(ViewManagerTest, EmbedWithSameNodeId2) { | 1463 TEST_F(ViewManagerTest, EmbedWithSameNodeId2) { |
1327 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); | 1464 ASSERT_NO_FATAL_FAILURE(EstablishSecondConnection(true)); |
1328 | 1465 |
1329 // Create a third connection. | 1466 ASSERT_NO_FATAL_FAILURE(EstablishThirdConnection(connection_, |
1330 ViewManagerProxy* connection3 = NULL; | 1467 BuildNodeId(1, 1))); |
1331 { | |
1332 ASSERT_TRUE(connection_->Embed(BuildNodeId(1, 1), kTestServiceURL2)); | |
1333 connection3 = ViewManagerProxy::WaitForInstance(); | |
1334 ASSERT_TRUE(connection3 != NULL); | |
1335 connection3->DoRunLoopUntilChangesCount(1); | |
1336 const Changes changes(ChangesToDescription1(connection3->changes())); | |
1337 ASSERT_EQ(1u, changes.size()); | |
1338 EXPECT_EQ("OnConnectionEstablished creator=mojo:test_url", changes[0]); | |
1339 } | |
1340 | 1468 |
1341 // Connection2 should have been told the node was deleted. | 1469 // Connection2 should have been told the node was deleted. |
1342 connection2_->DoRunLoopUntilChangesCount(1); | 1470 connection2_->DoRunLoopUntilChangesCount(1); |
1343 connection2_->ClearChanges(); | 1471 connection2_->ClearChanges(); |
1344 | 1472 |
1345 // Create a node in the third connection and parent it to the root. | 1473 // Create a node in the third connection and parent it to the root. |
1346 ASSERT_TRUE(connection3->CreateNode(BuildNodeId(3, 1))); | 1474 ASSERT_TRUE(connection3_->CreateNode(BuildNodeId(3, 1))); |
1347 ASSERT_TRUE(connection3->AddNode(BuildNodeId(1, 1), BuildNodeId(3, 1))); | 1475 ASSERT_TRUE(connection3_->AddNode(BuildNodeId(1, 1), BuildNodeId(3, 1))); |
1348 | 1476 |
1349 // Connection 1 should have been told about the add (it owns the node). | 1477 // Connection 1 should have been told about the add (it owns the node). |
1350 { | 1478 { |
1351 connection_->DoRunLoopUntilChangesCount(1); | 1479 connection_->DoRunLoopUntilChangesCount(1); |
1352 const Changes changes(ChangesToDescription1(connection_->changes())); | 1480 const Changes changes(ChangesToDescription1(connection_->changes())); |
1353 ASSERT_EQ(1u, changes.size()); | 1481 ASSERT_EQ(1u, changes.size()); |
1354 EXPECT_EQ("HierarchyChanged node=3,1 new_parent=1,1 old_parent=null", | 1482 EXPECT_EQ("HierarchyChanged node=3,1 new_parent=1,1 old_parent=null", |
1355 changes[0]); | 1483 changes[0]); |
1356 } | 1484 } |
1357 | 1485 |
1358 // Embed 1,1 back in connection 2. | 1486 // Embed 1,1 back in connection 2. |
1359 { | 1487 { |
1360 // 2 should be told about the new embed. | 1488 // 2 should be told about the new embed. |
1361 ASSERT_TRUE(connection_->Embed(BuildNodeId(1, 1), kTestServiceURL)); | 1489 ASSERT_TRUE(connection_->Embed(BuildNodeId(1, 1), kTestServiceURL)); |
1362 connection2_->DoRunLoopUntilChangesCount(1); | 1490 connection2_->DoRunLoopUntilChangesCount(1); |
1363 const std::vector<Change>& changes(connection2_->changes()); | 1491 const std::vector<Change>& changes(connection2_->changes()); |
1364 ASSERT_EQ(1u, changes.size()); | 1492 ASSERT_EQ(1u, changes.size()); |
1365 EXPECT_EQ("OnRootAdded", ChangesToDescription1(changes)[0]); | 1493 EXPECT_EQ("OnRootAdded", ChangesToDescription1(changes)[0]); |
1366 EXPECT_EQ("[node=1,1 parent=null view=null]", | 1494 EXPECT_EQ("[node=1,1 parent=null view=null]", |
1367 ChangeNodeDescription(changes)); | 1495 ChangeNodeDescription(changes)); |
1368 | 1496 |
1369 // And 3 should get a delete. | 1497 // And 3 should get a delete. |
1370 connection3->DoRunLoopUntilChangesCount(1); | 1498 connection3_->DoRunLoopUntilChangesCount(1); |
1371 ASSERT_EQ(1u, connection3->changes().size()); | 1499 ASSERT_EQ(1u, connection3_->changes().size()); |
1372 EXPECT_EQ("NodeDeleted node=1,1", | 1500 EXPECT_EQ("NodeDeleted node=1,1", |
1373 ChangesToDescription1(connection3->changes())[0]); | 1501 ChangesToDescription1(connection3_->changes())[0]); |
1374 } | 1502 } |
1375 | 1503 |
1376 // Connection3 has no root. Verify it can't see node 1,1 anymore. | 1504 // Connection3_ has no root. Verify it can't see node 1,1 anymore. |
1377 { | 1505 { |
1378 std::vector<TestNode> nodes; | 1506 std::vector<TestNode> nodes; |
1379 connection3->GetNodeTree(BuildNodeId(1, 1), &nodes); | 1507 connection3_->GetNodeTree(BuildNodeId(1, 1), &nodes); |
1380 EXPECT_TRUE(nodes.empty()); | 1508 EXPECT_TRUE(nodes.empty()); |
1381 } | 1509 } |
1382 | 1510 |
1383 // Verify 3,1 is no longer parented to 1,1. We have to do this from 1,1 as | 1511 // Verify 3,1 is no longer parented to 1,1. We have to do this from 1,1 as |
1384 // connection3 can no longer see 1,1. | 1512 // connection3_ can no longer see 1,1. |
1385 { | 1513 { |
1386 std::vector<TestNode> nodes; | 1514 std::vector<TestNode> nodes; |
1387 connection_->GetNodeTree(BuildNodeId(1, 1), &nodes); | 1515 connection_->GetNodeTree(BuildNodeId(1, 1), &nodes); |
1388 ASSERT_EQ(1u, nodes.size()); | 1516 ASSERT_EQ(1u, nodes.size()); |
1389 EXPECT_EQ("node=1,1 parent=null view=null", nodes[0].ToString()); | 1517 EXPECT_EQ("node=1,1 parent=null view=null", nodes[0].ToString()); |
1390 } | 1518 } |
1391 | 1519 |
1392 // Verify connection3 can still see the node it created 3,1. | 1520 // Verify connection3_ can still see the node it created 3,1. |
1393 { | 1521 { |
1394 std::vector<TestNode> nodes; | 1522 std::vector<TestNode> nodes; |
1395 connection3->GetNodeTree(BuildNodeId(3, 1), &nodes); | 1523 connection3_->GetNodeTree(BuildNodeId(3, 1), &nodes); |
1396 ASSERT_EQ(1u, nodes.size()); | 1524 ASSERT_EQ(1u, nodes.size()); |
1397 EXPECT_EQ("node=3,1 parent=null view=null", nodes[0].ToString()); | 1525 EXPECT_EQ("node=3,1 parent=null view=null", nodes[0].ToString()); |
1398 } | 1526 } |
1399 | |
1400 connection3->Destroy(); | |
1401 } | 1527 } |
1402 | 1528 |
1403 // TODO(sky): add coverage of test that destroys connections and ensures other | 1529 // TODO(sky): add coverage of test that destroys connections and ensures other |
1404 // connections get deletion notification. | 1530 // connections get deletion notification. |
1405 | 1531 |
1406 // TODO(sky): need to better track changes to initial connection. For example, | 1532 // TODO(sky): need to better track changes to initial connection. For example, |
1407 // that SetBounsdNodes/AddNode and the like don't result in messages to the | 1533 // that SetBounsdNodes/AddNode and the like don't result in messages to the |
1408 // originating connection. | 1534 // originating connection. |
1409 | 1535 |
1410 // TODO(beng): Add tests for focus: | 1536 // TODO(beng): Add tests for focus: |
1411 // - focus between two nodes known to a connection | 1537 // - focus between two nodes known to a connection |
1412 // - focus between nodes unknown to one of the connections. | 1538 // - focus between nodes unknown to one of the connections. |
1413 // - focus between nodes unknown to either connection. | 1539 // - focus between nodes unknown to either connection. |
1414 | 1540 |
1415 } // namespace service | 1541 } // namespace service |
1416 } // namespace view_manager | 1542 } // namespace view_manager |
1417 } // namespace mojo | 1543 } // namespace mojo |
OLD | NEW |