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