# 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")

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 = [ ":*" ]

    if (target_cpu == "arm64") {
      kernel_binary = "qemu-boot-shim.bin"
      deps = [ "//zircon/kernel/target/arm64/boot-shim:qemu" ]
    } else if (target_cpu == "x64") {
      kernel_binary = "multiboot.bin"
      deps = [ "//zircon/kernel/arch/x86/phys/boot-shim:multiboot-shim" ]
    } else {
      assert(false, "CPU not supported")
    }

    sources = [ "$root_build_dir/$kernel_binary" ]
  }

  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") {
    gopackages = [ "go.fuchsia.dev/fuchsia/tools/emulator" ]
    deps = [ ":emulator" ]
  }
}
