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

#include <fcntl.h>
#include <lib/syslog/cpp/macros.h>
#include <sys/stat.h>
#include <unistd.h>

#include <fbl/unique_fd.h>
#include <perftest/perftest.h>

namespace {

// Measure the time taken by stat() on the given path.
bool StatTest(perftest::RepeatState* state, const char* path) {
  while (state->KeepRunning()) {
    struct stat st;
    FX_CHECK(stat(path, &st) == 0);
  }
  return true;
}

// Measure the time taken by open()+close() on the given path.
bool OpenTest(perftest::RepeatState* state, const char* path) {
  while (state->KeepRunning()) {
    int fd = open(path, O_RDONLY);
    FX_CHECK(fd >= 0);
    FX_CHECK(close(fd) == 0);
  }
  return true;
}

// Measure the time taken by fstat() on an FD on the given path.
bool FstatTest(perftest::RepeatState* state, const char* path) {
  fbl::unique_fd fd(open(path, O_RDONLY));
  FX_CHECK(fd.is_valid());

  while (state->KeepRunning()) {
    struct stat st;
    FX_CHECK(fstat(fd.get(), &st) == 0);
  }
  return true;
}

void RegisterTests() {
  perftest::RegisterTest("Filesystem_Stat_Ext4", StatTest, "/");
  perftest::RegisterTest("Filesystem_Fstat_Ext4", FstatTest, "/");

  // Test open() times for different filesystem implementations.
  perftest::RegisterTest("Filesystem_Open_Bpf", OpenTest, "/sys/fs/bpf");
  perftest::RegisterTest("Filesystem_Open_DevPts", OpenTest, "/dev/pts");
  perftest::RegisterTest("Filesystem_Open_DevTmpfs", OpenTest, "/dev");
  perftest::RegisterTest("Filesystem_Open_Ext4", OpenTest, "/");
  perftest::RegisterTest("Filesystem_Open_Remotefs", OpenTest, "/container");
  perftest::RegisterTest("Filesystem_Open_Sysfs", OpenTest, "/sys");
  perftest::RegisterTest("Filesystem_Open_Tmpfs", OpenTest, "/tmp");
}
PERFTEST_CTOR(RegisterTests)

}  // namespace
