From cf3b3048da0f80d3643ba0a9bc61a29ca5c5cf8b Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 10 Sep 2021 20:54:08 -0400 Subject: Test failed Ring allocation --- test/ring_test.c | 69 +++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 51 insertions(+), 18 deletions(-) (limited to 'test/ring_test.c') diff --git a/test/ring_test.c b/test/ring_test.c index 23c5adc..2b20822 100644 --- a/test/ring_test.c +++ b/test/ring_test.c @@ -1,5 +1,5 @@ /* - Copyright 2011-2020 David Robillard + Copyright 2011-2021 David Robillard Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -14,6 +14,11 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#undef NDEBUG + +#include "failing_allocator.h" + +#include "zix/allocator.h" #include "zix/attributes.h" #include "zix/ring.h" #include "zix/thread.h" @@ -112,24 +117,9 @@ writer(void* ZIX_UNUSED(arg)) return NULL; } -int -main(int argc, char** argv) +static int +test_ring(const unsigned size) { - if (argc > 1 && argv[1][0] == '-') { - printf("Usage: %s SIZE N_WRITES\n", argv[0]); - return 1; - } - - unsigned size = 1024; - if (argc > 1) { - size = (unsigned)strtoul(argv[1], NULL, 10); - } - - n_writes = size * 1024; - if (argc > 2) { - n_writes = (unsigned)strtoul(argv[2], NULL, 10); - } - zix_ring_free(NULL); printf("Testing %u writes of %u ints to a %u int ring...\n", @@ -239,3 +229,46 @@ main(int argc, char** argv) zix_ring_free(ring); return 0; } + +static void +test_failed_alloc(void) +{ + ZixFailingAllocatorState state = {0u, SIZE_MAX}; + ZixAllocator allocator = zix_failing_allocator(&state); + + // Successfully allocate a ring to count the number of allocations + ring = zix_ring_new(&allocator, 512); + assert(ring); + + // Test that each allocation failing is handled gracefully + const size_t n_new_allocs = state.n_allocations; + for (size_t i = 0u; i < n_new_allocs; ++i) { + state.n_remaining = i; + assert(!zix_ring_new(&allocator, 512)); + } + + zix_ring_free(ring); +} + +int +main(int argc, char** argv) +{ + if (argc > 1 && argv[1][0] == '-') { + printf("Usage: %s SIZE N_WRITES\n", argv[0]); + return 1; + } + + unsigned size = 1024; + if (argc > 1) { + size = (unsigned)strtoul(argv[1], NULL, 10); + } + + n_writes = size * 1024; + if (argc > 2) { + n_writes = (unsigned)strtoul(argv[2], NULL, 10); + } + + test_failed_alloc(); + test_ring(size); + return 0; +} -- cgit v1.2.1