# 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/config.gni")
import("//build/package.gni")
import("//build/test/test_package.gni")
import("//build/testing/environments.gni")

source_set("lib") {
  testonly = true

  sources = [
    "component.cc",
    "component.h",
    "log_collector.cc",
    "log_collector.h",
    "max_severity_config.cc",
    "max_severity_config.h",
    "output_collector.cc",
    "output_collector.h",
    "run_test_component.cc",
    "run_test_component.h",
    "sys_tests.cc",
    "sys_tests.h",
    "test_metadata.cc",
    "test_metadata.h",
  ]

  public_deps = [
    "//garnet/public/lib/json",
    "//sdk/fidl/fuchsia.boot",
    "//sdk/fidl/fuchsia.camera2",
    "//sdk/fidl/fuchsia.device",
    "//sdk/fidl/fuchsia.hardware.pty",
    "//sdk/fidl/fuchsia.kernel",
    "//sdk/fidl/fuchsia.logger",
    "//sdk/fidl/fuchsia.media",
    "//sdk/fidl/fuchsia.net",
    "//sdk/fidl/fuchsia.posix.socket",
    "//sdk/fidl/fuchsia.scheduler",
    "//sdk/fidl/fuchsia.security.resource",
    "//sdk/fidl/fuchsia.sys.internal",
    "//sdk/fidl/fuchsia.sys.test",
    "//sdk/fidl/fuchsia.sysinfo",
    "//sdk/fidl/fuchsia.sysmem",
    "//sdk/fidl/fuchsia.time",
    "//sdk/fidl/fuchsia.tracing.provider",
    "//sdk/fidl/fuchsia.ui.policy",
    "//sdk/fidl/fuchsia.ui.scenic",
    "//sdk/fidl/fuchsia.vulkan.loader",
    "//sdk/lib/sys/cpp",
    "//sdk/lib/syslog/cpp",
    "//sdk/lib/syslog/cpp:backend_legacy",
    "//src/lib/cmx",
    "//src/lib/fxl",
    "//src/lib/pkg_url",
    "//src/sys/component_index/fidl:index",
    "//zircon/third_party/rapidjson",
  ]
}

executable("bin") {
  testonly = true
  output_name = "run_test_component"

  sources = [ "main.cc" ]

  deps = [
    ":lib",
    "//sdk/fidl/fuchsia.debugdata",
    "//sdk/fidl/fuchsia.logger",
    "//sdk/fidl/fuchsia.process",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/lib/sys/cpp",
    "//sdk/lib/sys/cpp/testing:enclosing_environment",
    "//sdk/lib/syslog/cpp",
    "//sdk/lib/syslog/cpp:backend_legacy",
    "//src/diagnostics/archivist/fidl:controller",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
  ]
}

package("run-test-component") {
  testonly = true
  package_name = "run_test_component"

  deps = [ ":bin" ]

  binaries = [
    {
      # Deprecated binary name
      name = "run_test_component"
      shell = true
    },
    {
      name = "run-test-component"
      source = "run_test_component"
      shell = true
    },
  ]
}

executable("test_bin") {
  testonly = true
  output_name = "run_test_component_unittests"

  sources = [
    "log_collector_unittests.cc",
    "max_severity_config_unittests.cc",
    "output_collector_unittests.cc",
    "run_test_component_unittest.cc",
    "sys_tests_unittests.cc",
    "test_metadata_unittest.cc",
  ]

  deps = [
    ":lib",
    "//src/lib/fxl/test:gtest_main",
    "//third_party/googletest:gmock",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
  ]

  # TODO(46834): Fix the leaks and remove this.
  deps += [ "//build/config/sanitizers:suppress-lsan.DO-NOT-USE-THIS" ]
}

test_package("run_test_component_unittests") {
  deps = [ ":test_bin" ]

  tests = [
    {
      name = "run_test_component_unittests"
      environments = basic_envs
    },
  ]

  resources = [
    {
      path = "test_configs/max_severity/valid1.json"
      dest = "max_severity/valid/1.json"
    },
    {
      path = "test_configs/max_severity/valid2.json"
      dest = "max_severity/valid/2.json"
    },
    {
      path = "test_configs/max_severity/valid3.json"
      dest = "max_severity/valid/3.json"
    },
    {
      path = "test_configs/max_severity/no_url.json"
      dest = "max_severity/no_url/no_url.json"
    },
    {
      path = "test_configs/max_severity/invalid_url.json"
      dest = "max_severity/invalid_url/invalid_url.json"
    },
    {
      path = "test_configs/max_severity/no_severity.json"
      dest = "max_severity/no_severity/no_severity.json"
    },
    {
      path = "test_configs/max_severity/invalid_severity.json"
      dest = "max_severity/invalid_severity/invalid_severity.json"
    },
    {
      path = "test_configs/max_severity/url_conflict.json"
      dest = "max_severity/url_conflict/url_conflict.json"
    },
  ]
}

config_data("max_severity") {
  testonly = true
  for_pkg = "run_test_component"
  sources = [ "max_severity_fuchsia.json" ]
}

group("run_test_component") {
  testonly = true
  public_deps = [
    ":max_severity",
    ":run-test-component",
  ]
}

group("tests") {
  testonly = true
  public_deps = [
    ":run_test_component_unittests",
    "test",
  ]
}
