# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/components.gni")
import("//build/test.gni")
import("//build/testing/host_test_data.gni")

source_set("fostr") {
  sources = [
    "fidl_types.cc",
    "fidl_types.h",
    "hex_dump.cc",
    "hex_dump.h",
    "indent.h",
    "zx_types.cc",
    "zx_types.h",
  ]

  if (is_fuchsia) {
    public_deps = [
      "//sdk/lib/fidl/cpp",
      "//zircon/system/ulib/zx",
    ]
  } else {
    public_deps = [ "//sdk/lib/fidl/cpp:cpp_base" ]
  }

  deps = [ ":fostr_shared" ]
}

shared_library("fostr_shared") {
  sources = [
    "indent.cc",
    "indent.h",
  ]
}

if (is_host) {
  host_test_data("fostr_shared_test_data") {
    if (is_linux) {
      sources = [ "$root_out_dir/libfostr_shared.so" ]
    } else if (is_mac) {
      sources = [ "$root_out_dir/libfostr_shared.dylib" ]
    }
    deps = [ ":fostr_shared($host_toolchain)" ]
  }
}

test("fostr-test-bin") {
  output_name = "fostr_unittests"

  sources = [
    "test/fidl_types_unittests.cc",
    "test/hex_dump_unittests.cc",
    "test/indent_unittests.cc",
    "test/zx_types_unittests.cc",
  ]

  deps = [
    ":fostr",
    "//src/lib/fostr/fidl/fuchsia.example.fostr",
    "//src/lib/fostr/fidl/fuchsia.example.fostr2",
    "//src/lib/fsl",

    # TODO(fxbug.dev/7945): Remove dependency on fuchsia.sys. We should instead be
    # using the fuchsia.example.fostr library to avoid changes in unrelated code
    # to break tests here.
    "//sdk/fidl/fuchsia.boot:fuchsia.boot_c",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/lib/fidl/cpp",
    "//src/lib/fxl/test:gtest_main",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
  ]

  # TODO(fxbug.dev/95833): This target uses the deprecated C bindings.
  # Consider switching to the C++ bindings. See linked bug for details.
  configs += [ "//build/c:fidl-deprecated-c-bindings" ]
}

fuchsia_unittest_package("fostr-tests") {
  package_name = "fostr_unittests"
  manifest = "meta/fostr_unittests.cml"
  deps = [ ":fostr-test-bin" ]
}

group("tests") {
  testonly = true
  deps = [ ":fostr-tests" ]
}
