chiark / gitweb /
16c2655495393fe54f1b0f889b9c35b589991bcb
[elogind.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 #if 0 /// UNNEEDED by elogind
330 static void test_extract_first_word_and_warn(void) {
331         const char *p, *original;
332         char *t;
333
334         p = original = "foobar waldo";
335         assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
336         assert_se(streq(t, "foobar"));
337         free(t);
338         assert_se(p == original + 7);
339
340         assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
341         assert_se(streq(t, "waldo"));
342         free(t);
343         assert_se(isempty(p));
344
345         assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) == 0);
346         assert_se(!t);
347         assert_se(isempty(p));
348
349         p = original = "\"foobar\" \'waldo\'";
350         assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) > 0);
351         assert_se(streq(t, "foobar"));
352         free(t);
353         assert_se(p == original + 9);
354
355         assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) > 0);
356         assert_se(streq(t, "waldo"));
357         free(t);
358         assert_se(isempty(p));
359
360         assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) == 0);
361         assert_se(!t);
362         assert_se(isempty(p));
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 = "\'";
369         assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) == -EINVAL);
370         assert_se(p == original + 1);
371
372         p = original = "\'fooo";
373         assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) == -EINVAL);
374         assert_se(p == original + 5);
375
376         p = original = "\'fooo";
377         assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
378         assert_se(streq(t, "fooo"));
379         free(t);
380         assert_se(isempty(p));
381
382         p = original = " foo\\ba\\x6ar ";
383         assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
384         assert_se(streq(t, "foo\ba\x6ar"));
385         free(t);
386         assert_se(isempty(p));
387
388         p = original = " foo\\ba\\x6ar ";
389         assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
390         assert_se(streq(t, "foobax6ar"));
391         free(t);
392         assert_se(isempty(p));
393
394         p = original = "    f\\u00f6o \"pi\\U0001F4A9le\"   ";
395         assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
396         assert_se(streq(t, "föo"));
397         free(t);
398         assert_se(p == original + 13);
399
400         assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
401         assert_se(streq(t, "pi\360\237\222\251le"));
402         free(t);
403         assert_se(isempty(p));
404
405         p = original = "fooo\\";
406         assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
407         assert_se(streq(t, "fooo"));
408         free(t);
409         assert_se(isempty(p));
410
411         p = original = "fooo\\";
412         assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
413         assert_se(streq(t, "fooo\\"));
414         free(t);
415         assert_se(isempty(p));
416
417         p = original = "fooo\\";
418         assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
419         assert_se(streq(t, "fooo\\"));
420         free(t);
421         assert_se(isempty(p));
422
423         p = original = "\"foo\\";
424         assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES, NULL, "fake", 1, original) == -EINVAL);
425         assert_se(p == original + 5);
426
427         p = original = "\"foo\\";
428         assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
429         assert_se(streq(t, "foo"));
430         free(t);
431         assert_se(isempty(p));
432
433         p = original = "\"foo\\";
434         assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE, NULL, "fake", 1, original) == -EINVAL);
435         assert_se(p == original + 5);
436
437         p = original = "\"foo\\";
438         assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_QUOTES|EXTRACT_CUNESCAPE|EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
439         assert_se(streq(t, "foo"));
440         free(t);
441         assert_se(isempty(p));
442
443         p = original = "fooo\\ bar quux";
444         assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_RELAX, NULL, "fake", 1, original) > 0);
445         assert_se(streq(t, "fooo bar"));
446         free(t);
447         assert_se(p == original + 10);
448
449         p = original = "fooo\\ bar quux";
450         assert_se(extract_first_word_and_warn(&p, &t, NULL, 0, NULL, "fake", 1, original) > 0);
451         assert_se(streq(t, "fooo bar"));
452         free(t);
453         assert_se(p == original + 10);
454
455         p = original = "fooo\\ bar quux";
456         assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
457         assert_se(streq(t, "fooo\\ bar"));
458         free(t);
459         assert_se(p == original + 10);
460
461         p = original = "\\w+@\\K[\\d.]+";
462         assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
463         assert_se(streq(t, "\\w+@\\K[\\d.]+"));
464         free(t);
465         assert_se(isempty(p));
466
467         p = original = "\\w+\\b";
468         assert_se(extract_first_word_and_warn(&p, &t, NULL, EXTRACT_CUNESCAPE, NULL, "fake", 1, original) > 0);
469         assert_se(streq(t, "\\w+\b"));
470         free(t);
471         assert_se(isempty(p));
472 }
473
474 static void test_extract_many_words(void) {
475         const char *p, *original;
476         char *a, *b, *c;
477
478         p = original = "foobar waldi piep";
479         assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 3);
480         assert_se(isempty(p));
481         assert_se(streq_ptr(a, "foobar"));
482         assert_se(streq_ptr(b, "waldi"));
483         assert_se(streq_ptr(c, "piep"));
484         free(a);
485         free(b);
486         free(c);
487
488         p = original = "'foobar' wa\"ld\"i   ";
489         assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 2);
490         assert_se(isempty(p));
491         assert_se(streq_ptr(a, "'foobar'"));
492         assert_se(streq_ptr(b, "wa\"ld\"i"));
493         assert_se(streq_ptr(c, NULL));
494         free(a);
495         free(b);
496
497         p = original = "'foobar' wa\"ld\"i   ";
498         assert_se(extract_many_words(&p, NULL, EXTRACT_QUOTES, &a, &b, &c, NULL) == 2);
499         assert_se(isempty(p));
500         assert_se(streq_ptr(a, "foobar"));
501         assert_se(streq_ptr(b, "waldi"));
502         assert_se(streq_ptr(c, NULL));
503         free(a);
504         free(b);
505
506         p = original = "";
507         assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 0);
508         assert_se(isempty(p));
509         assert_se(streq_ptr(a, NULL));
510         assert_se(streq_ptr(b, NULL));
511         assert_se(streq_ptr(c, NULL));
512
513         p = original = "  ";
514         assert_se(extract_many_words(&p, NULL, 0, &a, &b, &c, NULL) == 0);
515         assert_se(isempty(p));
516         assert_se(streq_ptr(a, NULL));
517         assert_se(streq_ptr(b, NULL));
518         assert_se(streq_ptr(c, NULL));
519
520         p = original = "foobar";
521         assert_se(extract_many_words(&p, NULL, 0, NULL) == 0);
522         assert_se(p == original);
523
524         p = original = "foobar waldi";
525         assert_se(extract_many_words(&p, NULL, 0, &a, NULL) == 1);
526         assert_se(p == original+7);
527         assert_se(streq_ptr(a, "foobar"));
528         free(a);
529
530         p = original = "     foobar    ";
531         assert_se(extract_many_words(&p, NULL, 0, &a, NULL) == 1);
532         assert_se(isempty(p));
533         assert_se(streq_ptr(a, "foobar"));
534         free(a);
535 }
536 #endif // 0
537
538 int main(int argc, char *argv[]) {
539         log_parse_environment();
540         log_open();
541
542         test_extract_first_word();
543 #if 0 /// UNNEEDED by elogind
544         test_extract_first_word_and_warn();
545         test_extract_many_words();
546 #endif // 0
547
548         return 0;
549 }