# Copyright 2019 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/go/go_library.gni")
import("//build/go/go_test.gni")
import("//build/testing/host_test_data.gni")
import("//zircon/kernel/phys/qemu.gni")

group("tests") {
  testonly = true
  deps = []
  if (host_os == "linux") {
    deps = [ ":emulator_tests($host_toolchain)" ]
  }
}

# Currently, we only support working with QEMU or FEMU on Linux.
if (is_linux) {
  # The infrastructure does not provide a way for host tests to access
  # qemu, so we need to archive our own copy of qemu from the source
  # tree.
  action("archive-qemu") {
    testonly = true
    visibility = [ ":*" ]

    archive_path = "$root_out_dir/test_data/emulator/qemu.tar.gz"
    outputs = [ archive_path ]

    depfile = "${archive_path}.d"

    script = "archive.py"

    args = [
      "--src",
      rebase_path("//prebuilt/third_party/qemu/${host_platform}",
                  root_build_dir),
      "--dst",
      rebase_path(archive_path, root_build_dir),
      "--depfile",
      rebase_path(depfile, root_build_dir),
    ]
  }

  action("archive-femu") {
    testonly = true
    visibility = [ ":*" ]

    archive_path = "$root_out_dir/test_data/emulator/femu.tar.gz"
    outputs = [ archive_path ]

    depfile = "${archive_path}.d"

    script = "archive.py"

    args = [
      "--src",
      rebase_path(
          "//prebuilt/third_party/android/aemu/release/${host_platform}",
          root_build_dir),
      "--dst",
      rebase_path(archive_path, root_build_dir),
      "--depfile",
      rebase_path(depfile, root_build_dir),
    ]
  }

  host_test_data("kernel") {
    visibility = [ ":*" ]

    deps = qemu_boot_shim.deps
    sources = [ qemu_boot_shim.path ]
  }

  generated_file("buildinfo.ini") {
    testonly = true
    contents = [
      # The path to images.json relative to the test data directory. This must be relative
      # the test data directory specifically, rather than the build directory because the
      # build directory is not guaranteed to exist at runtime, especially on CI.
      "image_manifest_path=" + rebase_path("$root_build_dir/images.json",
                                           "$root_out_dir/test_data/emulator"),
      "target_cpu=$target_cpu",
    ]
    outputs = [ "$root_out_dir/test_data/emulator/buildinfo.ini" ]
  }

  host_test_data("test_data") {
    sources = get_target_outputs(":buildinfo.ini") +
              get_target_outputs(":archive-qemu") +
              get_target_outputs(":archive-femu") +
              [
                # Any files referenced by :buildinfo.ini should be listed here.
                "$root_build_dir/images.json",
              ]

    deps = [
      ":archive-femu",
      ":archive-qemu",
      ":buildinfo.ini",
      ":kernel",
    ]
  }

  go_library("emulator") {
    testonly = true
    non_go_deps = [
      ":archive-femu",
      ":archive-qemu",
      ":test_data",
    ]
    sources = [
      "emulator.go",
      "emulator_test.go",
    ]
    deps = [
      "//tools/qemu",
      "//tools/virtual_device",
      "//tools/virtual_device:proto",
    ]
  }

  go_test("emulator_tests") {
    library = ":emulator"
  }
}
