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

dart_test("blobfs_metrics_test") {
  sources = [ "blobfs_metrics_test.dart" ]

  deps = [
    "//sdk/testing/sl4f/client",
    "//third_party/dart-pkg/pub/test",
  ]

  environments = [
    {
      dimensions = {
        device_type = "Astro"
      }
    },
  ]

  # Runs on "main" builders (try and ci) in QEMU environments, but only on x64,
  # as we don't currently support Dart on arm64 hosts.
  if (is_host && target_cpu == "x64") {
    environments += [ emu_env ]
  }
}

dart_test("inspect_metrics_test") {
  sources = [ "inspect_metrics_test.dart" ]

  deps = [
    "//sdk/testing/sl4f/client",
    "//third_party/dart-pkg/pub/test",
  ]

  environments = [
    {
      dimensions = {
        device_type = "Astro"
      }
    },
  ]

  # Runs on "main" builders (try and ci) in QEMU environments, but only on x64,
  # as we don't currently support Dart on arm64 hosts.
  if (is_host && target_cpu == "x64") {
    environments += [ emu_env ]
  }
}

dart_test("archivist_reader_test") {
  sources = [ "archivist_reader_test.dart" ]

  deps = [
    "//sdk/testing/sl4f/client",
    "//third_party/dart-pkg/pub/test",
  ]

  environments = [
    {
      dimensions = {
        device_type = "Astro"
      }
    },
  ]

  # Runs on "main" builders (try and ci) in QEMU environments, but only on x64,
  # as we don't currently support Dart on arm64 hosts.
  if (is_host && target_cpu == "x64") {
    environments += [ emu_env ]
  }
}

dart_test("inspect_metrics_emulator_test") {
  sources = [ "appmgr_cpu_metrics_test.dart" ]

  deps = [
    "//sdk/testing/sl4f/client",
    "//third_party/dart-pkg/pub/test",
  ]

  environments = [
    {
      dimensions = {
        device_type = "Astro"
      }
    },
  ]

  # Runs on "main" builders (try and ci) in QEMU environments, but only on x64,
  # as we don't currently support Dart on arm64 hosts.
  if (is_host && target_cpu == "x64") {
    environments += [ emu_env ]
  }
}

dart_test("archivist_metrics_test") {
  sources = [ "archivist_metrics_test.dart" ]

  deps = [
    "//sdk/testing/sl4f/client",
    "//third_party/dart-pkg/pub/test",
  ]

  environments = [
    {
      dimensions = {
        device_type = "Astro"
      }
    },
  ]

  # Runs on "main" builders (try and ci) in QEMU environments, but only on x64,
  # as we don't currently support Dart on arm64 hosts.
  if (is_host && target_cpu == "x64") {
    environments += [ emu_env ]
  }
}

dart_test("log_stats_test") {
  sources = [ "log_stats_test.dart" ]

  deps = [
    "//sdk/testing/sl4f/client",
    "//third_party/dart-pkg/pub/test",
  ]

  environments = [
    {
      dimensions = {
        device_type = "Astro"
      }
    },
  ]

  # Runs on "main" builders (try and ci) in QEMU environments, but only on x64,
  # as we don't currently support Dart on arm64 hosts.
  if (is_host && target_cpu == "x64") {
    environments += [ emu_env ]
  }
}

dart_test("legacy_metrics_test") {
  sources = [ "legacy_metrics_test.dart" ]

  deps = [
    "//sdk/testing/sl4f/client",
    "//third_party/dart-pkg/pub/test",
  ]

  environments = [
    {
      dimensions = {
        device_type = "Astro"
      }
    },
  ]
}

group("test") {
  testonly = true

  deps = [
    ":archivist_metrics_test($host_toolchain)",
    ":archivist_reader_test($host_toolchain)",
    ":inspect_metrics_emulator_test($host_toolchain)",
    ":inspect_metrics_test($host_toolchain)",
    ":legacy_metrics_test($host_toolchain)",
    ":log_stats_test($host_toolchain)",
  ]
}
