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

#include <stdlib.h>
#include <zircon/syscalls.h>

#include <random>
#include <type_traits>

#include "perftest/perftest.h"

namespace {

// Measure the time per call for retrieving random bytes from |RandFunc|.
template <auto RandFunc>
bool GetFrom(perftest::RepeatState* state) {
  while (state->KeepRunning()) {
    auto r = RandFunc();
    perftest::DoNotOptimize(r);
  }
  return true;
}

// Measure the time per call for reading random bytes from std::random_device.
bool GetFromRandomDevice(perftest::RepeatState* state) {
  std::random_device rd;
  while (state->KeepRunning()) {
    auto r = rd();
    perftest::DoNotOptimize(r);
  }
  return true;
}

// Measure the time per call for reading random data from Zircon.
bool GetFromZxCprng(perftest::RepeatState* state) {
  uint64_t r;
  while (state->KeepRunning()) {
    zx_cprng_draw(&r, sizeof(r));
    perftest::DoNotOptimize(r);
  }
  return true;
}

void RegisterTests() {
  perftest::RegisterTest("Prng/LibCpp/RandomDevice", GetFromRandomDevice);
  perftest::RegisterTest("Prng/Zx/CprngDraw", GetFromZxCprng);

  // Deprecated/discouraged PRNGs.
  // rand() is not a cryptographically secure PRNG.
  perftest::RegisterTest("Prng/DoNotUse/LibC/Rand", GetFrom<rand>);
  // random() should never be used, as it simply generates sequential numbers.
  perftest::RegisterTest("Prng/DoNotUse/LibC/Random", GetFrom<random>);
}

PERFTEST_CTOR(RegisterTests)

}  // namespace
