// Copyright 2018 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 <perftest/perftest.h>
#include <zircon/syscalls.h>

namespace {

// Performance test for zx_clock_get_monotonic().  This is worth
// testing because it is a very commonly called syscall.  The kernel's
// implementation of the syscall is non-trivial and can be rather slow on
// some machines/VMs.
bool ClockGetMonotonicTest() {
  zx_clock_get_monotonic();
  return true;
}

bool ClockGetUtcTest() {
  zx_time_t now = 0;
  zx_clock_get(ZX_CLOCK_UTC, &now);
  return true;
}

bool ClockGetThreadTest() {
  zx_time_t now = 0;
  zx_clock_get(ZX_CLOCK_THREAD, &now);
  return true;
}

bool TicksGetTest() {
  zx_ticks_get();
  return true;
}

void RegisterTests() {
  perftest::RegisterSimpleTest<ClockGetMonotonicTest>("ClockGetMonotonic");
  perftest::RegisterSimpleTest<ClockGetUtcTest>("ClockGetUtc");
  perftest::RegisterSimpleTest<ClockGetThreadTest>("ClockGetThread");
  perftest::RegisterSimpleTest<TicksGetTest>("TicksGet");
}
PERFTEST_CTOR(RegisterTests)

}  // namespace
