diff options
Diffstat (limited to '')
-rw-r--r-- | src/regress/lib/libcrypto/test/test.h | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/src/regress/lib/libcrypto/test/test.h b/src/regress/lib/libcrypto/test/test.h new file mode 100644 index 0000000000..1c8391d4ec --- /dev/null +++ b/src/regress/lib/libcrypto/test/test.h | |||
@@ -0,0 +1,137 @@ | |||
1 | /* $OpenBSD: test.h,v 1.4 2025/05/31 11:37:18 tb Exp $ */ | ||
2 | /* | ||
3 | * Copyright (c) 2025 Joshua Sing <joshua@joshuasing.dev> | ||
4 | * | ||
5 | * Permission to use, copy, modify, and distribute this software for any | ||
6 | * purpose with or without fee is hereby granted, provided that the above | ||
7 | * copyright notice and this permission notice appear in all copies. | ||
8 | * | ||
9 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
10 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
11 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
12 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
13 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
16 | */ | ||
17 | |||
18 | #ifndef HEADER_TEST_H | ||
19 | #define HEADER_TEST_H | ||
20 | |||
21 | #include <stddef.h> | ||
22 | #include <stdint.h> | ||
23 | |||
24 | struct test; | ||
25 | |||
26 | /* | ||
27 | * test_init creates a new root test struct. | ||
28 | * | ||
29 | * Additional tests may be run under the root test struct by calling test_run. | ||
30 | * | ||
31 | * If the TEST_VERBOSE environment variable is set and not equal to "0", then | ||
32 | * verbose mode will be enabled and all test logs will be written to stderr. | ||
33 | */ | ||
34 | struct test *test_init(void); | ||
35 | |||
36 | /* | ||
37 | * test_result cleans up after all tests have completed and returns an | ||
38 | * appropriate exit code indicating the result of the tests. | ||
39 | */ | ||
40 | int test_result(struct test *_t); | ||
41 | |||
42 | /* | ||
43 | * test_run_func is an individual test function. It is passed the test struct | ||
44 | * and an arbitrary argument which may be passed when test_run is called. | ||
45 | */ | ||
46 | typedef void (test_run_func)(struct test *_t, const void *_arg); | ||
47 | |||
48 | /* | ||
49 | * test_fail marks the test and its parents as failed. | ||
50 | */ | ||
51 | void test_fail(struct test *_t); | ||
52 | |||
53 | /* | ||
54 | * test_printf prints a test log message. When in verbose mode, the log message | ||
55 | * will be written to stderr, otherwise it will be buffered and only written to | ||
56 | * stderr if the test fails. | ||
57 | * | ||
58 | * This printf will write directly, without any additional formatting. | ||
59 | */ | ||
60 | void test_printf(struct test *_t, const char *_fmt, ...) | ||
61 | __attribute__((__format__ (printf, 2, 3))) | ||
62 | __attribute__((__nonnull__ (2))); | ||
63 | |||
64 | /* | ||
65 | * test_logf_internal prints a test log message. When in verbose mode, the | ||
66 | * log message will be written to stderr, otherwise it will be buffered and | ||
67 | * only written to stderr if the test fails. | ||
68 | * | ||
69 | * label is an optional label indicating the severity of the log. | ||
70 | * func, file and line are used to show where the log comes from and are | ||
71 | * automatically set in the test log macros. | ||
72 | * | ||
73 | * This function should never be called directly. | ||
74 | */ | ||
75 | void test_logf_internal(struct test *_t, const char *_label, const char *_func, | ||
76 | const char *_file, int _line, const char *_fmt, ...) | ||
77 | __attribute__((__format__ (printf, 6, 7))) | ||
78 | __attribute__((__nonnull__ (6))); | ||
79 | |||
80 | /* | ||
81 | * test_logf prints an informational log message. When in verbose mode, the log | ||
82 | * will be written to stderr, otherwise it will be buffered and only written to | ||
83 | * stderr if the test fails. | ||
84 | */ | ||
85 | #define test_logf(t, fmt, ...) \ | ||
86 | do { \ | ||
87 | test_logf_internal(t, NULL, __func__, __FILE__, __LINE__, fmt, ##__VA_ARGS__); \ | ||
88 | } while (0) | ||
89 | |||
90 | /* | ||
91 | * test_errorf prints an error message. It will also cause the test to fail. | ||
92 | * If the test cannot proceed, it is recommended to return or goto a cleanup | ||
93 | * label. | ||
94 | * | ||
95 | * Tests should not fail-fast if continuing will provide more detailed | ||
96 | * information about what is broken. | ||
97 | */ | ||
98 | #define test_errorf(t, fmt, ...) \ | ||
99 | do { \ | ||
100 | test_logf_internal(t, "ERROR", __func__, __FILE__, __LINE__, fmt, ##__VA_ARGS__); \ | ||
101 | test_fail(t); \ | ||
102 | } while (0) | ||
103 | |||
104 | /* | ||
105 | * test_skip marks the test as skipped. Once called, the test should return. | ||
106 | */ | ||
107 | void test_skip(struct test *_t, const char *_reason); | ||
108 | |||
109 | /* | ||
110 | * test_skipf marks the test as skipped with a formatted reason. Once called, | ||
111 | * the test should return. | ||
112 | */ | ||
113 | void test_skipf(struct test *_t, const char *_fmt, ...) | ||
114 | __attribute__((__format__ (printf, 2, 3))) | ||
115 | __attribute__((__nonnull__ (2))); | ||
116 | |||
117 | /* | ||
118 | * test_run runs a test function. It will create a new test struct with the | ||
119 | * given test as the parent. An argument may be provided to pass data to the | ||
120 | * test function, otherwise NULL should be passed. | ||
121 | * | ||
122 | * Each test should have a unique and informational name. | ||
123 | */ | ||
124 | void test_run(struct test *_t, const char *_name, test_run_func *_fn, const void *_arg); | ||
125 | |||
126 | /* | ||
127 | * test_hexdump prints the given data as hexadecimal. | ||
128 | */ | ||
129 | void test_hexdump(struct test *_t, const unsigned char *_buf, size_t _len); | ||
130 | |||
131 | /* | ||
132 | * test_hexdiff prints the given data as hexadecimal. If a second comparison | ||
133 | * buffer is not NULL, any differing bytes will be marked with an astrix. | ||
134 | */ | ||
135 | void test_hexdiff(struct test *_t, const uint8_t *_buf, size_t _len, const uint8_t *_compare); | ||
136 | |||
137 | #endif /* HEADER_TEST_H */ | ||