X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=test%2Ftestutil.h;h=ecf993445de11a916cf9295166b816caed57f68a;hp=a83323b9e89c0cb858f6c16351220e3108fa77c0;hb=208d721a004026b128dc66300e32e65a9dc7df1d;hpb=298f40e1f14981e535f82edf407718680ad7f86a diff --git a/test/testutil.h b/test/testutil.h index a83323b9e8..ecf993445d 100644 --- a/test/testutil.h +++ b/test/testutil.h @@ -16,12 +16,9 @@ #include /*- - * Simple unit tests should implement register_tests() from test_main.h - * and link against test_main.c. + * Simple unit tests should implement register_tests(). * To register tests, call ADD_TEST or ADD_ALL_TESTS: * - * #include "test_main.h" - * * void register_tests(void) * { * ADD_TEST(test_foo); @@ -29,8 +26,7 @@ * } * * Tests that need to perform custom setup or read command-line arguments should - * implement test_main() from test_main_custom.h and link against - * test_main_custom.c: + * implement test_main(): * * int test_main(int argc, char *argv[]) * { @@ -57,7 +53,12 @@ * Simple parameterized tests. Calls test_function(idx) for each 0 <= idx < num. */ # define ADD_ALL_TESTS(test_function, num) \ - add_all_tests(#test_function, test_function, num) + add_all_tests(#test_function, test_function, num, 1) +/* + * A variant of the same without TAP output. + */ +# define ADD_ALL_TESTS_NOSUBTEST(test_function, num) \ + add_all_tests(#test_function, test_function, num, 0) /*- * Test cases that share common setup should use the helper @@ -135,17 +136,31 @@ void setup_test(void); __owur int finish_test(int ret); void add_test(const char *test_case_name, int (*test_fn) ()); -void add_all_tests(const char *test_case_name, int (*test_fn)(int idx), int num); +void add_all_tests(const char *test_case_name, int (*test_fn)(int idx), int num, + int subtest); __owur int run_tests(const char *test_prog_name); +/* + * Declarations for user defined functions + */ +void register_tests(void); +int test_main(int argc, char *argv[]); + + /* * Test assumption verification helpers. */ -# if defined(__GNUC__) -#define PRINTF_FORMAT(a, b) __attribute__ ((format(printf, a, b))) -# else #define PRINTF_FORMAT(a, b) +#if defined(__GNUC__) && defined(__STDC_VERSION__) + /* + * Because we support the 'z' modifier, which made its appearance in C99, + * we can't use __attribute__ with pre C99 dialects. + */ +# if __STDC_VERSION__ >= 199901L +# undef PRINTF_FORMAT +# define PRINTF_FORMAT(a, b) __attribute__ ((format(printf, a, b))) +# endif #endif # define DECLARE_COMPARISON(type, name, opname) \ @@ -167,7 +182,13 @@ DECLARE_COMPARISONS(char, char) DECLARE_COMPARISONS(unsigned char, uchar) DECLARE_COMPARISONS(long, long) DECLARE_COMPARISONS(unsigned long, ulong) +/* + * Because this comparison uses a printf format specifier that's not + * universally known (yet), we provide an option to not have it declared. + */ +# ifndef TESTUTIL_NO_size_t_COMPARISON DECLARE_COMPARISONS(size_t, size_t) +# endif /* * Pointer comparisons against other pointers and null. @@ -189,9 +210,17 @@ int test_ptr_null(const char *file, int line, const char *s, const void *p); DECLARE_COMPARISON(char *, str, eq) DECLARE_COMPARISON(char *, str, ne) +/* + * Same as above, but for strncmp. + */ +int test_strn_eq(const char *file, int line, const char *, const char *, + const char *a, const char *b, size_t s); +int test_strn_ne(const char *file, int line, const char *, const char *, + const char *a, const char *b, size_t s); + /* * Equality test for memory blocks where NULL is a legitimate value. -* These calls return 1 if the two memory blocks compare true. + * These calls return 1 if the two memory blocks compare true. * Otherwise, they return 0 and pretty-print diagnostics. * These should not be called directly, use the TEST_xxx macros below instead. */ @@ -223,6 +252,12 @@ void test_info_c90(const char *desc, ...) PRINTF_FORMAT(1, 2); /* * The following macros provide wrapper calls to the test functions with * a default description that indicates the file and line number of the error. + * + * The following macros guarantee to evaluate each argument exactly once. + * This allows constructs such as: if(!TEST_ptr(ptr = OPENSSL_malloc(..))) + * to produce better contextual output than: + * ptr = OPENSSL_malloc(..); + * if (!TEST_ptr(ptr)) */ # define TEST_int_eq(a, b) test_int_eq(__FILE__, __LINE__, #a, #b, a, b) # define TEST_int_ne(a, b) test_int_ne(__FILE__, __LINE__, #a, #b, a, b) @@ -238,47 +273,47 @@ void test_info_c90(const char *desc, ...) PRINTF_FORMAT(1, 2); # define TEST_int_gt(a, b) test_int_gt(__FILE__, __LINE__, #a, #b, a, b) # define TEST_int_ge(a, b) test_int_ge(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_uint_eq(a, b) test_uint_eq(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_uint_ne(a, b) test_uint_ne(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_uint_lt(a, b) test_uint_lt(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_uint_le(a, b) test_uint_le(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_uint_gt(a, b) test_uint_gt(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_uint_ge(a, b) test_uint_ge(__FILE__, __LINE__, #a, #b, a, b) - -# define TEST_char_eq(a, b) test_char_eq(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_char_ne(a, b) test_char_ne(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_char_lt(a, b) test_char_lt(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_char_le(a, b) test_char_le(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_char_gt(a, b) test_char_gt(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_char_ge(a, b) test_char_ge(__FILE__, __LINE__, #a, #b, a, b) - -# define TEST_uchar_eq(a, b) test_uchar_eq(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_uchar_ne(a, b) test_uchar_ne(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_uchar_lt(a, b) test_uchar_lt(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_uchar_le(a, b) test_uchar_le(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_uchar_gt(a, b) test_uchar_gt(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_uchar_ge(a, b) test_uchar_ge(__FILE__, __LINE__, #a, #b, a, b) - -# define TEST_long_eq(a, b) test_long_eq(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_long_ne(a, b) test_long_ne(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_long_lt(a, b) test_long_lt(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_long_le(a, b) test_long_le(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_long_gt(a, b) test_long_gt(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_long_ge(a, b) test_long_ge(__FILE__, __LINE__, #a, #b, a, b) - -# define TEST_ulong_eq(a, b) test_ulong_eq(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_ulong_ne(a, b) test_ulong_ne(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_ulong_lt(a, b) test_ulong_lt(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_ulong_le(a, b) test_ulong_le(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_ulong_gt(a, b) test_ulong_gt(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_ulong_ge(a, b) test_ulong_ge(__FILE__, __LINE__, #a, #b, a, b) - -# define TEST_size_t_eq(a, b) test_size_t_eq(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_size_t_ne(a, b) test_size_t_ne(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_size_t_lt(a, b) test_size_t_lt(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_size_t_le(a, b) test_size_t_le(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_size_t_gt(a, b) test_size_t_gt(__FILE__, __LINE__, #a, #b, a, b) -# define TEST_size_t_ge(a, b) test_size_t_ge(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_uint_eq(a, b) test_uint_eq(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_uint_ne(a, b) test_uint_ne(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_uint_lt(a, b) test_uint_lt(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_uint_le(a, b) test_uint_le(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_uint_gt(a, b) test_uint_gt(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_uint_ge(a, b) test_uint_ge(__FILE__, __LINE__, #a, #b, a, b) + +# define TEST_char_eq(a, b) test_char_eq(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_char_ne(a, b) test_char_ne(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_char_lt(a, b) test_char_lt(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_char_le(a, b) test_char_le(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_char_gt(a, b) test_char_gt(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_char_ge(a, b) test_char_ge(__FILE__, __LINE__, #a, #b, a, b) + +# define TEST_uchar_eq(a, b) test_uchar_eq(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_uchar_ne(a, b) test_uchar_ne(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_uchar_lt(a, b) test_uchar_lt(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_uchar_le(a, b) test_uchar_le(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_uchar_gt(a, b) test_uchar_gt(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_uchar_ge(a, b) test_uchar_ge(__FILE__, __LINE__, #a, #b, a, b) + +# define TEST_long_eq(a, b) test_long_eq(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_long_ne(a, b) test_long_ne(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_long_lt(a, b) test_long_lt(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_long_le(a, b) test_long_le(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_long_gt(a, b) test_long_gt(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_long_ge(a, b) test_long_ge(__FILE__, __LINE__, #a, #b, a, b) + +# define TEST_ulong_eq(a, b) test_ulong_eq(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_ulong_ne(a, b) test_ulong_ne(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_ulong_lt(a, b) test_ulong_lt(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_ulong_le(a, b) test_ulong_le(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_ulong_gt(a, b) test_ulong_gt(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_ulong_ge(a, b) test_ulong_ge(__FILE__, __LINE__, #a, #b, a, b) + +# define TEST_size_t_eq(a, b) test_size_t_eq(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_size_t_ne(a, b) test_size_t_ne(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_size_t_lt(a, b) test_size_t_lt(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_size_t_le(a, b) test_size_t_le(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_size_t_gt(a, b) test_size_t_gt(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_size_t_ge(a, b) test_size_t_ge(__FILE__, __LINE__, #a, #b, a, b) # define TEST_ptr_eq(a, b) test_ptr_eq(__FILE__, __LINE__, #a, #b, a, b) # define TEST_ptr_ne(a, b) test_ptr_ne(__FILE__, __LINE__, #a, #b, a, b) @@ -287,6 +322,8 @@ void test_info_c90(const char *desc, ...) PRINTF_FORMAT(1, 2); # define TEST_str_eq(a, b) test_str_eq(__FILE__, __LINE__, #a, #b, a, b) # define TEST_str_ne(a, b) test_str_ne(__FILE__, __LINE__, #a, #b, a, b) +# define TEST_strn_eq(a, b, n) test_strn_eq(__FILE__, __LINE__, #a, #b, a, b, n) +# define TEST_strn_ne(a, b, n) test_strn_ne(__FILE__, __LINE__, #a, #b, a, b, n) # define TEST_mem_eq(a, m, b, n) test_mem_eq(__FILE__, __LINE__, #a, #b, a, m, b, n) # define TEST_mem_ne(a, m, b, n) test_mem_ne(__FILE__, __LINE__, #a, #b, a, m, b, n) @@ -319,3 +356,24 @@ void test_info_c90(const char *desc, ...) PRINTF_FORMAT(1, 2); } \ } while (0) #endif /* HEADER_TESTUTIL_H */ + + +/* + * The basic I/O functions used by the test framework. These can be + * overriden when needed. Note that if one is, then all must be. + */ +void test_open_streams(void); +void test_close_streams(void); +/* The following ALL return the number of characters written */ +int test_puts_stdout(const char *str); +int test_puts_stderr(const char *str); +int test_vprintf_stdout(const char *fmt, va_list ap); +int test_vprintf_stderr(const char *fmt, va_list ap); +/* These return failure or success */ +int test_flush_stdout(void); +int test_flush_stderr(void); + +extern BIO *bio_out; +extern BIO *bio_err; + +int subtest_level(void);