blob: e45fe459bef8c7fc1aa026349164312fabf970a2 [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.
#ifndef LIB_DRIVER_COMPONENT_CPP_TESTS_TEST_DRIVER_H_
#define LIB_DRIVER_COMPONENT_CPP_TESTS_TEST_DRIVER_H_
#include <fidl/fuchsia.driver.component.test/cpp/driver/wire.h>
#include <fidl/fuchsia.driver.component.test/cpp/wire.h>
#include <lib/driver/compat/cpp/device_server.h>
#include <lib/driver/component/cpp/driver_base.h>
#include <lib/driver/devfs/cpp/connector.h>
class TestDriver : public fdf::DriverBase,
public fidl::WireServer<fuchsia_driver_component_test::ZirconProtocol>,
public fdf::WireServer<fuchsia_driver_component_test::DriverProtocol>,
public fidl::WireAsyncEventHandler<fuchsia_driver_framework::NodeController> {
public:
TestDriver(fdf::DriverStartArgs start_args, fdf::UnownedSynchronizedDispatcher driver_dispatcher)
: fdf::DriverBase("test_driver", std::move(start_args), std::move(driver_dispatcher)),
devfs_connector_(fit::bind_member<&TestDriver::Connect>(this)) {}
void Start(fdf::StartCompleter completer) override;
void PrepareStop(fdf::PrepareStopCompleter completer) override;
zx::result<> InitSyncCompat();
void BeginInitAsyncCompat(fit::callback<void(zx::result<>)> completed);
zx::result<> ExportDevfsNodeSync();
zx::result<> ServeDriverService();
zx::result<> ServeZirconService();
zx::result<> ValidateIncomingDriverService();
zx::result<> ValidateIncomingZirconService();
void CreateChildNodeSync();
void CreateChildNodeAsync();
bool async_added_child() const { return async_added_child_; }
bool sync_added_child() const { return sync_added_child_; }
// fidl::WireAsyncEventHandler<fuchsia_driver_framework::NodeController>
void on_fidl_error(fidl::UnbindInfo error) override;
void handle_unknown_event(
fidl::UnknownEventMetadata<fuchsia_driver_framework::NodeController> metadata) override;
private:
// fidl::WireServer<fuchsia_driver_component_test::ZirconProtocol>
void ZirconMethod(ZirconMethodCompleter::Sync& completer) override { completer.ReplySuccess(); }
// fdf::WireServer<fuchsia_driver_component_test::DriverProtocol>
void DriverMethod(fdf::Arena& arena, DriverMethodCompleter::Sync& completer) override {
fdf::Arena reply_arena('DRVR');
completer.buffer(reply_arena).ReplySuccess();
}
// driver_devfs::Connector<fuchsia_driver_component_test::ZirconProtocol>
void Connect(fidl::ServerEnd<fuchsia_driver_component_test::ZirconProtocol> request) {
zircon_bindings_.AddBinding(dispatcher(), std::move(request), this,
fidl::kIgnoreBindingClosure);
}
fuchsia_driver_component_test::ZirconService::InstanceHandler GetInstanceHandlerZircon() {
return fuchsia_driver_component_test::ZirconService::InstanceHandler({
.device = zircon_bindings_.CreateHandler(
this, fdf::Dispatcher::GetCurrent()->async_dispatcher(), fidl::kIgnoreBindingClosure),
});
}
fuchsia_driver_component_test::DriverService::InstanceHandler GetInstanceHandlerDriver() {
return fuchsia_driver_component_test::DriverService::InstanceHandler({
.device = driver_bindings_.CreateHandler(this, fdf::Dispatcher::GetCurrent()->get(),
fidl::kIgnoreBindingClosure),
});
}
compat::SyncInitializedDeviceServer sync_device_server_;
compat::AsyncInitializedDeviceServer async_device_server_;
fidl::WireClient<fuchsia_driver_framework::Node> node_client_;
bool async_added_child_ = false;
bool sync_added_child_ = false;
fidl::ServerBindingGroup<fuchsia_driver_component_test::ZirconProtocol> zircon_bindings_;
driver_devfs::Connector<fuchsia_driver_component_test::ZirconProtocol> devfs_connector_;
fdf::ServerBindingGroup<fuchsia_driver_component_test::DriverProtocol> driver_bindings_;
fidl::WireSyncClient<fuchsia_driver_framework::Node> devfs_node_;
fidl::WireSyncClient<fuchsia_driver_framework::NodeController> devfs_node_controller_;
std::optional<fdf::PrepareStopCompleter> stop_completer_;
fidl::WireClient<fuchsia_driver_framework::NodeController> child_controller_;
std::optional<fdf::SynchronizedDispatcher> not_shutdown_manually_dispatcher_;
};
#endif // LIB_DRIVER_COMPONENT_CPP_TESTS_TEST_DRIVER_H_