前提条件
本教程以编译 FIDL 教程为基础。如需详细了解其他 FIDL 教程,请参阅概览。
概览
本教程详细介绍了如何通过创建可用作探索 HLCPP 绑定的“测试平台”的单元测试,将 HLCPP FIDL 绑定添加到您的代码中。
本文档介绍了如何完成以下任务:
示例代码位于 //examples/fidl/hlcpp/unittests/
中的 Fuchsia 结账部分。如果您希望按照本教程中的说明编写所有代码,则可以移除示例代码:
rm -r examples/fidl/hlcpp/unittests/*
编写 C++ 主机测试
将 gtest 桩添加到
examples/fidl/hlcpp/unittests/main.cc
:#include <gtest/gtest.h> namespace { } // namespace
定义
test
,然后通过$host_toolchain
创建对测试的依赖项。为此,请将以下代码添加到examples/fidl/hlcpp/unittests/BUILD.gn
中:import("//build/test.gni") group("unittests") { testonly = true deps = [ ":example-cpp-host-test($host_toolchain)" ] } test("example-cpp-host-test") { sources = [ "main.cc" ] deps = [ "//src/lib/fxl/test:gtest_main" ] }
将测试套件添加到您的配置中:
fx set product.board --with //examples/fidl/hlcpp/unittests
运行空测试套件:
fx test -vo example-cpp-host-test
您应该会看到表示未运行任何测试的测试输出,因为尚未添加任何测试。
将 HLCPP FIDL 绑定添加为依赖项
通过直接引用 FIDL 目标来添加对 HLCPP 绑定的依赖项。新的 test
目标应如下所示:
test("example-cpp-host-test") {
sources = [ "main.cc" ]
deps = [
"//examples/fidl/fuchsia.examples:fuchsia.examples_hlcpp",
"//src/lib/fxl/test:gtest_main",
]
}
(可选)如需查看新生成的绑定,请执行以下操作:
- 请使用
fx build
重新构建。 - 切换到生成的文件目录:
out/default/fidling/gen/examples/fidl/fuchsia.examples/fuchsia/examples
,生成文件所在的位置。如果您设置了不同的 build 输出目录,则可能需要更改out/default
。您可以使用fx get-build-dir
检查构建输出目录。
如需详细了解如何查找生成的绑定代码,请参阅查看生成的绑定代码。
在 C++ 代码中添加 HLCPP 绑定
如需包含绑定,请将以下 include 语句添加到 examples/fidl/hlcpp/unittests/main.cc
的顶部
#include <fuchsia/examples/cpp/fidl.h>
检查并使用生成的绑定代码
现在,您可以通过引用生成的代码来编写一些测试。如需详细了解这些绑定,请参阅 HLCPP 绑定参考文档。
首先,您还可以使用一些示例代码。您可以在 main.cc
中的匿名命名空间内添加以下代码:
TEST(FidlExamples, Bits) {
auto flags = fuchsia::examples::FileMode::READ | fuchsia::examples::FileMode::WRITE;
ASSERT_EQ(static_cast<uint16_t>(flags), 0b11);
flags |= fuchsia::examples::FileMode::EXECUTE;
ASSERT_EQ(flags, fuchsia::examples::FileModeMask);
}
TEST(FidlExamples, Enums) {
ASSERT_EQ(static_cast<uint32_t>(fuchsia::examples::LocationType::MUSEUM), 1u);
}
TEST(FidlExamples, Structs) {
fuchsia::examples::Color default_color;
ASSERT_EQ(default_color.id, 0u);
ASSERT_EQ(default_color.name, "red");
fuchsia::examples::Color blue = {1, "blue"};
ASSERT_EQ(blue.id, 1u);
}
TEST(FidlExamples, Unions) {
auto int_val = fuchsia::examples::JsonValue::WithIntValue(1);
ASSERT_EQ(int_val.Which(), fuchsia::examples::JsonValue::Tag::kIntValue);
ASSERT_TRUE(int_val.is_int_value());
auto str_val = fuchsia::examples::JsonValue::WithStringValue("1");
ASSERT_EQ(str_val.Which(), fuchsia::examples::JsonValue::Tag::kStringValue);
ASSERT_TRUE(str_val.is_string_value());
fuchsia::examples::JsonValuePtr other_int_val = std::make_unique<fuchsia::examples::JsonValue>();
other_int_val->set_int_value(5);
ASSERT_EQ(other_int_val->int_value(), 5);
}
TEST(FidlExamples, Tables) {
fuchsia::examples::User user;
ASSERT_FALSE(user.has_age());
user.set_age(100);
*user.mutable_age() += 100;
ASSERT_EQ(user.age(), 200);
user.clear_age();
ASSERT_TRUE(user.IsEmpty());
}
如需重新构建并重新运行测试,请运行以下命令:
fx test -vo example-cpp-host-test