1*a8c975d2Sderaadt /* $OpenBSD: test_strdelim.c,v 1.3 2021/12/14 21:25:27 deraadt Exp $ */
2e34e9144Sdjm /*
3e34e9144Sdjm * Regress test for misc strdelim() and co
4e34e9144Sdjm *
5e34e9144Sdjm * Placed in the public domain.
6e34e9144Sdjm */
7e34e9144Sdjm
8e34e9144Sdjm #include <sys/types.h>
9e34e9144Sdjm #include <stdio.h>
10e34e9144Sdjm #include <stdint.h>
11e34e9144Sdjm #include <stdlib.h>
12e34e9144Sdjm #include <string.h>
13e34e9144Sdjm
14e34e9144Sdjm #include "test_helper.h"
15e34e9144Sdjm
16e34e9144Sdjm #include "log.h"
17e34e9144Sdjm #include "misc.h"
18e34e9144Sdjm #include "xmalloc.h"
19e34e9144Sdjm
20e34e9144Sdjm void test_strdelim(void);
21e34e9144Sdjm
22e34e9144Sdjm void
test_strdelim(void)23e34e9144Sdjm test_strdelim(void)
24e34e9144Sdjm {
25e34e9144Sdjm char *orig, *str, *cp;
26e34e9144Sdjm
27e34e9144Sdjm #define START_STRING(x) orig = str = xstrdup(x)
28e34e9144Sdjm #define DONE_STRING() free(orig)
29e34e9144Sdjm
30e34e9144Sdjm TEST_START("empty");
31e34e9144Sdjm START_STRING("");
32e34e9144Sdjm cp = strdelim(&str);
339d6f8b7eSdjm ASSERT_STRING_EQ(cp, ""); /* XXX arguable */
349d6f8b7eSdjm cp = strdelim(&str);
359d6f8b7eSdjm ASSERT_PTR_EQ(cp, NULL);
36e34e9144Sdjm DONE_STRING();
37e34e9144Sdjm TEST_DONE();
38e34e9144Sdjm
39e34e9144Sdjm TEST_START("whitespace");
40e34e9144Sdjm START_STRING(" ");
41e34e9144Sdjm cp = strdelim(&str);
42e34e9144Sdjm ASSERT_STRING_EQ(cp, ""); /* XXX better as NULL */
439d6f8b7eSdjm ASSERT_STRING_EQ(str, "");
44e34e9144Sdjm DONE_STRING();
45e34e9144Sdjm TEST_DONE();
46e34e9144Sdjm
47e34e9144Sdjm TEST_START("trivial");
48e34e9144Sdjm START_STRING("blob");
49e34e9144Sdjm cp = strdelim(&str);
50e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob");
51e34e9144Sdjm cp = strdelim(&str);
52e34e9144Sdjm ASSERT_PTR_EQ(cp, NULL);
539d6f8b7eSdjm ASSERT_PTR_EQ(str, NULL);
54e34e9144Sdjm DONE_STRING();
55e34e9144Sdjm TEST_DONE();
56e34e9144Sdjm
57e34e9144Sdjm TEST_START("trivial whitespace");
58e34e9144Sdjm START_STRING("blob ");
59e34e9144Sdjm cp = strdelim(&str);
60e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob");
619d6f8b7eSdjm ASSERT_STRING_EQ(str, "");
62e34e9144Sdjm cp = strdelim(&str);
63e34e9144Sdjm ASSERT_STRING_EQ(cp, ""); /* XXX better as NULL */
649d6f8b7eSdjm ASSERT_PTR_EQ(str, NULL);
65e34e9144Sdjm DONE_STRING();
66e34e9144Sdjm TEST_DONE();
67e34e9144Sdjm
68e34e9144Sdjm TEST_START("multi");
69e34e9144Sdjm START_STRING("blob1 blob2");
70e34e9144Sdjm cp = strdelim(&str);
71e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob1");
729d6f8b7eSdjm ASSERT_STRING_EQ(str, "blob2");
73e34e9144Sdjm cp = strdelim(&str);
74e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob2");
759d6f8b7eSdjm ASSERT_PTR_EQ(str, NULL);
76e34e9144Sdjm cp = strdelim(&str);
77e34e9144Sdjm ASSERT_PTR_EQ(cp, NULL);
78e34e9144Sdjm DONE_STRING();
79e34e9144Sdjm TEST_DONE();
80e34e9144Sdjm
81e34e9144Sdjm TEST_START("multi whitespace");
82e34e9144Sdjm START_STRING("blob1 blob2 ");
83e34e9144Sdjm cp = strdelim(&str);
84e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob1");
859d6f8b7eSdjm ASSERT_STRING_EQ(str, "blob2 ");
86e34e9144Sdjm cp = strdelim(&str);
87e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob2");
88e34e9144Sdjm cp = strdelim(&str);
89e34e9144Sdjm ASSERT_STRING_EQ(cp, ""); /* XXX better as NULL */
909d6f8b7eSdjm ASSERT_PTR_EQ(str, NULL);
91e34e9144Sdjm DONE_STRING();
92e34e9144Sdjm TEST_DONE();
93e34e9144Sdjm
94e34e9144Sdjm TEST_START("multi equals");
95e34e9144Sdjm START_STRING("blob1=blob2");
96e34e9144Sdjm cp = strdelim(&str);
97e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob1");
989d6f8b7eSdjm ASSERT_STRING_EQ(str, "blob2");
99e34e9144Sdjm cp = strdelim(&str);
100e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob2");
1019d6f8b7eSdjm ASSERT_PTR_EQ(str, NULL);
102e34e9144Sdjm cp = strdelim(&str);
103e34e9144Sdjm ASSERT_PTR_EQ(cp, NULL);
104e34e9144Sdjm DONE_STRING();
105e34e9144Sdjm TEST_DONE();
106e34e9144Sdjm
107e34e9144Sdjm TEST_START("multi too many equals");
108e34e9144Sdjm START_STRING("blob1==blob2");
109e34e9144Sdjm cp = strdelim(&str);
110e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob1"); /* XXX better returning NULL early */
1119d6f8b7eSdjm ASSERT_STRING_EQ(str, "=blob2");
112e34e9144Sdjm cp = strdelim(&str);
113e34e9144Sdjm ASSERT_STRING_EQ(cp, "");
1149d6f8b7eSdjm ASSERT_STRING_EQ(str, "blob2");
1159d6f8b7eSdjm cp = strdelim(&str);
1169d6f8b7eSdjm ASSERT_STRING_EQ(cp, "blob2"); /* XXX should (but can't) reject */
1179d6f8b7eSdjm ASSERT_PTR_EQ(str, NULL);
118e34e9144Sdjm DONE_STRING();
119e34e9144Sdjm TEST_DONE();
120e34e9144Sdjm
121e34e9144Sdjm TEST_START("multi equals strdelimw");
122e34e9144Sdjm START_STRING("blob1=blob2");
123e34e9144Sdjm cp = strdelimw(&str);
124e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob1=blob2");
1259d6f8b7eSdjm ASSERT_PTR_EQ(str, NULL);
126e34e9144Sdjm cp = strdelimw(&str);
127e34e9144Sdjm ASSERT_PTR_EQ(cp, NULL);
128e34e9144Sdjm DONE_STRING();
129e34e9144Sdjm TEST_DONE();
130e34e9144Sdjm
131e34e9144Sdjm TEST_START("quoted");
132e34e9144Sdjm START_STRING("\"blob\"");
133e34e9144Sdjm cp = strdelim(&str);
134e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob");
135e34e9144Sdjm cp = strdelim(&str);
136e34e9144Sdjm ASSERT_STRING_EQ(cp, ""); /* XXX better as NULL */
1379d6f8b7eSdjm ASSERT_PTR_EQ(str, NULL);
138e34e9144Sdjm DONE_STRING();
139e34e9144Sdjm TEST_DONE();
140e34e9144Sdjm
141e34e9144Sdjm TEST_START("quoted multi");
142e34e9144Sdjm START_STRING("\"blob1\" blob2");
143e34e9144Sdjm cp = strdelim(&str);
144e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob1");
1459d6f8b7eSdjm ASSERT_STRING_EQ(str, "blob2");
146e34e9144Sdjm cp = strdelim(&str);
147e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob2");
1489d6f8b7eSdjm ASSERT_PTR_EQ(str, NULL);
149e34e9144Sdjm cp = strdelim(&str);
150e34e9144Sdjm ASSERT_PTR_EQ(cp, NULL);
151e34e9144Sdjm DONE_STRING();
152e34e9144Sdjm TEST_DONE();
153e34e9144Sdjm
154e34e9144Sdjm TEST_START("quoted multi reverse");
155e34e9144Sdjm START_STRING("blob1 \"blob2\"");
156e34e9144Sdjm cp = strdelim(&str);
157e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob1");
1589d6f8b7eSdjm ASSERT_STRING_EQ(str, "\"blob2\"");
159e34e9144Sdjm cp = strdelim(&str);
160e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob2");
1619d6f8b7eSdjm ASSERT_STRING_EQ(str, "");
162e34e9144Sdjm cp = strdelim(&str);
163e34e9144Sdjm ASSERT_STRING_EQ(cp, ""); /* XXX better as NULL */
1649d6f8b7eSdjm ASSERT_PTR_EQ(str, NULL);
165e34e9144Sdjm DONE_STRING();
166e34e9144Sdjm TEST_DONE();
167e34e9144Sdjm
168e34e9144Sdjm TEST_START("quoted multi middle");
169e34e9144Sdjm START_STRING("blob1 \"blob2\" blob3");
170e34e9144Sdjm cp = strdelim(&str);
171e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob1");
172e34e9144Sdjm cp = strdelim(&str);
173e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob2");
174e34e9144Sdjm cp = strdelim(&str);
175e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob3");
176e34e9144Sdjm cp = strdelim(&str);
177e34e9144Sdjm ASSERT_PTR_EQ(cp, NULL);
178e34e9144Sdjm DONE_STRING();
179e34e9144Sdjm TEST_DONE();
180e34e9144Sdjm
181e34e9144Sdjm TEST_START("badquote");
182e34e9144Sdjm START_STRING("\"blob");
183e34e9144Sdjm cp = strdelim(&str);
184e34e9144Sdjm ASSERT_PTR_EQ(cp, NULL);
185e34e9144Sdjm DONE_STRING();
186e34e9144Sdjm TEST_DONE();
187e34e9144Sdjm
188e34e9144Sdjm TEST_START("oops quote");
189e34e9144Sdjm START_STRING("\"blob\\\"");
190e34e9144Sdjm cp = strdelim(&str);
191e34e9144Sdjm ASSERT_STRING_EQ(cp, "blob\\"); /* XXX wrong */
192e34e9144Sdjm cp = strdelim(&str);
193e34e9144Sdjm ASSERT_STRING_EQ(cp, "");
194e34e9144Sdjm DONE_STRING();
195e34e9144Sdjm TEST_DONE();
196e34e9144Sdjm
197e34e9144Sdjm }
198