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
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