blob: 2f382c46a2d5a9a07ba79bd1b7f5e133622de03b [file] [log] [blame] [edit]
// 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 <fidl/fuchsia.device/cpp/wire_test_base.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <zxtest/zxtest.h>
#include "src/devices/lib/fidl/device_server.h"
namespace {
class TestInterface : public devfs_fidl::DeviceInterface {
public:
void LogError(const char* error) override { printf("%s\n", error); }
bool IsUnbound() override { return false; }
bool MessageOp(fidl::IncomingHeaderAndMessage msg, device_fidl_txn_t txn) override {
return false;
}
void GetCurrentPerformanceState(GetCurrentPerformanceStateCompleter::Sync& completer) override {
completer.Reply(1);
}
void ConnectToDeviceFidl(fuchsia_device::wire::ControllerConnectToDeviceFidlRequest* request,
ConnectToDeviceFidlCompleter::Sync& completer) override {
ZX_PANIC("Unimplemented");
}
void ConnectToController(fuchsia_device::wire::ControllerConnectToControllerRequest* request,
ConnectToControllerCompleter::Sync& completer) override {
ZX_PANIC("Unimplemented");
}
void Bind(fuchsia_device::wire::ControllerBindRequest* request,
BindCompleter::Sync& completer) override {
ZX_PANIC("Unimplemented");
}
void Rebind(fuchsia_device::wire::ControllerRebindRequest* request,
RebindCompleter::Sync& completer) override {
ZX_PANIC("Unimplemented");
}
void UnbindChildren(UnbindChildrenCompleter::Sync& completer) override {
ZX_PANIC("Unimplemented");
}
void ScheduleUnbind(ScheduleUnbindCompleter::Sync& completer) override {
ZX_PANIC("Unimplemented");
}
void GetTopologicalPath(GetTopologicalPathCompleter::Sync& completer) override {
ZX_PANIC("Unimplemented");
}
void GetMinDriverLogSeverity(GetMinDriverLogSeverityCompleter::Sync& completer) override {
ZX_PANIC("Unimplemented");
}
void SetMinDriverLogSeverity(
fuchsia_device::wire::ControllerSetMinDriverLogSeverityRequest* request,
SetMinDriverLogSeverityCompleter::Sync& completer) override {
ZX_PANIC("Unimplemented");
}
void SetPerformanceState(fuchsia_device::wire::ControllerSetPerformanceStateRequest* request,
SetPerformanceStateCompleter::Sync& completer) override {
ZX_PANIC("Unimplemented");
}
};
class MultiplexTest : public zxtest::TestWithParam<std::tuple<bool, bool>> {
public:
struct Param {
explicit Param(ParamType info)
: include_node(std::get<0>(info)), include_controller(std::get<1>(info)) {}
const bool include_node;
const bool include_controller;
};
};
TEST_P(MultiplexTest, CheckUnimplemented) {
const Param param(GetParam());
bool include_node = param.include_node;
bool include_controller = param.include_controller;
async::Loop loop(&kAsyncLoopConfigNoAttachToCurrentThread);
TestInterface interface;
devfs_fidl::DeviceServer server{interface, loop.dispatcher()};
{
zx::result node = fidl::CreateEndpoints<fuchsia_io::Node>();
ASSERT_OK(node);
server.ServeMultiplexed(node->server.TakeChannel(), include_node, include_controller);
fidl::WireClient node_client{std::move(node->client), loop.dispatcher()};
bool did_run = false;
node_client->Query().Then(
[&did_run, include_node](fidl::WireUnownedResult<fuchsia_io::Node::Query>& result) {
did_run = true;
if (include_node) {
ASSERT_OK(result.status());
} else {
ASSERT_STATUS(result.status(), ZX_ERR_PEER_CLOSED);
}
});
ASSERT_OK(loop.RunUntilIdle());
ASSERT_TRUE(did_run);
}
{
zx::result controller = fidl::CreateEndpoints<fuchsia_device::Controller>();
ASSERT_OK(controller);
server.ServeMultiplexed(controller->server.TakeChannel(), include_node, include_controller);
bool did_run = false;
fidl::WireClient controller_client{std::move(controller->client), loop.dispatcher()};
controller_client->GetCurrentPerformanceState().Then(
[&did_run, include_controller](
fidl::WireUnownedResult<fuchsia_device::Controller::GetCurrentPerformanceState>&
result) {
did_run = true;
if (include_controller) {
ASSERT_OK(result.status());
} else {
ASSERT_STATUS(result.status(), ZX_ERR_PEER_CLOSED);
}
});
ASSERT_OK(loop.RunUntilIdle());
ASSERT_TRUE(did_run);
}
bool did_run = false;
server.CloseAllConnections([&did_run]() { did_run = true; });
ASSERT_OK(loop.RunUntilIdle());
ASSERT_TRUE(did_run);
}
INSTANTIATE_TEST_SUITE_P(DevfsFidl, MultiplexTest, zxtest::Combine(zxtest::Bool(), zxtest::Bool()),
[](const zxtest::TestParamInfo<MultiplexTest::ParamType>& info) {
const MultiplexTest::Param param(info.param);
std::string test_suffix;
if (param.include_controller) {
test_suffix += "WithController";
}
if (param.include_node) {
test_suffix += "WithNode";
}
return test_suffix;
});
} // namespace