# Copyright 2021 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/fidl/toolchain.gni")
import("//build/python/python_host_test.gni")

group("tests") {
  testonly = true
  deps = [ ":analyze_deps_test($host_toolchain)" ]
}

python_host_test("analyze_deps_test") {
  main_source = "analyze_deps_test.py"

  sources = [ "analyze_deps.py" ]
}

_all_libraries_deps = [
  "ddk.hw.physiter",
  "ddk.hw.wlan.ieee80211",
  "ddk.hw.wlan.wlaninfo",
  "fuchsia.hardware.audio",
  "fuchsia.hardware.audiotypes",
  "fuchsia.hardware.badblock",
  "fuchsia.hardware.block",
  "fuchsia.hardware.block.partition",
  "fuchsia.hardware.block.volume",
  "fuchsia.hardware.bt.gattsvc",
  "fuchsia.hardware.bt.hci",
  "fuchsia.hardware.bt.vendor",
  "fuchsia.hardware.buttons",
  "fuchsia.hardware.clockimpl",
  "fuchsia.hardware.display.capture",
  "fuchsia.hardware.display.clamprgb",
  "fuchsia.hardware.display.controller",
  "fuchsia.hardware.dotmatrixdisplay",
  "fuchsia.hardware.dsi",
  "fuchsia.hardware.dsiimpl",
  "fuchsia.hardware.ethernet",
  "fuchsia.hardware.ethernet.board",
  "fuchsia.hardware.ethernet.mac",
  "fuchsia.hardware.goldfish.addressspace",
  "fuchsia.hardware.goldfish.control",
  "fuchsia.hardware.goldfish.pipe",
  "fuchsia.hardware.goldfish.sync",
  "fuchsia.hardware.gpu.mali",
  "fuchsia.hardware.hidbus",
  "fuchsia.hardware.hiddevice",
  "fuchsia.hardware.i2c",
  "fuchsia.hardware.i2cimpl",
  "fuchsia.hardware.intelgpucore",
  "fuchsia.hardware.intelhda.codec",
  "fuchsia.hardware.iommu",
  "fuchsia.hardware.mailbox",
  "fuchsia.hardware.nand",
  "fuchsia.hardware.nandinfo",
  "fuchsia.hardware.network.device",
  "fuchsia.hardware.network.mac",
  "fuchsia.hardware.pci",
  "fuchsia.hardware.pciroot",
  "fuchsia.hardware.power",
  "fuchsia.hardware.powerimpl",
  "fuchsia.hardware.pwm",
  "fuchsia.hardware.rawnand",
  "fuchsia.hardware.rpmb",
  "fuchsia.hardware.scpi",
  "fuchsia.hardware.sdhci",
  "fuchsia.hardware.sdio",
  "fuchsia.hardware.sdmmc",
  "fuchsia.hardware.serial",
  "fuchsia.hardware.serialimpl",
  "fuchsia.hardware.serialimpl.async",
  "fuchsia.hardware.shareddma",
  "fuchsia.hardware.spiimpl",
  "fuchsia.hardware.syscalls.pci",
  "fuchsia.hardware.tee",
  "fuchsia.hardware.test",
  "fuchsia.hardware.thermal",
  "fuchsia.hardware.usb",
  "fuchsia.hardware.usb.bus",
  "fuchsia.hardware.usb.composite",
  "fuchsia.hardware.usb.dci",
  "fuchsia.hardware.usb.function",
  "fuchsia.hardware.usb.hci",
  "fuchsia.hardware.usb.hub",
  "fuchsia.hardware.usb.hubdescriptor",
  "fuchsia.hardware.usb.modeswitch",
  "fuchsia.hardware.usb.phy",
  "fuchsia.hardware.usb.request",
  "fuchsia.hardware.vreg",
  "fuchsia.hardware.wlan.info",
  "fuchsia.hardware.wlan.mac",
  "fuchsia.hardware.wlanif",
  "fuchsia.hardware.wlanphy",
]

# This target only exists to support the `analyze_deps.py` script. It is
# currently not connected to the build graph.
group("banjo") {
  deps = _all_libraries_deps
}

# Verify that the libraries are valid FIDL libraries.
_fidl_translated_deps = _all_libraries_deps

# Remove libraries that have not been vetted yet.
_fidl_translated_deps -= [
  "fuchsia.hardware.usb",  # Blocked by zircon.hw.usb.
  "fuchsia.hardware.usb.bus",  # Blocked by zircon.hw.usb.
  "fuchsia.hardware.usb.composite",  # Blocked by zircon.hw.usb.
  "fuchsia.hardware.usb.dci",  # Blocked by zircon.hw.usb.
  "fuchsia.hardware.usb.function",  # Blocked by zircon.hw.usb.
  "fuchsia.hardware.usb.hci",  # Blocked by zircon.hw.usb.
  "fuchsia.hardware.usb.request",  # Blocked by zircon.hw.usb.
]

# Verify that the Rust bindings generated by fidlgen_banjo for these libraries are
# identical to the ones generated by banjo.
_rust_translated_deps = [
  "ddk.hw.wlan.ieee80211",
  "ddk.hw.wlan.wlaninfo",
  "fuchsia.hardware.wlan.info",

  # "fuchsia.hardware.wlan.mac",  # Not FIDL-compliant yet.
]

# Verify that the C++ mock bindings generated by fidlgen_banjo for these libraries are
# identical to the ones generated by banjo.
_cpp_mock_translated_deps = [
  "fuchsia.hardware.pci",
  "fuchsia.hardware.power",
  "fuchsia.hardware.pwm",
  "fuchsia.hardware.scpi",
  "fuchsia.hardware.sdhci",
  "fuchsia.hardware.sdio",
  "fuchsia.hardware.shareddma",
  "fuchsia.hardware.vreg",
]

group("translated") {
  testonly = true
  deps = []
  foreach(library, _fidl_translated_deps) {
    deps += [
      "$library:${library}.fidl($fidl_toolchain)",
      "$library:${library}_banjo_c",
      "$library:${library}_banjo_cpp",
    ]
  }
  foreach(library, _rust_translated_deps) {
    deps += [ "$library:${library}_banjo_rust" ]
  }
  foreach(library, _cpp_mock_translated_deps) {
    deps += [ "$library:${library}_banjo_cpp_mock" ]
  }
}
