blob: 9fdda16ea1db7eccd66af07d904a0e311e82ad28 [file]
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
///
/// \file
/// Unit tests for the getentropy function.
///
//===----------------------------------------------------------------------===//
#include "src/sys/random/getentropy.h"
#include "hdr/errno_macros.h"
#include "test/UnitTest/ErrnoCheckingTest.h"
#include "test/UnitTest/ErrnoSetterMatcher.h"
#include "test/UnitTest/Test.h"
using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
using LlvmLibcGetEntropyTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
TEST_F(LlvmLibcGetEntropyTest, ZeroLength) {
char buffer[16]{};
ASSERT_THAT(LIBC_NAMESPACE::getentropy(buffer, 0), Succeeds<int>(0));
ASSERT_THAT(LIBC_NAMESPACE::getentropy(nullptr, 0), Succeeds<int>(0));
}
TEST_F(LlvmLibcGetEntropyTest, LengthTooLarge) {
char buffer[257]{};
ASSERT_THAT(LIBC_NAMESPACE::getentropy(buffer, 257), Fails<int>(EIO));
}
TEST_F(LlvmLibcGetEntropyTest, InvalidBuffer) {
ASSERT_THAT(LIBC_NAMESPACE::getentropy(nullptr, 16), Fails<int>(EFAULT));
}
TEST_F(LlvmLibcGetEntropyTest, SmallBuffer) {
char buffer[16]{};
ASSERT_THAT(LIBC_NAMESPACE::getentropy(buffer, sizeof(buffer)),
Succeeds<int>(0));
}
TEST_F(LlvmLibcGetEntropyTest, MaxBuffer) {
constexpr size_t MAX_BYTES = 256;
char buffer[MAX_BYTES]{};
ASSERT_THAT(LIBC_NAMESPACE::getentropy(buffer, MAX_BYTES), Succeeds<int>(0));
bool all_zeros = true;
for (size_t i = 0; i < MAX_BYTES; ++i) {
if (buffer[i] != 0) {
all_zeros = false;
break;
}
}
ASSERT_FALSE(all_zeros);
}
TEST_F(LlvmLibcGetEntropyTest, DifferentOutputs) {
constexpr size_t BUF_SIZE = 32;
char buf1[BUF_SIZE]{};
char buf2[BUF_SIZE]{};
ASSERT_THAT(LIBC_NAMESPACE::getentropy(buf1, BUF_SIZE), Succeeds<int>(0));
ASSERT_THAT(LIBC_NAMESPACE::getentropy(buf2, BUF_SIZE), Succeeds<int>(0));
bool differ = false;
for (size_t i = 0; i < BUF_SIZE; ++i) {
if (buf1[i] != buf2[i]) {
differ = true;
break;
}
}
ASSERT_TRUE(differ);
}