blob: 4673999f4c90215600ab871ae2f4f601e22d26da [file] [log] [blame]
// 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 <lib/modular_test_harness/cpp/fake_component.h>
#include <lib/modular_test_harness/cpp/test_harness_fixture.h>
namespace modular {
namespace testing {
namespace {
constexpr char kServiceRootPath[] = "/svc";
std::unique_ptr<sys::ComponentContext> CreateComponentContext(
fuchsia::sys::StartupInfo* startup_info) {
fuchsia::sys::FlatNamespace& flat = startup_info->flat_namespace;
if (flat.paths.size() != flat.directories.size()) {
return nullptr;
}
zx::channel service_root;
for (size_t i = 0; i < flat.paths.size(); ++i) {
if (flat.paths.at(i) == kServiceRootPath) {
service_root = std::move(flat.directories.at(i));
break;
}
}
return std::make_unique<sys::ComponentContext>(
std::make_unique<sys::ServiceDirectory>(std::move(service_root)),
std::move(startup_info->launch_info.directory_request));
}
} // namespace
FakeComponent::~FakeComponent() = default;
TestHarnessBuilder::OnNewComponentHandler FakeComponent::GetOnCreateHandler() {
return
[this](
fuchsia::sys::StartupInfo startup_info,
fidl::InterfaceHandle<fuchsia::modular::testing::InterceptedComponent>
intercepted_component) {
intercepted_component_ptr_ = intercepted_component.Bind();
intercepted_component_ptr_.events().OnKill = [this] {
component_context_.reset();
OnDestroy();
};
component_context_ = CreateComponentContext(&startup_info);
OnCreate(std::move(startup_info));
};
}
bool FakeComponent::is_running() const { return !!component_context_; }
sys::ComponentContext* FakeComponent::component_context() {
ZX_ASSERT(is_running());
return component_context_.get();
}
void FakeComponent::Exit(int64_t exit_code,
fuchsia::sys::TerminationReason reason) {
ZX_ASSERT(is_running());
intercepted_component_ptr_->Exit(exit_code, reason);
}
} // namespace testing
} // namespace modular