前提条件
本教程基于编译 FIDL 教程。 如需详细了解其他 FIDL 教程,请参阅概览。
概览
本教程详细介绍了如何将 HLCPP FIDL 绑定 通过创建可用作“Playground”的单元测试用于 了解 HLCPP 绑定。
本文档介绍了如何完成以下任务:
示例代码位于您的 Fuchsia 结账部分,
//examples/fidl/hlcpp/unittests/
。如果您想编写所有代码
您可以移除示例代码:
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
,其中 生成的文件所在的位置 如果您设置了其他构建输出,则可能需要更改out/default
目录。您可以使用fx get-build-dir
检查 build 输出目录。
如需详细了解如何查找生成的绑定代码,请参阅 查看生成的绑定代码。
在 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