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
24void test_strdelim(void);
25
26void
27test_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