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

# This directory contains Dart wrappers for running performance tests
# that are defined elsewhere in the Fuchsia tree.
#
# The test wrappers in this directory are split into multiple test
# executables (dart_test targets here) because the Fuchsia Infra tools
# for retrying tests and tracking flakes operate on the granularity of
# test executables.

test_list = [
  "archivist_benchmarks_test",
  "dart_inspect_benchmarks_test",
  "fidlc_microbenchmarks_test",
  "garnet_input_latency_benchmarks_test",
  "kernel_boot_timeline_test",
  "microbenchmarks_test",
  "netstack_benchmarks_test",
  "rust_inspect_benchmarks_test",
  "rust_inspect_reader_benchmarks_test",
]
foreach(target_name, test_list) {
  dart_test(target_name) {
    sources = [ "$target_name.dart" ]

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

    non_dart_deps = [ ":runtime_deps($host_toolchain)" ]

    environments = [
      # Runs on "main" builders (try and ci) in NUC environments.
      nuc_env,
    ]
  }
}

flutter_test_list = [
  # fxbug.dev/60742
  # "button_flutter_benchmarks_test",

  # fxbug.dev/56644
  # "clockface_flutter_benchmarks_test",

  # fxbug.dev/59483
  # "scroll_flutter_benchmarks_test",
]
foreach(target_name, flutter_test_list) {
  dart_test(target_name) {
    sources = [ "flutter/$target_name.dart" ]

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

    non_dart_deps = [ ":runtime_deps($host_toolchain)" ]

    environments = [ nuc_env ]
  }
}

# Split the following tests into shards so that each shard fits
# within the default time limit.
shards = [
  "0",
  "1",
  "2",
  "3",
  "4",
  "5",
  "6",
  "7",
]
total_shards = "8"
shard_test_list = [
  "fidl_microbenchmarks_test",
  "netstack_iperf_test",
]
foreach(test, shard_test_list) {
  foreach(shard, shards) {
    target_name = test + "_shard_" + shard
    dart_test(target_name) {
      sources = [ test + ".dart" ]

      args = [
        "--total-shards=" + total_shards,
        "--shard-index=" + shard,
      ]

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

      non_dart_deps = [ ":runtime_deps($host_toolchain)" ]

      environments = [ nuc_env ]
    }
    test_list += [ target_name ]
  }
}

if (is_host) {
  host_test_data("runtime_deps") {
    sources = [
      "$root_out_dir/catapult_converter",
      "$root_out_dir/trace2json",
    ]
    outputs = [ "$target_gen_dir/runtime_deps/{{source_file_part}}" ]

    deps = [
      "//garnet/bin/catapult_converter:converter_bin",
      "//garnet/bin/trace2json:bin",
    ]

    # TODO(fxbug.dev/48350): Enable host build for non-linux hosts as well.
    if (host_os == "linux") {
      sources += [ "$root_out_dir/iperf3" ]
      deps += [ "//third_party/iperf:bin" ]
    }
  }
}

group("package_deps") {
  testonly = true
  public_deps = [
    "//src/connectivity/network/tests/benchmarks",
    "//src/diagnostics/archivist/bench",
    "//src/lib/diagnostics/inspect/rust:benchmarks",
    "//src/tests/benchmarks:kernel-boot-benchmarks",
    "//src/tests/benchmarks/fidl:benchmarks",
    "//src/tests/microbenchmarks:fuchsia_microbenchmarks_perftestmode",
    "//third_party/iperf",
    "//topaz/tests/dart-inspect-benchmarks",

    # These are used by garnet_input_latency_benchmarks.
    "//src/sys/activity",
    "//src/ui/examples:simplest_app",
    "//src/ui/examples:yuv_to_image_pipe",
    "//src/ui/tools:present_view",

    # These are used by the flutter benchmarks.
    "//src/experiences/benchmarks/bin/button_flutter:button_flutter",
    "//src/experiences/benchmarks/bin/clockface_flutter:clockface-flutter",
    "//src/experiences/benchmarks/bin/scroll_flutter:scroll-flutter",
  ]
}

group("test") {
  testonly = true

  deps = []

  foreach(target_name, test_list) {
    deps += [ ":$target_name($host_toolchain)" ]
  }

  foreach(target_name, flutter_test_list) {
    deps += [ ":$target_name($host_toolchain)" ]
  }
}

group("touch_input_test") {
  testonly = true

  deps = [
    ":touch_input_latency_benchmarks_test($host_toolchain)",
    "//src/testing/sl4f",
    "//src/ui/tests/integration_input_tests/touch:tests",
  ]
}

# Runs the benchmark for touch latency
dart_test("touch_input_latency_benchmarks_test") {
  sources = [ "touch_input_latency_benchmarks_test.dart" ]

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

  non_dart_deps = [ ":runtime_deps($host_toolchain)" ]

  environments = [
    # Runs on "main" builders (try and ci) in NUC environments.
    nuc_env,
  ]
}

# Unit tests of processing logic
group("tests") {
  testonly = true
  deps = [
    ":flutter_startup_time_metric_test($host_toolchain)",
    ":touch_input_latency_metric_test($host_toolchain)",
  ]
}

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

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

dart_test("flutter_startup_time_metric_test") {
  sources = [ "flutter/flutter_startup_time_metric_test.dart" ]

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