blob: afb31c151622cc5f9a49ac404741d0fea2dc23b5 [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 "src/graphics/display/lib/driver-framework-migration-utils/metadata/metadata-getter-dfv2.h"
#include <fidl/fuchsia.component.runner/cpp/fidl.h>
#include <lib/async_patterns/testing/cpp/dispatcher_bound.h>
#include <lib/component/incoming/cpp/constants.h>
#include <lib/driver/compat/cpp/device_server.h>
#include <lib/driver/incoming/cpp/namespace.h>
#include <lib/driver/testing/cpp/driver_runtime.h>
#include <lib/driver/testing/cpp/test_environment.h>
#include <lib/driver/testing/cpp/test_node.h>
#include <gtest/gtest.h>
#include "src/lib/testing/predicates/status.h"
namespace display {
namespace {
struct TestMetadata {
uint32_t vendor_id;
uint32_t platform_id;
uint32_t device_id;
};
constexpr uint32_t kTestMetadataType = 'TEST';
constexpr TestMetadata kTestMetadata = {
.vendor_id = 0x1a'2b'3c'4d,
.platform_id = 0x5a'6b'7c'8d,
.device_id = 0x9a'ab'bc'cd,
};
struct IncomingNamespace {
fdf_testing::TestNode node{std::string("root")};
fdf_testing::TestEnvironment env{fdf::Dispatcher::GetCurrent()->get()};
compat::DeviceServer compat_server;
};
class MetadataGetterDfv2Test : public testing::Test {
public:
// implements `testing::Test`.
void SetUp() override {
zx::result<fdf_testing::TestNode::CreateStartArgsResult> start_args_result = incoming_.SyncCall(
[&](IncomingNamespace* incoming) { return incoming->node.CreateStartArgsAndServe(); });
ASSERT_TRUE(start_args_result.is_ok());
zx::result test_environment_init_result = incoming_.SyncCall([&](IncomingNamespace* incoming) {
return incoming->env.Initialize(std::move(start_args_result->incoming_directory_server));
});
ASSERT_TRUE(test_environment_init_result.is_ok());
incoming_.SyncCall([&](IncomingNamespace* incoming) {
incoming->compat_server.Init(component::kDefaultInstance, "root");
zx_status_t add_metadata_status = incoming->compat_server.AddMetadata(
kTestMetadataType, &kTestMetadata, sizeof(TestMetadata));
ASSERT_OK(add_metadata_status);
zx_status_t serve_status = incoming->compat_server.Serve(env_dispatcher_->async_dispatcher(),
&incoming->env.incoming_directory());
ASSERT_OK(serve_status);
});
zx::result<fdf::Namespace> namespace_result =
fdf::Namespace::Create(*start_args_result->start_args.incoming());
ASSERT_OK(namespace_result.status_value());
namespace_ = std::make_shared<fdf::Namespace>(std::move(namespace_result).value());
}
protected:
fdf_testing::DriverRuntime runtime_;
fdf::UnownedSynchronizedDispatcher env_dispatcher_ = runtime_.StartBackgroundDispatcher();
async_patterns::TestDispatcherBound<IncomingNamespace> incoming_{
env_dispatcher_->async_dispatcher(), std::in_place};
std::shared_ptr<fdf::Namespace> namespace_;
};
TEST_F(MetadataGetterDfv2Test, GetMetadata) {
zx::result<std::unique_ptr<MetadataGetter>> create_metadata_getter_result =
display::MetadataGetterDfv2::Create(namespace_);
ASSERT_OK(create_metadata_getter_result.status_value());
std::unique_ptr<MetadataGetter> metadata_getter =
std::move(create_metadata_getter_result).value();
zx::result<std::unique_ptr<TestMetadata>> metadata_result =
metadata_getter->Get<TestMetadata>(kTestMetadataType, component::kDefaultInstance);
ASSERT_OK(metadata_result.status_value());
std::unique_ptr<TestMetadata> metadata = std::move(metadata_result).value();
ASSERT_NE(metadata, nullptr);
EXPECT_EQ(metadata->vendor_id, kTestMetadata.vendor_id);
EXPECT_EQ(metadata->platform_id, kTestMetadata.platform_id);
EXPECT_EQ(metadata->device_id, kTestMetadata.device_id);
}
TEST_F(MetadataGetterDfv2Test, ErrorOnIncorrectType) {
zx::result<std::unique_ptr<MetadataGetter>> create_metadata_getter_result =
display::MetadataGetterDfv2::Create(namespace_);
ASSERT_OK(create_metadata_getter_result.status_value());
std::unique_ptr<MetadataGetter> metadata_getter =
std::move(create_metadata_getter_result).value();
static constexpr uint32_t kInvalidMetadataType = 'INVA';
zx::result<std::unique_ptr<TestMetadata>> metadata_result =
metadata_getter->Get<TestMetadata>(kInvalidMetadataType, component::kDefaultInstance);
EXPECT_NE(metadata_result.status_value(), ZX_OK);
}
TEST_F(MetadataGetterDfv2Test, ErrorOnIncorrectReturnType) {
zx::result<std::unique_ptr<MetadataGetter>> create_metadata_getter_result =
display::MetadataGetterDfv2::Create(namespace_);
ASSERT_OK(create_metadata_getter_result.status_value());
std::unique_ptr<MetadataGetter> metadata_getter =
std::move(create_metadata_getter_result).value();
struct DifferentFromTestMetadata {
uint32_t vendor_id;
uint32_t platform_id;
uint32_t device_id;
uint32_t serial_number;
};
zx::result<std::unique_ptr<DifferentFromTestMetadata>> metadata_result =
metadata_getter->Get<DifferentFromTestMetadata>(kTestMetadataType,
component::kDefaultInstance);
EXPECT_NE(metadata_result.status_value(), ZX_OK);
}
TEST_F(MetadataGetterDfv2Test, ErrorOnIncorrectInstance) {
zx::result<std::unique_ptr<MetadataGetter>> create_metadata_getter_result =
display::MetadataGetterDfv2::Create(namespace_);
ASSERT_OK(create_metadata_getter_result.status_value());
std::unique_ptr<MetadataGetter> metadata_getter =
std::move(create_metadata_getter_result).value();
zx::result<std::unique_ptr<TestMetadata>> metadata_result =
metadata_getter->Get<TestMetadata>(kTestMetadataType, "incorrect-instance");
EXPECT_NE(metadata_result.status_value(), ZX_OK);
}
} // namespace
} // namespace display