// Copyright 2017 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 <sys/stat.h>
#include <unistd.h>

#include <perftest/perftest.h>

#include <lib/fxl/files/unique_fd.h>
#include <lib/fxl/logging.h>

namespace {

// Measure the time taken by stat() on the current directory.
bool StatTest() {
  struct stat st;
  FXL_CHECK(stat(".", &st) == 0);
  return true;
}

// Measure the time taken by open()+close() on the current directory.
bool OpenTest() {
  int fd = open(".", O_RDONLY);
  FXL_CHECK(fd >= 0);
  FXL_CHECK(close(fd) == 0);
  return true;
}

// Measure the time taken by fstat() on an FD for the current directory.
bool FstatTest(perftest::RepeatState* state) {
  fxl::UniqueFD fd(open(".", O_RDONLY));
  FXL_CHECK(fd.is_valid());

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

void RegisterTests() {
  perftest::RegisterSimpleTest<StatTest>("Filesystem_Stat");
  perftest::RegisterSimpleTest<OpenTest>("Filesystem_Open");
  perftest::RegisterTest("Filesystem_Fstat", FstatTest);
}
PERFTEST_CTOR(RegisterTests);

}  // namespace
