編譯 FIDL

必要條件

本教學課程是以編譯 FIDL 教學課程為基礎。 如要進一步瞭解其他 FIDL 教學課程,請參閱總覽

總覽

本教學課程將詳細說明如何將 HLCPP FIDL 繫結加入 建立能做為「遊樂場」單元測試的單元測試的 探索 HLCPP 繫結

本文件說明如何完成以下工作:

範例程式碼位於 Fuchsia 結帳時, //examples/fidl/hlcpp/unittests/。如果想編寫完整的程式碼 按照本教學課程操作時,您可以移除範例程式碼:

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,其中 產生的檔案會存放在這個資料夾中 如果您設定了其他建構輸出內容,可能需要變更 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