编译 FIDL

前提条件

本教程以编译 FIDL 教程为基础。如需详细了解其他 FIDL 教程,请参阅概览

概览

本教程详细介绍了如何通过创建可用作探索 HLCPP 绑定的“测试平台”的单元测试,将 HLCPP FIDL 绑定添加到您的代码中。

本文档介绍了如何完成以下任务:

示例代码位于 //examples/fidl/hlcpp/unittests/ 中的 Fuchsia 结账部分。如果您希望按照本教程中的说明编写所有代码,则可以移除示例代码:

rm -r examples/fidl/hlcpp/unittests/*

编写 C++ 主机测试

  1. 将 gtest 桩添加到 examples/fidl/hlcpp/unittests/main.cc

    #include <gtest/gtest.h>
    
    namespace {
    
    } // namespace
    
  2. 定义 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" ]
    }
    
  3. 将测试套件添加到您的配置中:

fx set product.board --with //examples/fidl/hlcpp/unittests
  1. 运行空测试套件:

    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",
  ]
}

(可选)如需查看新生成的绑定,请执行以下操作:

  1. 请使用 fx build 重新构建。
  2. 切换到生成的文件目录: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