# Copyright 2020 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/copy_tree.gni")
import("//build/host.gni")
import("//build/sdk/sdk_host_tool.gni")
import("//build/test.gni")
import("//build/testing/environments.gni")
import("//build/testing/host_test_data.gni")

if (is_host) {
  source_set("src") {
    sources = [
      "analytics.cc",
      "command_line_options.cc",
      "log_parser.cc",
      "symbolizer_impl.cc",
    ]
    public_deps = [
      "//src/developer/debug/zxdb/client",
      "//src/developer/debug/zxdb/console",
      "//src/developer/debug/zxdb/symbols",
      "//src/lib/analytics/cpp/core_dev_tools",
      "//src/lib/fxl",
      "//third_party/rapidjson",
      "//zircon/system/ulib/cmdline",
    ]

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

  executable("symbolizer") {
    sources = [ "main.cc" ]
    deps = [
      ":src",
      "//src/lib/fxl",
    ]
  }

  sdk_host_tool("sdk") {
    category = "partner"
    deps = [ ":symbolizer" ]
    output_name = "symbolizer"
  }

  test("symbolizer_tests") {
    sources = [
      "analytics_test.cc",
      "command_line_options_test.cc",
      "log_parser_test.cc",
      "symbolizer_impl_test.cc",
    ]
    deps = [
      ":src",
      "//src/lib/files",
      "//src/lib/fxl/test:gtest_main",
      "//third_party/googletest:gmock",
      "//third_party/googletest:gtest",
    ]

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

  host_test_data("e2e_test_cases") {
    sources = [
      "test_cases/cpp_crasher_klog.in",
      "test_cases/cpp_crasher_klog.out",
      "test_cases/cpp_crasher_syslog.in",
      "test_cases/cpp_crasher_syslog.out",
      "test_cases/kernel_panic.in",
      "test_cases/kernel_panic.out",
      "test_cases/kernel_panic_x64.in",
      "test_cases/kernel_panic_x64.out",
      "test_cases/multithread.in",
      "test_cases/multithread.out",
      "test_cases/rust_crasher_stdout.in",
      "test_cases/rust_crasher_stdout.out",
      "test_cases/rust_crasher_syslog.in",
      "test_cases/rust_crasher_syslog.out",
      "test_cases/userboot.in",
      "test_cases/userboot.out",
    ]
    outputs =
        [ "$root_out_dir/test_data/symbolizer/test_cases/{{source_file_part}}" ]
  }

  # Manually copy the symbol directory since host_test_data does not support
  # copying directory any more (fxbug.dev/73250). It's not a big issue for us
  # since the symbol directory seldom changes, and when it changes, we usually
  # only add new files to it which will change the directory's mtime.
  e2e_test_symbols_out_dir = "$root_out_dir/test_data/symbolizer/symbols"
  copy_tree("e2e_test_symbols_copy") {
    src_dir = "//prebuilt/test_data/symbolizer/symbols"
    dest_dir = e2e_test_symbols_out_dir
  }

  # Make the copied directory available at test runtime.
  host_test_data("e2e_test_symbols") {
    sources = [ e2e_test_symbols_out_dir ]
    deps = [ ":e2e_test_symbols_copy" ]
  }

  test("symbolizer_e2e_tests") {
    sources = [ "e2e_test.cc" ]
    deps = [
      ":e2e_test_cases",
      ":e2e_test_symbols",
      ":src",
      "//third_party/googletest:gtest",
    ]
    environments = [
      {
        dimensions = host_env.dimensions
        tags = [ "symbolizer-e2e" ]
      },
    ]
  }
}

group("tests") {
  testonly = true
  deps = [ ":symbolizer_tests($host_toolchain)" ]
}

group("e2e_tests") {
  testonly = true
  deps = [ ":symbolizer_e2e_tests($host_toolchain)" ]
}
