# Copyright 2019 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/fidl/fidl.gni")
import("//third_party/protobuf/proto_library.gni")

if (is_host) {
  static_library("host_lib") {
    public = [
      "analytics.h",
      "comparator.h",
      "decoder.h",
      "event.h",
      "exception_decoder.h",
      "fidlcat_printer.h",
      "inference.h",
      "interception_workflow.h",
      "replay.h",
      "statistics.h",
      "syscall_decoder.h",
      "syscall_decoder_dispatcher.h",
      "syscall_decoder_interface.h",
      "top.h",
      "type_decoder.h",
    ]

    sources = [
      "comparator.cc",
      "decoder.cc",
      "event.cc",
      "exception_decoder.cc",
      "fidlcat_printer.cc",
      "inference.cc",
      "interception_workflow.cc",
      "replay.cc",
      "statistics.cc",
      "syscall_decoder.cc",
      "syscall_decoder_dispatcher.cc",
      "syscall_decoder_interface.cc",
      "syscall_definition.cc",
      "top.cc",
      "type_decoder.cc",
    ]

    deps = [
      ":session_proto",
      "//sdk/lib/fidl_base",
      "//sdk/lib/fit",
      "//src/developer/debug/ipc",
      "//src/developer/debug/zxdb/client",
      "//src/developer/debug/zxdb/common",
      "//src/lib/analytics/cpp/core_dev_tools",
      "//src/lib/fidl_codec",
      "//src/lib/fidl_codec:value_proto",
      "//src/lib/fxl",
      "//third_party/protobuf:protobuf_full",
      "//third_party/rapidjson",
    ]

    public_deps = [
      "//third_party/re2",
      "//tools/fidlcat:lib",
      "//zircon/system/public",
    ]

    # TODO(https://fxbug.dev/42136089): delete the below and fix compiler warnings
    configs += [ "//build/config:Wno-conversion" ]
  }

  source_set("host_tests") {
    testonly = true
    sources = [ "comparator_test.cc" ]

    deps = [
      ":host_lib",
      "//sdk/lib/fidl_base",
      "//src/developer/debug/zxdb/client",
      "//src/lib/fidl_codec",
      "//third_party/googletest:gtest",
      "//third_party/protobuf:protobuf_full",
      "//third_party/rapidjson",
    ]

    # TODO(https://fxbug.dev/42136089): delete the below and fix compiler warnings
    configs += [ "//build/config:Wno-conversion" ]
  }

  proto_library("session_proto") {
    proto_in_dir = "//"

    sources = [ "//tools/fidlcat/proto/session.proto" ]

    generate_python = false

    deps = [
      "//src/lib/fidl_codec:value_proto",
      "//third_party/protobuf:protobuf_full",
    ]
  }
}

action("json_for_test") {
  deps = [
    ":fidl($fidl_toolchain)",
    ":fidl-composed($fidl_toolchain)",
    ":fidl-sys($fidl_toolchain)",
    "//sdk/fidl/fuchsia.io",
    "//sdk/lib/fidl/cpp/test:frobinator",
  ]
  outputs = [ "$target_gen_dir/library_loader_test_data.h" ]
  script = "generate_test_includes.sh"
  args = [
    rebase_path(outputs[0], root_build_dir),
    "fidling/gen/sdk/lib/fidl/cpp/test/frobinator.fidl.json",
    "fidling/gen/zircon/system/fidl/fuchsia-io/fuchsia-io.fidl.json",
    "fidling/gen/tools/fidlcat/lib/fidl.fidl.json",
    "fidling/gen/tools/fidlcat/lib/fidl-composed.fidl.json",
    "fidling/gen/tools/fidlcat/lib/fidl-sys.fidl.json",
  ]
}

fidl("fidl") {
  testonly = true
  name = "test.fidlcat.examples"

  sources = [
    "testdata/empty.test.fidl",
    "testdata/types.test.fidl",
  ]
}

fidl("fidl-composed") {
  testonly = true
  name = "test.fidlcat.composedinto"

  sources = [ "testdata/composed_into.test.fidl" ]

  public_deps = [ ":fidl" ]
}

fidl("fidl-sys") {
  testonly = true
  name = "test.fidlcat.sys"

  sources = [ "testdata/sys.test.fidl" ]
}
