xref: /freebsd/contrib/pkgconf/tests/api/test-api.h (revision 592efe252472a3385acf36b1f49ecf710a7f3d9c)
1 /*
2  * test-api.h
3  * test API macros and functions.
4  *
5  * SPDX-License-Identifier: pkgconf
6  *
7  * Copyright (c) 2026 pkgconf authors (see AUTHORS).
8  *
9  * Permission to use, copy, modify, and/or distribute this software for any
10  * purpose with or without fee is hereby granted, provided that the above
11  * copyright notice and this permission notice appear in all copies.
12  *
13  * This software is provided 'as is' and without any warranty, express or
14  * implied.  In no event shall the authors be liable for any damages arising
15  * from the use of this software.
16  */
17 
18 #ifndef TEST_API_H
19 #define TEST_API_H
20 
21 #include <libpkgconf/stdinc.h>
22 #include <libpkgconf/libpkgconf.h>
23 #include <libpkgconf/path.h>
24 #include <tests/win-shim.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 
29 #if defined(__GNUC__) && !defined(__clang__)
30 #	pragma GCC diagnostic push
31 #	pragma GCC diagnostic ignored "-Wpragmas" // older gcc may not know the next one
32 	// Stop false-positive warnings for test cases
33 #	pragma GCC diagnostic ignored "-Wanalyzer-tainted-assertion"
34 #endif
35 
36 #define TEST_FAIL_(fmt, ...)	\
37 	do {	\
38 		fprintf(stderr, "FAIL: %s:%d: " fmt "\n",	\
39 			__FILE__, __LINE__, __VA_ARGS__);	\
40 		exit(EXIT_FAILURE);	\
41 	} while (0)
42 
43 #define TEST_ASSERT_TRUE(expr)	\
44 	do {	\
45 		if (!(expr))	\
46 			TEST_FAIL_("TEST_ASSERT_TRUE(%s) was false", #expr);	\
47 	} while (0)
48 
49 #define TEST_ASSERT_FALSE(expr)	\
50 	do {	\
51 		if ((expr))	\
52 			TEST_FAIL_("TEST_ASSERT_FALSE(%s) was true", #expr);	\
53 	} while (0)
54 
55 #define TEST_ASSERT_NULL(expr)	\
56 	do {	\
57 		const void *_v = (const void *)(expr);	\
58 		if (_v != NULL)	\
59 			TEST_FAIL_("TEST_ASSERT_NULL(%s) was %p", #expr, _v);	\
60 	} while (0)
61 
62 #define TEST_ASSERT_NONNULL(expr)	\
63 	do {	\
64 		if ((expr) == NULL)	\
65 			TEST_FAIL_("TEST_ASSERT_NONNULL(%s) was NULL", #expr);	\
66 	} while (0)
67 
68 #define TEST_ASSERT_EQ(a, b)	\
69 	do {	\
70 		long long _a = (long long)(a);	\
71 		long long _b = (long long)(b);	\
72 		if (_a != _b)	\
73 			TEST_FAIL_("TEST_ASSERT_EQ(%s, %s): %lld != %lld",	\
74 				#a, #b, _a, _b);	\
75 	} while (0)
76 
77 #define TEST_ASSERT_LT(a, b)	\
78 	do {	\
79 		long long _a = (long long)(a);	\
80 		long long _b = (long long)(b);	\
81 		if (_a >= _b)	\
82 			TEST_FAIL_("TEST_ASSERT_LT(%s, %s): %lld >= %lld",	\
83 				#a, #b, _a, _b);	\
84 	} while (0)
85 
86 #define TEST_ASSERT_LE(a, b)	\
87 	do {	\
88 		long long _a = (long long)(a);	\
89 		long long _b = (long long)(b);	\
90 		if (_a > _b)	\
91 			TEST_FAIL_("TEST_ASSERT_LE(%s, %s): %lld > %lld",	\
92 				#a, #b, _a, _b);	\
93 	} while (0)
94 
95 #define TEST_ASSERT_GT(a, b)	\
96 	do {	\
97 		long long _a = (long long)(a);	\
98 		long long _b = (long long)(b);	\
99 		if (_a <= _b)	\
100 			TEST_FAIL_("TEST_ASSERT_GT(%s, %s): %lld <= %lld",	\
101 				#a, #b, _a, _b);	\
102 	} while (0)
103 
104 #define TEST_ASSERT_GE(a, b)	\
105 	do {	\
106 		long long _a = (long long)(a);	\
107 		long long _b = (long long)(b);	\
108 		if (_a < _b)	\
109 			TEST_FAIL_("TEST_ASSERT_GE(%s, %s): %lld < %lld",	\
110 				#a, #b, _a, _b);	\
111 	} while (0)
112 
113 #define TEST_ASSERT_NE(a, b)	\
114 	do {	\
115 		long long _a = (long long)(a);	\
116 		long long _b = (long long)(b);	\
117 		if (_a == _b)	\
118 			TEST_FAIL_("TEST_ASSERT_NE(%s, %s): both %lld",	\
119 				#a, #b, _a);	\
120 	} while (0)
121 
122 #define TEST_ASSERT_STRCMP_EQ(actual, expected)	\
123 	do {	\
124 		const char *_a = (actual);	\
125 		const char *_e = (expected);	\
126 		if (_a == NULL || _e == NULL || strcmp(_a, _e) != 0)	\
127 			TEST_FAIL_("TEST_ASSERT_STRCMP_EQ(%s, %s): [%s] != [%s]",	\
128 				#actual, #expected,	\
129 				_a ? _a : "(null)", _e ? _e : "(null)");	\
130 	} while (0)
131 
132 #define TEST_ASSERT_STRCASECMP_EQ(actual, expected)	\
133 	do {	\
134 		const char *_a = (actual);	\
135 		const char *_e = (expected);	\
136 		if (_a == NULL || _e == NULL || strcasecmp(_a, _e) != 0)	\
137 			TEST_FAIL_("TEST_ASSERT_STRCASECMP_EQ(%s, %s): [%s] !~ [%s]",	\
138 				#actual, #expected,	\
139 				_a ? _a : "(null)", _e ? _e : "(null)");	\
140 	} while (0)
141 
142 #define TEST_ASSERT_STRNCMP_EQ(actual, expected, n)	\
143 	do {	\
144 		const char *_a = (actual);	\
145 		const char *_e = (expected);	\
146 		size_t _n = (size_t)(n);	\
147 		if (_a == NULL || _e == NULL || strncmp(_a, _e, _n) != 0)	\
148 			TEST_FAIL_("TEST_ASSERT_STRNCMP_EQ(%s, %s, %zu): [%s] != [%s]",	\
149 				#actual, #expected, _n,	\
150 				_a ? _a : "(null)", _e ? _e : "(null)");	\
151 	} while (0)
152 
153 #define TEST_ASSERT_STRSTR(haystack, needle)	\
154 	do {	\
155 		const char *_h = (haystack);	\
156 		const char *_n = (needle);	\
157 		if (_h == NULL || _n == NULL || strstr(_h, _n) == NULL)	\
158 			TEST_FAIL_("TEST_ASSERT_STRSTR(%s, %s): [%s] does not contain [%s]",	\
159 				#haystack, #needle,	\
160 				_h ? _h : "(null)", _n ? _n : "(null)");	\
161 	} while (0)
162 
163 #define TEST_ASSERT_EMPTY_STRING(expr)	\
164 	do {	\
165 		const char *_s = (expr);	\
166 		if (_s == NULL)	\
167 			TEST_FAIL_("TEST_ASSERT_EMPTY_STRING(%s) was NULL", #expr);	\
168 		if (_s[0] != '\0')	\
169 			TEST_FAIL_("TEST_ASSERT_EMPTY_STRING(%s) was [%s]", #expr, _s);	\
170 	} while (0)
171 
172 #define TEST_RUN(name, fn)	\
173 	do {	\
174 		fprintf(stderr, "%s -> %s:", name, #fn);	\
175 		fn();	\
176 		fprintf(stderr, " PASS\n");	\
177 	} while (0)
178 
179 static inline pkgconf_client_t *
test_client_new(void)180 test_client_new(void)
181 {
182 	pkgconf_cross_personality_t *pers = pkgconf_cross_personality_default();
183 	return pkgconf_client_new(NULL, NULL, pers, NULL, NULL);
184 }
185 
186 #endif // TEST_API_H
187