# 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("$zx/public/gn/config/standard.gni")
import("$zx/public/gn/toolchain/environment_redirect.gni")
import("$zx/public/gn/zbi.gni")

if (current_cpu != "") {
  group("utest") {
    testonly = true

    # For unittests, the recommended naming scheme is:
    #   path/to/code/test
    # or
    #   path/to/code:test
    #
    # Where "test" is a group containing all unittest labels.
    deps = [
      ":host",  # TODO(mcgrathr): reach this differently?
      "$zx/system/core/bootsvc/test",
      "$zx/system/core/console:console-test",
      "$zx/system/core/devmgr/fshost:block-watcher-test",
      "$zx/system/core/devmgr/fshost:fshost-metrics-test",
      "$zx/system/core/devmgr/fshost:fshost-test",
      "$zx/system/core/netsvc:netsvc-stress-test",
      "$zx/system/core/netsvc:netsvc-test",
      "$zx/system/core/ptysvc:ptysvc-test",
      "$zx/system/core/svchost:crashsvc-test",
      "$zx/system/dev/audio/codecs/max98373:max98373-test",
      "$zx/system/dev/audio/codecs/tas5782:tas5782-test",
      "$zx/system/dev/audio/codecs/tas5805:tas5805-test",
      "$zx/system/dev/audio/intel-hda:test",
      "$zx/system/dev/audio/lib/simple-audio-stream:sa-unittest",
      "$zx/system/dev/block/ftl/test",
      "$zx/system/dev/board/mt8167s_ref:mt8167s_ref-test",
      "$zx/system/dev/bus/pci:pci-driver",
      "$zx/system/dev/bus/pci:pci-unit",
      "$zx/system/dev/bus/virtio:virtio-test",
      "$zx/system/dev/cpu/aml-cpu:aml-cpu-test",
      "$zx/system/dev/display/aml-canvas:aml-canvas-test",
      "$zx/system/dev/display/astro-display:astro-display-test",
      "$zx/system/dev/display/display/test",
      "$zx/system/dev/display/goldfish-display:tests",
      "$zx/system/dev/display/hikey-display:hikey-display-test",
      "$zx/system/dev/display/mt8167s-display:tests",
      "$zx/system/dev/display/vim-display:vim-display-test",
      "$zx/system/dev/lib/as370:audio-dsp-test",
      "$zx/system/dev/lib/as370:syn-audio-in-test",
      "$zx/system/dev/lib/device-protocol-pci:device-protocol-pci-test",
      "$zx/system/dev/lib/device-protocol-pdev:device-protocol-pdev-test",
      "$zx/system/dev/lib/dma-buffer:dma-buffer-test",
      "$zx/system/dev/lib/fake-mmio-reg:fake-mmio-reg-test",
      "$zx/system/dev/lib/fake-object/test:fake-object",
      "$zx/system/dev/lib/fake-resource/test:fake-resource",
      "$zx/system/dev/lib/mock-mmio-reg:mock-mmio-reg-test",
      "$zx/system/dev/lib/mt8167:mt8167-audio-lib-test",
      "$zx/system/dev/lib/new-mock-mmio-reg:new-mock-mmio-reg-test",
      "$zx/system/dev/lib/scsi:scsilib-disk-test",
      "$zx/system/dev/light-sensor/lite-on:ltr-578als-test",
      "$zx/system/dev/pwm/aml-pwm:aml-pwm-test",
      "$zx/system/dev/pwm/aml-pwm-init:aml-pwm-init-test",
      "$zx/system/dev/pwm/pwm:pwm-test",
      "$zx/system/dev/shareddma/syn-dma:syn-dhub-test",
      "$zx/system/dev/sysmem/sysmem:sysmem-unittest",
      "$zx/system/dev/test",
      "$zx/system/dev/usb/xhci-rewrite:xhci-unittest",
      "$zx/system/uapp/disk-pave:install-disk-image-test",
      "$zx/system/ulib/abs_clock:test",
      "$zx/system/ulib/affine/test",
      "$zx/system/ulib/bitmap/test",
      "$zx/system/ulib/blobfs/test",
      "$zx/system/ulib/bootfs:bootfs-parser-fuzzer",
      "$zx/system/ulib/bootfs:bootfs-test",
      "$zx/system/ulib/c/test",
      "$zx/system/ulib/cobalt-client/test",
      "$zx/system/ulib/ddk:ddk-unittest",
      "$zx/system/ulib/disk_inspector/test",
      "$zx/system/ulib/elf-search/test",
      "$zx/system/ulib/elfload/test",
      "$zx/system/ulib/fdio/test",
      "$zx/system/ulib/fdio-caller/test",
      "$zx/system/ulib/ffl/test",
      "$zx/system/ulib/fidl-async/test:fidl-async-test",
      "$zx/system/ulib/fs:test",
      "$zx/system/ulib/fs-pty/test",
      "$zx/system/ulib/ftl:test",
      "$zx/system/ulib/fvm/test",
      "$zx/system/ulib/gfx/test",
      "$zx/system/ulib/hermetic-compute/test",
      "$zx/system/ulib/hermetic-decompressor/test",
      "$zx/system/ulib/intel-hda:test",
      "$zx/system/ulib/io-scheduler:io-scheduler-test",
      "$zx/system/ulib/kernel-mexec:kernel-mexec-test",
      "$zx/system/ulib/lazy_init:lazy_init-test",
      "$zx/system/ulib/ldmsg/test",
      "$zx/system/ulib/lockdep:test",
      "$zx/system/ulib/minfs/test",
      "$zx/system/ulib/mipi-dsi:mipidsi",
      "$zx/system/ulib/paver:paver-test",
      "$zx/system/ulib/pretty:pretty-test",
      "$zx/system/ulib/refcount:test",
      "$zx/system/ulib/runtests-utils/test",
      "$zx/system/ulib/smbios:smbios-test",
      "$zx/system/ulib/storage:test",
      "$zx/system/ulib/sysconfig-client:tests",
      "$zx/system/ulib/tftp:tftp-fuzzer",
      "$zx/system/ulib/tftp:tftp-test",
      "$zx/system/ulib/trace-engine:tests",
      "$zx/system/ulib/trace-provider:tests",
      "$zx/system/ulib/trace-reader:tests",
      "$zx/system/ulib/trace-vthread:tests",
      "$zx/system/ulib/utf_conversion/test",
      "$zx/system/ulib/zbi-bootfs:test",
      "$zx/system/ulib/zircon-crypto/test",
      "$zx/system/ulib/zxtest/test",
      "$zx/third_party/ulib/backtrace:test",
      "$zx/third_party/ulib/linenoise:test",
      "$zx/third_party/ulib/lz4:test",
      "abi-type-validator",
      "blobfs-bench",
      "channel-fatal",
      "core",
      "devcoordinator-namespace",
      "dlfcn",
      "fidl",
      "fidl-coding-tables",
      "fidl-llcpp-interop",
      "fidl-simple",
      "fidl-utils",
      "fit",
      "fs-test-utils",
      "fvm",
      "kcounter",
      "kernel-cmdline:test",
      "log",
      "logger",
      "mexec",
      "noop-fuzzer",
      "platform-bus",
      "policy",
      "service:test",
      "stdio",
      "timers",
      "trace",
      "utc-procargs",
      "util",
      "zxcrypt",

      # disabled for now:
      #"bad-kernel-access",

      # TODO(fuzztest): "edid"
    ]
    if (current_cpu == "x64") {
      deps += [
        "$zx/system/dev/board/x86:x86-battery-test",
        "$zx/system/dev/board/x86:x86-board-test",
        "$zx/system/dev/board/x86:x86-lid-test",
        "$zx/system/dev/board/x86:x86-pwrsrc-test",
        "$zx/system/dev/board/x86:x86-thermal-test",
        "$zx/system/dev/display/intel-i915:intel-i915-test",
        "x86-umip",
      ]
    }
  }

  # This plus a kernel in deps makes a tiny zbi() that just runs core-tests.
  zbi_input("core-tests") {
    testonly = true
    type = "cmdline"
    args = [
      "--entry=userboot=bin/core-tests",
      "--entry=userboot.shutdown",
    ]
    deps = [ "$zx/system/utest/core:core-tests" ]
  }

  group("host-tests") {
    testonly = true
    deps = [
      "$zx/system/ulib/blobfs/test:blobfs-host",
      "$zx/system/ulib/ffl/test",
      "$zx/system/ulib/fvm/test",
      "$zx/system/ulib/minfs/test:minfs-host",
      "$zx/system/ulib/trace-reader:tests",
      "$zx/system/ulib/zxtest/test",
      "$zx/tools/kazoo:tests",
      "cmdline",
      "fidl",
      "fidl-compiler",
      "fit",
      "fs-host",
      "fvm-host",
      "util",
    ]
    if (current_os == "linux") {
      deps += [
        "$zx/system/dev/usb/usb-peripheral-test",
        "$zx/system/ulib/ftl-mtd/test",
        "ftl-mtd",
        "mtd",
        "nand-redundant-storage",
      ]
    }
  }
}

# Build the host tests for each host.
foreach(host, standard_build_hosts) {
  environment_redirect("host-tests-${host.os}-${host.cpu}") {
    testonly = true
    environment_label = "$zx/public/gn/toolchain:host"
    cpu = host.cpu
    os = host.os
    direct = true
    deps = [ ":host-tests" ]
  }
}

group("host-tests-all-platforms") {
  testonly = true
  deps = []
  foreach(host, standard_build_hosts) {
    deps += [ ":host-tests-${host.os}-${host.cpu}" ]
  }
}

group("host") {
  testonly = true
  deps = [ ":host-tests-${host_os}-${host_cpu}" ]
}
