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