# 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.
#
#  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",
                           ])

    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"
  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}" ]
    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
    }
  }

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

    binary_path = python_exe_src
    args =
        [ 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",
    ]
  }
}
