1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 #include "alloc-util.h"
5 #include "string-util.h"
10 assert_se(STR_IN_SET("x", "x", "y", "z"));
11 assert_se(!STR_IN_SET("X", "x", "y", "z"));
12 assert_se(!STR_IN_SET("", "x", "y", "z"));
13 assert_se(STR_IN_SET("x", "w", "x"));
17 assert_se(STRPTR_IN_SET("x", "x", "y", "z"));
18 assert_se(!STRPTR_IN_SET("X", "x", "y", "z"));
19 assert_se(!STRPTR_IN_SET("", "x", "y", "z"));
20 assert_se(STRPTR_IN_SET("x", "w", "x"));
22 assert_se(!STRPTR_IN_SET(NULL
, "x", "y", "z"));
23 assert_se(!STRPTR_IN_SET(NULL
, ""));
24 /* strv cannot contain a null, hence the result below */
25 assert_se(!STRPTR_IN_SET(NULL
, NULL
));
28 TEST(startswith_set
) {
29 assert_se(!STARTSWITH_SET("foo", "bar", "baz", "waldo"));
30 assert_se(!STARTSWITH_SET("foo", "bar"));
32 assert_se(STARTSWITH_SET("abc", "a", "ab", "abc"));
33 assert_se(STARTSWITH_SET("abc", "ax", "ab", "abc"));
34 assert_se(STARTSWITH_SET("abc", "ax", "abx", "abc"));
35 assert_se(!STARTSWITH_SET("abc", "ax", "abx", "abcx"));
37 assert_se(streq_ptr(STARTSWITH_SET("foobar", "hhh", "kkk", "foo", "zzz"), "bar"));
38 assert_se(streq_ptr(STARTSWITH_SET("foobar", "hhh", "kkk", "", "zzz"), "foobar"));
39 assert_se(streq_ptr(STARTSWITH_SET("", "hhh", "kkk", "zzz", ""), ""));
42 static const char* const input_table_multiple
[] = {
49 static const char* const input_table_quoted
[] = {
56 static const char* const input_table_quoted_joined
[] = {
58 " two\t three " " four five",
62 static const char* const input_table_one
[] = {
67 static const char* const input_table_none
[] = {
71 static const char* const input_table_two_empties
[] = {
77 static const char* const input_table_one_empty
[] = {
82 static const char* const input_table_unescape
[] = {
84 "ID_VENDOR_ENC=QEMUx20x20x20x20",
85 "ID_MODEL_ENC=QEMUx20HARDDISKx20x20x20",
89 static const char* const input_table_retain_escape
[] = {
91 "ID_VENDOR_ENC=QEMU\\x20\\x20\\x20\\x20",
92 "ID_MODEL_ENC=QEMU\\x20HARDDISK\\x20\\x20\\x20",
97 assert_se(strv_find((char **)input_table_multiple
, "three"));
98 assert_se(!strv_find((char **)input_table_multiple
, "four"));
101 TEST(strv_find_prefix
) {
102 assert_se(strv_find_prefix((char **)input_table_multiple
, "o"));
103 assert_se(strv_find_prefix((char **)input_table_multiple
, "one"));
104 assert_se(strv_find_prefix((char **)input_table_multiple
, ""));
105 assert_se(!strv_find_prefix((char **)input_table_multiple
, "xxx"));
106 assert_se(!strv_find_prefix((char **)input_table_multiple
, "onee"));
109 TEST(strv_find_startswith
) {
112 r
= strv_find_startswith((char **)input_table_multiple
, "o");
113 assert_se(r
&& streq(r
, "ne"));
115 r
= strv_find_startswith((char **)input_table_multiple
, "one");
116 assert_se(r
&& streq(r
, ""));
118 r
= strv_find_startswith((char **)input_table_multiple
, "");
119 assert_se(r
&& streq(r
, "one"));
121 assert_se(!strv_find_startswith((char **)input_table_multiple
, "xxx"));
122 assert_se(!strv_find_startswith((char **)input_table_multiple
, "onee"));
126 _cleanup_free_
char *p
= strv_join((char **)input_table_multiple
, ", ");
128 assert_se(streq(p
, "one, two, three"));
130 _cleanup_free_
char *q
= strv_join((char **)input_table_multiple
, ";");
132 assert_se(streq(q
, "one;two;three"));
134 _cleanup_free_
char *r
= strv_join((char **)input_table_multiple
, NULL
);
136 assert_se(streq(r
, "one two three"));
138 _cleanup_free_
char *s
= strv_join(STRV_MAKE("1", "2", "3,3"), ",");
140 assert_se(streq(s
, "1,2,3,3"));
142 _cleanup_free_
char *t
= strv_join((char **)input_table_one
, ", ");
144 assert_se(streq(t
, "one"));
146 _cleanup_free_
char *u
= strv_join((char **)input_table_none
, ", ");
148 assert_se(streq(u
, ""));
150 _cleanup_free_
char *v
= strv_join((char **)input_table_two_empties
, ", ");
152 assert_se(streq(v
, ", "));
154 _cleanup_free_
char *w
= strv_join((char **)input_table_one_empty
, ", ");
156 assert_se(streq(w
, ""));
159 TEST(strv_join_full
) {
160 _cleanup_free_
char *p
= strv_join_full((char **)input_table_multiple
, ", ", "foo", false);
162 assert_se(streq(p
, "fooone, footwo, foothree"));
164 _cleanup_free_
char *q
= strv_join_full((char **)input_table_multiple
, ";", "foo", false);
166 assert_se(streq(q
, "fooone;footwo;foothree"));
168 _cleanup_free_
char *r
= strv_join_full(STRV_MAKE("a", "a;b", "a:c"), ";", NULL
, true);
170 assert_se(streq(r
, "a;a\\;b;a:c"));
172 _cleanup_free_
char *s
= strv_join_full(STRV_MAKE("a", "a;b", "a;;c", ";", ";x"), ";", NULL
, true);
174 assert_se(streq(s
, "a;a\\;b;a\\;\\;c;\\;;\\;x"));
176 _cleanup_free_
char *t
= strv_join_full(STRV_MAKE("a", "a;b", "a:c", ";"), ";", "=", true);
178 assert_se(streq(t
, "=a;=a\\;b;=a:c;=\\;"));
181 _cleanup_free_
char *u
= strv_join_full((char **)input_table_multiple
, NULL
, "foo", false);
183 assert_se(streq(u
, "fooone footwo foothree"));
185 _cleanup_free_
char *v
= strv_join_full((char **)input_table_one
, ", ", "foo", false);
187 assert_se(streq(v
, "fooone"));
189 _cleanup_free_
char *w
= strv_join_full((char **)input_table_none
, ", ", "foo", false);
191 assert_se(streq(w
, ""));
193 _cleanup_free_
char *x
= strv_join_full((char **)input_table_two_empties
, ", ", "foo", false);
195 assert_se(streq(x
, "foo, foo"));
197 _cleanup_free_
char *y
= strv_join_full((char **)input_table_one_empty
, ", ", "foo", false);
199 assert_se(streq(y
, "foo"));
202 static void test_strv_unquote_one(const char *quoted
, char **list
) {
203 _cleanup_strv_free_
char **s
;
204 _cleanup_free_
char *j
;
208 log_info("/* %s */", __func__
);
210 r
= strv_split_full(&s
, quoted
, WHITESPACE
, EXTRACT_UNQUOTE
);
211 assert_se(r
== (int) strv_length(list
));
213 j
= strv_join(s
, " | ");
218 assert_se(streq(list
[i
++], *t
));
220 assert_se(list
[i
] == NULL
);
224 test_strv_unquote_one(" foo=bar \"waldo\" zzz ", STRV_MAKE("foo=bar", "waldo", "zzz"));
225 test_strv_unquote_one("", STRV_MAKE_EMPTY
);
226 test_strv_unquote_one(" ", STRV_MAKE_EMPTY
);
227 test_strv_unquote_one(" ", STRV_MAKE_EMPTY
);
228 test_strv_unquote_one(" x", STRV_MAKE("x"));
229 test_strv_unquote_one("x ", STRV_MAKE("x"));
230 test_strv_unquote_one(" x ", STRV_MAKE("x"));
231 test_strv_unquote_one(" \"x\" ", STRV_MAKE("x"));
232 test_strv_unquote_one(" 'x' ", STRV_MAKE("x"));
233 test_strv_unquote_one(" 'x\"' ", STRV_MAKE("x\""));
234 test_strv_unquote_one(" \"x'\" ", STRV_MAKE("x'"));
235 test_strv_unquote_one("a '--b=c \"d e\"'", STRV_MAKE("a", "--b=c \"d e\""));
237 /* trailing backslashes */
238 test_strv_unquote_one(" x\\\\", STRV_MAKE("x\\"));
241 static void test_invalid_unquote_one(const char *quoted
) {
245 log_info("/* %s */", __func__
);
247 r
= strv_split_full(&s
, quoted
, WHITESPACE
, EXTRACT_UNQUOTE
);
248 assert_se(s
== NULL
);
249 assert_se(r
== -EINVAL
);
252 TEST(invalid_unquote
) {
253 test_invalid_unquote_one(" x\\");
254 test_invalid_unquote_one("a --b='c \"d e\"''");
255 test_invalid_unquote_one("a --b='c \"d e\" '\"");
256 test_invalid_unquote_one("a --b='c \"d e\"garbage");
257 test_invalid_unquote_one("'");
258 test_invalid_unquote_one("\"");
259 test_invalid_unquote_one("'x'y'g");
263 _cleanup_(strv_free_erasep
) char **l
= NULL
;
264 const char str
[] = "one,two,three";
266 l
= strv_split(str
, ",");
268 assert_se(strv_equal(l
, (char**) input_table_multiple
));
272 l
= strv_split(" one two\t three", WHITESPACE
);
274 assert_se(strv_equal(l
, (char**) input_table_multiple
));
278 /* Setting NULL for separator is equivalent to WHITESPACE */
279 l
= strv_split(" one two\t three", NULL
);
281 assert_se(strv_equal(l
, (char**) input_table_multiple
));
285 assert_se(strv_split_full(&l
, " one two\t three", NULL
, 0) == 3);
286 assert_se(strv_equal(l
, (char**) input_table_multiple
));
290 assert_se(strv_split_full(&l
, " 'one' \" two\t three \" ' four five'", NULL
, EXTRACT_UNQUOTE
) == 3);
291 assert_se(strv_equal(l
, (char**) input_table_quoted
));
293 l
= strv_free_erase(l
);
295 /* missing last quote causes extraction to fail. */
296 assert_se(strv_split_full(&l
, " 'one' \" two\t three \" ' four five", NULL
, EXTRACT_UNQUOTE
) == -EINVAL
);
299 /* missing last quote, but the last element is _not_ ignored with EXTRACT_RELAX. */
300 assert_se(strv_split_full(&l
, " 'one' \" two\t three \" ' four five", NULL
, EXTRACT_UNQUOTE
| EXTRACT_RELAX
) == 3);
301 assert_se(strv_equal(l
, (char**) input_table_quoted
));
303 l
= strv_free_erase(l
);
305 /* missing separator between items */
306 assert_se(strv_split_full(&l
, " 'one' \" two\t three \"' four five'", NULL
, EXTRACT_UNQUOTE
| EXTRACT_RELAX
) == 2);
307 assert_se(strv_equal(l
, (char**) input_table_quoted_joined
));
309 l
= strv_free_erase(l
);
311 assert_se(strv_split_full(&l
, " 'one' \" two\t three \"' four five", NULL
,
312 EXTRACT_UNQUOTE
| EXTRACT_RELAX
| EXTRACT_UNESCAPE_RELAX
) == 2);
313 assert_se(strv_equal(l
, (char**) input_table_quoted_joined
));
315 l
= strv_free_erase(l
);
317 assert_se(strv_split_full(&l
, "\\", NULL
, EXTRACT_UNQUOTE
| EXTRACT_RELAX
| EXTRACT_UNESCAPE_RELAX
) == 1);
318 assert_se(strv_equal(l
, STRV_MAKE("\\")));
320 l
= strv_free_erase(l
);
322 assert_se(l
= strv_split("\\", NULL
));
323 assert_se(strv_equal(l
, STRV_MAKE("\\")));
325 l
= strv_free_erase(l
);
327 assert_se(l
= strv_split("aa\\ bb\\", NULL
));
328 assert_se(strv_equal(l
, STRV_MAKE("aa\\", "bb\\")));
330 l
= strv_free_erase(l
);
332 assert_se(l
= strv_split("aa\" bb'", NULL
));
333 assert_se(strv_equal(l
, STRV_MAKE("aa\"", "bb'")));
336 TEST(strv_split_empty
) {
337 _cleanup_strv_free_
char **l
= NULL
;
339 l
= strv_split("", WHITESPACE
);
341 assert_se(strv_isempty(l
));
344 assert_se(l
= strv_split("", NULL
));
345 assert_se(strv_isempty(l
));
348 assert_se(strv_split_full(&l
, "", NULL
, 0) == 0);
350 assert_se(strv_isempty(l
));
353 assert_se(strv_split_full(&l
, "", NULL
, EXTRACT_UNQUOTE
) == 0);
355 assert_se(strv_isempty(l
));
358 assert_se(strv_split_full(&l
, "", WHITESPACE
, EXTRACT_UNQUOTE
) == 0);
360 assert_se(strv_isempty(l
));
363 assert_se(strv_split_full(&l
, "", WHITESPACE
, EXTRACT_UNQUOTE
| EXTRACT_RELAX
) == 0);
365 assert_se(strv_isempty(l
));
368 l
= strv_split(" ", WHITESPACE
);
370 assert_se(strv_isempty(l
));
373 l
= strv_split(" ", NULL
);
375 assert_se(strv_isempty(l
));
378 assert_se(strv_split_full(&l
, " ", NULL
, 0) == 0);
380 assert_se(strv_isempty(l
));
383 assert_se(strv_split_full(&l
, " ", WHITESPACE
, EXTRACT_UNQUOTE
) == 0);
385 assert_se(strv_isempty(l
));
388 assert_se(strv_split_full(&l
, " ", NULL
, EXTRACT_UNQUOTE
) == 0);
390 assert_se(strv_isempty(l
));
393 assert_se(strv_split_full(&l
, " ", NULL
, EXTRACT_UNQUOTE
| EXTRACT_RELAX
) == 0);
395 assert_se(strv_isempty(l
));
398 TEST(strv_split_full
) {
399 _cleanup_strv_free_
char **l
= NULL
;
400 const char *str
= ":foo\\:bar::waldo:";
403 r
= strv_split_full(&l
, str
, ":", EXTRACT_DONT_COALESCE_SEPARATORS
);
404 assert_se(r
== (int) strv_length(l
));
405 assert_se(streq_ptr(l
[0], ""));
406 assert_se(streq_ptr(l
[1], "foo:bar"));
407 assert_se(streq_ptr(l
[2], ""));
408 assert_se(streq_ptr(l
[3], "waldo"));
409 assert_se(streq_ptr(l
[4], ""));
410 assert_se(streq_ptr(l
[5], NULL
));
413 TEST(strv_split_and_extend_full
) {
414 _cleanup_strv_free_
char **l
= NULL
;
415 const char *str1
= ":foo\\:bar:";
416 const char *str2
= "waldo::::::baz";
419 r
= strv_split_and_extend(&l
, "", ":", false);
420 assert_se(r
== (int) strv_length(l
));
421 r
= strv_split_and_extend_full(&l
, str1
, ":", false, EXTRACT_DONT_COALESCE_SEPARATORS
);
422 assert_se(r
== (int) strv_length(l
));
423 assert_se(streq_ptr(l
[0], ""));
424 assert_se(streq_ptr(l
[1], "foo:bar"));
425 assert_se(streq_ptr(l
[2], ""));
426 r
= strv_split_and_extend_full(&l
, str2
, ":", false, 0);
427 assert_se(r
== (int) strv_length(l
));
428 assert_se(streq_ptr(l
[3], "waldo"));
429 assert_se(streq_ptr(l
[4], "baz"));
430 assert_se(streq_ptr(l
[5], NULL
));
433 TEST(strv_split_colon_pairs
) {
434 _cleanup_strv_free_
char **l
= NULL
;
435 const char *str
= "one:two three four:five six seven:eight\\:nine ten\\:eleven\\\\",
436 *str_inval
="one:two three:four:five";
439 r
= strv_split_colon_pairs(&l
, str
);
440 assert_se(r
== (int) strv_length(l
));
442 assert_se(streq_ptr(l
[0], "one"));
443 assert_se(streq_ptr(l
[1], "two"));
444 assert_se(streq_ptr(l
[2], "three"));
445 assert_se(streq_ptr(l
[3], ""));
446 assert_se(streq_ptr(l
[4], "four"));
447 assert_se(streq_ptr(l
[5], "five"));
448 assert_se(streq_ptr(l
[6], "six"));
449 assert_se(streq_ptr(l
[7], ""));
450 assert_se(streq_ptr(l
[8], "seven"));
451 assert_se(streq_ptr(l
[9], "eight:nine"));
452 assert_se(streq_ptr(l
[10], "ten:eleven\\"));
453 assert_se(streq_ptr(l
[11], ""));
454 assert_se(streq_ptr(l
[12], NULL
));
456 r
= strv_split_colon_pairs(&l
, str_inval
);
457 assert_se(r
== -EINVAL
);
460 TEST(strv_split_newlines
) {
462 _cleanup_strv_free_
char **l
= NULL
;
463 const char str
[] = "one\ntwo\nthree";
465 l
= strv_split_newlines(str
);
469 assert_se(streq(*s
, input_table_multiple
[i
++]));
472 TEST(strv_split_newlines_full
) {
475 "ID_VENDOR_ENC=QEMU\\x20\\x20\\x20\\x20\n"
476 "ID_MODEL_ENC=QEMU\\x20HARDDISK\\x20\\x20\\x20\n"
478 _cleanup_strv_free_
char **l
= NULL
;
480 assert_se(strv_split_newlines_full(&l
, str
, 0) == 3);
481 assert_se(strv_equal(l
, (char**) input_table_unescape
));
485 assert_se(strv_split_newlines_full(&l
, str
, EXTRACT_RETAIN_ESCAPE
) == 3);
486 assert_se(strv_equal(l
, (char**) input_table_retain_escape
));
490 const char * const input_table
[] = {
496 const char * const input_table_overlap
[] = {
500 const char * const input_table_unique
[] = {
507 assert_se(strv_overlap((char **)input_table
, (char**)input_table_overlap
));
508 assert_se(!strv_overlap((char **)input_table
, (char**)input_table_unique
));
512 const char* input_table
[] = {
516 "CAPITAL LETTERS FIRST",
521 strv_sort((char **)input_table
);
523 assert_se(streq(input_table
[0], "CAPITAL LETTERS FIRST"));
524 assert_se(streq(input_table
[1], "apple"));
525 assert_se(streq(input_table
[2], "banana"));
526 assert_se(streq(input_table
[3], "citrus"));
527 assert_se(streq(input_table
[4], "durian"));
530 TEST(strv_extend_strv_concat
) {
531 _cleanup_strv_free_
char **a
= NULL
, **b
= NULL
;
533 a
= strv_new("without", "suffix");
534 b
= strv_new("with", "suffix");
538 assert_se(strv_extend_strv_concat(&a
, b
, "_suffix") >= 0);
540 assert_se(streq(a
[0], "without"));
541 assert_se(streq(a
[1], "suffix"));
542 assert_se(streq(a
[2], "with_suffix"));
543 assert_se(streq(a
[3], "suffix_suffix"));
546 TEST(strv_extend_strv
) {
547 _cleanup_strv_free_
char **a
= NULL
, **b
= NULL
, **n
= NULL
;
549 a
= strv_new("abc", "def", "ghi");
550 b
= strv_new("jkl", "mno", "abc", "pqr");
554 assert_se(strv_extend_strv(&a
, b
, true) == 3);
556 assert_se(streq(a
[0], "abc"));
557 assert_se(streq(a
[1], "def"));
558 assert_se(streq(a
[2], "ghi"));
559 assert_se(streq(a
[3], "jkl"));
560 assert_se(streq(a
[4], "mno"));
561 assert_se(streq(a
[5], "pqr"));
562 assert_se(strv_length(a
) == 6);
564 assert_se(strv_extend_strv(&n
, b
, false) >= 0);
565 assert_se(streq(n
[0], "jkl"));
566 assert_se(streq(n
[1], "mno"));
567 assert_se(streq(n
[2], "abc"));
568 assert_se(streq(n
[3], "pqr"));
569 assert_se(strv_length(n
) == 4);
572 TEST(strv_extend_with_size
) {
573 _cleanup_strv_free_
char **a
= NULL
;
576 a
= strv_new("test", "test1");
579 assert_se(strv_extend_with_size(&a
, &n
, "test2") >= 0);
581 assert_se(strv_extend_with_size(&a
, &n
, "test3") >= 0);
584 assert_se(streq(a
[0], "test"));
585 assert_se(streq(a
[1], "test1"));
586 assert_se(streq(a
[2], "test2"));
587 assert_se(streq(a
[3], "test3"));
588 assert_se(a
[4] == NULL
);
592 _cleanup_strv_free_
char **a
= NULL
, **b
= NULL
;
594 a
= strv_new("test", "test1");
596 assert_se(strv_extend(&a
, "test2") >= 0);
597 assert_se(strv_extend(&b
, "test3") >= 0);
599 assert_se(streq(a
[0], "test"));
600 assert_se(streq(a
[1], "test1"));
601 assert_se(streq(a
[2], "test2"));
602 assert_se(streq(b
[0], "test3"));
606 _cleanup_strv_free_
char **a
= NULL
, **b
= NULL
;
608 a
= strv_new("test", "test1");
610 assert_se(strv_extendf(&a
, "test2 %s %d %s", "foo", 128, "bar") >= 0);
611 assert_se(strv_extendf(&b
, "test3 %s %s %d", "bar", "foo", 128) >= 0);
613 assert_se(streq(a
[0], "test"));
614 assert_se(streq(a
[1], "test1"));
615 assert_se(streq(a
[2], "test2 foo 128 bar"));
616 assert_se(streq(b
[0], "test3 bar foo 128"));
620 _cleanup_strv_free_
char **a
;
623 a
= strv_new("one", "two", "three");
626 STRV_FOREACH(check
, a
)
627 assert_se(streq(*check
, input_table_multiple
[i
++]));
630 TEST(strv_foreach_backwards
) {
631 _cleanup_strv_free_
char **a
;
634 a
= strv_new("one", "two", "three");
638 STRV_FOREACH_BACKWARDS(check
, a
)
639 assert_se(streq_ptr(*check
, input_table_multiple
[i
--]));
641 STRV_FOREACH_BACKWARDS(check
, (char**) NULL
)
642 assert_not_reached();
644 STRV_FOREACH_BACKWARDS(check
, STRV_MAKE_EMPTY
)
645 assert_not_reached();
648 STRV_FOREACH_BACKWARDS(check
, STRV_MAKE("ONE"))
650 assert_se(count
== 1);
653 TEST(strv_foreach_pair
) {
654 _cleanup_strv_free_
char **a
= NULL
;
656 a
= strv_new("pair_one", "pair_one",
657 "pair_two", "pair_two",
658 "pair_three", "pair_three");
659 STRV_FOREACH_PAIR(x
, y
, a
)
660 assert_se(streq(*x
, *y
));
663 static void test_strv_from_stdarg_alloca_one(char **l
, const char *first
, ...) {
667 log_info("/* %s */", __func__
);
669 j
= strv_from_stdarg_alloca(first
);
672 assert_se(streq_ptr(l
[i
], j
[i
]));
679 TEST(strv_from_stdarg_alloca
) {
680 test_strv_from_stdarg_alloca_one(STRV_MAKE("foo", "bar"), "foo", "bar", NULL
);
681 test_strv_from_stdarg_alloca_one(STRV_MAKE("foo"), "foo", NULL
);
682 test_strv_from_stdarg_alloca_one(STRV_MAKE_EMPTY
, NULL
);
686 _cleanup_strv_free_
char **a
= NULL
;
688 assert_se(strv_insert(&a
, 0, strdup("first")) == 0);
689 assert_se(streq(a
[0], "first"));
692 assert_se(strv_insert(&a
, 0, NULL
) == 0);
693 assert_se(streq(a
[0], "first"));
696 assert_se(strv_insert(&a
, 1, strdup("two")) == 0);
697 assert_se(streq(a
[0], "first"));
698 assert_se(streq(a
[1], "two"));
701 assert_se(strv_insert(&a
, 4, strdup("tri")) == 0);
702 assert_se(streq(a
[0], "first"));
703 assert_se(streq(a
[1], "two"));
704 assert_se(streq(a
[2], "tri"));
707 assert_se(strv_insert(&a
, 1, strdup("duo")) == 0);
708 assert_se(streq(a
[0], "first"));
709 assert_se(streq(a
[1], "duo"));
710 assert_se(streq(a
[2], "two"));
711 assert_se(streq(a
[3], "tri"));
715 TEST(strv_push_prepend
) {
716 _cleanup_strv_free_
char **a
= NULL
;
718 assert_se(a
= strv_new("foo", "bar", "three"));
720 assert_se(strv_push_prepend(&a
, strdup("first")) >= 0);
721 assert_se(streq(a
[0], "first"));
722 assert_se(streq(a
[1], "foo"));
723 assert_se(streq(a
[2], "bar"));
724 assert_se(streq(a
[3], "three"));
727 assert_se(strv_consume_prepend(&a
, strdup("first2")) >= 0);
728 assert_se(streq(a
[0], "first2"));
729 assert_se(streq(a
[1], "first"));
730 assert_se(streq(a
[2], "foo"));
731 assert_se(streq(a
[3], "bar"));
732 assert_se(streq(a
[4], "three"));
736 TEST(strv_push_with_size
) {
737 _cleanup_strv_free_
char **a
= NULL
;
741 assert_se(i
= strdup("foo"));
742 assert_se(strv_push_with_size(&a
, &n
, i
) >= 0);
745 assert_se(i
= strdup("a"));
746 assert_se(j
= strdup("b"));
747 assert_se(strv_push_with_size(&a
, &n
, i
) >= 0);
749 assert_se(strv_push_with_size(&a
, &n
, j
) >= 0);
752 assert_se(streq_ptr(a
[0], "foo"));
753 assert_se(streq_ptr(a
[1], "a"));
754 assert_se(streq_ptr(a
[2], "b"));
755 assert_se(streq_ptr(a
[3], NULL
));
757 assert_se(n
= strv_length(a
));
761 _cleanup_strv_free_
char **a
= NULL
;
764 assert_se(i
= strdup("foo"));
765 assert_se(strv_push(&a
, i
) >= 0);
767 assert_se(i
= strdup("a"));
768 assert_se(j
= strdup("b"));
769 assert_se(strv_push_pair(&a
, i
, j
) >= 0);
771 assert_se(streq_ptr(a
[0], "foo"));
772 assert_se(streq_ptr(a
[1], "a"));
773 assert_se(streq_ptr(a
[2], "b"));
774 assert_se(streq_ptr(a
[3], NULL
));
778 _cleanup_strv_free_
char **a
= NULL
;
779 _cleanup_strv_free_
char **b
= NULL
;
780 _cleanup_strv_free_
char **c
= NULL
;
781 _cleanup_strv_free_
char **d
= NULL
;
783 a
= strv_new("one", "two", "three");
785 b
= strv_new("one", "two", "three");
787 c
= strv_new("one", "two", "three", "four");
792 assert_se(strv_compare(a
, a
) == 0);
793 assert_se(strv_compare(a
, b
) == 0);
794 assert_se(strv_compare(d
, d
) == 0);
795 assert_se(strv_compare(d
, NULL
) == 0);
796 assert_se(strv_compare(NULL
, NULL
) == 0);
798 assert_se(strv_compare(a
, c
) < 0);
799 assert_se(strv_compare(b
, c
) < 0);
800 assert_se(strv_compare(b
, d
) == 1);
801 assert_se(strv_compare(b
, NULL
) == 1);
805 _cleanup_strv_free_
char **a
= NULL
, **b
= NULL
, **c
= NULL
, **d
= NULL
;
809 assert_se(strv_is_uniq(a
));
813 assert_se(strv_is_uniq(b
));
815 c
= strv_new("foo", "bar");
817 assert_se(strv_is_uniq(c
));
819 d
= strv_new("foo", "bar", "waldo", "bar", "piep");
821 assert_se(!strv_is_uniq(d
));
825 _cleanup_strv_free_
char **a
= NULL
, **b
= NULL
, **c
= NULL
, **d
= NULL
;
831 assert_se(strv_isempty(a
));
836 assert_se(streq_ptr(b
[0], "foo"));
837 assert_se(streq_ptr(b
[1], NULL
));
839 c
= strv_new("foo", "bar");
842 assert_se(streq_ptr(c
[0], "bar"));
843 assert_se(streq_ptr(c
[1], "foo"));
844 assert_se(streq_ptr(c
[2], NULL
));
846 d
= strv_new("foo", "bar", "waldo");
849 assert_se(streq_ptr(d
[0], "waldo"));
850 assert_se(streq_ptr(d
[1], "bar"));
851 assert_se(streq_ptr(d
[2], "foo"));
852 assert_se(streq_ptr(d
[3], NULL
));
855 TEST(strv_shell_escape
) {
856 _cleanup_strv_free_
char **v
= NULL
;
858 v
= strv_new("foo:bar", "bar,baz", "wal\\do");
860 assert_se(strv_shell_escape(v
, ",:"));
861 assert_se(streq_ptr(v
[0], "foo\\:bar"));
862 assert_se(streq_ptr(v
[1], "bar\\,baz"));
863 assert_se(streq_ptr(v
[2], "wal\\\\do"));
864 assert_se(streq_ptr(v
[3], NULL
));
867 static void test_strv_skip_one(char **a
, size_t n
, char **b
) {
869 assert_se(strv_equal(a
, b
));
873 test_strv_skip_one(STRV_MAKE("foo", "bar", "baz"), 0, STRV_MAKE("foo", "bar", "baz"));
874 test_strv_skip_one(STRV_MAKE("foo", "bar", "baz"), 1, STRV_MAKE("bar", "baz"));
875 test_strv_skip_one(STRV_MAKE("foo", "bar", "baz"), 2, STRV_MAKE("baz"));
876 test_strv_skip_one(STRV_MAKE("foo", "bar", "baz"), 3, STRV_MAKE(NULL
));
877 test_strv_skip_one(STRV_MAKE("foo", "bar", "baz"), 4, STRV_MAKE(NULL
));
878 test_strv_skip_one(STRV_MAKE("foo", "bar", "baz"), 55, STRV_MAKE(NULL
));
880 test_strv_skip_one(STRV_MAKE("quux"), 0, STRV_MAKE("quux"));
881 test_strv_skip_one(STRV_MAKE("quux"), 1, STRV_MAKE(NULL
));
882 test_strv_skip_one(STRV_MAKE("quux"), 55, STRV_MAKE(NULL
));
884 test_strv_skip_one(STRV_MAKE(NULL
), 0, STRV_MAKE(NULL
));
885 test_strv_skip_one(STRV_MAKE(NULL
), 1, STRV_MAKE(NULL
));
886 test_strv_skip_one(STRV_MAKE(NULL
), 55, STRV_MAKE(NULL
));
889 TEST(strv_extend_n
) {
890 _cleanup_strv_free_
char **v
= NULL
;
892 v
= strv_new("foo", "bar");
895 assert_se(strv_extend_n(&v
, "waldo", 3) >= 0);
896 assert_se(strv_extend_n(&v
, "piep", 2) >= 0);
898 assert_se(streq(v
[0], "foo"));
899 assert_se(streq(v
[1], "bar"));
900 assert_se(streq(v
[2], "waldo"));
901 assert_se(streq(v
[3], "waldo"));
902 assert_se(streq(v
[4], "waldo"));
903 assert_se(streq(v
[5], "piep"));
904 assert_se(streq(v
[6], "piep"));
905 assert_se(v
[7] == NULL
);
909 assert_se(strv_extend_n(&v
, "foo", 1) >= 0);
910 assert_se(strv_extend_n(&v
, "bar", 0) >= 0);
912 assert_se(streq(v
[0], "foo"));
913 assert_se(v
[1] == NULL
);
916 TEST(foreach_string
) {
917 const char * const t
[] = {
925 FOREACH_STRING(x
, "foo", "bar", "waldo")
926 assert_se(streq_ptr(t
[i
++], x
));
929 FOREACH_STRING(x
, "zzz")
930 assert_se(streq(x
, "zzz"));
934 _cleanup_strv_free_
char **v
= NULL
;
937 assert_se(!strv_fnmatch(STRV_MAKE_EMPTY
, "a"));
939 v
= strv_new("xxx", "*\\*", "yyy");
940 assert_se(!strv_fnmatch_full(v
, "\\", 0, NULL
));
941 assert_se(strv_fnmatch_full(v
, "\\", FNM_NOESCAPE
, &pos
));
945 DEFINE_TEST_MAIN(LOG_INFO
);