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 run_tests(suite) cx_test_run_stdout(suite); success += (suite)->success; failure += (suite)->failure; \ 61 if (!cx_testing_allocator_verify(&testing_allocator)) break; 62 #define execute_test_suites(...) unsigned success = 0, failure = 0; CxTestSuite* test_suites[] = {__VA_ARGS__}; \ 63 for (size_t i = 0; i < cx_nmemb(test_suites) ; i++) {run_tests(test_suites[i]);} (void)0 64 #define free_test_suites for (size_t i = 0 ; i < cx_nmemb(test_suites) ; i++) {cx_test_suite_free(test_suites[i]);} (void)0 65 66 static int verify_testing_allocator(void) { 67 printf("Verify Testing Allocator\n"); 68 CxTestSuite *suite_ta = cx_test_suite_testing_allocator(); 69 int result = suite_ta->failure > 0; 70 cx_test_suite_free(suite_ta); 71 return result; 72 } 73 74 int main(void) { 75 if (verify_testing_allocator()) { 76 fprintf(stderr, "Testing Allocator is not working - cannot perform tests!\n"); 77 return EXIT_FAILURE; 78 } 79 80 // Replace the default allocator with the testing allocator 81 CxTestingAllocator testing_allocator; 82 cx_testing_allocator_init(&testing_allocator); 83 cxDefaultAllocator = &testing_allocator.base; 84 85 // Run tests 86 printf("UCX Tests\n---------\n"); 87 88 execute_test_suites( 89 cx_test_suite_szmul(), 90 cx_test_suite_allocator(), 91 cx_test_suite_streams(), 92 cx_test_suite_compare(), 93 cx_test_suite_string(), 94 cx_test_suite_string_to_number(), 95 cx_test_suite_buffer(), 96 cx_test_suite_hash_key(), 97 cx_test_suite_hash_map(), 98 cx_test_suite_iterator(), 99 cx_test_suite_empty_list(), 100 cx_test_suite_array_list(), 101 cx_test_suite_array_list_defaulted_funcs(), 102 cx_test_suite_linked_list(), 103 cx_test_suite_linked_list_defaulted_funcs(), 104 cx_test_suite_kv_list(), 105 cx_test_suite_kv_list_specifics(), 106 cx_test_suite_list_set_ops(), 107 cx_test_suite_list_corner_cases(), 108 cx_test_suite_tree_low_level(), 109 cx_test_suite_tree_high_level(), 110 cx_test_suite_properties(), 111 cx_test_suite_mempool(), 112 cx_test_suite_json(), 113 cx_test_suite_printf() 114 ); 115 printf("=== OVERALL RESULT ===\n"); 116 printf(" Total: %u\n Success: %u\n Failure: %u\n", 117 success + failure, success, failure); 118 free_test_suites; 119 120 if (cx_testing_allocator_verify(&testing_allocator)) { 121 printf("\nAllocations verified successfully.\n"); 122 } else { 123 printf("\nVerifying allocations failed!\nSome cxMalloc() might not match a cxFree().\n" 124 "Aborting test execution.\nError must be in a function tested by the last executed test suite.\n" 125 "Total allocations: %u\n" 126 "Total frees: %u\n", testing_allocator.alloc_total, testing_allocator.free_total); 127 failure++; 128 } 129 cx_testing_allocator_destroy(&testing_allocator); 130 131 return failure > 0 ? 1 : 0; 132 } 133 134