Rich Salz | 440e5d8 | 2016-05-17 14:20:24 -0400 | [diff] [blame] | 1 | /* |
Pauli | 8fe3127 | 2017-06-19 11:21:22 +1000 | [diff] [blame] | 2 | * Copyright 2014-2017 The OpenSSL Project Authors. All Rights Reserved. |
Mike Bland | 3ead9f3 | 2014-06-07 13:05:50 -0400 | [diff] [blame] | 3 | * |
Rich Salz | 440e5d8 | 2016-05-17 14:20:24 -0400 | [diff] [blame] | 4 | * Licensed under the OpenSSL license (the "License"). You may not use |
| 5 | * this file except in compliance with the License. You can obtain a copy |
| 6 | * in the file LICENSE in the source distribution or at |
| 7 | * https://www.openssl.org/source/license.html |
Mike Bland | 3ead9f3 | 2014-06-07 13:05:50 -0400 | [diff] [blame] | 8 | */ |
| 9 | |
| 10 | #ifndef HEADER_TESTUTIL_H |
Matt Caswell | 0f113f3 | 2015-01-22 03:40:55 +0000 | [diff] [blame] | 11 | # define HEADER_TESTUTIL_H |
Mike Bland | 3ead9f3 | 2014-06-07 13:05:50 -0400 | [diff] [blame] | 12 | |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 13 | #include <stdarg.h> |
| 14 | |
Emilia Kasper | d61f007 | 2016-08-09 17:03:23 +0200 | [diff] [blame] | 15 | #include <openssl/err.h> |
Emilia Kasper | e364c3b | 2016-11-07 16:53:15 +0100 | [diff] [blame] | 16 | #include <openssl/e_os2.h> |
Pauli | dc352c1 | 2017-05-08 12:09:41 +1000 | [diff] [blame] | 17 | #include <openssl/bn.h> |
Emilia Kasper | e364c3b | 2016-11-07 16:53:15 +0100 | [diff] [blame] | 18 | |
| 19 | /*- |
Pauli | ad88741 | 2017-07-18 11:48:27 +1000 | [diff] [blame] | 20 | * Simple unit tests should implement setup_tests(). |
| 21 | * This function should return zero if the registration process fails. |
Emilia Kasper | e364c3b | 2016-11-07 16:53:15 +0100 | [diff] [blame] | 22 | * To register tests, call ADD_TEST or ADD_ALL_TESTS: |
| 23 | * |
Pauli | ad88741 | 2017-07-18 11:48:27 +1000 | [diff] [blame] | 24 | * int setup_tests(void) |
Emilia Kasper | e364c3b | 2016-11-07 16:53:15 +0100 | [diff] [blame] | 25 | * { |
| 26 | * ADD_TEST(test_foo); |
| 27 | * ADD_ALL_TESTS(test_bar, num_test_bar); |
Pauli | ad88741 | 2017-07-18 11:48:27 +1000 | [diff] [blame] | 28 | * return 1; |
Emilia Kasper | e364c3b | 2016-11-07 16:53:15 +0100 | [diff] [blame] | 29 | * } |
| 30 | * |
Pauli | ad88741 | 2017-07-18 11:48:27 +1000 | [diff] [blame] | 31 | * Tests that require clean up after execution should implement: |
Emilia Kasper | e364c3b | 2016-11-07 16:53:15 +0100 | [diff] [blame] | 32 | * |
Pauli | ad88741 | 2017-07-18 11:48:27 +1000 | [diff] [blame] | 33 | * void cleanup_tests(void); |
Emilia Kasper | e364c3b | 2016-11-07 16:53:15 +0100 | [diff] [blame] | 34 | * |
Pauli | ad88741 | 2017-07-18 11:48:27 +1000 | [diff] [blame] | 35 | * The cleanup_tests function will be called even if setup_tests() |
| 36 | * returns failure. |
Emilia Kasper | e364c3b | 2016-11-07 16:53:15 +0100 | [diff] [blame] | 37 | * |
Pauli | ad88741 | 2017-07-18 11:48:27 +1000 | [diff] [blame] | 38 | * In some cases, early initialization before the framework is set up |
| 39 | * may be needed. In such a case, this should be implemented: |
Emilia Kasper | e364c3b | 2016-11-07 16:53:15 +0100 | [diff] [blame] | 40 | * |
Pauli | ad88741 | 2017-07-18 11:48:27 +1000 | [diff] [blame] | 41 | * int global_init(void); |
Emilia Kasper | e364c3b | 2016-11-07 16:53:15 +0100 | [diff] [blame] | 42 | * |
Pauli | ad88741 | 2017-07-18 11:48:27 +1000 | [diff] [blame] | 43 | * This function should return zero if there is an unrecoverable error and |
| 44 | * non-zero if the intialization was successful. |
Emilia Kasper | e364c3b | 2016-11-07 16:53:15 +0100 | [diff] [blame] | 45 | */ |
| 46 | |
| 47 | /* Adds a simple test case. */ |
| 48 | # define ADD_TEST(test_function) add_test(#test_function, test_function) |
Emilia Kasper | d61f007 | 2016-08-09 17:03:23 +0200 | [diff] [blame] | 49 | |
Emilia Kasper | 308b876 | 2016-11-03 17:15:41 +0100 | [diff] [blame] | 50 | /* |
Emilia Kasper | e364c3b | 2016-11-07 16:53:15 +0100 | [diff] [blame] | 51 | * Simple parameterized tests. Calls test_function(idx) for each 0 <= idx < num. |
Emilia Kasper | 308b876 | 2016-11-03 17:15:41 +0100 | [diff] [blame] | 52 | */ |
Emilia Kasper | e364c3b | 2016-11-07 16:53:15 +0100 | [diff] [blame] | 53 | # define ADD_ALL_TESTS(test_function, num) \ |
Richard Levitte | 208d721 | 2017-04-19 10:34:54 +0200 | [diff] [blame] | 54 | add_all_tests(#test_function, test_function, num, 1) |
| 55 | /* |
| 56 | * A variant of the same without TAP output. |
| 57 | */ |
| 58 | # define ADD_ALL_TESTS_NOSUBTEST(test_function, num) \ |
| 59 | add_all_tests(#test_function, test_function, num, 0) |
Emilia Kasper | 308b876 | 2016-11-03 17:15:41 +0100 | [diff] [blame] | 60 | |
Tim Hudson | 1d97c84 | 2014-12-28 12:48:40 +1000 | [diff] [blame] | 61 | /*- |
Emilia Kasper | 308b876 | 2016-11-03 17:15:41 +0100 | [diff] [blame] | 62 | * Test cases that share common setup should use the helper |
Tim Hudson | 1d97c84 | 2014-12-28 12:48:40 +1000 | [diff] [blame] | 63 | * SETUP_TEST_FIXTURE and EXECUTE_TEST macros for test case functions. |
Mike Bland | 3ead9f3 | 2014-06-07 13:05:50 -0400 | [diff] [blame] | 64 | * |
| 65 | * SETUP_TEST_FIXTURE will call set_up() to create a new TEST_FIXTURE_TYPE |
| 66 | * object called "fixture". It will also allocate the "result" variable used |
| 67 | * by EXECUTE_TEST. set_up() should take a const char* specifying the test |
| 68 | * case name and return a TEST_FIXTURE_TYPE by value. |
| 69 | * |
| 70 | * EXECUTE_TEST will pass fixture to execute_func() by value, call |
| 71 | * tear_down(), and return the result of execute_func(). execute_func() should |
Emilia Kasper | ababe86 | 2016-04-05 14:29:06 +0200 | [diff] [blame] | 72 | * take a TEST_FIXTURE_TYPE by value and return 1 on success and 0 on |
Mike Bland | 3ead9f3 | 2014-06-07 13:05:50 -0400 | [diff] [blame] | 73 | * failure. |
| 74 | * |
| 75 | * Unit tests can define their own SETUP_TEST_FIXTURE and EXECUTE_TEST |
| 76 | * variations like so: |
| 77 | * |
| 78 | * #define SETUP_FOOBAR_TEST_FIXTURE()\ |
| 79 | * SETUP_TEST_FIXTURE(FOOBAR_TEST_FIXTURE, set_up_foobar) |
| 80 | * |
| 81 | * #define EXECUTE_FOOBAR_TEST()\ |
| 82 | * EXECUTE_TEST(execute_foobar, tear_down_foobar) |
| 83 | * |
| 84 | * Then test case functions can take the form: |
| 85 | * |
| 86 | * static int test_foobar_feature() |
Matt Caswell | 0f113f3 | 2015-01-22 03:40:55 +0000 | [diff] [blame] | 87 | * { |
| 88 | * SETUP_FOOBAR_TEST_FIXTURE(); |
| 89 | * [...set individual members of fixture...] |
| 90 | * EXECUTE_FOOBAR_TEST(); |
| 91 | * } |
Mike Bland | 3ead9f3 | 2014-06-07 13:05:50 -0400 | [diff] [blame] | 92 | */ |
Matt Caswell | 0f113f3 | 2015-01-22 03:40:55 +0000 | [diff] [blame] | 93 | # define SETUP_TEST_FIXTURE(TEST_FIXTURE_TYPE, set_up)\ |
Emilia Kasper | 453dfd8 | 2016-03-17 15:14:30 +0100 | [diff] [blame] | 94 | TEST_FIXTURE_TYPE fixture = set_up(TEST_CASE_NAME); \ |
| 95 | int result = 0 |
Mike Bland | 3ead9f3 | 2014-06-07 13:05:50 -0400 | [diff] [blame] | 96 | |
Matt Caswell | 0f113f3 | 2015-01-22 03:40:55 +0000 | [diff] [blame] | 97 | # define EXECUTE_TEST(execute_func, tear_down)\ |
Emilia Kasper | ababe86 | 2016-04-05 14:29:06 +0200 | [diff] [blame] | 98 | result = execute_func(fixture);\ |
Matt Caswell | 0f113f3 | 2015-01-22 03:40:55 +0000 | [diff] [blame] | 99 | tear_down(fixture);\ |
| 100 | return result |
Mike Bland | 3ead9f3 | 2014-06-07 13:05:50 -0400 | [diff] [blame] | 101 | |
Emilia Kasper | d836d71 | 2016-11-04 16:06:12 +0100 | [diff] [blame] | 102 | /* Shorthand if tear_down does nothing. */ |
| 103 | # define EXECUTE_TEST_NO_TEARDOWN(execute_func)\ |
| 104 | result = execute_func(fixture);\ |
| 105 | return result |
| 106 | |
Matt Caswell | 0f113f3 | 2015-01-22 03:40:55 +0000 | [diff] [blame] | 107 | /* |
| 108 | * TEST_CASE_NAME is defined as the name of the test case function where |
Mike Bland | 3ead9f3 | 2014-06-07 13:05:50 -0400 | [diff] [blame] | 109 | * possible; otherwise we get by with the file name and line number. |
| 110 | */ |
Bernd Edlinger | 01b76c2 | 2017-02-23 14:52:23 +0100 | [diff] [blame] | 111 | # if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L |
Matt Caswell | 0f113f3 | 2015-01-22 03:40:55 +0000 | [diff] [blame] | 112 | # if defined(_MSC_VER) |
| 113 | # define TEST_CASE_NAME __FUNCTION__ |
| 114 | # else |
| 115 | # define testutil_stringify_helper(s) #s |
| 116 | # define testutil_stringify(s) testutil_stringify_helper(s) |
| 117 | # define TEST_CASE_NAME __FILE__ ":" testutil_stringify(__LINE__) |
| 118 | # endif /* _MSC_VER */ |
| 119 | # else |
| 120 | # define TEST_CASE_NAME __func__ |
| 121 | # endif /* __STDC_VERSION__ */ |
Mike Bland | 3ead9f3 | 2014-06-07 13:05:50 -0400 | [diff] [blame] | 122 | |
Matt Caswell | 0f113f3 | 2015-01-22 03:40:55 +0000 | [diff] [blame] | 123 | /* |
Pauli | ad88741 | 2017-07-18 11:48:27 +1000 | [diff] [blame] | 124 | * Tests that need access to command line arguments should use the functions: |
| 125 | * test_get_argument(int n) to get the nth argument, the first argument is |
| 126 | * argument 0. This function returns NULL on error. |
| 127 | * test_get_argument_count() to get the count of the arguments. |
| 128 | * test_has_option(const char *) to check if the specified option was passed. |
| 129 | * test_get_option_argument(const char *) to get an option which includes an |
| 130 | * argument. NULL is returns if the option is not found. |
| 131 | * const char *test_get_program_name(void) returns the name of the test program |
| 132 | * being executed. |
| 133 | */ |
| 134 | const char *test_get_program_name(void); |
| 135 | char *test_get_argument(size_t n); |
| 136 | size_t test_get_argument_count(void); |
| 137 | int test_has_option(const char *option); |
| 138 | const char *test_get_option_argument(const char *option); |
| 139 | |
| 140 | /* |
Emilia Kasper | e364c3b | 2016-11-07 16:53:15 +0100 | [diff] [blame] | 141 | * Internal helpers. Test programs shouldn't use these directly, but should |
| 142 | * rather link to one of the helper main() methods. |
Emilia Kasper | 453dfd8 | 2016-03-17 15:14:30 +0100 | [diff] [blame] | 143 | */ |
Emilia Kasper | e364c3b | 2016-11-07 16:53:15 +0100 | [diff] [blame] | 144 | |
Pauli | 735e350 | 2017-07-28 09:26:40 +1000 | [diff] [blame^] | 145 | void add_test(const char *test_case_name, int (*test_fn) (void)); |
Richard Levitte | 208d721 | 2017-04-19 10:34:54 +0200 | [diff] [blame] | 146 | void add_all_tests(const char *test_case_name, int (*test_fn)(int idx), int num, |
| 147 | int subtest); |
Mike Bland | 5e3de8e | 2014-06-19 12:27:54 -0400 | [diff] [blame] | 148 | |
Emilia Kasper | ce2cdac | 2016-07-04 20:16:14 +0200 | [diff] [blame] | 149 | /* |
Pauli | ad88741 | 2017-07-18 11:48:27 +1000 | [diff] [blame] | 150 | * Declarations for user defined functions. |
| 151 | * The first two return a boolean indicating that the test should not proceed. |
Richard Levitte | 4db40c9 | 2017-04-18 16:27:27 +0200 | [diff] [blame] | 152 | */ |
Pauli | ad88741 | 2017-07-18 11:48:27 +1000 | [diff] [blame] | 153 | int global_init(void); |
| 154 | int setup_tests(void); |
| 155 | void cleanup_tests(void); |
Richard Levitte | 4db40c9 | 2017-04-18 16:27:27 +0200 | [diff] [blame] | 156 | |
| 157 | /* |
Emilia Kasper | ce2cdac | 2016-07-04 20:16:14 +0200 | [diff] [blame] | 158 | * Test assumption verification helpers. |
| 159 | */ |
| 160 | |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 161 | #define PRINTF_FORMAT(a, b) |
Richard Levitte | 4db40c9 | 2017-04-18 16:27:27 +0200 | [diff] [blame] | 162 | #if defined(__GNUC__) && defined(__STDC_VERSION__) |
| 163 | /* |
| 164 | * Because we support the 'z' modifier, which made its appearance in C99, |
| 165 | * we can't use __attribute__ with pre C99 dialects. |
| 166 | */ |
| 167 | # if __STDC_VERSION__ >= 199901L |
| 168 | # undef PRINTF_FORMAT |
| 169 | # define PRINTF_FORMAT(a, b) __attribute__ ((format(printf, a, b))) |
| 170 | # endif |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 171 | #endif |
| 172 | |
Pauli | 735e350 | 2017-07-28 09:26:40 +1000 | [diff] [blame^] | 173 | # define DECLARE_COMPARISON(type, name, opname) \ |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 174 | int test_ ## name ## _ ## opname(const char *, int, \ |
| 175 | const char *, const char *, \ |
| 176 | const type, const type); |
| 177 | |
| 178 | # define DECLARE_COMPARISONS(type, name) \ |
| 179 | DECLARE_COMPARISON(type, name, eq) \ |
| 180 | DECLARE_COMPARISON(type, name, ne) \ |
| 181 | DECLARE_COMPARISON(type, name, lt) \ |
| 182 | DECLARE_COMPARISON(type, name, le) \ |
| 183 | DECLARE_COMPARISON(type, name, gt) \ |
| 184 | DECLARE_COMPARISON(type, name, ge) |
| 185 | |
| 186 | DECLARE_COMPARISONS(int, int) |
| 187 | DECLARE_COMPARISONS(unsigned int, uint) |
| 188 | DECLARE_COMPARISONS(char, char) |
| 189 | DECLARE_COMPARISONS(unsigned char, uchar) |
| 190 | DECLARE_COMPARISONS(long, long) |
| 191 | DECLARE_COMPARISONS(unsigned long, ulong) |
Richard Levitte | f044cd0 | 2017-04-19 13:06:08 +0200 | [diff] [blame] | 192 | /* |
| 193 | * Because this comparison uses a printf format specifier that's not |
| 194 | * universally known (yet), we provide an option to not have it declared. |
| 195 | */ |
| 196 | # ifndef TESTUTIL_NO_size_t_COMPARISON |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 197 | DECLARE_COMPARISONS(size_t, size_t) |
Richard Levitte | f044cd0 | 2017-04-19 13:06:08 +0200 | [diff] [blame] | 198 | # endif |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 199 | |
Emilia Kasper | ce2cdac | 2016-07-04 20:16:14 +0200 | [diff] [blame] | 200 | /* |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 201 | * Pointer comparisons against other pointers and null. |
| 202 | * These functions return 1 if the test is true. |
| 203 | * Otherwise, they return 0 and pretty-print diagnostics. |
| 204 | * These should not be called directly, use the TEST_xxx macros below instead. |
Emilia Kasper | ce2cdac | 2016-07-04 20:16:14 +0200 | [diff] [blame] | 205 | */ |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 206 | DECLARE_COMPARISON(void *, ptr, eq) |
| 207 | DECLARE_COMPARISON(void *, ptr, ne) |
| 208 | int test_ptr(const char *file, int line, const char *s, const void *p); |
| 209 | int test_ptr_null(const char *file, int line, const char *s, const void *p); |
| 210 | |
| 211 | /* |
| 212 | * Equality tests for strings where NULL is a legitimate value. |
| 213 | * These calls return 1 if the two passed strings compare true. |
| 214 | * Otherwise, they return 0 and pretty-print diagnostics. |
| 215 | * These should not be called directly, use the TEST_xxx macros below instead. |
| 216 | */ |
| 217 | DECLARE_COMPARISON(char *, str, eq) |
| 218 | DECLARE_COMPARISON(char *, str, ne) |
| 219 | |
| 220 | /* |
Rich Salz | adcd8e3 | 2017-04-18 16:33:15 -0400 | [diff] [blame] | 221 | * Same as above, but for strncmp. |
| 222 | */ |
| 223 | int test_strn_eq(const char *file, int line, const char *, const char *, |
| 224 | const char *a, const char *b, size_t s); |
| 225 | int test_strn_ne(const char *file, int line, const char *, const char *, |
| 226 | const char *a, const char *b, size_t s); |
| 227 | |
| 228 | /* |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 229 | * Equality test for memory blocks where NULL is a legitimate value. |
Pauli | d063add | 2017-04-13 08:51:28 +1000 | [diff] [blame] | 230 | * These calls return 1 if the two memory blocks compare true. |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 231 | * Otherwise, they return 0 and pretty-print diagnostics. |
| 232 | * These should not be called directly, use the TEST_xxx macros below instead. |
| 233 | */ |
| 234 | int test_mem_eq(const char *, int, const char *, const char *, |
| 235 | const void *, size_t, const void *, size_t); |
| 236 | int test_mem_ne(const char *, int, const char *, const char *, |
| 237 | const void *, size_t, const void *, size_t); |
| 238 | |
| 239 | /* |
| 240 | * Check a boolean result for being true or false. |
| 241 | * They return 1 if the condition is true (i.e. the value is non-zro). |
| 242 | * Otherwise, they return 0 and pretty-prints diagnostics using |desc|. |
| 243 | * These should not be called directly, use the TEST_xxx macros below instead. |
| 244 | */ |
| 245 | int test_true(const char *file, int line, const char *s, int b); |
| 246 | int test_false(const char *file, int line, const char *s, int b); |
| 247 | |
| 248 | /* |
Pauli | dc352c1 | 2017-05-08 12:09:41 +1000 | [diff] [blame] | 249 | * Comparisons between BIGNUMs. |
| 250 | * BIGNUMS can be compared against other BIGNUMs or zero. |
| 251 | * Some additional equality tests against 1 & specific values are provided. |
| 252 | * Tests for parity are included as well. |
| 253 | */ |
| 254 | DECLARE_COMPARISONS(BIGNUM *, BN) |
| 255 | int test_BN_eq_zero(const char *file, int line, const char *s, const BIGNUM *a); |
| 256 | int test_BN_ne_zero(const char *file, int line, const char *s, const BIGNUM *a); |
| 257 | int test_BN_lt_zero(const char *file, int line, const char *s, const BIGNUM *a); |
| 258 | int test_BN_le_zero(const char *file, int line, const char *s, const BIGNUM *a); |
| 259 | int test_BN_gt_zero(const char *file, int line, const char *s, const BIGNUM *a); |
| 260 | int test_BN_ge_zero(const char *file, int line, const char *s, const BIGNUM *a); |
| 261 | int test_BN_eq_one(const char *file, int line, const char *s, const BIGNUM *a); |
| 262 | int test_BN_odd(const char *file, int line, const char *s, const BIGNUM *a); |
| 263 | int test_BN_even(const char *file, int line, const char *s, const BIGNUM *a); |
| 264 | int test_BN_eq_word(const char *file, int line, const char *bns, const char *ws, |
| 265 | const BIGNUM *a, BN_ULONG w); |
| 266 | int test_BN_abs_eq_word(const char *file, int line, const char *bns, |
| 267 | const char *ws, const BIGNUM *a, BN_ULONG w); |
| 268 | |
| 269 | /* |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 270 | * Pretty print a failure message. |
| 271 | * These should not be called directly, use the TEST_xxx macros below instead. |
| 272 | */ |
| 273 | void test_error(const char *file, int line, const char *desc, ...) |
| 274 | PRINTF_FORMAT(3, 4); |
| 275 | void test_error_c90(const char *desc, ...) PRINTF_FORMAT(1, 2); |
| 276 | void test_info(const char *file, int line, const char *desc, ...) |
| 277 | PRINTF_FORMAT(3, 4); |
| 278 | void test_info_c90(const char *desc, ...) PRINTF_FORMAT(1, 2); |
Pauli | 3791646 | 2017-06-12 10:01:17 +1000 | [diff] [blame] | 279 | void test_note(const char *desc, ...) PRINTF_FORMAT(1, 2); |
Richard Levitte | 68e49bf | 2017-04-28 14:48:13 +0200 | [diff] [blame] | 280 | void test_openssl_errors(void); |
Pauli | 8fe3127 | 2017-06-19 11:21:22 +1000 | [diff] [blame] | 281 | void test_perror(const char *s); |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 282 | |
| 283 | /* |
| 284 | * The following macros provide wrapper calls to the test functions with |
| 285 | * a default description that indicates the file and line number of the error. |
Pauli | d063add | 2017-04-13 08:51:28 +1000 | [diff] [blame] | 286 | * |
| 287 | * The following macros guarantee to evaluate each argument exactly once. |
| 288 | * This allows constructs such as: if(!TEST_ptr(ptr = OPENSSL_malloc(..))) |
| 289 | * to produce better contextual output than: |
| 290 | * ptr = OPENSSL_malloc(..); |
| 291 | * if (!TEST_ptr(ptr)) |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 292 | */ |
| 293 | # define TEST_int_eq(a, b) test_int_eq(__FILE__, __LINE__, #a, #b, a, b) |
| 294 | # define TEST_int_ne(a, b) test_int_ne(__FILE__, __LINE__, #a, #b, a, b) |
| 295 | # define TEST_int_lt(a, b) test_int_lt(__FILE__, __LINE__, #a, #b, a, b) |
| 296 | # define TEST_int_le(a, b) test_int_le(__FILE__, __LINE__, #a, #b, a, b) |
| 297 | # define TEST_int_gt(a, b) test_int_gt(__FILE__, __LINE__, #a, #b, a, b) |
| 298 | # define TEST_int_ge(a, b) test_int_ge(__FILE__, __LINE__, #a, #b, a, b) |
| 299 | |
| 300 | # define TEST_int_eq(a, b) test_int_eq(__FILE__, __LINE__, #a, #b, a, b) |
| 301 | # define TEST_int_ne(a, b) test_int_ne(__FILE__, __LINE__, #a, #b, a, b) |
| 302 | # define TEST_int_lt(a, b) test_int_lt(__FILE__, __LINE__, #a, #b, a, b) |
| 303 | # define TEST_int_le(a, b) test_int_le(__FILE__, __LINE__, #a, #b, a, b) |
| 304 | # define TEST_int_gt(a, b) test_int_gt(__FILE__, __LINE__, #a, #b, a, b) |
| 305 | # define TEST_int_ge(a, b) test_int_ge(__FILE__, __LINE__, #a, #b, a, b) |
| 306 | |
Pauli | d063add | 2017-04-13 08:51:28 +1000 | [diff] [blame] | 307 | # define TEST_uint_eq(a, b) test_uint_eq(__FILE__, __LINE__, #a, #b, a, b) |
| 308 | # define TEST_uint_ne(a, b) test_uint_ne(__FILE__, __LINE__, #a, #b, a, b) |
| 309 | # define TEST_uint_lt(a, b) test_uint_lt(__FILE__, __LINE__, #a, #b, a, b) |
| 310 | # define TEST_uint_le(a, b) test_uint_le(__FILE__, __LINE__, #a, #b, a, b) |
| 311 | # define TEST_uint_gt(a, b) test_uint_gt(__FILE__, __LINE__, #a, #b, a, b) |
| 312 | # define TEST_uint_ge(a, b) test_uint_ge(__FILE__, __LINE__, #a, #b, a, b) |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 313 | |
Pauli | d063add | 2017-04-13 08:51:28 +1000 | [diff] [blame] | 314 | # define TEST_char_eq(a, b) test_char_eq(__FILE__, __LINE__, #a, #b, a, b) |
| 315 | # define TEST_char_ne(a, b) test_char_ne(__FILE__, __LINE__, #a, #b, a, b) |
| 316 | # define TEST_char_lt(a, b) test_char_lt(__FILE__, __LINE__, #a, #b, a, b) |
| 317 | # define TEST_char_le(a, b) test_char_le(__FILE__, __LINE__, #a, #b, a, b) |
| 318 | # define TEST_char_gt(a, b) test_char_gt(__FILE__, __LINE__, #a, #b, a, b) |
| 319 | # define TEST_char_ge(a, b) test_char_ge(__FILE__, __LINE__, #a, #b, a, b) |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 320 | |
Pauli | d063add | 2017-04-13 08:51:28 +1000 | [diff] [blame] | 321 | # define TEST_uchar_eq(a, b) test_uchar_eq(__FILE__, __LINE__, #a, #b, a, b) |
| 322 | # define TEST_uchar_ne(a, b) test_uchar_ne(__FILE__, __LINE__, #a, #b, a, b) |
| 323 | # define TEST_uchar_lt(a, b) test_uchar_lt(__FILE__, __LINE__, #a, #b, a, b) |
| 324 | # define TEST_uchar_le(a, b) test_uchar_le(__FILE__, __LINE__, #a, #b, a, b) |
| 325 | # define TEST_uchar_gt(a, b) test_uchar_gt(__FILE__, __LINE__, #a, #b, a, b) |
| 326 | # define TEST_uchar_ge(a, b) test_uchar_ge(__FILE__, __LINE__, #a, #b, a, b) |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 327 | |
Pauli | d063add | 2017-04-13 08:51:28 +1000 | [diff] [blame] | 328 | # define TEST_long_eq(a, b) test_long_eq(__FILE__, __LINE__, #a, #b, a, b) |
| 329 | # define TEST_long_ne(a, b) test_long_ne(__FILE__, __LINE__, #a, #b, a, b) |
| 330 | # define TEST_long_lt(a, b) test_long_lt(__FILE__, __LINE__, #a, #b, a, b) |
| 331 | # define TEST_long_le(a, b) test_long_le(__FILE__, __LINE__, #a, #b, a, b) |
| 332 | # define TEST_long_gt(a, b) test_long_gt(__FILE__, __LINE__, #a, #b, a, b) |
| 333 | # define TEST_long_ge(a, b) test_long_ge(__FILE__, __LINE__, #a, #b, a, b) |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 334 | |
Pauli | d063add | 2017-04-13 08:51:28 +1000 | [diff] [blame] | 335 | # define TEST_ulong_eq(a, b) test_ulong_eq(__FILE__, __LINE__, #a, #b, a, b) |
| 336 | # define TEST_ulong_ne(a, b) test_ulong_ne(__FILE__, __LINE__, #a, #b, a, b) |
| 337 | # define TEST_ulong_lt(a, b) test_ulong_lt(__FILE__, __LINE__, #a, #b, a, b) |
| 338 | # define TEST_ulong_le(a, b) test_ulong_le(__FILE__, __LINE__, #a, #b, a, b) |
| 339 | # define TEST_ulong_gt(a, b) test_ulong_gt(__FILE__, __LINE__, #a, #b, a, b) |
| 340 | # define TEST_ulong_ge(a, b) test_ulong_ge(__FILE__, __LINE__, #a, #b, a, b) |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 341 | |
Pauli | d063add | 2017-04-13 08:51:28 +1000 | [diff] [blame] | 342 | # define TEST_size_t_eq(a, b) test_size_t_eq(__FILE__, __LINE__, #a, #b, a, b) |
| 343 | # define TEST_size_t_ne(a, b) test_size_t_ne(__FILE__, __LINE__, #a, #b, a, b) |
| 344 | # define TEST_size_t_lt(a, b) test_size_t_lt(__FILE__, __LINE__, #a, #b, a, b) |
| 345 | # define TEST_size_t_le(a, b) test_size_t_le(__FILE__, __LINE__, #a, #b, a, b) |
| 346 | # define TEST_size_t_gt(a, b) test_size_t_gt(__FILE__, __LINE__, #a, #b, a, b) |
| 347 | # define TEST_size_t_ge(a, b) test_size_t_ge(__FILE__, __LINE__, #a, #b, a, b) |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 348 | |
| 349 | # define TEST_ptr_eq(a, b) test_ptr_eq(__FILE__, __LINE__, #a, #b, a, b) |
| 350 | # define TEST_ptr_ne(a, b) test_ptr_ne(__FILE__, __LINE__, #a, #b, a, b) |
| 351 | # define TEST_ptr(a) test_ptr(__FILE__, __LINE__, #a, a) |
| 352 | # define TEST_ptr_null(a) test_ptr_null(__FILE__, __LINE__, #a, a) |
| 353 | |
| 354 | # define TEST_str_eq(a, b) test_str_eq(__FILE__, __LINE__, #a, #b, a, b) |
| 355 | # define TEST_str_ne(a, b) test_str_ne(__FILE__, __LINE__, #a, #b, a, b) |
Rich Salz | adcd8e3 | 2017-04-18 16:33:15 -0400 | [diff] [blame] | 356 | # define TEST_strn_eq(a, b, n) test_strn_eq(__FILE__, __LINE__, #a, #b, a, b, n) |
| 357 | # define TEST_strn_ne(a, b, n) test_strn_ne(__FILE__, __LINE__, #a, #b, a, b, n) |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 358 | |
| 359 | # define TEST_mem_eq(a, m, b, n) test_mem_eq(__FILE__, __LINE__, #a, #b, a, m, b, n) |
| 360 | # define TEST_mem_ne(a, m, b, n) test_mem_ne(__FILE__, __LINE__, #a, #b, a, m, b, n) |
| 361 | |
Pauli | 298f40e | 2017-04-10 07:13:59 +1000 | [diff] [blame] | 362 | # define TEST_true(a) test_true(__FILE__, __LINE__, #a, (a) != 0) |
| 363 | # define TEST_false(a) test_false(__FILE__, __LINE__, #a, (a) != 0) |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 364 | |
Pauli | dc352c1 | 2017-05-08 12:09:41 +1000 | [diff] [blame] | 365 | # define TEST_BN_eq(a, b) test_BN_eq(__FILE__, __LINE__, #a, #b, a, b) |
| 366 | # define TEST_BN_ne(a, b) test_BN_ne(__FILE__, __LINE__, #a, #b, a, b) |
Pauli | 03d8e9c | 2017-05-09 07:58:55 +1000 | [diff] [blame] | 367 | # define TEST_BN_lt(a, b) test_BN_lt(__FILE__, __LINE__, #a, #b, a, b) |
| 368 | # define TEST_BN_gt(a, b) test_BN_gt(__FILE__, __LINE__, #a, #b, a, b) |
| 369 | # define TEST_BN_le(a, b) test_BN_le(__FILE__, __LINE__, #a, #b, a, b) |
| 370 | # define TEST_BN_ge(a, b) test_BN_ge(__FILE__, __LINE__, #a, #b, a, b) |
Pauli | dc352c1 | 2017-05-08 12:09:41 +1000 | [diff] [blame] | 371 | # define TEST_BN_eq_zero(a) test_BN_eq_zero(__FILE__, __LINE__, #a, a) |
| 372 | # define TEST_BN_ne_zero(a) test_BN_ne_zero(__FILE__, __LINE__, #a, a) |
| 373 | # define TEST_BN_lt_zero(a) test_BN_lt_zero(__FILE__, __LINE__, #a, a) |
| 374 | # define TEST_BN_gt_zero(a) test_BN_gt_zero(__FILE__, __LINE__, #a, a) |
| 375 | # define TEST_BN_le_zero(a) test_BN_le_zero(__FILE__, __LINE__, #a, a) |
| 376 | # define TEST_BN_ge_zero(a) test_BN_ge_zero(__FILE__, __LINE__, #a, a) |
| 377 | # define TEST_BN_eq_one(a) test_BN_eq_one(__FILE__, __LINE__, #a, a) |
| 378 | # define TEST_BN_eq_word(a, w) test_BN_eq_word(__FILE__, __LINE__, #a, #w, a, w) |
| 379 | # define TEST_BN_abs_eq_word(a, w) test_BN_abs_eq_word(__FILE__, __LINE__, #a, #w, a, w) |
| 380 | # define TEST_BN_odd(a) test_BN_odd(__FILE__, __LINE__, #a, a) |
| 381 | # define TEST_BN_even(a) test_BN_even(__FILE__, __LINE__, #a, a) |
| 382 | |
Pauli | 2fae041 | 2017-03-22 14:27:55 +1000 | [diff] [blame] | 383 | /* |
| 384 | * TEST_error(desc, ...) prints an informative error message in the standard |
| 385 | * format. |desc| is a printf format string. |
| 386 | */ |
| 387 | # if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L |
| 388 | # define TEST_error test_error_c90 |
| 389 | # define TEST_info test_info_c90 |
| 390 | # else |
| 391 | # define TEST_error(...) test_error(__FILE__, __LINE__, __VA_ARGS__) |
| 392 | # define TEST_info(...) test_info(__FILE__, __LINE__, __VA_ARGS__) |
| 393 | # endif |
Pauli | 3791646 | 2017-06-12 10:01:17 +1000 | [diff] [blame] | 394 | # define TEST_note test_note |
Richard Levitte | 68e49bf | 2017-04-28 14:48:13 +0200 | [diff] [blame] | 395 | # define TEST_openssl_errors test_openssl_errors |
Pauli | 8fe3127 | 2017-06-19 11:21:22 +1000 | [diff] [blame] | 396 | # define TEST_perror test_perror |
Emilia Kasper | d61f007 | 2016-08-09 17:03:23 +0200 | [diff] [blame] | 397 | |
Richard Levitte | 4db40c9 | 2017-04-18 16:27:27 +0200 | [diff] [blame] | 398 | extern BIO *bio_out; |
| 399 | extern BIO *bio_err; |
Richard Levitte | 208d721 | 2017-04-19 10:34:54 +0200 | [diff] [blame] | 400 | |
Rich Salz | ae269dd | 2017-06-05 13:32:05 -0400 | [diff] [blame] | 401 | /* |
Pauli | 3791646 | 2017-06-12 10:01:17 +1000 | [diff] [blame] | 402 | * Formatted output for strings, memory and bignums. |
| 403 | */ |
| 404 | void test_output_string(const char *name, const char *m, size_t l); |
| 405 | void test_output_bignum(const char *name, const BIGNUM *bn); |
| 406 | void test_output_memory(const char *name, const unsigned char *m, size_t l); |
| 407 | |
| 408 | |
| 409 | /* |
Rich Salz | ae269dd | 2017-06-05 13:32:05 -0400 | [diff] [blame] | 410 | * Utilities to parse a test file. |
| 411 | */ |
| 412 | #define TESTMAXPAIRS 20 |
| 413 | |
| 414 | typedef struct pair_st { |
| 415 | char *key; |
| 416 | char *value; |
| 417 | } PAIR; |
| 418 | |
| 419 | typedef struct stanza_st { |
| 420 | const char *test_file; /* Input file name */ |
| 421 | BIO *fp; /* Input file */ |
| 422 | int curr; /* Current line in file */ |
| 423 | int start; /* Line where test starts */ |
| 424 | int errors; /* Error count */ |
| 425 | int numtests; /* Number of tests */ |
| 426 | int numskip; /* Number of skipped tests */ |
| 427 | int numpairs; |
| 428 | PAIR pairs[TESTMAXPAIRS]; |
| 429 | BIO *key; /* temp memory BIO for reading in keys */ |
| 430 | char buff[4096]; /* Input buffer for a single key/value */ |
| 431 | } STANZA; |
| 432 | |
| 433 | /* |
| 434 | * Prepare to start reading the file |testfile| as input. |
| 435 | */ |
| 436 | int test_start_file(STANZA *s, const char *testfile); |
| 437 | int test_end_file(STANZA *s); |
| 438 | |
| 439 | /* |
| 440 | * Read a stanza from the test file. A stanza consists of a block |
Paul Yang | bd91e3c | 2017-06-06 23:35:43 +0800 | [diff] [blame] | 441 | * of lines of the form |
Rich Salz | ae269dd | 2017-06-05 13:32:05 -0400 | [diff] [blame] | 442 | * key = value |
| 443 | * The block is terminated by EOF or a blank line. |
| 444 | * Return 1 if found, 0 on EOF or error. |
| 445 | */ |
| 446 | int test_readstanza(STANZA *s); |
| 447 | |
| 448 | /* |
| 449 | * Clear a stanza, release all allocated memory. |
| 450 | */ |
| 451 | void test_clearstanza(STANZA *s); |
| 452 | |
Richard Levitte | 579d0fa | 2017-04-28 14:37:19 +0200 | [diff] [blame] | 453 | #endif /* HEADER_TESTUTIL_H */ |