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