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