# Copyright 2016 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/test/test_package.gni")
import("//build/testing/environments.gni")

# Public targets
group("ledger") {
  testonly = true
  deps = [
    ":ledger_tests",
    ":tests",
    "bin",
    "cloud_provider_in_memory",
    "lib",
    "third_party",
  ]
}

group("bin") {
  deps = [ "bin" ]
}

group("tests") {
  testonly = true
  deps = [
    ":ledger_tests",
    "third_party/bup:bup_tests",
    "//src/ledger/bin",
    "//src/ledger/bin:ledger_fuzzers",
    "//src/ledger/bin/testing/ledger_test_instance_provider:ledger_test_instance_provider",
    "//src/ledger/cloud_provider_in_memory/bin",
  ]
}

group("host_tests") {
  testonly = true
  public_deps = [ "//src/ledger/bin:ledger_host_tests($host_toolchain)" ]
}

# Private targets
visibility = [ "//src/ledger/*" ]

config("ledger_config") {
  asmflags = []

  cflags = [
    # Remove when enabled globally by TO-99.
    "-Wunused-lambda-capture",

    # Remove when enabled globally by TO-100.
    "-Wuser-defined-warnings",

    # Warn about unreachable code.
    "-Wunreachable-code",
  ]

  ldflags = [
    # Use a 1M stack.
    "-Wl,-z,stack-size=0x100000",
  ]
}

package("ledger_tests") {
  testonly = true
  rootjob_svc = true

  deps = [
    "//src/ledger/bin:ledger_unittests",
    "//src/ledger/bin/testing:run_all_unittests_test",
    "//src/ledger/bin/tests/cloud_provider",
    "//src/ledger/bin/tests/e2e_local",
    "//src/ledger/bin/tests/integration",
    "//src/ledger/bin/tests/integration:integration_diff_compatibility",
    "//src/ledger/cloud_provider_in_memory:cloud_provider_in_memory_unittests",
    "//src/ledger/cloud_provider_in_memory/bin:tests",
    "//src/ledger/lib:ledger_lib_unittests",
  ]

  meta = [
    {
      path = rebase_path("//src/ledger/bin/tests/ledger_unittests.cmx")
      dest = "ledger_unittests.cmx"
    },
    {
      path = rebase_path(
              "//src/ledger/bin/tests/integration/ledger_integration_tests.cmx")
      dest = "ledger_integration_tests.cmx"
    },
    {
      path = rebase_path(
              "//src/ledger/bin/tests/integration/ledger_integration_tests_diff_compatibility.cmx")
      dest = "ledger_integration_tests_diff_compatibility.cmx"
    },
    {
      path =
          rebase_path("//src/ledger/bin/tests/e2e_local/ledger_e2e_local.cmx")
      dest = "ledger_e2e_local.cmx"
    },
    {
      path = rebase_path("//src/ledger/lib/ledger_lib_unittests.cmx")
      dest = "ledger_lib_unittests.cmx"
    },
    {
      path = rebase_path(
              "//src/ledger/cloud_provider_in_memory/bin/validation/validation_in_memory.cmx")
      dest = "validation_in_memory.cmx"
    },
    {
      path = rebase_path(
              "//src/ledger/cloud_provider_in_memory/cloud_provider_in_memory_unittests.cmx")
      dest = "cloud_provider_in_memory_unittests.cmx"
    },
    {
      # This test must be started by validation_in_memory or
      # validation_in_memory and will fail if started on its own.
      path = rebase_path(
              "//src/ledger/bin/tests/cloud_provider/cloud_provider_validation_tests.cmx")
      dest = "cloud_provider_validation_tests.cmx"
    },
    {
      path = rebase_path("//src/ledger/bin/testing/run_all_unittests_test.cmx")
      dest = "run_all_unittests_test.cmx"
    },
  ]

  # Disable tests in arm64-debug builds until fxb/42434 is resolved.
  integration_envs = [ nuc_env ]
  if (target_cpu != "arm64" || !is_debug) {
    integration_envs += [ qemu_env ]
  }

  tests = [
    {
      name = "ledger_unittests"
      environments = basic_envs
    },
    {
      name = "ledger_integration_tests"
      environments = integration_envs
    },
    {
      name = "ledger_integration_tests_diff_compatibility"
      environments = integration_envs
    },
    {
      name = "ledger_e2e_local"
      environments = basic_envs
    },
    {
      name = "ledger_lib_unittests"
      environments = basic_envs
    },
    {
      name = "validation_in_memory"
      environments = basic_envs
    },
    {
      name = "cloud_provider_in_memory_unittests"
      environments = basic_envs
    },
    {
      name = "run_all_unittests_test"
      environments = basic_envs
    },
    {
      name = "cloud_provider_validation_tests"

      # This test must be started by validation_in_memory and will fail if started on its own.
      # Marking it as disabled puts the binary in `test/disabled/` under the
      # package directory.
      disabled = true
      environments = basic_envs
    },
  ]
}
