# 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/images/vbmeta.gni")
import("//build/testing/test_spec.gni")
import("//build/testing/zbi_test_success.gni")
import("//build/zbi/zbi.gni")
import("//build/zbi/zbi_input.gni")

declare_args() {
  # Set this variable to true to include zbi_tests into tests.json.
  include_zbi_host_tests = false
}

# Composes a host test to check for the success of the zbi tests.
#
# The test target is constructed differently based on whether it is run against
# hardware or an emulator, so the template needs to be called with device_types
# that are either only hardware or only emulators.
#
# Parameters
#
#   is_emu
#     [bool] Whether the device_types provided are all emulator types. If false,
#     all device_types are expected to be hardware.
#
#   device_types
#     [list of strings] Devices the test should run on.
#     Allowable values are those among the entries in
#     //build/testing/platforms.gni; others will be ignored.
#
#   zbi_image, vbmeta_image, qemu_kernel
#     Passed through to the environments of the associated test_spec.
#     See //build/testing/test_spec.gni.
#
template("zbi_host_test") {
  forward_variables_from(invoker, [ "is_emu" ])
  toolchain = host_toolchain
  os = host_os
  cpu = host_cpu
  if (is_emu) {
    toolchain = host_toolchain_for_target_cpu
    os = host_os
    cpu = target_cpu
  }

  # Create a script to run the seriallistener tool with the appropriate args.
  _script_file = "${target_out_dir}/${target_name}.sh"
  _test_script_target = "${target_name}_script"

  action(_test_script_target) {
    testonly = true
    script = "//build/testing/create_test.sh"
    binary_path = get_label_info("//tools/testing/seriallistener($toolchain)",
                                 "root_out_dir") + "/seriallistener"
    args = [
      rebase_path(_script_file, root_build_dir),
      rebase_path(binary_path, root_build_dir),
    ]
    args += [
      "-success-str",
      zbi_test_success_string,
    ]
    if (!is_emu) {
      args += [ "-stdout=True" ]
    }

    outputs = [ "${_script_file}" ]
    visibility = [ ":*" ]

    deps = [ "//tools/testing/seriallistener($toolchain)" ]
    metadata = {
      test_runtime_deps = [
        _script_file,
        binary_path,
      ]
    }
  }

  test_spec(target_name) {
    target = get_label_info(":${target_name}", "label_with_toolchain")
    path = _script_file
    os = os
    cpu = cpu
    isolated = true

    # Default timeout for zbi tests is 10 minutes.
    # TODO(ihuh): Once we have more data, we can override this with a more
    # sensible timeout for each test.
    timeout_secs = 600
    forward_variables_from(invoker, [ "visibility" ])

    deps = [ ":${_test_script_target}" ]

    environments = []
    if (defined(invoker.device_types)) {
      foreach(dt, invoker.device_types) {
        environments += [
          {
            dimensions = {
              device_type = dt
            }
            image_overrides = {
              zbi_image = {
                name = invoker.zbi_image
              }
              if (!is_emu && defined(invoker.vbmeta_image)) {
                vbmeta_image = {
                  name = invoker.vbmeta_image
                }
              }
              if (is_emu) {
                if (defined(invoker.qemu_kernel)) {
                  qemu_kernel = {
                    label = get_label_info(invoker.qemu_kernel,
                                           "label_with_toolchain")
                  }
                } else {  # If qemu_kernel is not provided, use the default.
                  qemu_kernel = {
                    name = "qemu-kernel"
                  }
                }
              }
            }
          },
        ]
      }
    }
  }
}

# Composes a test zbi out of Zircon artifacts.
#
# The $target_name target is a group() that holds the metadata and is what
# should be used in deps.  The actual zbi() target is defined as
# "$target_name.zbi" so that e.g. get_target_outputs(":$target_name.zbi")
# can be used.
#
# If `use_vbmeta` is true, an associated VBMeta image (of the same base name)
# will be output alongside the ZBI.
#
# Parameters
#
#   args (optional)
#     [list of strings] Command line arguments for the resulting zbi. ZBI tests
#     using the kernel and a non-default `userboot.next` options must add
#     `userboot.{shutdown,reboot}` as well in order to guarantee that a success
#     string is printed. See //zircon/system/utest/core:core-tests for a
#     canonical example.
#
#   device_types
#     [list of strings] Devices the test should run on.
#     Allowable values are those among the entries in
#     //build/testing/platforms.gni; others will be ignored.
#     Defaults to [ "QEMU" ].
#
#   qemu_kernel
#     [label_with_toolchain] Label corresponding to the qemu-kernel image
#     in images.json that should be used with the zbi_image. This will appear
#     as the qemu_kernel_label in a zbi_tests.json entry.
#
#   deps, data_deps, replace, complete, compress
#     See //build/zbi/zbi.gni.
template("zbi_test") {
  main_target = target_name
  zbi_target = "${target_name}.zbi"

  not_needed(invoker,
             [
               "qemu_kernel",
               "timeout",
             ])

  input_deps = []
  group_deps = []

  entries = []
  if (defined(invoker.args)) {
    entries += invoker.args
  }

  if (entries != []) {
    input_target = "${target_name}_input"
    input_deps += [ ":$input_target" ]

    zbi_input(input_target) {
      forward_variables_from(invoker, [ "deps" ])
      testonly = true
      type = "cmdline"
      args = []
      foreach(entry, entries) {
        args += [ "--entry=$entry" ]
      }
    }
  }

  forward_variables_from(invoker, [ "output_name" ])
  if (!defined(output_name)) {
    output_name = main_target
  }

  zbi(zbi_target) {
    testonly = true
    data_deps = []
    forward_variables_from(invoker,
                           [
                             "cpu",
                             "compress",
                             "data_deps",
                             "output_dir",
                             "output_extension",
                             "visibility",
                           ])
    if (defined(visibility)) {
      visibility += [ ":$main_target" ]
    }

    deps = invoker.deps + input_deps
    if (defined(invoker.qemu_kernel)) {
      data_deps += [ invoker.qemu_kernel ]
    }

    _output_dir = target_out_dir
    if (defined(output_dir)) {
      _output_dir = output_dir
    }
    _output_extension = "zbi"
    if (defined(output_extension)) {
      _output_extension = output_extension
    }
    _output_file = "${_output_dir}/${output_name}"
    if (_output_extension != "") {
      _output_file += ".${_output_extension}"
    }

    metadata = {
      images = [
        {
          label = get_label_info(":$zbi_target", "label_with_toolchain")
          name = output_name
          path = rebase_path(_output_file, root_build_dir)
          type = "zbi"
          cpu = current_cpu
          compressed =
              !defined(invoker.compressed) ||
              (invoker.compressed != false && invoker.compressed != "none")
          if (defined(testonly) && testonly) {
            testonly = true
          }
          forward_variables_from(invoker, [ "tags" ])
        },
      ]
    }
  }

  group_deps += [ ":$zbi_target" ]

  output_zbi = target_name
  if (defined(invoker.output_name)) {
    output_zbi = invoker.output_name
  }
  if (defined(invoker.output_extension)) {
    if (invoker.output_extension != "") {
      output_zbi += ".${invoker.output_extension}"
    }
  } else {
    output_zbi += ".zbi"
  }
  if (defined(invoker.output_dir)) {
    output_zbi = "${invoker.output_dir}/$output_zbi"
  } else {
    output_zbi = "$target_out_dir/$output_zbi"
  }

  if (defined(invoker.device_types)) {
    _device_types = invoker.device_types
  } else {
    _device_types = [
      "AEMU",
      "QEMU",
    ]
  }

  if (use_vbmeta) {
    vbmeta_target = "${target_name}.vbmeta"
    vbmeta(vbmeta_target) {
      forward_variables_from(invoker, [ "visibility" ])
      testonly = true
      zbi = ":$zbi_target"
    }

    vbmeta_outputs = get_target_outputs(":${vbmeta_target}")
    output_vbmeta = vbmeta_outputs[0]

    group_deps += [ ":${vbmeta_target}" ]
  }

  if (include_zbi_host_tests) {
    emu_types = []
    hardware_types = []
    foreach(dt, _device_types) {
      if (dt == "QEMU" || dt == "AEMU") {
        emu_types += [ dt ]
      } else {
        hardware_types += [ dt ]
      }
    }
    host_test_name = "${main_target}_host_test"
    if (emu_types != []) {
      zbi_host_test(host_test_name) {
        is_emu = true
        zbi_image = output_name
        if (defined(invoker.qemu_kernel)) {
          qemu_kernel = invoker.qemu_kernel
        }
        device_types = emu_types
      }
      group_deps += [ ":$host_test_name" ]
    }
    if (hardware_types != []) {
      host_test_hw_name = "${host_test_name}_for_hardware"
      zbi_host_test(host_test_hw_name) {
        is_emu = false
        zbi_image = output_name
        if (use_vbmeta) {
          vbmeta_image = vbmeta_target
        }
        device_types = hardware_types
      }
      group_deps += [ ":$host_test_hw_name" ]
    }
  }

  group(main_target) {
    forward_variables_from(invoker,
                           [
                             "assert_no_deps",
                             "visibility",
                           ])

    testonly = true

    public_deps = group_deps

    metadata = {
      # Used by the zbi() template to ensure that this is not included into
      # any ZBI that depends on this target.
      zbi_input_barrier = []

      # Used by build_api_module("zbi_tests") in //BUILD.gn
      zbi_tests = [
        {
          cpu = current_cpu
          disabled = defined(invoker.tags) && invoker.tags + [ "disabled" ] -
                                              [ "disabled" ] != invoker.tags
          name = main_target
          label = get_label_info(":$target_name", "label_with_toolchain")
          path = rebase_path(output_zbi, root_build_dir)
          if (use_vbmeta) {
            vbmeta = rebase_path(output_vbmeta, root_build_dir)
          }
          bootserver_netboot = [ "--boot" ]
          success_string = zbi_test_success_string
          device_types = _device_types
          if (defined(invoker.qemu_kernel)) {
            assert(device_types == [ "QEMU" ],
                   "`qemu_kernel` tests can only run on QEMU")
            qemu_kernel_label =
                get_label_info(invoker.qemu_kernel, "label_with_toolchain")
          }
          if (defined(invoker.timeout) && invoker.timeout != false) {
            timeout = invoker.timeout
          }
        },
      ]
    }
  }
}
