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