// 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 <zircon/syscalls.h>

#include <stdlib.h>

#include <random>
#include <type_traits>

#include "perftest/perftest.h"

namespace {

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

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

// Measure the time per call, as well as throughput, for reading random data
// from Zircon.
bool GetFromZxCprng(perftest::RepeatState* state) {
  uint64_t r;
  state->SetBytesProcessedPerRun(sizeof(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
