chiark / gitweb /
tree-wide: beautify remaining copyright statements
[elogind.git] / src / test / test-extract-word.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 /***
3   Copyright © 2013 Thomas H.P. Andersen
4 ***/
5
6 #include <errno.h>
7 #include <stdlib.h>
8 #include <string.h>
9
10 #include "extract-word.h"
11 #include "log.h"
12 #include "string-util.h"
13
14 static 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);
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);
324 }
325
326 #if 0 /// UNNEEDED by elogind
327 static 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
471 static 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 #endif // 0
534
535 int main(int argc, char *argv[]) {
536         log_parse_environment();
537         log_open();
538
539         test_extract_first_word();
540 #if 0 /// UNNEEDED by elogind
541         test_extract_first_word_and_warn();
542         test_extract_many_words();
543 #endif // 0
544
545         return 0;
546 }