UNIXworkcode

1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2023 Mike Becker, Olaf Wintermann All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include "util_allocator.h" 30 #include "cx/common.h" 31 #include "cx/test.h" 32 33 CxTestSuite *cx_test_suite_testing_allocator(void); 34 CxTestSuite *cx_test_suite_szmul(void); 35 CxTestSuite *cx_test_suite_allocator(void); 36 CxTestSuite *cx_test_suite_streams(void); 37 CxTestSuite *cx_test_suite_compare(void); 38 CxTestSuite *cx_test_suite_string(void); 39 CxTestSuite *cx_test_suite_string_to_number(void); 40 CxTestSuite *cx_test_suite_buffer(void); 41 CxTestSuite *cx_test_suite_hash_key(void); 42 CxTestSuite *cx_test_suite_hash_map(void); 43 CxTestSuite *cx_test_suite_iterator(void); 44 CxTestSuite *cx_test_suite_empty_list(void); 45 CxTestSuite *cx_test_suite_array_list(void); 46 CxTestSuite *cx_test_suite_array_list_defaulted_funcs(void); 47 CxTestSuite *cx_test_suite_linked_list(void); 48 CxTestSuite *cx_test_suite_linked_list_defaulted_funcs(void); 49 CxTestSuite *cx_test_suite_kv_list(void); 50 CxTestSuite *cx_test_suite_kv_list_specifics(void); 51 CxTestSuite *cx_test_suite_list_set_ops(void); 52 CxTestSuite *cx_test_suite_list_corner_cases(void); 53 CxTestSuite *cx_test_suite_tree_low_level(void); 54 CxTestSuite *cx_test_suite_tree_high_level(void); 55 CxTestSuite *cx_test_suite_properties(void); 56 CxTestSuite *cx_test_suite_json(void); 57 CxTestSuite *cx_test_suite_printf(void); 58 CxTestSuite *cx_test_suite_mempool(void); 59 60 #define break_on_failure false 61 #define run_tests(suite) cx_test_run_stdout(suite); success += (suite)->success; failure += (suite)->failure; \ 62 if (!cx_testing_allocator_verify(&testing_allocator) || (break_on_failure && failure > 0)) break; 63 #define execute_test_suites(...) unsigned success = 0, failure = 0; CxTestSuite* test_suites[] = {__VA_ARGS__}; \ 64 for (size_t i = 0; i < cx_nmemb(test_suites) ; i++) {run_tests(test_suites[i]);} (void)0 65 #define free_test_suites for (size_t i = 0 ; i < cx_nmemb(test_suites) ; i++) {cx_test_suite_free(test_suites[i]);} (void)0 66 67 static int verify_testing_allocator(void) { 68 printf("Verify Testing Allocator\n"); 69 CxTestSuite *suite_ta = cx_test_suite_testing_allocator(); 70 int result = suite_ta->failure > 0; 71 cx_test_suite_free(suite_ta); 72 return result; 73 } 74 75 int main(void) { 76 if (verify_testing_allocator()) { 77 fprintf(stderr, "Testing Allocator is not working - cannot perform tests!\n"); 78 return EXIT_FAILURE; 79 } 80 81 // Replace the default allocator with the testing allocator 82 CxTestingAllocator testing_allocator; 83 cx_testing_allocator_init(&testing_allocator); 84 cxDefaultAllocator = &testing_allocator.base; 85 86 // Run tests 87 printf("UCX Tests\n---------\n"); 88 89 execute_test_suites( 90 cx_test_suite_szmul(), 91 cx_test_suite_allocator(), 92 cx_test_suite_streams(), 93 cx_test_suite_compare(), 94 cx_test_suite_string(), 95 cx_test_suite_string_to_number(), 96 cx_test_suite_buffer(), 97 cx_test_suite_hash_key(), 98 cx_test_suite_hash_map(), 99 cx_test_suite_iterator(), 100 cx_test_suite_empty_list(), 101 cx_test_suite_array_list(), 102 cx_test_suite_array_list_defaulted_funcs(), 103 cx_test_suite_linked_list(), 104 cx_test_suite_linked_list_defaulted_funcs(), 105 cx_test_suite_kv_list(), 106 cx_test_suite_kv_list_specifics(), 107 cx_test_suite_list_set_ops(), 108 cx_test_suite_list_corner_cases(), 109 cx_test_suite_tree_low_level(), 110 cx_test_suite_tree_high_level(), 111 cx_test_suite_properties(), 112 cx_test_suite_mempool(), 113 cx_test_suite_json(), 114 cx_test_suite_printf() 115 ); 116 printf("=== OVERALL RESULT ===\n"); 117 printf(" Total: %u\n Success: %u\n Failure: %u\n", 118 success + failure, success, failure); 119 free_test_suites; 120 121 if (cx_testing_allocator_verify(&testing_allocator)) { 122 printf("\nAllocations verified successfully.\n"); 123 } else { 124 printf("\nVerifying allocations failed!\nSome cxMalloc() might not match a cxFree().\n" 125 "Aborting test execution.\nError must be in a function tested by the last executed test suite.\n" 126 "Total allocations: %u\n" 127 "Total frees: %u\n", testing_allocator.alloc_total, testing_allocator.free_total); 128 failure++; 129 } 130 cx_testing_allocator_destroy(&testing_allocator); 131 132 return failure > 0 ? 1 : 0; 133 } 134 135