# 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.gni")
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",
#   ]
#   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: "${root_out_dir}/test_data/${target_dir}"
#
#  extra_args (optional)
#    Additional arguments to pass to the test.
#    Type: list(string)
#
#   deps
#   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"
  python_binary(_python_binary_target) {
    forward_variables_from(invoker,
                           [
                             "main_source",
                             "sources",
                           ])

    testonly = true
    visibility = [ ":*" ]

    output_name = _python_binary_name
    main_callable = "unittest.main"

    if (defined(invoker.libraries)) {
      deps = invoker.libraries
    }
  }

  _target_dir = get_label_info(target_name, "dir")
  _test_dir = "${root_out_dir}/test_data/${_target_dir}"
  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
    }
  }

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

    binary_path = python_exe_path
    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",
    ]
  }
}
