|
6 | 6 | //
|
7 | 7 | //===----------------------------------------------------------------------===//
|
8 | 8 |
|
| 9 | +#include "src/__support/CPP/array.h" |
9 | 10 | #include "src/errno/libc_errno.h"
|
10 | 11 | #include "src/math/fabs.h"
|
11 | 12 | #include "src/sys/random/getrandom.h"
|
12 | 13 | #include "test/ErrnoSetterMatcher.h"
|
13 | 14 | #include "test/UnitTest/Test.h"
|
14 | 15 |
|
15 | 16 | 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; |
21 | 18 | libc_errno = 0;
|
| 19 | + ASSERT_THAT(__llvm_libc::getrandom(buffer.data(), buffer.size(), -1), |
| 20 | + __llvm_libc::testing::ErrnoSetterMatcher::Fails(EINVAL)); |
22 | 21 | }
|
23 | 22 |
|
24 | 23 | 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)); |
29 | 24 | libc_errno = 0;
|
| 25 | + ASSERT_THAT(__llvm_libc::getrandom(nullptr, 65536, 0), |
| 26 | + __llvm_libc::testing::ErrnoSetterMatcher::Fails(EFAULT)); |
30 | 27 | }
|
31 | 28 |
|
32 | 29 | 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) { |
36 | 32 | // 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)); |
38 | 35 | }
|
39 | 36 | }
|
40 | 37 |
|
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; |
44 | 42 |
|
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; |
50 | 45 |
|
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); |
56 | 47 |
|
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); |
65 | 54 | }
|
0 commit comments