From: Bruno Haible Date: Sat, 30 May 2020 12:58:28 +0000 (+0200) Subject: getrandom: Add tests. X-Git-Tag: v1.0~4016 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=eaefb0474f1207bf4efa441e8589404a03539232;p=gnulib.git getrandom: Add tests. * tests/test-getrandom.c: New file. * modules/getrandom-tests: New file. --- diff --git a/ChangeLog b/ChangeLog index 48aa8905d4..521ee3c084 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2020-05-30 Bruno Haible + + getrandom: Add tests. + * tests/test-getrandom.c: New file. + * modules/getrandom-tests: New file. + 2020-05-30 Bruno Haible crypto/gc-random: Fix link error on MSVC. diff --git a/modules/getrandom-tests b/modules/getrandom-tests new file mode 100644 index 0000000000..8982173613 --- /dev/null +++ b/modules/getrandom-tests @@ -0,0 +1,12 @@ +Files: +tests/test-getrandom.c +tests/signature.h +tests/macros.h + +Depends-on: + +configure.ac: + +Makefile.am: +TESTS += test-getrandom +check_PROGRAMS += test-getrandom diff --git a/tests/test-getrandom.c b/tests/test-getrandom.c new file mode 100644 index 0000000000..3c84f871ef --- /dev/null +++ b/tests/test-getrandom.c @@ -0,0 +1,83 @@ +/* Test of getting random bytes. + Copyright (C) 2020 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible. */ + +#include + +#include + +#include "signature.h" +SIGNATURE_CHECK (getrandom, ssize_t, (void *, size_t, unsigned int)); + +#include +#include + +#include "macros.h" + +int +main (void) +{ + char buf1[8]; + char buf2[8]; + char large_buf[100000]; + ssize_t ret; + + /* Check that different calls produce different results (with a high + probability). */ + ret = getrandom (buf1, sizeof (buf1), 0); + if (ret < 0) + ASSERT (errno == ENOSYS); + else + { + ret = getrandom (buf2, sizeof (buf2), 0); + if (ret < 0) + ASSERT (errno == ENOSYS); + else + { + /* It is very unlikely that two calls to getrandom produce the + same results. */ + ASSERT (memcmp (buf1, buf2, sizeof (buf1)) != 0); + } + } + + /* Likewise with the "truly random" number generator. */ + ret = getrandom (buf1, sizeof (buf1), GRND_RANDOM); + if (ret < 0) + ASSERT (errno == ENOSYS); + else + { + ret = getrandom (buf2, sizeof (buf2), GRND_RANDOM); + if (ret < 0) + ASSERT (errno == ENOSYS); + else + { + /* It is very unlikely that two calls to getrandom produce the + same results. */ + ASSERT (memcmp (buf1, buf2, sizeof (buf1)) != 0); + } + } + + /* Check that GRND_NONBLOCK works. */ + ret = getrandom (large_buf, sizeof (large_buf), GRND_RANDOM | GRND_NONBLOCK); + /* It is very unlikely that so many truly random bytes were ready. */ + if (ret < 0) + ASSERT (errno == ENOSYS || errno == EAGAIN); + else + ASSERT (ret > 0 && ret < sizeof (large_buf)); + + return 0; +}