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