| 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 "mojo/shell/application_manager.h" | 5 #include "mojo/shell/application_manager.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/at_exit.h" | 9 #include "base/at_exit.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 ~ApplicationManagerTest() override {} | 391 ~ApplicationManagerTest() override {} |
| 392 | 392 |
| 393 void SetUp() override { | 393 void SetUp() override { |
| 394 application_manager_.reset(new ApplicationManager(true)); | 394 application_manager_.reset(new ApplicationManager(true)); |
| 395 test_loader_ = new TestApplicationLoader; | 395 test_loader_ = new TestApplicationLoader; |
| 396 test_loader_->set_context(&context_); | 396 test_loader_->set_context(&context_); |
| 397 application_manager_->set_default_loader( | 397 application_manager_->set_default_loader( |
| 398 scoped_ptr<ApplicationLoader>(test_loader_)); | 398 scoped_ptr<ApplicationLoader>(test_loader_)); |
| 399 | 399 |
| 400 TestServicePtr service_proxy; | 400 TestServicePtr service_proxy; |
| 401 ConnectToInterface(application_manager_.get(), GURL(kTestURLString), | 401 ConnectToInterface(application_manager_.get(), CreateShellIdentity(), |
| 402 &service_proxy); | 402 GURL(kTestURLString), &service_proxy); |
| 403 test_client_.reset(new TestClient(std::move(service_proxy))); | 403 test_client_.reset(new TestClient(std::move(service_proxy))); |
| 404 } | 404 } |
| 405 | 405 |
| 406 void TearDown() override { | 406 void TearDown() override { |
| 407 test_client_.reset(); | 407 test_client_.reset(); |
| 408 application_manager_.reset(); | 408 application_manager_.reset(); |
| 409 } | 409 } |
| 410 | 410 |
| 411 void AddLoaderForURL(const GURL& url, const std::string& requestor_url) { | 411 void AddLoaderForURL(const GURL& url, const std::string& requestor_url) { |
| 412 application_manager_->SetLoaderForURL( | 412 application_manager_->SetLoaderForURL( |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 TEST_F(ApplicationManagerTest, SetLoaders) { | 468 TEST_F(ApplicationManagerTest, SetLoaders) { |
| 469 TestApplicationLoader* default_loader = new TestApplicationLoader; | 469 TestApplicationLoader* default_loader = new TestApplicationLoader; |
| 470 TestApplicationLoader* url_loader = new TestApplicationLoader; | 470 TestApplicationLoader* url_loader = new TestApplicationLoader; |
| 471 application_manager_->set_default_loader( | 471 application_manager_->set_default_loader( |
| 472 scoped_ptr<ApplicationLoader>(default_loader)); | 472 scoped_ptr<ApplicationLoader>(default_loader)); |
| 473 application_manager_->SetLoaderForURL( | 473 application_manager_->SetLoaderForURL( |
| 474 scoped_ptr<ApplicationLoader>(url_loader), GURL("test:test1")); | 474 scoped_ptr<ApplicationLoader>(url_loader), GURL("test:test1")); |
| 475 | 475 |
| 476 // test::test1 should go to url_loader. | 476 // test::test1 should go to url_loader. |
| 477 TestServicePtr test_service; | 477 TestServicePtr test_service; |
| 478 ConnectToInterface(application_manager_.get(), GURL("test:test1"), | 478 ConnectToInterface(application_manager_.get(), CreateShellIdentity(), |
| 479 &test_service); | 479 GURL("test:test1"), &test_service); |
| 480 EXPECT_EQ(1, url_loader->num_loads()); | 480 EXPECT_EQ(1, url_loader->num_loads()); |
| 481 EXPECT_EQ(0, default_loader->num_loads()); | 481 EXPECT_EQ(0, default_loader->num_loads()); |
| 482 | 482 |
| 483 // http::test1 should go to default loader. | 483 // http::test1 should go to default loader. |
| 484 ConnectToInterface(application_manager_.get(), GURL("http:test1"), | 484 ConnectToInterface(application_manager_.get(), CreateShellIdentity(), |
| 485 &test_service); | 485 GURL("http:test1"), &test_service); |
| 486 EXPECT_EQ(1, url_loader->num_loads()); | 486 EXPECT_EQ(1, url_loader->num_loads()); |
| 487 EXPECT_EQ(1, default_loader->num_loads()); | 487 EXPECT_EQ(1, default_loader->num_loads()); |
| 488 } | 488 } |
| 489 | 489 |
| 490 // Confirm that the url of a service is correctly passed to another service that | 490 // Confirm that the url of a service is correctly passed to another service that |
| 491 // it loads. | 491 // it loads. |
| 492 TEST_F(ApplicationManagerTest, ACallB) { | 492 TEST_F(ApplicationManagerTest, ACallB) { |
| 493 // Any url can load a. | 493 // Any url can load a. |
| 494 AddLoaderForURL(GURL(kTestAURLString), std::string()); | 494 AddLoaderForURL(GURL(kTestAURLString), std::string()); |
| 495 | 495 |
| 496 // Only a can load b. | 496 // Only a can load b. |
| 497 AddLoaderForURL(GURL(kTestBURLString), kTestAURLString); | 497 AddLoaderForURL(GURL(kTestBURLString), kTestAURLString); |
| 498 | 498 |
| 499 TestAPtr a; | 499 TestAPtr a; |
| 500 ConnectToInterface(application_manager_.get(), GURL(kTestAURLString), &a); | 500 ConnectToInterface(application_manager_.get(), CreateShellIdentity(), |
| 501 GURL(kTestAURLString), &a); |
| 501 a->CallB(); | 502 a->CallB(); |
| 502 loop_.Run(); | 503 loop_.Run(); |
| 503 EXPECT_EQ(1, tester_context_.num_b_calls()); | 504 EXPECT_EQ(1, tester_context_.num_b_calls()); |
| 504 EXPECT_TRUE(tester_context_.a_called_quit()); | 505 EXPECT_TRUE(tester_context_.a_called_quit()); |
| 505 } | 506 } |
| 506 | 507 |
| 507 // A calls B which calls C. | 508 // A calls B which calls C. |
| 508 TEST_F(ApplicationManagerTest, BCallC) { | 509 TEST_F(ApplicationManagerTest, BCallC) { |
| 509 // Any url can load a. | 510 // Any url can load a. |
| 510 AddLoaderForURL(GURL(kTestAURLString), std::string()); | 511 AddLoaderForURL(GURL(kTestAURLString), std::string()); |
| 511 | 512 |
| 512 // Only a can load b. | 513 // Only a can load b. |
| 513 AddLoaderForURL(GURL(kTestBURLString), kTestAURLString); | 514 AddLoaderForURL(GURL(kTestBURLString), kTestAURLString); |
| 514 | 515 |
| 515 TestAPtr a; | 516 TestAPtr a; |
| 516 ConnectToInterface(application_manager_.get(), GURL(kTestAURLString), &a); | 517 ConnectToInterface(application_manager_.get(), CreateShellIdentity(), |
| 518 GURL(kTestAURLString), &a); |
| 517 a->CallCFromB(); | 519 a->CallCFromB(); |
| 518 loop_.Run(); | 520 loop_.Run(); |
| 519 | 521 |
| 520 EXPECT_EQ(1, tester_context_.num_b_calls()); | 522 EXPECT_EQ(1, tester_context_.num_b_calls()); |
| 521 EXPECT_EQ(1, tester_context_.num_c_calls()); | 523 EXPECT_EQ(1, tester_context_.num_c_calls()); |
| 522 EXPECT_TRUE(tester_context_.a_called_quit()); | 524 EXPECT_TRUE(tester_context_.a_called_quit()); |
| 523 } | 525 } |
| 524 | 526 |
| 525 // Confirm that a service impl will be deleted if the app that connected to | 527 // Confirm that a service impl will be deleted if the app that connected to |
| 526 // it goes away. | 528 // it goes away. |
| 527 TEST_F(ApplicationManagerTest, BDeleted) { | 529 TEST_F(ApplicationManagerTest, BDeleted) { |
| 528 AddLoaderForURL(GURL(kTestAURLString), std::string()); | 530 AddLoaderForURL(GURL(kTestAURLString), std::string()); |
| 529 AddLoaderForURL(GURL(kTestBURLString), std::string()); | 531 AddLoaderForURL(GURL(kTestBURLString), std::string()); |
| 530 | 532 |
| 531 TestAPtr a; | 533 TestAPtr a; |
| 532 ConnectToInterface(application_manager_.get(), GURL(kTestAURLString), &a); | 534 ConnectToInterface(application_manager_.get(), CreateShellIdentity(), |
| 535 GURL(kTestAURLString), &a); |
| 533 | 536 |
| 534 a->CallB(); | 537 a->CallB(); |
| 535 loop_.Run(); | 538 loop_.Run(); |
| 536 | 539 |
| 537 // Kills the a app. | 540 // Kills the a app. |
| 538 application_manager_->SetLoaderForURL(scoped_ptr<ApplicationLoader>(), | 541 application_manager_->SetLoaderForURL(scoped_ptr<ApplicationLoader>(), |
| 539 GURL(kTestAURLString)); | 542 GURL(kTestAURLString)); |
| 540 loop_.Run(); | 543 loop_.Run(); |
| 541 | 544 |
| 542 EXPECT_EQ(1, tester_context_.num_b_deletes()); | 545 EXPECT_EQ(1, tester_context_.num_b_deletes()); |
| 543 } | 546 } |
| 544 | 547 |
| 545 // Confirm that the url of a service is correctly passed to another service that | 548 // Confirm that the url of a service is correctly passed to another service that |
| 546 // it loads, and that it can be rejected. | 549 // it loads, and that it can be rejected. |
| 547 TEST_F(ApplicationManagerTest, ANoLoadB) { | 550 TEST_F(ApplicationManagerTest, ANoLoadB) { |
| 548 // Any url can load a. | 551 // Any url can load a. |
| 549 AddLoaderForURL(GURL(kTestAURLString), std::string()); | 552 AddLoaderForURL(GURL(kTestAURLString), std::string()); |
| 550 | 553 |
| 551 // Only c can load b, so this will fail. | 554 // Only c can load b, so this will fail. |
| 552 AddLoaderForURL(GURL(kTestBURLString), "test:TestC"); | 555 AddLoaderForURL(GURL(kTestBURLString), "test:TestC"); |
| 553 | 556 |
| 554 TestAPtr a; | 557 TestAPtr a; |
| 555 ConnectToInterface(application_manager_.get(), GURL(kTestAURLString), &a); | 558 ConnectToInterface(application_manager_.get(), CreateShellIdentity(), |
| 559 GURL(kTestAURLString), &a); |
| 556 a->CallB(); | 560 a->CallB(); |
| 557 loop_.Run(); | 561 loop_.Run(); |
| 558 EXPECT_EQ(0, tester_context_.num_b_calls()); | 562 EXPECT_EQ(0, tester_context_.num_b_calls()); |
| 559 | 563 |
| 560 EXPECT_FALSE(tester_context_.a_called_quit()); | 564 EXPECT_FALSE(tester_context_.a_called_quit()); |
| 561 EXPECT_TRUE(tester_context_.tester_called_quit()); | 565 EXPECT_TRUE(tester_context_.tester_called_quit()); |
| 562 } | 566 } |
| 563 | 567 |
| 564 TEST_F(ApplicationManagerTest, NoServiceNoLoad) { | 568 TEST_F(ApplicationManagerTest, NoServiceNoLoad) { |
| 565 AddLoaderForURL(GURL(kTestAURLString), std::string()); | 569 AddLoaderForURL(GURL(kTestAURLString), std::string()); |
| 566 | 570 |
| 567 // There is no TestC service implementation registered with | 571 // There is no TestC service implementation registered with |
| 568 // ApplicationManager, so this cannot succeed (but also shouldn't crash). | 572 // ApplicationManager, so this cannot succeed (but also shouldn't crash). |
| 569 TestCPtr c; | 573 TestCPtr c; |
| 570 ConnectToInterface(application_manager_.get(), GURL(kTestAURLString), &c); | 574 ConnectToInterface(application_manager_.get(), CreateShellIdentity(), |
| 575 GURL(kTestAURLString), &c); |
| 571 c.set_connection_error_handler( | 576 c.set_connection_error_handler( |
| 572 []() { base::MessageLoop::current()->QuitWhenIdle(); }); | 577 []() { base::MessageLoop::current()->QuitWhenIdle(); }); |
| 573 | 578 |
| 574 loop_.Run(); | 579 loop_.Run(); |
| 575 EXPECT_TRUE(c.encountered_error()); | 580 EXPECT_TRUE(c.encountered_error()); |
| 576 } | 581 } |
| 577 | 582 |
| 578 TEST_F(ApplicationManagerTest, TestEndApplicationClosure) { | 583 TEST_F(ApplicationManagerTest, TestEndApplicationClosure) { |
| 579 ClosingApplicationLoader* loader = new ClosingApplicationLoader(); | 584 ClosingApplicationLoader* loader = new ClosingApplicationLoader(); |
| 580 application_manager_->SetLoaderForURL( | 585 application_manager_->SetLoaderForURL( |
| 581 scoped_ptr<ApplicationLoader>(loader), GURL("test:test")); | 586 scoped_ptr<ApplicationLoader>(loader), GURL("test:test")); |
| 582 | 587 |
| 583 bool called = false; | 588 bool called = false; |
| 584 scoped_ptr<ConnectToApplicationParams> params(new ConnectToApplicationParams); | 589 scoped_ptr<ConnectToApplicationParams> params(new ConnectToApplicationParams); |
| 585 params->SetTargetURL(GURL("test:test")); | 590 params->SetTargetURL(GURL("test:test")); |
| 586 params->set_on_application_end( | 591 params->set_on_application_end( |
| 587 base::Bind(&QuitClosure, base::Unretained(&called))); | 592 base::Bind(&QuitClosure, base::Unretained(&called))); |
| 588 application_manager_->ConnectToApplication(std::move(params)); | 593 application_manager_->ConnectToApplication(std::move(params)); |
| 589 loop_.Run(); | 594 loop_.Run(); |
| 590 EXPECT_TRUE(called); | 595 EXPECT_TRUE(called); |
| 591 } | 596 } |
| 592 | 597 |
| 593 TEST_F(ApplicationManagerTest, SameIdentityShouldNotCauseDuplicateLoad) { | 598 TEST_F(ApplicationManagerTest, SameIdentityShouldNotCauseDuplicateLoad) { |
| 594 // 1 because ApplicationManagerTest connects once at startup. | 599 // 1 because ApplicationManagerTest connects once at startup. |
| 595 EXPECT_EQ(1, test_loader_->num_loads()); | 600 EXPECT_EQ(1, test_loader_->num_loads()); |
| 596 | 601 |
| 597 TestServicePtr test_service; | 602 TestServicePtr test_service; |
| 598 ConnectToInterface(application_manager_.get(), | 603 ConnectToInterface(application_manager_.get(), CreateShellIdentity(), |
| 599 GURL("mojo:foo"), &test_service); | 604 GURL("mojo:foo"), &test_service); |
| 600 EXPECT_EQ(2, test_loader_->num_loads()); | 605 EXPECT_EQ(2, test_loader_->num_loads()); |
| 601 | 606 |
| 602 // Exactly the same URL as above. | 607 // Exactly the same URL as above. |
| 603 ConnectToInterface(application_manager_.get(), | 608 ConnectToInterface(application_manager_.get(), CreateShellIdentity(), |
| 604 GURL("mojo:foo"), &test_service); | 609 GURL("mojo:foo"), &test_service); |
| 605 EXPECT_EQ(2, test_loader_->num_loads()); | 610 EXPECT_EQ(2, test_loader_->num_loads()); |
| 606 | 611 |
| 607 // A different identity because the domain is different. | 612 // A different identity because the domain is different. |
| 608 ConnectToInterface(application_manager_.get(), | 613 ConnectToInterface(application_manager_.get(), CreateShellIdentity(), |
| 609 GURL("mojo:bar"), &test_service); | 614 GURL("mojo:bar"), &test_service); |
| 610 EXPECT_EQ(3, test_loader_->num_loads()); | 615 EXPECT_EQ(3, test_loader_->num_loads()); |
| 611 } | 616 } |
| 612 | 617 |
| 613 } // namespace test | 618 } // namespace test |
| 614 } // namespace shell | 619 } // namespace shell |
| 615 } // namespace mojo | 620 } // namespace mojo |
| OLD | NEW |