]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/test/test-extract-word.c
tree-wide: beautify remaining copyright statements
[thirdparty/systemd.git] / src / test / test-extract-word.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
23a3c916 2/***
96b2fb93 3 Copyright © 2013 Thomas H.P. Andersen
23a3c916
FB
4***/
5
dccca82b 6#include <errno.h>
23a3c916
FB
7#include <stdlib.h>
8#include <string.h>
9
10#include "extract-word.h"
11#include "log.h"
12#include "string-util.h"
13
14static void test_extract_first_word(void) {
15 const char *p, *original;
16 char *t;
17
18 p = original = "foobar waldo";
19 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
20 assert_se(streq(t, "foobar"));
21 free(t);
22 assert_se(p == original + 7);
23
24 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
25 assert_se(streq(t, "waldo"));
26 free(t);
27 assert_se(isempty(p));
28
29 assert_se(extract_first_word(&p, &t, NULL, 0) == 0);
30 assert_se(!t);
31 assert_se(isempty(p));
32
33 p = original = "\"foobar\" \'waldo\'";
34 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
35 assert_se(streq(t, "\"foobar\""));
36 free(t);
37 assert_se(p == original + 9);
38
39 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
40 assert_se(streq(t, "\'waldo\'"));
41 free(t);
42 assert_se(isempty(p));
43
44 assert_se(extract_first_word(&p, &t, NULL, 0) == 0);
45 assert_se(!t);
46 assert_se(isempty(p));
47
48 p = original = "\"foobar\" \'waldo\'";
49 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) > 0);
50 assert_se(streq(t, "foobar"));
51 free(t);
52 assert_se(p == original + 9);
53
54 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) > 0);
55 assert_se(streq(t, "waldo"));
56 free(t);
57 assert_se(isempty(p));
58
59 assert_se(extract_first_word(&p, &t, NULL, 0) == 0);
60 assert_se(!t);
61 assert_se(isempty(p));
62
63 p = original = "\"";
64 assert_se(extract_first_word(&p, &t, NULL, 0) == 1);
65 assert_se(streq(t, "\""));
66 free(t);
67 assert_se(isempty(p));
68
69 p = original = "\"";
70 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) == -EINVAL);
71 assert_se(p == original + 1);
72
73 p = original = "\'";
74 assert_se(extract_first_word(&p, &t, NULL, 0) == 1);
75 assert_se(streq(t, "\'"));
76 free(t);
77 assert_se(isempty(p));
78
79 p = original = "\'";
80 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) == -EINVAL);
81 assert_se(p == original + 1);
82
83 p = original = "\'fooo";
84 assert_se(extract_first_word(&p, &t, NULL, 0) == 1);
85 assert_se(streq(t, "\'fooo"));
86 free(t);
87 assert_se(isempty(p));
88
89 p = original = "\'fooo";
90 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) == -EINVAL);
91 assert_se(p == original + 5);
92
93 p = original = "\'fooo";
94 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_RELAX) > 0);
95 assert_se(streq(t, "fooo"));
96 free(t);
97 assert_se(isempty(p));
98
99 p = original = "\"fooo";
100 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_RELAX) > 0);
101 assert_se(streq(t, "fooo"));
102 free(t);
103 assert_se(isempty(p));
104
105 p = original = "yay\'foo\'bar";
106 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
107 assert_se(streq(t, "yay\'foo\'bar"));
108 free(t);
109 assert_se(isempty(p));
110
111 p = original = "yay\'foo\'bar";
112 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) > 0);
113 assert_se(streq(t, "yayfoobar"));
114 free(t);
115 assert_se(isempty(p));
116
117 p = original = " foobar ";
118 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
119 assert_se(streq(t, "foobar"));
120 free(t);
121 assert_se(isempty(p));
122
123 p = original = " foo\\ba\\x6ar ";
124 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) > 0);
125 assert_se(streq(t, "foo\ba\x6ar"));
126 free(t);
127 assert_se(isempty(p));
128
129 p = original = " foo\\ba\\x6ar ";
130 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
131 assert_se(streq(t, "foobax6ar"));
132 free(t);
133 assert_se(isempty(p));
134
135 p = original = " f\\u00f6o \"pi\\U0001F4A9le\" ";
136 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) > 0);
137 assert_se(streq(t, "föo"));
138 free(t);
139 assert_se(p == original + 13);
140
141 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE) > 0);
142 assert_se(streq(t, "pi\360\237\222\251le"));
143 free(t);
144 assert_se(isempty(p));
145
146 p = original = "fooo\\";
147 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RELAX) > 0);
148 assert_se(streq(t, "fooo"));
149 free(t);
150 assert_se(isempty(p));
151
152 p = original = "fooo\\";
153 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX) > 0);
154 assert_se(streq(t, "fooo\\"));
155 free(t);
156 assert_se(isempty(p));
157
158 p = original = "fooo\\";
159 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
160 assert_se(streq(t, "fooo\\"));
161 free(t);
162 assert_se(isempty(p));
163
164 p = original = "fooo\\";
165 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
166 assert_se(streq(t, "fooo\\"));
167 free(t);
168 assert_se(isempty(p));
169
170 p = original = "\"foo\\";
171 assert_se(extract_first_word(&p, &t, NULL, 0) == -EINVAL);
172 assert_se(p == original + 5);
173
174 p = original = "\"foo\\";
175 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_RELAX) > 0);
176 assert_se(streq(t, "foo"));
177 free(t);
178 assert_se(isempty(p));
179
180 p = original = "foo::bar";
181 assert_se(extract_first_word(&p, &t, ":", 0) == 1);
182 assert_se(streq(t, "foo"));
183 free(t);
184 assert_se(p == original + 5);
185
186 assert_se(extract_first_word(&p, &t, ":", 0) == 1);
187 assert_se(streq(t, "bar"));
188 free(t);
189 assert_se(isempty(p));
190
191 assert_se(extract_first_word(&p, &t, ":", 0) == 0);
192 assert_se(!t);
193 assert_se(isempty(p));
194
195 p = original = "foo\\:bar::waldo";
196 assert_se(extract_first_word(&p, &t, ":", 0) == 1);
197 assert_se(streq(t, "foo:bar"));
198 free(t);
199 assert_se(p == original + 10);
200
201 assert_se(extract_first_word(&p, &t, ":", 0) == 1);
202 assert_se(streq(t, "waldo"));
203 free(t);
204 assert_se(isempty(p));
205
206 assert_se(extract_first_word(&p, &t, ":", 0) == 0);
207 assert_se(!t);
208 assert_se(isempty(p));
209
210 p = original = "\"foo\\";
211 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE_RELAX) == -EINVAL);
212 assert_se(p == original + 5);
213
214 p = original = "\"foo\\";
215 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
216 assert_se(streq(t, "foo\\"));
217 free(t);
218 assert_se(isempty(p));
219
220 p = original = "\"foo\\";
221 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
222 assert_se(streq(t, "foo\\"));
223 free(t);
224 assert_se(isempty(p));
225
226 p = original = "fooo\\ bar quux";
227 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RELAX) > 0);
228 assert_se(streq(t, "fooo bar"));
229 free(t);
230 assert_se(p == original + 10);
231
232 p = original = "fooo\\ bar quux";
233 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX) > 0);
234 assert_se(streq(t, "fooo bar"));
235 free(t);
236 assert_se(p == original + 10);
237
238 p = original = "fooo\\ bar quux";
239 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE_RELAX|EXTRACT_RELAX) > 0);
240 assert_se(streq(t, "fooo bar"));
241 free(t);
242 assert_se(p == original + 10);
243
244 p = original = "fooo\\ bar quux";
245 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) == -EINVAL);
246 assert_se(p == original + 5);
247
248 p = original = "fooo\\ bar quux";
249 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
250 assert_se(streq(t, "fooo\\ bar"));
251 free(t);
252 assert_se(p == original + 10);
253
254 p = original = "\\w+@\\K[\\d.]+";
255 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE) == -EINVAL);
256 assert_se(p == original + 1);
257
258 p = original = "\\w+@\\K[\\d.]+";
259 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
260 assert_se(streq(t, "\\w+@\\K[\\d.]+"));
261 free(t);
262 assert_se(isempty(p));
263
264 p = original = "\\w+\\b";
265 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX) > 0);
266 assert_se(streq(t, "\\w+\b"));
267 free(t);
268 assert_se(isempty(p));
269
270 p = original = "-N ''";
271 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) > 0);
272 assert_se(streq(t, "-N"));
273 free(t);
274 assert_se(p == original + 3);
275
276 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_QUOTES) > 0);
277 assert_se(streq(t, ""));
278 free(t);
279 assert_se(isempty(p));
280
281 p = original = ":foo\\:bar::waldo:";
282 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
283 assert_se(t);
284 assert_se(streq(t, ""));
285 free(t);
286 assert_se(p == original + 1);
287
288 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
289 assert_se(streq(t, "foo:bar"));
290 free(t);
291 assert_se(p == original + 10);
292
293 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
294 assert_se(t);
295 assert_se(streq(t, ""));
296 free(t);
297 assert_se(p == original + 11);
298
299 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
300 assert_se(streq(t, "waldo"));
301 free(t);
302 assert_se(p == original + 17);
303
304 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 1);
305 assert_se(streq(t, ""));
306 free(t);
307 assert_se(p == NULL);
308
309 assert_se(extract_first_word(&p, &t, ":", EXTRACT_DONT_COALESCE_SEPARATORS) == 0);
310 assert_se(!t);
311 assert_se(!p);
c89f52ac
LP
312
313 p = "foo\\xbar";
314 assert_se(extract_first_word(&p, &t, NULL, 0) > 0);
315 assert_se(streq(t, "fooxbar"));
316 free(t);
317 assert_se(p == NULL);
318
319 p = "foo\\xbar";
320 assert_se(extract_first_word(&p, &t, NULL, EXTRACT_RETAIN_ESCAPE) > 0);
321 assert_se(streq(t, "foo\\xbar"));
322 free(t);
323 assert_se(p == NULL);
23a3c916
FB
324}
325
326static void test_extract_first_word_and_warn(void) {
327 const char *p, *original;
328 char *t;
329
330 p = original = "foobar waldo";
331 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
332 assert_se(streq(t, "foobar"));
333 free(t);
334 assert_se(p == original + 7);
335
336 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
337 assert_se(streq(t, "waldo"));
338 free(t);
339 assert_se(isempty(p));
340
341 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) == 0);
342 assert_se(!t);
343 assert_se(isempty(p));
344
345 p = original = "\"foobar\" \'waldo\'";
346 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) > 0);
347 assert_se(streq(t, "foobar"));
348 free(t);
349 assert_se(p == original + 9);
350
351 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) > 0);
352 assert_se(streq(t, "waldo"));
353 free(t);
354 assert_se(isempty(p));
355
356 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) == 0);
357 assert_se(!t);
358 assert_se(isempty(p));
359
360 p = original = "\"";
361 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) == -EINVAL);
362 assert_se(p == original + 1);
363
364 p = original = "\'";
365 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) == -EINVAL);
366 assert_se(p == original + 1);
367
368 p = original = "\'fooo";
369 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) == -EINVAL);
370 assert_se(p == original + 5);
371
372 p = original = "\'fooo";
373 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
374 assert_se(streq(t, "fooo"));
375 free(t);
376 assert_se(isempty(p));
377
378 p = original = " foo\\ba\\x6ar ";
379 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
380 assert_se(streq(t, "foo\ba\x6ar"));
381 free(t);
382 assert_se(isempty(p));
383
384 p = original = " foo\\ba\\x6ar ";
385 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
386 assert_se(streq(t, "foobax6ar"));
387 free(t);
388 assert_se(isempty(p));
389
390 p = original = " f\\u00f6o \"pi\\U0001F4A9le\" ";
391 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
392 assert_se(streq(t, "föo"));
393 free(t);
394 assert_se(p == original + 13);
395
396 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
397 assert_se(streq(t, "pi\360\237\222\251le"));
398 free(t);
399 assert_se(isempty(p));
400
401 p = original = "fooo\\";
402 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
403 assert_se(streq(t, "fooo"));
404 free(t);
405 assert_se(isempty(p));
406
407 p = original = "fooo\\";
408 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
409 assert_se(streq(t, "fooo\\"));
410 free(t);
411 assert_se(isempty(p));
412
413 p = original = "fooo\\";
414 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
415 assert_se(streq(t, "fooo\\"));
416 free(t);
417 assert_se(isempty(p));
418
419 p = original = "\"foo\\";
420 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) == -EINVAL);
421 assert_se(p == original + 5);
422
423 p = original = "\"foo\\";
424 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
425 assert_se(streq(t, "foo"));
426 free(t);
427 assert_se(isempty(p));
428
429 p = original = "\"foo\\";
430 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE, NULL, "fake", 1, original) == -EINVAL);
431 assert_se(p == original + 5);
432
433 p = original = "\"foo\\";
434 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE|EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
435 assert_se(streq(t, "foo"));
436 free(t);
437 assert_se(isempty(p));
438
439 p = original = "fooo\\ bar quux";
440 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
441 assert_se(streq(t, "fooo bar"));
442 free(t);
443 assert_se(p == original + 10);
444
445 p = original = "fooo\\ bar quux";
446 assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
447 assert_se(streq(t, "fooo bar"));
448 free(t);
449 assert_se(p == original + 10);
450
451 p = original = "fooo\\ bar quux";
452 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
453 assert_se(streq(t, "fooo\\ bar"));
454 free(t);
455 assert_se(p == original + 10);
456
457 p = original = "\\w+@\\K[\\d.]+";
458 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
459 assert_se(streq(t, "\\w+@\\K[\\d.]+"));
460 free(t);
461 assert_se(isempty(p));
462
463 p = original = "\\w+\\b";
464 assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
465 assert_se(streq(t, "\\w+\b"));
466 free(t);
467 assert_se(isempty(p));
468}
469
470static void test_extract_many_words(void) {
471 const char *p, *original;
472 char *a, *b, *c;
473
474 p = original = "foobar waldi piep";
475 assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 3);
476 assert_se(isempty(p));
477 assert_se(streq_ptr(a, "foobar"));
478 assert_se(streq_ptr(b, "waldi"));
479 assert_se(streq_ptr(c, "piep"));
480 free(a);
481 free(b);
482 free(c);
483
484 p = original = "'foobar' wa\"ld\"i ";
485 assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 2);
486 assert_se(isempty(p));
487 assert_se(streq_ptr(a, "'foobar'"));
488 assert_se(streq_ptr(b, "wa\"ld\"i"));
489 assert_se(streq_ptr(c, NULL));
490 free(a);
491 free(b);
492
493 p = original = "'foobar' wa\"ld\"i ";
494 assert_se(extract_many_words(&p, NULL, EXTRACT_QUOTES, &a, &b, &c, NULL) == 2);
495 assert_se(isempty(p));
496 assert_se(streq_ptr(a, "foobar"));
497 assert_se(streq_ptr(b, "waldi"));
498 assert_se(streq_ptr(c, NULL));
499 free(a);
500 free(b);
501
502 p = original = "";
503 assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 0);
504 assert_se(isempty(p));
505 assert_se(streq_ptr(a, NULL));
506 assert_se(streq_ptr(b, NULL));
507 assert_se(streq_ptr(c, NULL));
508
509 p = original = " ";
510 assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 0);
511 assert_se(isempty(p));
512 assert_se(streq_ptr(a, NULL));
513 assert_se(streq_ptr(b, NULL));
514 assert_se(streq_ptr(c, NULL));
515
516 p = original = "foobar";
517 assert_se(extract_many_words(&p, NULL, 0, NULL) == 0);
518 assert_se(p == original);
519
520 p = original = "foobar waldi";
521 assert_se(extract_many_words(&p, NULL, 0, &a, NULL) == 1);
522 assert_se(p == original+7);
523 assert_se(streq_ptr(a, "foobar"));
524 free(a);
525
526 p = original = " foobar ";
527 assert_se(extract_many_words(&p, NULL, 0, &a, NULL) == 1);
528 assert_se(isempty(p));
529 assert_se(streq_ptr(a, "foobar"));
530 free(a);
531}
532
533int main(int argc, char *argv[]) {
534 log_parse_environment();
535 log_open();
536
537 test_extract_first_word();
538 test_extract_first_word_and_warn();
539 test_extract_many_words();
540
541 return 0;
542}