編譯 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,這是產生的檔案存放位置。 如果您設定了不同的建構輸出目錄,可能需要變更 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