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