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