blob: 047865a312e6219d44614b5247187f401106da15 [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 <fidl/fuchsia.driver.test/cpp/fidl.h>
#include <fidl/fuchsia.hardware.powersource/cpp/fidl.h>
#include <lib/component/incoming/cpp/protocol.h>
#include <lib/device-watcher/cpp/device-watcher.h>
#include <lib/driver_test_realm/realm_builder/cpp/lib.h>
#include <lib/sys/component/cpp/testing/realm_builder.h>
#include <lib/sys/component/cpp/testing/realm_builder_types.h>
#include <lib/syslog/cpp/macros.h>
#include "src/lib/testing/loop_fixture/test_loop_fixture.h"
using fuchsia_hardware_powersource::wire::PowerType;
class FakeBatteryRealmTest : public gtest::TestLoopFixture {
public:
protected:
void SetUp() override {
TestLoopFixture::SetUp();
// Create and build the realm.
auto realm_builder = component_testing::RealmBuilder::Create();
driver_test_realm::Setup(realm_builder);
realm_ = realm_builder.Build(dispatcher());
// Start DriverTestRealm.
zx::result dtr = realm_->component().Connect<fuchsia_driver_test::Realm>();
fuchsia_driver_test::RealmArgs args{{
.root_driver = "fuchsia-boot:///platform-bus#meta/platform-bus.cm",
}};
fidl::Result result = fidl::Call(*dtr)->Start(std::move(args));
ASSERT_TRUE(result.is_ok()) << result.error_value();
}
component_testing::RealmRoot& Realm() { return *realm_; }
private:
std::optional<component_testing::RealmRoot> realm_;
};
TEST_F(FakeBatteryRealmTest, DriversExist) {
// Connect to dev.
zx::result dev_class_dir = Realm().component().Connect<fuchsia_io::Directory>("dev-class");
ASSERT_EQ(dev_class_dir.status_value(), ZX_OK);
zx::result dir_result = component::ConnectAt<fuchsia_io::Directory>(*dev_class_dir, "power");
ASSERT_EQ(dir_result.status_value(), ZX_OK);
auto& dir = dir_result.value();
auto watch_result = device_watcher::WatchDirectoryForItems<std::string>(
dir, [](std::string_view name) -> std::optional<std::string> { return std::string(name); });
ASSERT_EQ(watch_result.status_value(), ZX_OK);
auto name = std::move(watch_result.value());
auto client_end = component::ConnectAt<fuchsia_hardware_powersource::Source>(dir, name);
ASSERT_EQ(client_end.status_value(), ZX_OK);
fidl::WireSyncClient client(std::move(*client_end));
// Send a FIDL request.
fidl::WireResult result = client->GetPowerInfo();
ASSERT_EQ(ZX_OK, result.status());
const auto& info = result.value().info;
ASSERT_EQ(info.type, PowerType::kBattery);
}