Skip to content

Commit bb4f88f

Browse files
committed
[libc] simplify test for getrandom
`getrandom` is implemented as a syscall. We don't want to test linux implementation of the syscall. We just want to verify that it reacts as expected to sensible values. Runtime before ``` [ RUN ] LlvmLibcGetRandomTest.InvalidFlag [ OK ] LlvmLibcGetRandomTest.InvalidFlag (took 0 ms) [ RUN ] LlvmLibcGetRandomTest.InvalidBuffer [ OK ] LlvmLibcGetRandomTest.InvalidBuffer (took 0 ms) [ RUN ] LlvmLibcGetRandomTest.ReturnsSize [ OK ] LlvmLibcGetRandomTest.ReturnsSize (took 83 ms) [ RUN ] LlvmLibcGetRandomTest.PiEstimation [ OK ] LlvmLibcGetRandomTest.PiEstimation (took 9882 ms) ``` Runtime after ``` [ RUN ] LlvmLibcGetRandomTest.InvalidFlag [ OK ] LlvmLibcGetRandomTest.InvalidFlag (took 0 ms) [ RUN ] LlvmLibcGetRandomTest.InvalidBuffer [ OK ] LlvmLibcGetRandomTest.InvalidBuffer (took 0 ms) [ RUN ] LlvmLibcGetRandomTest.ReturnsSize [ OK ] LlvmLibcGetRandomTest.ReturnsSize (took 0 ms) [ RUN ] LlvmLibcGetRandomTest.CheckValue [ OK ] LlvmLibcGetRandomTest.CheckValue (took 0 ms) ``` Reviewed By: lntue Differential Revision: https://reviews.llvm.org/D151336
1 parent d71297c commit bb4f88f

File tree

1 file changed

+23
-34
lines changed

1 file changed

+23
-34
lines changed

libc/test/src/sys/random/linux/getrandom_test.cpp

Lines changed: 23 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,60 +6,49 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9+
#include "src/__support/CPP/array.h"
910
#include "src/errno/libc_errno.h"
1011
#include "src/math/fabs.h"
1112
#include "src/sys/random/getrandom.h"
1213
#include "test/ErrnoSetterMatcher.h"
1314
#include "test/UnitTest/Test.h"
1415

1516
TEST(LlvmLibcGetRandomTest, InvalidFlag) {
16-
using __llvm_libc::testing::ErrnoSetterMatcher::Fails;
17-
static constexpr size_t SIZE = 256;
18-
char data[SIZE];
19-
libc_errno = 0;
20-
ASSERT_THAT(__llvm_libc::getrandom(data, SIZE, -1), Fails(EINVAL));
17+
__llvm_libc::cpp::array<char, 10> buffer;
2118
libc_errno = 0;
19+
ASSERT_THAT(__llvm_libc::getrandom(buffer.data(), buffer.size(), -1),
20+
__llvm_libc::testing::ErrnoSetterMatcher::Fails(EINVAL));
2221
}
2322

2423
TEST(LlvmLibcGetRandomTest, InvalidBuffer) {
25-
using __llvm_libc::testing::ErrnoSetterMatcher::Fails;
26-
27-
libc_errno = 0;
28-
ASSERT_THAT(__llvm_libc::getrandom(nullptr, 65536, 0), Fails(EFAULT));
2924
libc_errno = 0;
25+
ASSERT_THAT(__llvm_libc::getrandom(nullptr, 65536, 0),
26+
__llvm_libc::testing::ErrnoSetterMatcher::Fails(EFAULT));
3027
}
3128

3229
TEST(LlvmLibcGetRandomTest, ReturnsSize) {
33-
static constexpr size_t SIZE = 8192;
34-
uint8_t buf[SIZE];
35-
for (size_t i = 0; i < SIZE; ++i) {
30+
__llvm_libc::cpp::array<char, 10> buffer;
31+
for (size_t i = 0; i < buffer.size(); ++i) {
3632
// Without GRND_RANDOM set this should never fail.
37-
ASSERT_EQ(__llvm_libc::getrandom(buf, i, 0), static_cast<ssize_t>(i));
33+
ASSERT_EQ(__llvm_libc::getrandom(buffer.data(), i, 0),
34+
static_cast<ssize_t>(i));
3835
}
3936
}
4037

41-
TEST(LlvmLibcGetRandomTest, PiEstimation) {
42-
static constexpr size_t LIMIT = 10000000;
43-
static constexpr double PI = 3.14159265358979;
38+
TEST(LlvmLibcGetRandomTest, CheckValue) {
39+
// Probability of picking one particular value amongst 256 possibilities a
40+
// hundred times in a row is (1/256)^100 = 1.49969681e-241.
41+
__llvm_libc::cpp::array<char, 100> buffer;
4442

45-
auto generator = []() {
46-
uint16_t data;
47-
__llvm_libc::getrandom(&data, sizeof(data), 0);
48-
return data;
49-
};
43+
for (char &c : buffer)
44+
c = 0;
5045

51-
auto sample = [&]() {
52-
auto x = static_cast<double>(generator()) / 65536.0;
53-
auto y = static_cast<double>(generator()) / 65536.0;
54-
return x * x + y * y < 1.0;
55-
};
46+
__llvm_libc::getrandom(buffer.data(), buffer.size(), 0);
5647

57-
double counter = 0;
58-
for (size_t i = 0; i < LIMIT; ++i) {
59-
if (sample()) {
60-
counter += 1.0;
61-
}
62-
}
63-
counter = counter / LIMIT * 4.0;
64-
ASSERT_TRUE(__llvm_libc::fabs(counter - PI) < 0.1);
48+
bool all_zeros = true;
49+
for (char c : buffer)
50+
if (c != 0)
51+
all_zeros = false;
52+
53+
ASSERT_FALSE(all_zeros);
6554
}

0 commit comments

Comments
 (0)