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