Annotation of embedaddon/bird2/test/birdtest.h, revision 1.1
1.1 ! misho 1: /*
! 2: * BIRD -- Unit Test Framework (BIRD Test)
! 3: *
! 4: * Can be freely distributed and used under the terms of the GNU GPL.
! 5: */
! 6:
! 7: #ifndef _BIRDTEST_H_
! 8: #define _BIRDTEST_H_
! 9:
! 10: #include <stdio.h>
! 11: #include <stdlib.h>
! 12: #include <stdint.h>
! 13: #include <string.h>
! 14: #include <errno.h>
! 15: #include <sys/types.h>
! 16:
! 17: #include "nest/bird.h"
! 18:
! 19:
! 20: extern int bt_result;
! 21: extern int bt_suite_result;
! 22: extern char bt_out_fmt_buf[1024];
! 23:
! 24: extern uint bt_verbose;
! 25: #define BT_VERBOSE_NO 0
! 26: #define BT_VERBOSE_SUITE 1
! 27: #define BT_VERBOSE_SUITE_CASE 2
! 28: #define BT_VERBOSE_ABSOLUTELY_ALL 3
! 29:
! 30: extern const char *bt_filename;
! 31: extern const char *bt_test_id;
! 32:
! 33: void bt_init(int argc, char *argv[]);
! 34: int bt_exit_value(void);
! 35: int bt_test_suite_base(int (*test_fn)(const void *), const char *test_id, const void *test_fn_argument, int forked, int timeout, const char *dsc, ...);
! 36: static inline u64 bt_random(void)
! 37: { return ((u64) random() & 0xffffffff) | ((u64) random() << 32); }
! 38:
! 39: void bt_log_suite_result(int result, const char *fmt, ...);
! 40: void bt_log_suite_case_result(int result, const char *fmt, ...);
! 41:
! 42: #define BT_TIMEOUT 5 /* Default timeout in seconds */
! 43: #define BT_FORKING 1 /* Forking is enabled in default */
! 44:
! 45: #define BT_RANDOM_SEED 0x5097d2bb
! 46:
! 47: #define BT_BUFFER_SIZE 10000
! 48:
! 49: #define BT_PROMPT_GREEN "\e[1;32m"
! 50: #define BT_PROMPT_RED "\e[1;31m"
! 51: #define BT_PROMPT_NORMAL "\e[0m"
! 52: #define BT_PROMPT_OK " [" BT_PROMPT_GREEN " OK " BT_PROMPT_NORMAL "] "
! 53: #define BT_PROMPT_OK_NO_COLOR " [" " OK " "] "
! 54: #define BT_PROMPT_FAIL " [" BT_PROMPT_RED "FAIL" BT_PROMPT_NORMAL "] "
! 55: #define BT_PROMPT_FAIL_NO_COLOR " [" "FAIL" "] "
! 56: #define BT_PROMPT_OK_FAIL_STRLEN 8 /* strlen ' [FAIL] ' */
! 57:
! 58: static inline int bt_test_fn_noarg(const void *cp) { return ((int (*)(void)) cp)(); }
! 59:
! 60: #define bt_test_suite(fn, dsc, ...) \
! 61: bt_test_suite_extra(fn, BT_FORKING, BT_TIMEOUT, dsc, ##__VA_ARGS__)
! 62:
! 63: #define bt_test_suite_extra(fn, f, t, dsc, ...) \
! 64: bt_test_suite_base(bt_test_fn_noarg, #fn, fn, f, t, dsc, ##__VA_ARGS__)
! 65:
! 66: #define bt_test_suite_arg(fn, arg, dsc, ...) \
! 67: bt_test_suite_arg_extra(fn, arg, BT_FORKING, BT_TIMEOUT, dsc, ##__VA_ARGS__)
! 68:
! 69: #define bt_test_suite_arg_extra(fn, arg, f, t, dsc, ...) \
! 70: bt_test_suite_base(fn, #fn, arg, f, t, dsc, ##__VA_ARGS__)
! 71:
! 72: #define bt_abort() \
! 73: bt_abort_msg("Aborted at %s:%d", __FILE__, __LINE__)
! 74:
! 75: #define bt_abort_msg(format, ...) \
! 76: do \
! 77: { \
! 78: bt_log(format, ##__VA_ARGS__); \
! 79: abort(); \
! 80: } while (0)
! 81:
! 82: #define bt_log(format, ...) \
! 83: do \
! 84: { \
! 85: if (bt_test_id) \
! 86: printf("%s: %s: " format "\n", bt_filename, bt_test_id, ##__VA_ARGS__); \
! 87: else \
! 88: printf("%s: " format "\n", bt_filename, ##__VA_ARGS__); \
! 89: } while(0)
! 90:
! 91: #define bt_debug(format, ...) \
! 92: do \
! 93: { \
! 94: if (bt_verbose >= BT_VERBOSE_ABSOLUTELY_ALL) \
! 95: printf(format, ##__VA_ARGS__); \
! 96: } while (0)
! 97:
! 98: #define bt_assert(test) \
! 99: bt_assert_msg(test, "Assertion (%s) at %s:%d", #test, __FILE__, __LINE__)
! 100:
! 101: #define bt_assert_msg(test, format, ...) \
! 102: do \
! 103: { \
! 104: int bt_suit_case_result = 1; \
! 105: if ((test) == 0) \
! 106: { \
! 107: bt_result = 0; \
! 108: bt_suite_result = 0; \
! 109: bt_suit_case_result = 0; \
! 110: } \
! 111: bt_log_suite_case_result(bt_suit_case_result, format, ##__VA_ARGS__); \
! 112: } while (0)
! 113:
! 114: #define bt_syscall(test, format, ...) \
! 115: do \
! 116: { \
! 117: if (test) \
! 118: { \
! 119: bt_log(format ": %s", ##__VA_ARGS__, strerror(errno)); \
! 120: exit(3); \
! 121: } \
! 122: } while (0)
! 123:
! 124: #define bt_sprintf_concat(s, format, ...) \
! 125: snprintf(s + strlen(s), sizeof(s) - strlen(s), format, ##__VA_ARGS__)
! 126:
! 127: struct bt_pair {
! 128: const void *in;
! 129: const void *out;
! 130: };
! 131:
! 132: /* Data structure used by bt_assert_batch() function */
! 133: struct bt_batch {
! 134: /* in_fmt / out_fmt - formating data
! 135: * @buf: buffer for write stringified @data
! 136: * @size: empty size in @buf
! 137: * @data: data for stringify
! 138: *
! 139: * There are some build-in functions, see bt_fmt_* functions */
! 140: void (*in_fmt)(char *buf, size_t size, const void *data);
! 141: void (*out_fmt)(char *buf, size_t size, const void *data);
! 142:
! 143: /* Temporary output buffer */
! 144: void *out_buf;
! 145:
! 146: /* test_fn - testing function
! 147: * @out: output data from tested function
! 148: * @in: data for input
! 149: * @expected_out: expected data from tested function
! 150: *
! 151: * Input arguments should not be stringified using in_fmt() or out_fmt()
! 152: * function already. This function should return only 0 or 1 */
! 153: int (*test_fn)(void *out, const void *in, const void *expected_out);
! 154:
! 155: /* Name of testing function @test_fn */
! 156: const char *test_fn_name;
! 157:
! 158: /* Number of items in data */
! 159: int ndata;
! 160:
! 161: /* Array of input and expected output pairs */
! 162: struct bt_pair *data;
! 163: };
! 164:
! 165: void bt_fmt_str(char *buf, size_t size, const void *data);
! 166: void bt_fmt_unsigned(char *buf, size_t size, const void *data);
! 167: void bt_fmt_ipa(char *buf, size_t size, const void *data);
! 168: int bt_assert_batch__(struct bt_batch *opts);
! 169: int bt_is_char(byte c);
! 170:
! 171: #define bt_assert_batch(data__, fn__, in_fmt__, out_fmt__) \
! 172: bt_assert_batch__(& (struct bt_batch) { \
! 173: .data = data__, \
! 174: .ndata = ARRAY_SIZE(data__), \
! 175: .test_fn = fn__, \
! 176: .test_fn_name = #fn__, \
! 177: .in_fmt = in_fmt__, \
! 178: .out_fmt = out_fmt__, \
! 179: .out_buf = bt_out_fmt_buf, /* Global memory for this usage */ \
! 180: })
! 181:
! 182: #endif /* _BIRDTEST_H_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>