From 80b01dd8344c2469e943726769c5ec6b8fc53401 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Tue, 14 Sep 2021 21:41:48 -0400 Subject: Replace shared library malloc shim with explicit allocation testing The old approach was generally annoying to deal with sometimes, and not particularly portable. This replaces it by using the new custom allocator interface with unit tests that specifically check that failed allocation is handled properly. --- test/btree_test.c | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) (limited to 'test/btree_test.c') diff --git a/test/btree_test.c b/test/btree_test.c index b526551..aa8cb69 100644 --- a/test/btree_test.c +++ b/test/btree_test.c @@ -1,12 +1,12 @@ -// Copyright 2011-2020 David Robillard +// Copyright 2011-2021 David Robillard // SPDX-License-Identifier: ISC #undef NDEBUG #include "zix/btree.h" +#include "failing_allocator.h" #include "test_data.h" -#include "test_malloc.h" #include "zix/common.h" @@ -250,14 +250,16 @@ test_remove_cases(void) } static int -stress(const unsigned test_num, const size_t n_elems) +stress(ZixAllocator* const allocator, + const unsigned test_num, + const size_t n_elems) { if (n_elems == 0) { return 0; } uintptr_t r = 0; - ZixBTree* t = zix_btree_new(NULL, int_cmp, NULL); + ZixBTree* t = zix_btree_new(allocator, int_cmp, NULL); ZixStatus st = ZIX_STATUS_SUCCESS; if (!t) { @@ -592,6 +594,22 @@ stress(const unsigned test_num, const size_t n_elems) return EXIT_SUCCESS; } +static void +test_failed_alloc(void) +{ + ZixFailingAllocator allocator = zix_failing_allocator(); + + // Successfully stress test the tree to count the number of allocations + assert(!stress(&allocator.base, 0, 4096)); + + // Test that each allocation failing is handled gracefully + const size_t n_new_allocs = allocator.n_allocations; + for (size_t i = 0u; i < n_new_allocs; ++i) { + allocator.n_remaining = i; + assert(stress(&allocator.base, 0, 4096)); + } +} + int main(int argc, char** argv) { @@ -605,6 +623,7 @@ main(int argc, char** argv) test_iter_comparison(); test_insert_split_value(); test_remove_cases(); + test_failed_alloc(); const unsigned n_tests = 3u; const size_t n_elems = (argc > 1) ? strtoul(argv[1], NULL, 10) : 524288u; @@ -613,27 +632,11 @@ main(int argc, char** argv) for (unsigned i = 0; i < n_tests; ++i) { printf("."); fflush(stdout); - if (stress(i, n_elems)) { + if (stress(NULL, i, n_elems)) { return EXIT_FAILURE; } } printf("\n"); -#ifdef ZIX_WITH_TEST_MALLOC - const size_t total_n_allocs = test_malloc_get_n_allocs(); - const size_t fail_n_elems = 1000; - printf("Testing 0 ... %" PRIuPTR " failed allocations\n", total_n_allocs); - expect_failure = true; - for (size_t i = 0; i < total_n_allocs; ++i) { - test_malloc_reset(i); - stress(0, fail_n_elems); - if (i > test_malloc_get_n_allocs()) { - break; - } - } - - test_malloc_reset((size_t)-1); -#endif - return EXIT_SUCCESS; } -- cgit v1.2.1