# Copyright 2019 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

import("$dir_pw_build/pw_executable.gni")
import("$dir_pw_build/python_script.gni")

# Creates an executable target for a unit test.
#
# If the pw_automatic_test_runner variable is set, this template also creates a
# "${test_name}_run" target which runs the unit test executable after building
# it.
#
# This template accepts all of the regular "executable" target args.
template("pw_test") {
  # This is required in order to reference the pw_test template's target name
  # within the test_metadata of the metadata group below. The group() definition
  # creates a new scope where the "target_name" variable is set to its target,
  # shadowing the one in this scope.
  _test_target_name = target_name

  pw_executable(_test_target_name) {
    # Metadata for this test when used as part of a pw_test_group target.
    metadata = {
      tests = [
        {
          type = "test"
          test_name = _test_target_name
          test_directory = rebase_path(target_out_dir, root_build_dir)
        },
      ]
    }

    forward_variables_from(invoker, "*", [ "metadata" ])

    if (!defined(deps)) {
      deps = []
    }
    deps += [ pw_unit_test_main ]
  }

  if (pw_automatic_test_runner != "") {
    # When the automatic runner is set, create an action which runs the unit
    # test executable using the test runner script.
    _run_action_name = _test_target_name + "_run"

    pw_python_script(_run_action_name) {
      deps = [ ":$_test_target_name" ]
      inputs = [ pw_automatic_test_runner ]
      script = "$dir_pw_unit_test/py/pw_unit_test/test_runner.py"
      args = [
        "--runner",
        pw_automatic_test_runner,
        "--test",
        get_path_info("$target_out_dir:$_test_target_name", "abspath"),
      ]
      stamp = true
    }
  }
}

# Defines a related collection of unit tests.
#
# pw_test_group targets output a JSON metadata file for the Pigweed test runner.
#
# Args:
#  tests: List of pw_test targets for each of the tests in the group.
#  group_deps: Optional pw_test_group targets on which this group depends.
template("pw_test_group") {
  _group_target = target_name
  _group_deps_metadata = []
  if (defined(invoker.tests)) {
    _deps = invoker.tests
  } else {
    _deps = []
  }

  if (defined(invoker.group_deps)) {
    # If the group specified any other group dependencies, create a metadata
    # entry for each of them indicating that they are another group and a group
    # target to collect that metadata.
    foreach(dep, invoker.group_deps) {
      _group_deps_metadata += [
        {
          type = "dep"
          group = get_path_info(dep, "abspath")
        },
      ]
    }

    _deps += invoker.group_deps
  }

  _metadata_group_target = "${target_name}_pw_test_group_metadata"
  group(_metadata_group_target) {
    metadata = {
      group_deps = _group_deps_metadata
      self = [
        {
          type = "self"
          name = get_path_info(":$_group_target", "abspath")
        },
      ]

      # Metadata from the group's own unit test targets is forwarded through
      # the group dependencies group. This entry is listed as a "walk_key" in
      # the generated file so that only test targets' metadata (not group
      # targets) appear in the output.
      if (defined(invoker.tests)) {
        propagate_metadata_from = invoker.tests
      }
    }
    deps = _deps
  }

  _test_group_deps = [ ":$_metadata_group_target" ]

  generated_file(_group_target) {
    outputs = [ "$target_out_dir/$target_name.testinfo.json" ]
    data_keys = [
      "group_deps",
      "self",
      "tests",
    ]
    walk_keys = [ "propagate_metadata_from" ]
    output_conversion = "json"
    deps = _test_group_deps
  }

  # If automatic test running is enabled, create a *_run group that collects all
  # of the individual *_run targets and groups.
  if (pw_automatic_test_runner != "") {
    group(_group_target + "_run") {
      deps = [ ":$_group_target" ]
      foreach(_target, _deps) {
        deps += [ "${_target}_run" ]
      }
    }
  }
}
