blob: 99d2e79d8a6f29a6eec533df6f7131f8685940fa [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.driver.test/cpp/fidl.h>
#include <fidl/fuchsia.examples.metadata/cpp/fidl.h>
#include <lib/component/incoming/cpp/service_member_watcher.h>
#include <lib/device-watcher/cpp/device-watcher.h>
#include <lib/driver_test_realm/realm_builder/cpp/lib.h>
#include <lib/fdio/fd.h>
#include "src/lib/testing/loop_fixture/test_loop_fixture.h"
#include "src/lib/testing/predicates/status.h"
namespace metadata_test {
class MetadataTest : public gtest::TestLoopFixture {
public:
void SetUp() override {
// Create and build the realm.
auto realm_builder = component_testing::RealmBuilder::Create();
driver_test_realm::Setup(realm_builder);
const std::vector<fuchsia_component_test::Capability> exposes = {
{
fuchsia_component_test::Capability::WithService(fuchsia_component_test::Service(
{.name = fuchsia_examples_metadata::RetrieverService::Name})),
},
{
fuchsia_component_test::Capability::WithService(fuchsia_component_test::Service(
{.name = fuchsia_examples_metadata::SenderService::Name})),
}};
driver_test_realm::AddDtrExposes(realm_builder, exposes);
realm_.emplace(realm_builder.Build(dispatcher()));
// Start DriverTestRealm.
zx::result result = realm_->component().Connect<fuchsia_driver_test::Realm>();
ASSERT_OK(result);
fidl::SyncClient<fuchsia_driver_test::Realm> driver_test_realm(std::move(result.value()));
fidl::Result start_result = driver_test_realm->Start(fuchsia_driver_test::RealmArgs(
{.root_driver = "fuchsia-boot:///dtr#meta/sender.cm", .dtr_exposes = exposes}));
ASSERT_OK(start_result);
// Connect to sender driver.
component::SyncServiceMemberWatcher<fuchsia_examples_metadata::SenderService::Device> watcher(
SvcDir());
zx::result sender = watcher.GetNextInstance(false);
ASSERT_OK(sender);
sender_.Bind(std::move(sender.value()));
}
protected:
fidl::SyncClient<fuchsia_examples_metadata::Sender>& sender() { return sender_; }
fidl::UnownedClientEnd<fuchsia_io::Directory> SvcDir() {
return fidl::UnownedClientEnd<fuchsia_io::Directory>(
realm_->component().exposed().unowned_channel()->get());
}
private:
std::optional<component_testing::RealmRoot> realm_;
fidl::SyncClient<fuchsia_examples_metadata::Sender> sender_;
};
TEST_F(MetadataTest, TransferMetadata) {
const char* kMetadataPropertyValue = "test property value";
// Serve the metadata of the sender driver and offer it to its child node (which the forwarder
// driver binds to).
{
fuchsia_examples_metadata::Metadata metadata({.test_property = kMetadataPropertyValue});
ASSERT_OK(sender()->ServeMetadata(std::move(metadata)));
}
// Connect to retriever driver.
component::SyncServiceMemberWatcher<fuchsia_examples_metadata::RetrieverService::Device> watcher(
SvcDir());
zx::result retriever_client_end = watcher.GetNextInstance(false);
ASSERT_OK(retriever_client_end);
fidl::SyncClient retriever(std::move(retriever_client_end.value()));
// Retrieve the metadata from the retriever driver's parent driver (the forwarder driver).
// This verifies that:
// * The `sender` driver sent the correct metadata.
// * The `forwarder` driver forwarded the correct metadata.
// * The `retriever` driver retrieved the correct metadata.
{
fidl::Result result = retriever->GetMetadata();
ASSERT_OK(result);
auto metadata = std::move(result.value().metadata());
ASSERT_EQ(metadata.test_property(), kMetadataPropertyValue);
}
}
} // namespace metadata_test