blob: 3674119e5d84478b24c6849062ba43be47ad33fb [file] [log] [blame]
// Copyright 2023 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 "src/devices/tests/v2/reload-driver/driver_helpers.h"
#include <fidl/fuchsia.reloaddriver.test/cpp/fidl.h>
#include <lib/driver/component/cpp/node_add_args.h>
#include <bind/fuchsia/reloaddriverbind/test/cpp/bind.h>
namespace bindlib = bind_fuchsia_reloaddriverbind_test;
namespace ft = fuchsia_reloaddriver_test;
namespace reload_test_driver_helpers {
zx::result<fidl::ClientEnd<fuchsia_driver_framework::NodeController>> AddChild(
fdf::Logger& logger, std::string_view child_name,
fidl::SyncClient<fuchsia_driver_framework::Node>& node_client,
std::string_view child_test_property) {
fuchsia_driver_framework::NodeProperty node_property =
fdf::MakeProperty(bindlib::TEST_BIND_PROPERTY, child_test_property);
fuchsia_driver_framework::NodeAddArgs args(
{.name = std::string(child_name), .properties = {{node_property}}});
// Create endpoints of the `NodeController` for the node.
auto endpoints = fidl::CreateEndpoints<fuchsia_driver_framework::NodeController>();
if (endpoints.is_error()) {
return endpoints.take_error();
}
auto result = node_client->AddChild({std::move(args), std::move(endpoints->server), {}});
if (result.is_error()) {
FDF_LOGL(ERROR, logger, "AddChild failed: %s",
result.error_value().FormatDescription().c_str());
return zx::error(ZX_ERR_INTERNAL);
}
return zx::ok(std::move(endpoints->client));
}
zx::result<> SendAck(fdf::Logger& logger, std::string_view node_name,
const std::shared_ptr<fdf::Namespace>& incoming,
std::string_view driver_name) {
auto connect_result = incoming->Connect<ft::Waiter>();
if (connect_result.is_error()) {
FDF_LOGL(ERROR, logger, "Failed to connect to ft::Waiter: %s", connect_result.status_string());
return connect_result.take_error();
}
fidl::SyncClient<ft::Waiter> waiter(std::move(connect_result.value()));
auto result = waiter->Ack({std::string(node_name), std::string(driver_name), ZX_OK});
if (result.is_error()) {
FDF_LOGL(ERROR, logger, "Ack failed: %s", result.error_value().FormatDescription().c_str());
return zx::error(ZX_ERR_INTERNAL);
}
return zx::ok();
}
} // namespace reload_test_driver_helpers