| // Copyright 2024 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 <fidl/fuchsia.cpu.profiler/cpp/fidl.h> | |
| #include <fidl/fuchsia.sys2/cpp/fidl.h> | |
| #include <lib/component/incoming/cpp/protocol.h> | |
| #include <lib/zx/result.h> | |
| #include <vector> | |
| #include <gtest/gtest.h> | |
| // If we fail to launch a component, ensure that it gets cleaned up properly. | |
| TEST(ComponentControlling, CleanUpFailedLaunch) { | |
| zx::result client_end = component::Connect<fuchsia_cpu_profiler::Session>(); | |
| ASSERT_TRUE(client_end.is_ok()); | |
| const fidl::SyncClient client{std::move(*client_end)}; | |
| zx::socket in_socket, outgoing_socket; | |
| ASSERT_EQ(zx::socket::create(0u, &in_socket, &outgoing_socket), ZX_OK); | |
| fuchsia_cpu_profiler::SamplingConfig sampling_config{{ | |
| .period = 1000000, | |
| .timebase = fuchsia_cpu_profiler::Counter::WithPlatformIndependent( | |
| fuchsia_cpu_profiler::CounterId::kNanoseconds), | |
| .sample = fuchsia_cpu_profiler::Sample{{ | |
| .callgraph = | |
| fuchsia_cpu_profiler::CallgraphConfig{ | |
| {.strategy = fuchsia_cpu_profiler::CallgraphStrategy::kFramePointer}}, | |
| .counters = {}, | |
| }}, | |
| }}; | |
| // Attempt to launch a component that will be created, but will fail to resolve. | |
| fuchsia_cpu_profiler::TargetConfig target_config = | |
| fuchsia_cpu_profiler::TargetConfig::WithComponent( | |
| fuchsia_cpu_profiler::AttachConfig::WithLaunchComponent({{ | |
| .url = "not_found#meta/not_found.cm", | |
| .moniker = "./launchpad:not_found", | |
| }})); | |
| ASSERT_TRUE(client | |
| ->Configure({{.output = std::move(outgoing_socket), | |
| .config = fuchsia_cpu_profiler::Config{{ | |
| .configs = std::vector{sampling_config}, | |
| .target = std::move(target_config), | |
| }}}}) | |
| .is_error()); | |
| auto lifecycle_client_end = component::Connect<fuchsia_sys2::LifecycleController>(); | |
| ASSERT_TRUE(lifecycle_client_end.is_ok()); | |
| fidl::SyncClient lifecycle_client{std::move(*lifecycle_client_end)}; | |
| auto res = lifecycle_client->DestroyInstance({{.parent_moniker = ".", | |
| .child = {{ | |
| .name = "not_found", | |
| .collection = "launchpad", | |
| }}}}); | |
| ASSERT_TRUE(res.is_error()); | |
| ASSERT_TRUE(res.error_value().is_domain_error()); | |
| ASSERT_EQ(res.error_value().domain_error(), fuchsia_sys2::DestroyError::kInstanceNotFound); | |
| } |