# Copyright 2020 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/components.gni")
import("//build/config.gni")
import("//build/python/python_action.gni")

# Define a filtered ArchiveAccessor pipeline.
#
# Parameters
#
#   name
#     Type: string
#     Optional: defaults to target_name
#
#   inspect
#     Type: list of files
#     Required: inspect selector configurations for the pipeline
#
#   with_tests
#     Type: boolean
#     Optional: whether or not to generate tests for this pipeline.
#
#   test_expect_disabled
#     Type: boolean
#     Optional: defaults to false. Whether or not the test should assert that the pipeline is
#         disabled.
#
#   test_environments
#     Type: List<Environment>
#     Optional: environments in which the test will be executed.
#
# TODO(https://fxbug.dev/42138811) update public pipeline docs with this template
template("archive_pipeline") {
  assert(defined(invoker.inspect), "Must define inspect selectors")

  name = target_name
  if (defined(invoker.name)) {
    name = invoker.name
  }
  with_tests = true
  if (defined(invoker.with_tests)) {
    with_tests = invoker.with_tests
  }

  resource(invoker.target_name) {
    sources = invoker.inspect
    outputs = [ "config/archivist/${name}/{{source_file_part}}" ]
  }

  if (with_tests) {
    path_to_test_cml = "${target_out_dir}/${invoker.target_name}_test.cml"
    generate_test_cml_action = "${invoker.target_name}_generate_test_cml_action"

    python_action(generate_test_cml_action) {
      binary_label =
          "//src/diagnostics/archivist/build/scripts:generate_pipeline_test_cml"
      outputs = [ path_to_test_cml ]

      args = [
        "--name",
        name,
        "--out",
        rebase_path(path_to_test_cml, root_build_dir),
      ]
      if (defined(invoker.test_expect_disabled) &&
          invoker.test_expect_disabled) {
        args += [ "--expect-disabled" ]
      }
      foreach(path, invoker.inspect) {
        args += [
          "--file",
          path,
        ]
      }
    }

    component_action = "${invoker.target_name}_pipeline_test_component"
    fuchsia_component(component_action) {
      testonly = true
      component_name = "${invoker.target_name}_pipeline_test"
      manifest = path_to_test_cml
      manifest_deps = [ ":${generate_test_cml_action}" ]
    }

    fuchsia_test_package("${invoker.target_name}_pipeline_test") {
      test_components = [ ":${component_action}" ]

      if (defined(invoker.test_environments)) {
        test_specs = {
          environments = invoker.test_environments
        }
      }
    }
  }
}
