diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | test/Makefile | 2 | ||||
-rwxr-xr-x | test/randomtest.sh | 15 | ||||
-rw-r--r-- | test/repeat_random.c | 40 |
4 files changed, 54 insertions, 4 deletions
@@ -6,6 +6,7 @@ test/lib*.o test/lib*.so test/use_lib_random test/use_lib_getpid +test/repeat_random src/libfaketime.dylib.1 src/libfaketime.1.dylib diff --git a/test/Makefile b/test/Makefile index 8f56489..8959b71 100644 --- a/test/Makefile +++ b/test/Makefile @@ -25,7 +25,7 @@ functest: %_test: %_test.c ${CC} -o $@ ${CFLAGS} $< -randomtest: getrandom_test use_lib_random librandom.so +randomtest: getrandom_test use_lib_random librandom.so repeat_random ./randomtest.sh getpidtest: use_lib_getpid libgetpid.so diff --git a/test/randomtest.sh b/test/randomtest.sh index 5330419..4290ec6 100755 --- a/test/randomtest.sh +++ b/test/randomtest.sh @@ -14,7 +14,7 @@ FAKERANDOM_SEED=0x0000000000000000 LD_PRELOAD="$FTPL" ./getrandom_test > run3 if diff -u run-base run0 > /dev/null; then error=1 - printf >&2 'test run without the LD_PRELOAD matches a run without LD_PRELOAD' + printf >&2 'test run without the LD_PRELOAD matches a run without LD_PRELOAD\n' fi if diff -u run0 run1 > /dev/null; then @@ -30,8 +30,6 @@ if diff -u run2 run3 >/dev/null; then printf >&2 'test runs with different seeds produced the same data!\n' fi -rm -f run-base run0 run1 run2 run3 - printf 'testing shared object with getrandom() in library constructor\n' LD_LIBRARY_PATH=. ./use_lib_random printf 'now with LD_PRELOAD and FAKERANDOM_SEED\n' @@ -40,6 +38,17 @@ FAKERANDOM_SEED=0x0000000000000000 LD_PRELOAD="$FTPL" LD_LIBRARY_PATH=. ./use_li printf 'now with LD_PRELOAD without FAKERANDOM_SEED\n' LD_PRELOAD="$FTPL" LD_LIBRARY_PATH=. ./use_lib_random + +FAKERANDOM_SEED=0xDEADBEEFDEADBEEF LD_PRELOAD="$FTPL" ./repeat_random 3 5 > run4 +FAKERANDOM_SEED=0xDEADBEEFDEADBEEF LD_PRELOAD="$FTPL" ./repeat_random 5 3 > run5 + +if ! diff -u run4 run5; then + error=5 + printf >&2 '5 calls of getrandom(3) did not produce the same stream as 3 calls of getrandom(5)\n' +fi + +rm -f run-base run0 run1 run2 run3 run4 run5 + if [ 0 = $error ]; then printf 'getrandom interception test successful.\n' fi diff --git a/test/repeat_random.c b/test/repeat_random.c new file mode 100644 index 0000000..5a93433 --- /dev/null +++ b/test/repeat_random.c @@ -0,0 +1,40 @@ +#include <stdio.h> +#include <stdlib.h> +#include <sys/random.h> + +void usage(const char* name) { + fprintf(stderr, + "Usage: %s REPS SIZE\n\n" + "Gather and print REPS blocks of SIZE bytes from getrandom()\n", + name); +} + +int main(int argc, const char **argv) { + int reps, size; + unsigned char *buf; + if (argc != 3) { + usage(argv[0]); + return 1; + } + reps = atoi(argv[1]); + size = atoi(argv[2]); + buf = malloc(size); + if (!buf) { + fprintf(stderr, "failure to allocate buffer of size %d\n", size); + return 1; + } + for (int i = 0; i < reps; i++) { + ssize_t resp = getrandom(buf, size, 0); + if (resp != size) { + fprintf(stderr, "tried to get %d bytes, got %zd\n", size, resp); + free(buf); + return 2; + } + for (int j = 0; j < size; j++) { + printf("%02x", buf[j]); + } + } + free(buf); + printf("\n"); + return 0; +}; |