| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <fuchsia/modular/testing/cpp/fidl.h> |
| #include <lib/modular/testing/cpp/fake_agent.h> |
| |
| #include "src/modular/lib/modular_test_harness/cpp/fake_module.h" |
| #include "src/modular/lib/modular_test_harness/cpp/test_harness_fixture.h" |
| |
| namespace { |
| |
| /// A FakeAgent that sets a flag when OnCreate was called. |
| class WasCreatedFakeAgent : public modular_testing::FakeAgent { |
| public: |
| explicit WasCreatedFakeAgent(FakeComponent::Args args) : modular_testing::FakeAgent(args) {} |
| static std::unique_ptr<WasCreatedFakeAgent> CreateWithDefaultOptions(); |
| |
| /// Returns true if OnCreate has been called. |
| bool was_created() { return was_created_; } |
| |
| protected: |
| void OnCreate(fuchsia::sys::StartupInfo startup_info) override { was_created_ = true; } |
| |
| /// Whether or not the agent has been instantiated. |
| bool was_created_ = false; |
| }; |
| |
| std::unique_ptr<WasCreatedFakeAgent> WasCreatedFakeAgent::CreateWithDefaultOptions() { |
| return std::make_unique<WasCreatedFakeAgent>(modular_testing::FakeComponent::Args{ |
| .url = modular_testing::TestHarnessBuilder::GenerateFakeUrl(), |
| .sandbox_services = FakeAgent::GetDefaultSandboxServices()}); |
| } |
| |
| class ComponentContextTest : public modular_testing::TestHarnessFixture {}; |
| |
| // Tests that an agent is able to start another agent through |
| // fuchsia::modular::ComponentContext.DeprecatedConnectToAgent(). Asserts that closing |
| // fuchsia::modular::AgentController triggers the agent to stop. |
| TEST_F(ComponentContextTest, AgentStartsSecondAgent) { |
| fuchsia::modular::testing::TestHarnessSpec spec; |
| auto fake_module = modular_testing::FakeModule::CreateWithDefaultOptions(); |
| auto fake_agent = modular_testing::FakeAgent::CreateWithDefaultOptions(); |
| auto second_fake_agent = modular_testing::FakeAgent::CreateWithDefaultOptions(); |
| |
| spec.mutable_sessionmgr_config()->mutable_session_agents()->push_back(fake_agent->url()); |
| spec.mutable_sessionmgr_config()->mutable_session_agents()->push_back(second_fake_agent->url()); |
| |
| modular_testing::TestHarnessBuilder builder(std::move(spec)); |
| builder.InterceptComponent(fake_module->BuildInterceptOptions()); |
| builder.InterceptComponent(fake_agent->BuildInterceptOptions()); |
| builder.InterceptComponent(second_fake_agent->BuildInterceptOptions()); |
| builder.BuildAndRun(test_harness()); |
| |
| // Add the test mod. |
| fuchsia::modular::Intent intent; |
| intent.handler = fake_module->url(); |
| modular_testing::AddModToStory(test_harness(), "story_name", "mod_name", std::move(intent)); |
| RunLoopUntil([&] { return fake_module->is_running(); }); |
| |
| // Connect to the first fake agent from the fake mod. |
| fuchsia::sys::ServiceProviderPtr first_agent_services; |
| fuchsia::modular::AgentControllerPtr first_agent_controller; |
| fake_module->modular_component_context()->DeprecatedConnectToAgent( |
| fake_agent->url(), first_agent_services.NewRequest(), first_agent_controller.NewRequest()); |
| RunLoopUntil([&] { return fake_agent->is_running(); }); |
| |
| // Connect to the second fake agent from the first fake agent. |
| fuchsia::sys::ServiceProviderPtr second_agent_services; |
| fuchsia::modular::AgentControllerPtr second_agent_controller; |
| fake_agent->modular_component_context()->DeprecatedConnectToAgent( |
| second_fake_agent->url(), second_agent_services.NewRequest(), |
| second_agent_controller.NewRequest()); |
| RunLoopUntil([&] { return second_fake_agent->is_running(); }); |
| } |
| |
| /// Tests that an attempt to connect to an agent that is a session agent succeeds. |
| TEST_F(ComponentContextTest, AttemptToConnectToSessionAgent) { |
| fuchsia::modular::testing::TestHarnessSpec spec; |
| auto fake_module = modular_testing::FakeModule::CreateWithDefaultOptions(); |
| auto fake_agent = WasCreatedFakeAgent::CreateWithDefaultOptions(); |
| spec.mutable_sessionmgr_config()->mutable_session_agents()->push_back(fake_agent->url()); |
| |
| modular_testing::TestHarnessBuilder builder(std::move(spec)); |
| builder.InterceptComponent(fake_module->BuildInterceptOptions()); |
| builder.InterceptComponent(fake_agent->BuildInterceptOptions()); |
| builder.BuildAndRun(test_harness()); |
| |
| // Add the test mod. |
| fuchsia::modular::Intent intent; |
| intent.handler = fake_module->url(); |
| modular_testing::AddModToStory(test_harness(), "story_name", "mod_name", std::move(intent)); |
| RunLoopUntil([&] { return fake_module->is_running(); }); |
| |
| // Connect to the first fake agent from the fake mod. |
| fuchsia::sys::ServiceProviderPtr first_agent_services; |
| fuchsia::modular::AgentControllerPtr first_agent_controller; |
| fake_module->modular_component_context()->DeprecatedConnectToAgent( |
| fake_agent->url(), first_agent_services.NewRequest(), first_agent_controller.NewRequest()); |
| |
| RunLoopUntil([&] { return fake_agent->is_running(); }); |
| } |
| |
| /// Tests that an attempt to connect to an agent that is not a session agent fails. |
| TEST_F(ComponentContextTest, AttemptToConnectToNonSessionAgent) { |
| fuchsia::modular::testing::TestHarnessSpec spec; |
| auto fake_module = modular_testing::FakeModule::CreateWithDefaultOptions(); |
| auto fake_agent = WasCreatedFakeAgent::CreateWithDefaultOptions(); |
| |
| modular_testing::TestHarnessBuilder builder(std::move(spec)); |
| builder.InterceptComponent(fake_module->BuildInterceptOptions()); |
| builder.InterceptComponent(fake_agent->BuildInterceptOptions()); |
| builder.BuildAndRun(test_harness()); |
| |
| // Add the test mod. |
| fuchsia::modular::Intent intent; |
| intent.handler = fake_module->url(); |
| modular_testing::AddModToStory(test_harness(), "story_name", "mod_name", std::move(intent)); |
| RunLoopUntil([&] { return fake_module->is_running(); }); |
| |
| // Connect to the first fake agent from the fake mod. |
| fuchsia::sys::ServiceProviderPtr first_agent_services; |
| fuchsia::modular::AgentControllerPtr first_agent_controller; |
| fake_module->modular_component_context()->DeprecatedConnectToAgent( |
| fake_agent->url(), first_agent_services.NewRequest(), first_agent_controller.NewRequest()); |
| |
| bool agent_controller_dropped = false; |
| first_agent_controller.set_error_handler( |
| [&](zx_status_t status) { agent_controller_dropped = true; }); |
| |
| RunLoopUntil([&] { return agent_controller_dropped; }); |
| |
| ASSERT_FALSE(fake_agent->was_created()); |
| } |
| |
| } // namespace |