# 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/compiled_action.gni")
import("//build/fidl/fidl_summary.gni")
import("config.gni")

group("plasa") {
  testonly = true
  deps = [
    ":filter_compdb",
    ":tests",
    "clang_doc_filter:host",
    "model",
    "plasa_test_coverage_report:host",
  ]
  if (current_toolchain == toolchain_variant.base) {
    deps += [ ":compdb" ]

    if (generate_plasa_artifacts) {
      deps += [ ":api_coverage_report" ]
    }
  }
}

group("tests") {
  testonly = true
  deps = [
    "clang_doc_filter:tests",
    "model:tests",
    "plasa_test_coverage_report:tests",
  ]
}

if (current_toolchain == toolchain_variant.base) {
  action("compdb") {
    no_output_dir_leaks = false

    _compdb_file = "${root_build_dir}/compile_commands.json"
    _stamp_file = "${target_gen_dir}/${target_name}.stamp"
    outputs = [
      _compdb_file,
      _stamp_file,
    ]
    script = "//sdk/cts/plasa/run.sh"
    args = [ rebase_path(_stamp_file, root_build_dir) ]
  }

  compiled_action("api_coverage_report") {
    testonly = true
    _plasa_input = "$root_build_dir/manifest.plasa.json"
    _plasa_output = "$root_build_dir/test_coverage_report.plasa.json"
    tool = "//sdk/cts/plasa/plasa_test_coverage_report"
    outputs = [ _plasa_output ]
    inputs = [ _plasa_input ]
    args = [
      "--plasa-manifest-file",
      rebase_path(_plasa_input, root_build_dir),
      "--output",
      rebase_path(_plasa_output, root_build_dir),
    ]
    deps = [ "//sdk:plasa" ]
  }

  fidl_summary_json("vdso_summary") {
    testonly = true
    dest = "vdso"
    inputs = [ "${root_gen_dir}/zircon/vdso/zx.fidl.json" ]
    outputs = [ "${target_gen_dir}/zx.api_summary.json" ]
    deps = [ "//zircon/vdso" ]
  }
}

action("filter_compdb") {
  no_output_dir_leaks = false

  script = "//sdk/cts/plasa/run_jq_on_compdb.sh"
  _stamp_file = "${target_gen_dir}/${target_name}.stamp"
  _jq = "//prebuilt/third_party/jq/${host_platform}/bin/jq"
  _output = "${root_gen_dir}/compdb/compile_commands.json"
  sources = [
    "${root_build_dir}/compile_commands.json",
    script,
  ]
  inputs = [ _jq ]
  outputs = [
    _stamp_file,
    _output,
  ]
  args = [
    rebase_path(_stamp_file, root_build_dir),
    rebase_path(_jq, root_build_dir),
    rebase_path("${root_build_dir}/compile_commands.json", root_build_dir),
    rebase_path(_output, root_build_dir),
    "api_stub.cc",
  ]
  deps = [ ":compdb(${toolchain_variant.base})" ]
}
