# 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/python/python_binary.gni")
import("//build/testing/host_test.gni")
import("//build/testing/host_test_data.gni")

# Declares a host-side python test.
#
# Example
#
# ```
# python_host_test("my_host_test") {
#   main_source = "my_host_test.py"
#   sources = [
#     "test_helpers_foo.py",
#     "test_helpers_bar.py",
#   ]
#   libraries = [
#     "//path/to/foo:lib",
#     "//path/to/bar:lib",
#   ]
#   main_callable = "my_module.main"
#   extra_args = [ "--a_very_useful_flag" ]
# }
# ```
#
# Parameters
#
#  main_source (required)
#    The .py file that will be interpreted.
#    Type: path
#
#  sources (optional)
#    Other files that are used in the test.
#    Type: list(path)
#    Default: empty list
#
#  libraries (optional)
#    Paths to python_libraries this test imports.
#    Type: list(string)
#    Default: empty list
#
#  test_dir (optional)
#    Path to where the test executes.
#    Type: string
#    Default: "${target_out_dir}/${target_name}"
#
#  extra_args (optional)
#    Additional arguments to pass to the test.
#    Type: list(string)
#
#  main_callable (optional)
#    Main callable, which serves as the entry point of the output zip archive.
#    In the example above, this is "my_module.main".
#    Type: string
#    Default: unittest.main
#
#  timeout_secs (optional)
#    The infra timeout in seconds for the test.
#    Type: int
#    Default: 300
#
#  enable_mypy (optional)
#    If true, enable MyPy type checking on the target and respective deps.
#    Type: boolean
#    Default: true
#
#  test_data_deps (optional)
#    The dependencies used only at runtime for this test.
#
#  package_deps (optional)
#    List of `fuchsia_package` labels that are needed at runtime. These are forwarded
#    to the host_test() template which forwards it to the test_spec() template and may
#    also need to be included in the build graph separately in universe to be included
#    in the package repo because the package repo doesn't depend on tests that are
#    included in host_labels.
#    Type: list(string)
#    Default: empty list
#
#  list_cases_argument (optional)
#    Argument to pass to the host python unittest binary to list test cases.
#    Type: string
#    Default: "list_host_python_unittests"
#
#  data_sources (optional)
#    See build/python/python_binary.gni
#
#  data_package_name (required if |data_sources| is provided, else optional)
#    See build/python/python_binary.gni
#
#  deps
#  environments
#  visibility
template("python_host_test") {
  assert(defined(invoker.main_source), "main_source is required")
  _python_binary_name = "${target_name}.pyz"
  _python_binary_target = "${target_name}_python_binary"

  _enable_mypy = true
  if (defined(invoker.enable_mypy)) {
    _enable_mypy = invoker.enable_mypy
  }

  python_binary(_python_binary_target) {
    forward_variables_from(invoker,
                           [
                             "main_source",
                             "sources",
                             "deps",
                             "data_sources",
                             "data_package_name",
                           ])

    testonly = true
    visibility = [ ":*" ]
    enable_mypy = _enable_mypy
    output_name = _python_binary_name
    main_callable = "unittest.main"
    if (defined(invoker.main_callable)) {
      main_callable = invoker.main_callable
    }

    if (!defined(deps)) {
      deps = []
    }
    if (defined(invoker.libraries)) {
      deps += invoker.libraries
    }
  }

  _test_dir = "${target_out_dir}/${target_name}"
  if (defined(invoker.test_dir)) {
    _test_dir = invoker.test_dir
  }

  _host_test_data_target = "${target_name}_test_data"
  _test_lister_target_label =
      "//scripts/fxtest/list_host_test:list_host_python_unittests_data"
  _test_lister_target_out_dir =
      get_label_info(_test_lister_target_label, "target_out_dir")
  host_test_data(_host_test_data_target) {
    testonly = true
    visibility = [ ":*" ]

    sources = [ get_label_info(":${_python_binary_target}", "target_out_dir") +
                "/${_python_binary_name}" ]
    outputs = [ "${_test_dir}/${_python_binary_name}" ]
    deps = [
      ":${_python_binary_target}",
      _test_lister_target_label,
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
    if (!defined(data_deps)) {
      data_deps = []
    }
    if (defined(invoker.test_data_deps)) {
      data_deps += invoker.test_data_deps
    }
    if (defined(invoker.libraries)) {
      data_deps += invoker.libraries
    }
  }

  _list_cases_argument = "list_host_python_unittests"
  if (defined(invoker.list_cases_argument)) {
    _list_cases_argument = invoker.list_cases_argument
  }

  host_test(target_name) {
    forward_variables_from(invoker,
                           [
                             "environments",
                             "metadata",
                             "package_deps",
                             "visibility",
                             "timeout_secs",
                             "isolated",
                             "expects_ssh",
                           ])

    list_cases_argument = _list_cases_argument

    binary_path = python_exe_src
    args = [
      "test_lister_path=" + rebase_path(
              "${_test_lister_target_out_dir}/test_data/list_host_python_unittests.pyz",
              root_build_dir),
      rebase_path("${_test_dir}/${_python_binary_name}", root_build_dir),
    ]
    if (defined(invoker.extra_args)) {
      args += invoker.extra_args
    }
    deps = [
      ":${_host_test_data_target}",
      "//build/python:interpreter",
    ]
  }
}
