56 lines · cpp
1//===-- Unittests for getrandom -------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "src/__support/CPP/array.h"10#include "src/math/fabs.h"11#include "src/sys/random/getrandom.h"12#include "test/UnitTest/ErrnoCheckingTest.h"13#include "test/UnitTest/ErrnoSetterMatcher.h"14#include "test/UnitTest/Test.h"15 16using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;17using LlvmLibcGetRandomTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;18 19TEST_F(LlvmLibcGetRandomTest, InvalidFlag) {20 LIBC_NAMESPACE::cpp::array<char, 10> buffer;21 ASSERT_THAT(LIBC_NAMESPACE::getrandom(buffer.data(), buffer.size(), -1),22 Fails<ssize_t>(EINVAL));23}24 25TEST_F(LlvmLibcGetRandomTest, InvalidBuffer) {26 ASSERT_THAT(LIBC_NAMESPACE::getrandom(nullptr, 65536, 0),27 Fails<ssize_t>(EFAULT));28}29 30TEST_F(LlvmLibcGetRandomTest, ReturnsSize) {31 LIBC_NAMESPACE::cpp::array<char, 10> buffer;32 for (size_t i = 0; i < buffer.size(); ++i) {33 // Without GRND_RANDOM set this should never fail.34 ASSERT_EQ(LIBC_NAMESPACE::getrandom(buffer.data(), i, 0),35 static_cast<ssize_t>(i));36 }37}38 39TEST_F(LlvmLibcGetRandomTest, CheckValue) {40 // Probability of picking one particular value amongst 256 possibilities a41 // hundred times in a row is (1/256)^100 = 1.49969681e-241.42 LIBC_NAMESPACE::cpp::array<char, 100> buffer;43 44 for (char &c : buffer)45 c = 0;46 47 LIBC_NAMESPACE::getrandom(buffer.data(), buffer.size(), 0);48 49 bool all_zeros = true;50 for (char c : buffer)51 if (c != 0)52 all_zeros = false;53 54 ASSERT_FALSE(all_zeros);55}56