blob: 078f11cd6ff8b1988b49ff20889bdc5cd50c8c80 [file] [log] [blame]
// 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.power.broker/cpp/fidl.h>
#include <lib/driver/power/cpp/element-description-builder.h>
#include <lib/driver/power/cpp/power-support.h>
#include <zircon/syscalls/object.h>
#include <src/lib/testing/loop_fixture/test_loop_fixture.h>
#if FUCHSIA_API_LEVEL_AT_LEAST(HEAD)
namespace power_lib_test {
class ElementBuilderTests : public gtest::TestLoopFixture {};
void check_channels_peered(zx_handle_t c1, zx_handle_t c2) {
zx_info_handle_basic_t basic1;
size_t actual1;
size_t handles1;
zx_info_handle_basic_t basic2;
size_t actual2;
size_t handles2;
zx_object_get_info(c1, ZX_INFO_HANDLE_BASIC, &basic1, sizeof(zx_info_handle_basic_t), &actual1,
&handles1);
zx_object_get_info(c2, ZX_INFO_HANDLE_BASIC, &basic2, sizeof(zx_info_handle_basic_t), &actual2,
&handles2);
ASSERT_EQ(basic1.koid, basic2.related_koid);
}
TEST_F(ElementBuilderTests, ElementBuilderLevelControlFilledOut) {
fdf_power::PowerElementConfiguration config;
fdf_power::TokenMap tokens;
zx_handle_t active, passive;
zx_event_create(0, &active);
zx_event_create(0, &passive);
zx::event active_event(active);
zx::event passive_event(passive);
fidl::Endpoints<fuchsia_power_broker::CurrentLevel> current_level =
fidl::CreateEndpoints<fuchsia_power_broker::CurrentLevel>().value();
fidl::Endpoints<fuchsia_power_broker::RequiredLevel> required_level =
fidl::CreateEndpoints<fuchsia_power_broker::RequiredLevel>().value();
fidl::Endpoints<fuchsia_power_broker::Lessor> lessor =
fidl::CreateEndpoints<fuchsia_power_broker::Lessor>().value();
fidl::Endpoints<fuchsia_power_broker::ElementControl> element_control =
fidl::CreateEndpoints<fuchsia_power_broker::ElementControl>().value();
fdf_power::ElementDesc desc = fdf_power::ElementDescBuilder(config, std::move(tokens))
.SetAssertiveToken(active_event.borrow())
.SetOpportunisticToken(passive_event.borrow())
.SetCurrentLevel(std::move(current_level.server))
.SetRequiredLevel(std::move(required_level.server))
.SetLessor(std::move(lessor.server))
.SetElementControl(std::move(element_control.server))
.Build();
ASSERT_TRUE(desc.lessor_server.is_valid());
ASSERT_TRUE(desc.element_control_server.is_valid());
ASSERT_TRUE(desc.level_control_servers.first.is_valid());
ASSERT_TRUE(desc.level_control_servers.second.is_valid());
ASSERT_EQ(desc.element_runner_client, std::nullopt);
ASSERT_TRUE(desc.assertive_token.is_valid());
ASSERT_TRUE(desc.opportunistic_token.is_valid());
ASSERT_EQ(desc.current_level_client, std::nullopt);
ASSERT_EQ(desc.required_level_client, std::nullopt);
ASSERT_EQ(desc.lessor_client, std::nullopt);
ASSERT_EQ(desc.element_control_client, std::nullopt);
check_channels_peered(current_level.client.handle()->get(),
desc.level_control_servers.first.handle()->get());
check_channels_peered(required_level.client.handle()->get(),
desc.level_control_servers.second.handle()->get());
check_channels_peered(lessor.client.handle()->get(), desc.lessor_server.handle()->get());
check_channels_peered(element_control.client.handle()->get(),
desc.element_control_server.handle()->get());
}
TEST_F(ElementBuilderTests, ElementBuilderElementRunnerFilledOut) {
fdf_power::PowerElementConfiguration config;
fdf_power::TokenMap tokens;
zx_handle_t active, passive;
zx_event_create(0, &active);
zx_event_create(0, &passive);
zx::event active_event(active);
zx::event passive_event(passive);
fidl::Endpoints<fuchsia_power_broker::Lessor> lessor =
fidl::CreateEndpoints<fuchsia_power_broker::Lessor>().value();
fidl::Endpoints<fuchsia_power_broker::ElementControl> element_control =
fidl::CreateEndpoints<fuchsia_power_broker::ElementControl>().value();
fidl::Endpoints<fuchsia_power_broker::ElementRunner> element_runner =
fidl::CreateEndpoints<fuchsia_power_broker::ElementRunner>().value();
fdf_power::ElementDesc desc = fdf_power::ElementDescBuilder(config, std::move(tokens))
.SetAssertiveToken(active_event.borrow())
.SetOpportunisticToken(passive_event.borrow())
.SetLessor(std::move(lessor.server))
.SetElementControl(std::move(element_control.server))
.SetElementRunner(std::move(element_runner.client))
.Build();
ASSERT_TRUE(desc.lessor_server.is_valid());
ASSERT_TRUE(desc.element_control_server.is_valid());
ASSERT_FALSE(desc.level_control_servers.first.is_valid());
ASSERT_FALSE(desc.level_control_servers.second.is_valid());
ASSERT_TRUE(desc.element_runner_client->is_valid());
ASSERT_TRUE(desc.assertive_token.is_valid());
ASSERT_TRUE(desc.opportunistic_token.is_valid());
ASSERT_EQ(desc.current_level_client, std::nullopt);
ASSERT_EQ(desc.required_level_client, std::nullopt);
ASSERT_EQ(desc.lessor_client, std::nullopt);
ASSERT_EQ(desc.element_control_client, std::nullopt);
check_channels_peered(lessor.client.handle()->get(), desc.lessor_server.handle()->get());
check_channels_peered(element_control.client.handle()->get(),
desc.element_control_server.handle()->get());
check_channels_peered(element_runner.server.handle()->get(),
desc.element_runner_client->handle()->get());
}
TEST_F(ElementBuilderTests, ElementBuilderMissingCurrentLevel) {
fdf_power::PowerElementConfiguration config;
fdf_power::TokenMap tokens;
zx_handle_t active, passive;
zx_event_create(0, &active);
zx_event_create(0, &passive);
zx::event active_event(active);
zx::event passive_event(passive);
fidl::Endpoints<fuchsia_power_broker::RequiredLevel> required_level =
fidl::CreateEndpoints<fuchsia_power_broker::RequiredLevel>().value();
fidl::Endpoints<fuchsia_power_broker::Lessor> lessor =
fidl::CreateEndpoints<fuchsia_power_broker::Lessor>().value();
fidl::Endpoints<fuchsia_power_broker::ElementControl> element_control =
fidl::CreateEndpoints<fuchsia_power_broker::ElementControl>().value();
fdf_power::ElementDesc desc = fdf_power::ElementDescBuilder(config, std::move(tokens))
.SetAssertiveToken(active_event.borrow())
.SetOpportunisticToken(passive_event.borrow())
.SetRequiredLevel(std::move(required_level.server))
.SetLessor(std::move(lessor.server))
.SetElementControl(std::move(element_control.server))
.Build();
ASSERT_TRUE(desc.lessor_server.is_valid());
ASSERT_TRUE(desc.element_control_server.is_valid());
ASSERT_TRUE(desc.level_control_servers.first.is_valid());
ASSERT_TRUE(desc.level_control_servers.second.is_valid());
ASSERT_TRUE(desc.assertive_token.is_valid());
ASSERT_TRUE(desc.opportunistic_token.is_valid());
ASSERT_TRUE(desc.current_level_client.has_value());
ASSERT_EQ(desc.required_level_client, std::nullopt);
ASSERT_EQ(desc.lessor_client, std::nullopt);
ASSERT_EQ(desc.element_control_client, std::nullopt);
check_channels_peered(desc.current_level_client->handle()->get(),
desc.level_control_servers.first.handle()->get());
check_channels_peered(required_level.client.handle()->get(),
desc.level_control_servers.second.handle()->get());
check_channels_peered(lessor.client.handle()->get(), desc.lessor_server.handle()->get());
check_channels_peered(element_control.client.handle()->get(),
desc.element_control_server.handle()->get());
}
TEST_F(ElementBuilderTests, ElementBuilderMin) {
fdf_power::PowerElementConfiguration config;
fdf_power::TokenMap tokens;
fdf_power::ElementDesc desc = fdf_power::ElementDescBuilder(config, std::move(tokens)).Build();
ASSERT_NE(desc.current_level_client, std::nullopt);
ASSERT_TRUE(desc.current_level_client.value().is_valid());
ASSERT_NE(desc.required_level_client, std::nullopt);
ASSERT_TRUE(desc.required_level_client.value().is_valid());
ASSERT_NE(desc.lessor_client, std::nullopt);
ASSERT_NE(desc.element_control_client, std::nullopt);
ASSERT_TRUE(desc.required_level_client.value().is_valid());
ASSERT_TRUE(desc.lessor_server.is_valid());
ASSERT_TRUE(desc.element_control_server.is_valid());
ASSERT_TRUE(desc.level_control_servers.first.is_valid());
ASSERT_TRUE(desc.level_control_servers.second.is_valid());
ASSERT_TRUE(desc.assertive_token.is_valid());
ASSERT_TRUE(desc.opportunistic_token.is_valid());
check_channels_peered(desc.current_level_client->handle()->get(),
desc.level_control_servers.first.handle()->get());
check_channels_peered(desc.required_level_client->handle()->get(),
desc.level_control_servers.second.handle()->get());
check_channels_peered(desc.element_control_client->handle()->get(),
desc.element_control_server.handle()->get());
}
} // namespace power_lib_test
#endif