# 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.amlogiccanvas",
  "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.camera",
  "fuchsia.hardware.camera.sensor",
  "fuchsia.hardware.camerahwaccel",
  "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.gdc",
  "fuchsia.hardware.ge2d",
  "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.isp",
  "fuchsia.hardware.mailbox",
  "fuchsia.hardware.mipicsi",
  "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.registers",
  "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",
  "fuchsia.hardware.wlanphyimpl",
  "fuchsia.sysmem",
  "zircon.hw.pci",
]

# 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 -= [
  "ddk.hw.wlan.wlaninfo",  # Identifiers starting with a digit.
  "fuchsia.hardware.audiotypes",  # Identifiers starting with a digit.
  "fuchsia.hardware.display.controller",  # Blocked by
                                          # fuchsia.hardware.audiotypes.
  "fuchsia.hardware.gdc",  # Blocked by fuchsia.sysmem.
  "fuchsia.hardware.ge2d",  # Blocked by fuchsia.sysmem.
  "fuchsia.hardware.hidbus",  # Multiple enum variants with the same value.
  "fuchsia.hardware.isp",  # Blocked by fuchsia.sysmem.
  "fuchsia.hardware.pciroot",  # Blocked by zircon.hw.pci.
  "fuchsia.hardware.serialimpl",  # Blocked by fuchsia.hardware.serial.
  "fuchsia.hardware.serialimpl.async",  # Blocked by fuchsia.hardware.serial.
  "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.
  "fuchsia.hardware.wlan.info",  # Variable names starting with `_`.
  "fuchsia.hardware.wlan.mac",  # Blocked by fuchsia.hardware.wlan.info.
  "fuchsia.hardware.wlanif",  # Blocked by fuchsia.hardware.wlan.info.
  "fuchsia.hardware.wlanphyimpl",  # Blocked by ddk.hw.wlan.wlaninfo.
  "fuchsia.sysmem",  # A struct and a constant share the same canonical name.
  "zircon.hw.pci",  # Dummy library.
]

# 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",  # Not FIDL-compliant yet.
  # "fuchsia.hardware.wlan.info",  # Not FIDL-compliant yet.
  # "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.camera.sensor",
  "fuchsia.hardware.mipicsi",
  "fuchsia.hardware.pci",
  "fuchsia.hardware.power",
  "fuchsia.hardware.pwm",
  "fuchsia.hardware.registers",
  "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_2",
    ]
  }
  foreach(library, _rust_translated_deps) {
    deps += [ "$library:${library}_banjo_rust" ]
  }
  foreach(library, _cpp_mock_translated_deps) {
    deps += [ "$library:${library}_banjo_cpp_mock_2" ]
  }
}
