1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
7 Copyright 2013 Thomas H.P. Andersen
9 systemd is free software; you can redistribute it and/or modify it
10 under the terms of the GNU Lesser General Public License as published by
11 the Free Software Foundation; either version 2.1 of the License, or
12 (at your option) any later version.
14 systemd is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 Lesser General Public License for more details.
19 You should have received a copy of the GNU Lesser General Public License
20 along with systemd; If not, see <http://www.gnu.org/licenses/>.
26 #include "specifier.h"
29 static void test_specifier_printf(void) {
30 static const Specifier table[] = {
31 { 'a', specifier_string, (char*) "AAAA" },
32 { 'b', specifier_string, (char*) "BBBB" },
33 { 'm', specifier_machine_id, NULL },
34 { 'B', specifier_boot_id, NULL },
35 { 'H', specifier_host_name, NULL },
36 { 'v', specifier_kernel_release, NULL },
40 _cleanup_free_ char *w = NULL;
43 r = specifier_printf("xxx a=%a b=%b yyy", table, NULL, &w);
48 assert_se(streq(w, "xxx a=AAAA b=BBBB yyy"));
51 r = specifier_printf("machine=%m, boot=%B, host=%H, version=%v", table, NULL, &w);
57 static const char* const input_table_multiple[] = {
64 static const char* const input_table_one[] = {
69 static const char* const input_table_none[] = {
73 static const char* const input_table_quotes[] = {
81 #define QUOTES_STRING \
88 static const char * const input_table_spaces[] = {
96 #define SPACES_STRING \
103 static void test_strv_find(void) {
104 assert_se(strv_find((char **)input_table_multiple, "three"));
105 assert_se(!strv_find((char **)input_table_multiple, "four"));
108 static void test_strv_find_prefix(void) {
109 assert_se(strv_find_prefix((char **)input_table_multiple, "o"));
110 assert_se(strv_find_prefix((char **)input_table_multiple, "one"));
111 assert_se(strv_find_prefix((char **)input_table_multiple, ""));
112 assert_se(!strv_find_prefix((char **)input_table_multiple, "xxx"));
113 assert_se(!strv_find_prefix((char **)input_table_multiple, "onee"));
116 static void test_strv_join(void) {
117 _cleanup_free_ char *p = NULL, *q = NULL, *r = NULL, *s = NULL, *t = NULL;
119 p = strv_join((char **)input_table_multiple, ", ");
121 assert_se(streq(p, "one, two, three"));
123 q = strv_join((char **)input_table_multiple, ";");
125 assert_se(streq(q, "one;two;three"));
127 r = strv_join((char **)input_table_multiple, NULL);
129 assert_se(streq(r, "one two three"));
131 s = strv_join((char **)input_table_one, ", ");
133 assert_se(streq(s, "one"));
135 t = strv_join((char **)input_table_none, ", ");
137 assert_se(streq(t, ""));
140 static void test_strv_quote_unquote(const char* const *split, const char *quoted) {
141 _cleanup_free_ char *p;
142 _cleanup_strv_free_ char **s;
145 p = strv_join_quoted((char **)split);
146 printf("-%s- --- -%s-\n", p, quoted); /* fprintf deals with NULL, puts does not */
148 assert_se(streq(p, quoted));
150 s = strv_split_quoted(quoted);
154 assert_se(streq(*t, *split));
159 static void test_strv_split(void) {
162 _cleanup_strv_free_ char **l = NULL;
163 const char str[] = "one,two,three";
165 l = strv_split(str, ",");
170 assert_se(streq(*s, input_table_multiple[i++]));
174 static void test_strv_split_newlines(void) {
177 _cleanup_strv_free_ char **l = NULL;
178 const char str[] = "one\ntwo\nthree";
180 l = strv_split_newlines(str);
185 assert_se(streq(*s, input_table_multiple[i++]));
189 static void test_strv_split_nulstr(void) {
190 _cleanup_strv_free_ char **l = NULL;
191 const char nulstr[] = "str0\0str1\0str2\0str3\0";
193 l = strv_split_nulstr (nulstr);
196 assert_se(streq(l[0], "str0"));
197 assert_se(streq(l[1], "str1"));
198 assert_se(streq(l[2], "str2"));
199 assert_se(streq(l[3], "str3"));
202 static void test_strv_remove_prefix(void) {
205 _cleanup_strv_free_ char **l = NULL;
207 l = strv_new("_one", "_two", "_three", NULL);
210 l = strv_remove_prefix(l, "_");
214 assert_se(streq(*s, input_table_multiple[i++]));
218 static void test_strv_parse_nulstr(void) {
219 _cleanup_strv_free_ char **l = NULL;
220 const char nulstr[] = "fuck\0fuck2\0fuck3\0\0fuck5\0\0xxx";
222 l = strv_parse_nulstr(nulstr, sizeof(nulstr)-1);
224 puts("Parse nulstr:");
227 assert_se(streq(l[0], "fuck"));
228 assert_se(streq(l[1], "fuck2"));
229 assert_se(streq(l[2], "fuck3"));
230 assert_se(streq(l[3], ""));
231 assert_se(streq(l[4], "fuck5"));
232 assert_se(streq(l[5], ""));
233 assert_se(streq(l[6], "xxx"));
236 static void test_strv_overlap(void) {
237 const char * const input_table[] = {
243 const char * const input_table_overlap[] = {
247 const char * const input_table_unique[] = {
254 assert_se(strv_overlap((char **)input_table, (char**)input_table_overlap));
255 assert_se(!strv_overlap((char **)input_table, (char**)input_table_unique));
258 static void test_strv_sort(void) {
259 const char* input_table[] = {
263 "CAPITAL LETTERS FIRST",
268 strv_sort((char **)input_table);
270 assert_se(streq(input_table[0], "CAPITAL LETTERS FIRST"));
271 assert_se(streq(input_table[1], "apple"));
272 assert_se(streq(input_table[2], "banana"));
273 assert_se(streq(input_table[3], "citrus"));
274 assert_se(streq(input_table[4], "durian"));
277 static void test_strv_merge_concat(void) {
278 _cleanup_strv_free_ char **a = NULL, **b = NULL, **c = NULL;
280 a = strv_new("without", "suffix", NULL);
281 b = strv_new("with", "suffix", NULL);
285 c = strv_merge_concat(a, b, "_suffix");
288 assert_se(streq(c[0], "without"));
289 assert_se(streq(c[1], "suffix"));
290 assert_se(streq(c[2], "with_suffix"));
291 assert_se(streq(c[3], "suffix_suffix"));
294 static void test_strv_merge(void) {
295 _cleanup_strv_free_ char **a = NULL, **b = NULL, **c = NULL;
297 a = strv_new("abc", "def", "ghi", NULL);
298 b = strv_new("jkl", "mno", "pqr", NULL);
302 c = strv_merge(a, b);
305 assert_se(streq(c[0], "abc"));
306 assert_se(streq(c[1], "def"));
307 assert_se(streq(c[2], "ghi"));
308 assert_se(streq(c[3], "jkl"));
309 assert_se(streq(c[4], "mno"));
310 assert_se(streq(c[5], "pqr"));
312 assert_se(strv_length(c) == 6);
315 static void test_strv_append(void) {
316 _cleanup_strv_free_ char **a = NULL, **b = NULL, **c = NULL;
318 a = strv_new("test", "test1", NULL);
320 b = strv_append(a, "test2");
321 c = strv_append(NULL, "test3");
325 assert_se(streq(b[0], "test"));
326 assert_se(streq(b[1], "test1"));
327 assert_se(streq(b[2], "test2"));
328 assert_se(streq(c[0], "test3"));
331 static void test_strv_foreach(void) {
332 _cleanup_strv_free_ char **a;
336 a = strv_new("one", "two", "three", NULL);
340 STRV_FOREACH(check, a) {
341 assert_se(streq(*check, input_table_multiple[i++]));
345 static void test_strv_foreach_backwards(void) {
346 _cleanup_strv_free_ char **a;
350 a = strv_new("one", "two", "three", NULL);
354 STRV_FOREACH_BACKWARDS(check, a) {
355 assert_se(streq(*check, input_table_multiple[i--]));
359 static void test_strv_foreach_pair(void) {
360 _cleanup_strv_free_ char **a = NULL;
363 a = strv_new("pair_one", "pair_one",
364 "pair_two", "pair_two",
365 "pair_three", "pair_three",
368 STRV_FOREACH_PAIR(x, y, a) {
369 assert_se(streq(*x, *y));
373 static void test_strv_from_stdarg_alloca_one(char **l, const char *first, ...) {
377 j = strv_from_stdarg_alloca(first);
380 assert_se(streq_ptr(l[i], j[i]));
387 static void test_strv_from_stdarg_alloca(void) {
388 test_strv_from_stdarg_alloca_one(STRV_MAKE("foo", "bar"), "foo", "bar", NULL);
389 test_strv_from_stdarg_alloca_one(STRV_MAKE("foo"), "foo", NULL);
390 test_strv_from_stdarg_alloca_one(STRV_MAKE_EMPTY, NULL);
393 int main(int argc, char *argv[]) {
394 test_specifier_printf();
396 test_strv_foreach_backwards();
397 test_strv_foreach_pair();
399 test_strv_find_prefix();
402 test_strv_quote_unquote(input_table_multiple, "\"one\" \"two\" \"three\"");
403 test_strv_quote_unquote(input_table_one, "\"one\"");
404 test_strv_quote_unquote(input_table_none, "");
405 test_strv_quote_unquote(input_table_quotes, QUOTES_STRING);
406 test_strv_quote_unquote(input_table_spaces, SPACES_STRING);
409 test_strv_split_newlines();
410 test_strv_split_nulstr();
411 test_strv_parse_nulstr();
412 test_strv_remove_prefix();
416 test_strv_merge_concat();
418 test_strv_from_stdarg_alloca();