// 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.

// This target runs all benchmarks for the Garnet layer.

#include "garnet/testing/benchmarking/benchmarking.h"
#include "garnet/tests/benchmarks/gfx_benchmarks.h"
#include "src/lib/fxl/logging.h"

int main(int argc, const char** argv) {
  auto maybe_benchmarks_runner =
      benchmarking::BenchmarksRunner::Create(argc, argv);
  if (!maybe_benchmarks_runner) {
    exit(1);
  }

  auto& benchmarks_runner = *maybe_benchmarks_runner;

  // Benchmark example, here for demonstration.
  benchmarks_runner.AddTspecBenchmark(
      "benchmark_example",
      "/pkgfs/packages/benchmark/0/data/benchmark_example.tspec");

  // Performance tests implemented in the Zircon repo.
  benchmarks_runner.AddLibPerfTestBenchmark(
      "zircon.perf_test",
      "/pkgfs/packages/garnet_benchmarks/0/test/sys/perf-test");

  // Performance tests implemented in the Garnet repo (the name
  // "zircon_benchmarks" is now misleading).
  benchmarks_runner.AddLibPerfTestBenchmark(
      "zircon_benchmarks",
      "/pkgfs/packages/zircon_benchmarks/0/test/zircon_benchmarks");

  std::string benchmarks_bot_name = benchmarks_runner.benchmarks_bot_name();

  // TODO(PT-118): Input latency tests are only currently supported on NUC.
  if (benchmarks_bot_name == "garnet-x64-perf-dawson_canyon") {
    // simplest_app
    {
      constexpr const char* kLabel = "fuchsia.input_latency.simplest_app";
      std::string out_file = benchmarks_runner.MakeTempFile();
      benchmarks_runner.AddCustomBenchmark(
          kLabel,
          {"/bin/run",
           "fuchsia-pkg://fuchsia.com/garnet_input_latency_benchmarks#meta/"
           "run_simplest_app_benchmark.cmx",
           "--out_file", out_file, "--benchmark_label", kLabel},
          out_file);
    }
    // yuv_to_image_pipe
    {
      constexpr const char* kLabel = "fuchsia.input_latency.yuv_to_image_pipe";
      std::string out_file = benchmarks_runner.MakeTempFile();
      benchmarks_runner.AddCustomBenchmark(
          kLabel,
          {"/bin/run",
           "fuchsia-pkg://fuchsia.com/garnet_input_latency_benchmarks#meta/"
           "run_yuv_to_image_pipe_benchmark.cmx",
           "--out_file", out_file, "--benchmark_label", kLabel},
          out_file);
    }
  }

  AddGraphicsBenchmarks(&benchmarks_runner);

  // Test storage performance.
  if (benchmarks_bot_name == "garnet-x64-perf-dawson_canyon") {
    constexpr const char* block_device =
        "/dev/sys/pci/00:17.0/ahci/sata2/block";

    benchmarks_runner.AddTask([=]() {
      int status = benchmarking::Spawn({"/boot/bin/waitfor", "class=block",
                                        std::string("topo=") + block_device,
                                        "timeout=30000"});
      FXL_CHECK(status == 0);
    });

    // Test block device performance.
    {
      // Passing this parameter reduces the test running time to something
      // reasonable -- 10 seconds for a transfer rate of 500 MiB/second.
      // (Otherwise biotime reads the whole device.)
      auto* kBytesToTransfer = "5G";

      std::string out_file = benchmarks_runner.MakeTempFile();
      benchmarks_runner.AddCustomBenchmark(
          "block_device_throughput",
          {"/boot/bin/biotime", "-total-bytes-to-transfer", kBytesToTransfer,
           "-output-file", out_file, block_device},
          out_file);
    }

    // Test filesystem performance.
    benchmarks_runner.AddLibPerfTestBenchmark(
        "fs_bench", "/pkgfs/packages/garnet_benchmarks/0/test/fs/fs-bench-test",
        {"--fs", "minfs", "--block_device", block_device,
         "--print_statistics"});

    // Test BlobFs performance.
    benchmarks_runner.AddLibPerfTestBenchmark(
        "blobfs_bench",
        "/pkgfs/packages/garnet_benchmarks/0/test/sys/blobfs-bench-test",
        {"--fs", "blobfs", "--block_device", block_device,
         "--print_statistics"});
  } else if (benchmarks_bot_name == "garnet-arm64-perf-vim2") {
    // TODO(ZX-2466): Enable the storage perf tests on the VIM2 bots when we
    // figure out what partition or device we can use for testing.
    FXL_LOG(INFO) << "Storage perf tests skipped on bot '"
                  << benchmarks_bot_name << "'";
  } else {
    FXL_LOG(ERROR)
        << "Bot '" << benchmarks_bot_name
        << "' not recognized: please update benchmarks.cc in garnet.";
    exit(1);
  }

  // List block devices.  This is for debugging purposes and to help with
  // enabling the storage tests above on new devices.  We do this at the end
  // of this script because block devices aren't always immediately available
  // soon after boot, and because "waitfor" isn't applicable when we are
  // listing all devices.
  benchmarks_runner.AddTask([]() {
    FXL_LOG(INFO) << "-- block devices list (lsblk): start";
    int status = benchmarking::Spawn({"/boot/bin/lsblk"});
    FXL_CHECK(status == 0);
    FXL_LOG(INFO) << "-- block devices list (lsblk): end";
  });

  benchmarks_runner.Finish();
}
