xref: /xnu-12377.81.4/tests/test_strings.c (revision 043036a2b3718f7f0be807e2870f8f47d3fa0796)
1*043036a2SApple OSS Distributions #define _FORTIFY_SOURCE 0
2*043036a2SApple OSS Distributions #define __arch_memcmp_zero_ptr_aligned
3*043036a2SApple OSS Distributions 
4*043036a2SApple OSS Distributions /* must include first because otherwise header guard conflicts with SDK's
5*043036a2SApple OSS Distributions  * string.h (quite reasonably)
6*043036a2SApple OSS Distributions  */
7*043036a2SApple OSS Distributions #include "../osfmk/libsa/string.h"
8*043036a2SApple OSS Distributions 
9*043036a2SApple OSS Distributions char *strerror(int);
10*043036a2SApple OSS Distributions char *itoa(int, char *);
11*043036a2SApple OSS Distributions 
12*043036a2SApple OSS Distributions #include <darwintest.h>
13*043036a2SApple OSS Distributions #include <darwintest_utils.h>
14*043036a2SApple OSS Distributions 
15*043036a2SApple OSS Distributions #pragma clang diagnostic ignored "-Wlanguage-extension-token"
16*043036a2SApple OSS Distributions #pragma clang diagnostic ignored "-Wformat-pedantic"
17*043036a2SApple OSS Distributions 
18*043036a2SApple OSS Distributions #define DEVELOPMENT 0
19*043036a2SApple OSS Distributions #define DEBUG 0
20*043036a2SApple OSS Distributions #define XNU_KERNEL_PRIVATE 1
21*043036a2SApple OSS Distributions 
22*043036a2SApple OSS Distributions __printflike(1, 2) __attribute__((noreturn))
23*043036a2SApple OSS Distributions static void
panic(const char * fmt,...)24*043036a2SApple OSS Distributions panic(const char *fmt, ...)
25*043036a2SApple OSS Distributions {
26*043036a2SApple OSS Distributions 	va_list ap;
27*043036a2SApple OSS Distributions 	va_start(ap, fmt);
28*043036a2SApple OSS Distributions 	vfprintf(stderr, fmt, ap);
29*043036a2SApple OSS Distributions 	abort();
30*043036a2SApple OSS Distributions }
31*043036a2SApple OSS Distributions 
32*043036a2SApple OSS Distributions #include "../libkern/libkern/section_keywords.h"
33*043036a2SApple OSS Distributions #include "../osfmk/machine/string.h"
34*043036a2SApple OSS Distributions #include "../osfmk/device/subrs.c"
35*043036a2SApple OSS Distributions 
36*043036a2SApple OSS Distributions #pragma clang diagnostic ignored "-Wdeclaration-after-statement"
37*043036a2SApple OSS Distributions #pragma clang diagnostic ignored "-Wgnu-designator"
38*043036a2SApple OSS Distributions 
39*043036a2SApple OSS Distributions T_GLOBAL_META(
40*043036a2SApple OSS Distributions 	T_META_RUN_CONCURRENTLY(true),
41*043036a2SApple OSS Distributions 	T_META_TAG_VM_PREFERRED);
42*043036a2SApple OSS Distributions 
43*043036a2SApple OSS Distributions T_DECL(strbufcmp, "strbufcmp") {
44*043036a2SApple OSS Distributions #define T_COMPARE(A, AS, B, BS, EQ) T_ASSERT_EQ(strbufcmp_impl((A), (AS), (B), (BS)), (EQ), "compare '%s'.%zu, '%s'.%zu", (A), (AS), (B), (BS))
45*043036a2SApple OSS Distributions 	// two identical strings
46*043036a2SApple OSS Distributions 	char a[] = "hello";
47*043036a2SApple OSS Distributions 	char b[] = "hello";
48*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a), b, sizeof(b), 0);
49*043036a2SApple OSS Distributions 	T_COMPARE(b, sizeof(b), a, sizeof(a), 0);
50*043036a2SApple OSS Distributions 
51*043036a2SApple OSS Distributions 	// the same string
52*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a), b, sizeof(b), 0);
53*043036a2SApple OSS Distributions 	T_COMPARE(b, sizeof(b), a, sizeof(a), 0);
54*043036a2SApple OSS Distributions 
55*043036a2SApple OSS Distributions 	// two different strings
56*043036a2SApple OSS Distributions 	char c[] = "world";
57*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a), c, sizeof(c), a[0] - c[0]);
58*043036a2SApple OSS Distributions 	T_COMPARE(c, sizeof(c), a, sizeof(a), c[0] - a[0]);
59*043036a2SApple OSS Distributions 	char d[] = "hellp";
60*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a), d, sizeof(d), 'o' - 'p');
61*043036a2SApple OSS Distributions 	T_COMPARE(d, sizeof(d), a, sizeof(a), 'p' - 'o');
62*043036a2SApple OSS Distributions 
63*043036a2SApple OSS Distributions 	// strings of different size
64*043036a2SApple OSS Distributions 	char e[] = "aaaa";
65*043036a2SApple OSS Distributions 	char f[] = "aaaab";
66*043036a2SApple OSS Distributions 	T_COMPARE(e, sizeof(e), f, sizeof(f), 0 - 'b');
67*043036a2SApple OSS Distributions 	T_COMPARE(f, sizeof(f), e, sizeof(e), 'b' - 0);
68*043036a2SApple OSS Distributions 
69*043036a2SApple OSS Distributions 	// strings that are not NUL-terminated
70*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a) - 1, b, sizeof(b) - 1, 0);
71*043036a2SApple OSS Distributions 	T_COMPARE(b, sizeof(b) - 1, a, sizeof(a) - 1, 0);
72*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a) - 1, d, sizeof(d) - 1, 'o' - 'p');
73*043036a2SApple OSS Distributions 	T_COMPARE(d, sizeof(d) - 1, a, sizeof(a) - 1, 'p' - 'o');
74*043036a2SApple OSS Distributions 	T_COMPARE(e, sizeof(e) - 1, f, sizeof(f) - 1, 0 - 'b');
75*043036a2SApple OSS Distributions 	T_COMPARE(f, sizeof(f) - 1, e, sizeof(e) - 1, 'b' - 0);
76*043036a2SApple OSS Distributions #undef T_COMPARE
77*043036a2SApple OSS Distributions }
78*043036a2SApple OSS Distributions 
79*043036a2SApple OSS Distributions T_DECL(strlcmp, "strlcmp") {
80*043036a2SApple OSS Distributions #define T_COMPARE(A, AS, B, EQ) T_ASSERT_EQ(strlcmp_impl((A), (B), (AS)), (EQ), "compare '%s'.%zu, '%s'", (A), (AS), (B))
81*043036a2SApple OSS Distributions 	// two identical strings
82*043036a2SApple OSS Distributions 	char a[] = "hello";
83*043036a2SApple OSS Distributions 	char b[] = "hello";
84*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a), b, 0);
85*043036a2SApple OSS Distributions 	T_COMPARE(b, sizeof(b), a, 0);
86*043036a2SApple OSS Distributions 
87*043036a2SApple OSS Distributions 	// the same string
88*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a), b, 0);
89*043036a2SApple OSS Distributions 	T_COMPARE(b, sizeof(b), a, 0);
90*043036a2SApple OSS Distributions 
91*043036a2SApple OSS Distributions 	// two different strings
92*043036a2SApple OSS Distributions 	char c[] = "world";
93*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a), c, a[0] - c[0]);
94*043036a2SApple OSS Distributions 	T_COMPARE(c, sizeof(c), a, c[0] - a[0]);
95*043036a2SApple OSS Distributions 	char d[] = "hellp";
96*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a), d, 'o' - 'p');
97*043036a2SApple OSS Distributions 	T_COMPARE(d, sizeof(d), a, 'p' - 'o');
98*043036a2SApple OSS Distributions 
99*043036a2SApple OSS Distributions 	// strings of different size
100*043036a2SApple OSS Distributions 	char e[] = "aaaa";
101*043036a2SApple OSS Distributions 	char f[] = "aaaab";
102*043036a2SApple OSS Distributions 	T_COMPARE(e, sizeof(e), f, 0 - 'b');
103*043036a2SApple OSS Distributions 	T_COMPARE(f, sizeof(f), e, 'b' - 0);
104*043036a2SApple OSS Distributions 
105*043036a2SApple OSS Distributions 	// strings that are not NUL-terminated
106*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a) - 1, b, 0);
107*043036a2SApple OSS Distributions 	T_COMPARE(b, sizeof(b) - 1, a, 0);
108*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a) - 1, d, 'o' - 'p');
109*043036a2SApple OSS Distributions 	T_COMPARE(d, sizeof(d) - 1, a, 'p' - 'o');
110*043036a2SApple OSS Distributions 	T_COMPARE(e, sizeof(e) - 1, f, 0 - 'b');
111*043036a2SApple OSS Distributions 	T_COMPARE(f, sizeof(f) - 1, e, 'b' - 0);
112*043036a2SApple OSS Distributions #undef T_COMPARE
113*043036a2SApple OSS Distributions }
114*043036a2SApple OSS Distributions 
115*043036a2SApple OSS Distributions T_DECL(strbufcasecmp, "strbufcasecmp") {
116*043036a2SApple OSS Distributions #define T_COMPARE(A, AS, B, BS, EQ) T_ASSERT_EQ(strbufcasecmp_impl((A), (AS), (B), (BS)), (EQ), "case-insensitive compare '%s'.%zu, '%s'.%zu", (A), (AS), (B), (BS))
117*043036a2SApple OSS Distributions 	// same tests as strcasecmp, then tests with individual characters
118*043036a2SApple OSS Distributions 	// two identical strings
119*043036a2SApple OSS Distributions 	char a[] = "hElLo";
120*043036a2SApple OSS Distributions 	char b[] = "HeLlO";
121*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a), b, sizeof(b), 0);
122*043036a2SApple OSS Distributions 	T_COMPARE(b, sizeof(b), a, sizeof(a), 0);
123*043036a2SApple OSS Distributions 
124*043036a2SApple OSS Distributions 	// the same string
125*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a), b, sizeof(b), 0);
126*043036a2SApple OSS Distributions 	T_COMPARE(b, sizeof(b), a, sizeof(a), 0);
127*043036a2SApple OSS Distributions 
128*043036a2SApple OSS Distributions 	// two different strings
129*043036a2SApple OSS Distributions 	char c[] = "world";
130*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a), c, sizeof(c), a[0] - c[0]);
131*043036a2SApple OSS Distributions 	T_COMPARE(c, sizeof(c), a, sizeof(a), c[0] - a[0]);
132*043036a2SApple OSS Distributions 	char d[] = "hellp";
133*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a), d, sizeof(d), 'o' - 'p');
134*043036a2SApple OSS Distributions 	T_COMPARE(d, sizeof(d), a, sizeof(a), 'p' - 'o');
135*043036a2SApple OSS Distributions 
136*043036a2SApple OSS Distributions 	// strings of different size
137*043036a2SApple OSS Distributions 	char e[] = "aAaA";
138*043036a2SApple OSS Distributions 	char f[] = "AaAaB";
139*043036a2SApple OSS Distributions 	T_COMPARE(e, sizeof(e), f, sizeof(f), 0 - 'b');
140*043036a2SApple OSS Distributions 	T_COMPARE(f, sizeof(f), e, sizeof(e), 'b' - 0);
141*043036a2SApple OSS Distributions 
142*043036a2SApple OSS Distributions 	// strings that are not NUL-terminated
143*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a) - 1, b, sizeof(b) - 1, 0);
144*043036a2SApple OSS Distributions 	T_COMPARE(b, sizeof(b) - 1, a, sizeof(a) - 1, 0);
145*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a) - 1, d, sizeof(d) - 1, 'o' - 'p');
146*043036a2SApple OSS Distributions 	T_COMPARE(d, sizeof(d) - 1, a, sizeof(a) - 1, 'p' - 'o');
147*043036a2SApple OSS Distributions 	T_COMPARE(e, sizeof(e) - 1, f, sizeof(f) - 1, 0 - 'b');
148*043036a2SApple OSS Distributions 	T_COMPARE(f, sizeof(f) - 1, e, sizeof(e) - 1, 'b' - 0);
149*043036a2SApple OSS Distributions #undef T_COMPARE
150*043036a2SApple OSS Distributions }
151*043036a2SApple OSS Distributions 
152*043036a2SApple OSS Distributions T_DECL(strlcasecmp, "strlcasecmp") {
153*043036a2SApple OSS Distributions #define T_COMPARE(A, AS, B, EQ) T_ASSERT_EQ(strlcasecmp_impl((A), (B), (AS)), (EQ), "case-insensitive compare '%s'.%zu, '%s'", (A), (AS), (B))
154*043036a2SApple OSS Distributions 	// same tests as strcasecmp, then tests with individual characters
155*043036a2SApple OSS Distributions 	// two identical strings
156*043036a2SApple OSS Distributions 	char a[] = "hElLo";
157*043036a2SApple OSS Distributions 	char b[] = "HeLlO";
158*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a), b, 0);
159*043036a2SApple OSS Distributions 	T_COMPARE(b, sizeof(b), a, 0);
160*043036a2SApple OSS Distributions 
161*043036a2SApple OSS Distributions 	// the same string
162*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a), b, 0);
163*043036a2SApple OSS Distributions 	T_COMPARE(b, sizeof(b), a, 0);
164*043036a2SApple OSS Distributions 
165*043036a2SApple OSS Distributions 	// two different strings
166*043036a2SApple OSS Distributions 	char c[] = "world";
167*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a), c, a[0] - c[0]);
168*043036a2SApple OSS Distributions 	T_COMPARE(c, sizeof(c), a, c[0] - a[0]);
169*043036a2SApple OSS Distributions 	char d[] = "hellp";
170*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a), d, 'o' - 'p');
171*043036a2SApple OSS Distributions 	T_COMPARE(d, sizeof(d), a, 'p' - 'o');
172*043036a2SApple OSS Distributions 
173*043036a2SApple OSS Distributions 	// strings of different size
174*043036a2SApple OSS Distributions 	char e[] = "aAaA";
175*043036a2SApple OSS Distributions 	char f[] = "AaAaB";
176*043036a2SApple OSS Distributions 	T_COMPARE(e, sizeof(e), f, 0 - 'b');
177*043036a2SApple OSS Distributions 	T_COMPARE(f, sizeof(f), e, 'b' - 0);
178*043036a2SApple OSS Distributions 
179*043036a2SApple OSS Distributions 	// strings that are not NUL-terminated
180*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a) - 1, b, 0);
181*043036a2SApple OSS Distributions 	T_COMPARE(b, sizeof(b) - 1, a, 0);
182*043036a2SApple OSS Distributions 	T_COMPARE(a, sizeof(a) - 1, d, 'o' - 'p');
183*043036a2SApple OSS Distributions 	T_COMPARE(d, sizeof(d) - 1, a, 'p' - 'o');
184*043036a2SApple OSS Distributions 	T_COMPARE(e, sizeof(e) - 1, f, 0 - 'b');
185*043036a2SApple OSS Distributions 	T_COMPARE(f, sizeof(f) - 1, e, 'b' - 0);
186*043036a2SApple OSS Distributions #undef T_COMPARE
187*043036a2SApple OSS Distributions }
188*043036a2SApple OSS Distributions 
189*043036a2SApple OSS Distributions T_DECL(strbufcasecmp_all, "strbufcasecmp_all") {
190*043036a2SApple OSS Distributions #define T_CHAR_COMPARE(A, AS, B, BS, EQ) do { \
191*043036a2SApple OSS Distributions     int r = strbufcasecmp_impl((A), (AS), (B), (BS)); \
192*043036a2SApple OSS Distributions     if (r != (EQ)) T_FAIL("case-insensitive compare '0x%02hhx' to '0x%02hhx' was %i instead of %i", *(A), *(B), r, (EQ)); \
193*043036a2SApple OSS Distributions } while (0)
194*043036a2SApple OSS Distributions 	// test each character
195*043036a2SApple OSS Distributions 	char ga, gb, ha, hb;
196*043036a2SApple OSS Distributions 	char nul = 0;
197*043036a2SApple OSS Distributions 	for (int i = 0; i < 256; ++i) {
198*043036a2SApple OSS Distributions 		ga = (char)(i);
199*043036a2SApple OSS Distributions 		gb = (i >= 'A' && i <= 'Z') ? (char)(i - 'A' + 'a') : ga;
200*043036a2SApple OSS Distributions 		T_CHAR_COMPARE(&ga, 1, &nul, 0, gb);
201*043036a2SApple OSS Distributions 		T_CHAR_COMPARE(&nul, 0, &ga, 1, -gb);
202*043036a2SApple OSS Distributions 
203*043036a2SApple OSS Distributions 		for (int j = 0; j < 256; ++j) {
204*043036a2SApple OSS Distributions 			ha = (char)(j);
205*043036a2SApple OSS Distributions 			hb = (j >= 'A' && j <= 'Z') ? (char)(j - 'A' + 'a') : ha;
206*043036a2SApple OSS Distributions 			T_CHAR_COMPARE(&ga, 1, &ha, 1, gb - hb);
207*043036a2SApple OSS Distributions 			T_CHAR_COMPARE(&ha, 1, &ga, 1, hb - gb);
208*043036a2SApple OSS Distributions 		}
209*043036a2SApple OSS Distributions 	}
210*043036a2SApple OSS Distributions 	T_PASS("ASCII character case insensitivity");
211*043036a2SApple OSS Distributions }
212*043036a2SApple OSS Distributions 
213*043036a2SApple OSS Distributions T_DECL(strbufcpy, "strbufcpy") {
214*043036a2SApple OSS Distributions 	char dst[32];
215*043036a2SApple OSS Distributions 	// empty dest
216*043036a2SApple OSS Distributions 	T_ASSERT_EQ(strbufcpy_impl(NULL, 0, "hello", 5), NULL, "0-length destination");
217*043036a2SApple OSS Distributions 
218*043036a2SApple OSS Distributions #define T_CPY(A, AS, B, BS) T_ASSERT_EQ(strbufcpy_impl((A), (AS), (B), (BS)), (char *)(A), "copy '%.*s'.%zu to dst.%zu", (int)(BS), (B), (size_t)(BS), (AS))
219*043036a2SApple OSS Distributions 	// copy NUL terminated string that fits in dst
220*043036a2SApple OSS Distributions 	char hello[] = "hello";
221*043036a2SApple OSS Distributions 	memset(dst, 0, sizeof(dst));
222*043036a2SApple OSS Distributions 	T_CPY(dst, sizeof(dst), hello, sizeof(hello));
223*043036a2SApple OSS Distributions 	T_ASSERT_EQ(memcmp_impl(dst, (char[32]){"hello"}, sizeof(dst)), 0, "check result is 'hello'");
224*043036a2SApple OSS Distributions 
225*043036a2SApple OSS Distributions 	// copy NUL terminated string that does not fit in dst
226*043036a2SApple OSS Distributions 	char aaa[40] = {[0 ... 38] = 'a' };
227*043036a2SApple OSS Distributions 	memset(dst, 0, sizeof(dst));
228*043036a2SApple OSS Distributions 	T_CPY(dst, sizeof(dst), aaa, sizeof(aaa));
229*043036a2SApple OSS Distributions 	T_ASSERT_EQ(memcmp_impl(aaa, dst, 31), 0, "check result is 'aaaaaa...'");
230*043036a2SApple OSS Distributions 	T_ASSERT_EQ(dst[31], 0, "check result is NUL-terminated");
231*043036a2SApple OSS Distributions 
232*043036a2SApple OSS Distributions 	// copy non-terminated string
233*043036a2SApple OSS Distributions 	memset(dst, 0xff, sizeof(dst));
234*043036a2SApple OSS Distributions 	T_CPY(dst, sizeof(dst), "bbb", 3);
235*043036a2SApple OSS Distributions 	T_ASSERT_EQ(strcmp_impl(dst, "bbb"), 0, "check result is 'bbb'");
236*043036a2SApple OSS Distributions 
237*043036a2SApple OSS Distributions 	// copy string over itself
238*043036a2SApple OSS Distributions 	char hw1[32] = "hello world";
239*043036a2SApple OSS Distributions 	T_CPY(hw1 + 6, sizeof(hw1) - 6, hw1, sizeof(hw1));
240*043036a2SApple OSS Distributions 	T_ASSERT_EQ(strcmp_impl(hw1, "hello hello world"), 0, "check copy over self is 'hello hello world'");
241*043036a2SApple OSS Distributions 
242*043036a2SApple OSS Distributions 	char hw2[32] = "hello world";
243*043036a2SApple OSS Distributions 	T_CPY(hw2, sizeof(hw2), hw2 + 6, sizeof(hw2) - 6);
244*043036a2SApple OSS Distributions 	T_ASSERT_EQ(strcmp_impl(hw2, "world"), 0, "check copy over self is 'world'");
245*043036a2SApple OSS Distributions #undef T_CPY
246*043036a2SApple OSS Distributions }
247*043036a2SApple OSS Distributions 
248*043036a2SApple OSS Distributions T_DECL(strbufcat, "strbufcat") {
249*043036a2SApple OSS Distributions 	char dst[32] = {0};
250*043036a2SApple OSS Distributions 
251*043036a2SApple OSS Distributions 	// empty dst
252*043036a2SApple OSS Distributions 	T_ASSERT_EQ(strbufcat_impl(NULL, 0, "hello", 5), NULL, "check concatenation to 0-length destination");
253*043036a2SApple OSS Distributions 
254*043036a2SApple OSS Distributions #define T_CAT_RESULT(RESULT) \
255*043036a2SApple OSS Distributions     T_ASSERT_EQ(strcmp_impl(dst, (RESULT)), 0, "check result of concatenation is '%s'", (RESULT)); \
256*043036a2SApple OSS Distributions 
257*043036a2SApple OSS Distributions #define T_CAT(TO_CAT, RESULT) do { \
258*043036a2SApple OSS Distributions     T_ASSERT_EQ(strbufcat_impl(dst, sizeof(dst), (TO_CAT), sizeof(TO_CAT)), (char *)dst, "check concatenation of '%s'", (TO_CAT)); \
259*043036a2SApple OSS Distributions     T_CAT_RESULT(RESULT); \
260*043036a2SApple OSS Distributions } while (0)
261*043036a2SApple OSS Distributions 
262*043036a2SApple OSS Distributions 	// append "hello "
263*043036a2SApple OSS Distributions 	T_CAT("hello ", "hello ");
264*043036a2SApple OSS Distributions 
265*043036a2SApple OSS Distributions 	// append "world!"
266*043036a2SApple OSS Distributions 	T_CAT("world!", "hello world!");
267*043036a2SApple OSS Distributions 
268*043036a2SApple OSS Distributions 	// append itself
269*043036a2SApple OSS Distributions 	T_ASSERT_EQ(strbufcat_impl(dst, sizeof(dst), dst, sizeof(dst)), (char *)dst, "check concatenating self");
270*043036a2SApple OSS Distributions 	T_CAT_RESULT("hello world!hello world!");
271*043036a2SApple OSS Distributions 
272*043036a2SApple OSS Distributions 	// append bunch of 'a's
273*043036a2SApple OSS Distributions 	T_ASSERT_EQ(strbufcat_impl(dst, sizeof(dst), "aaaaaaaaaa", 10), (char *)dst, "check concatenating 'aaaa...'");
274*043036a2SApple OSS Distributions 	T_CAT_RESULT("hello world!hello world!aaaaaaa");
275*043036a2SApple OSS Distributions 
276*043036a2SApple OSS Distributions #undef T_CAT
277*043036a2SApple OSS Distributions #undef T_CAT_RESULT
278*043036a2SApple OSS Distributions }
279*043036a2SApple OSS Distributions 
280*043036a2SApple OSS Distributions T_DECL(libsa_overloads, "libsa_overloads") {
281*043036a2SApple OSS Distributions 	char buf[32] = "hello, world";
282*043036a2SApple OSS Distributions 	char buf2[32] = "world, hello";
283*043036a2SApple OSS Distributions 
284*043036a2SApple OSS Distributions 	T_ASSERT_EQ(strbuflen(buf), (size_t)12, "strbuflen one argument");
285*043036a2SApple OSS Distributions 	T_ASSERT_EQ(strbuflen(buf, sizeof(buf)), (size_t)12, "strbuflen two arguments");
286*043036a2SApple OSS Distributions 
287*043036a2SApple OSS Distributions 	T_ASSERT_LT(strbufcmp(buf, buf2), 0, "strbufcmp two arguments");
288*043036a2SApple OSS Distributions 	T_ASSERT_LT(strbufcmp(buf, sizeof(buf), buf2, sizeof(buf2)), 0, "strbufcmp four arguments");
289*043036a2SApple OSS Distributions 
290*043036a2SApple OSS Distributions 	T_ASSERT_LT(strbufcasecmp(buf, buf2), 0, "strbufcasecmp two arguments");
291*043036a2SApple OSS Distributions 	T_ASSERT_LT(strbufcasecmp(buf, sizeof(buf), buf2, sizeof(buf2)), 0, "strbufcasecmp four arguments");
292*043036a2SApple OSS Distributions 
293*043036a2SApple OSS Distributions 	T_ASSERT_NE(strbufcpy(buf, buf2), NULL, "strbufcpy two arguments");
294*043036a2SApple OSS Distributions 	T_ASSERT_NE(strbufcpy(buf, sizeof(buf), buf2, sizeof(buf2)), NULL, "strbufcpy four arguments");
295*043036a2SApple OSS Distributions 
296*043036a2SApple OSS Distributions 	T_ASSERT_NE(strbufcat(buf, buf2), NULL, "strbufcat two arguments");
297*043036a2SApple OSS Distributions 	T_ASSERT_NE(strbufcat(buf, sizeof(buf), buf2, sizeof(buf2)), NULL, "strbufcat four arguments");
298*043036a2SApple OSS Distributions }
299