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 _cleanup_free_ char *w = NULL;
32 const Specifier table[] = {
33 { 'a', specifier_string, (char*) "AAAA" },
34 { 'b', specifier_string, (char*) "BBBB" },
38 w = specifier_printf("xxx a=%a b=%b yyy", table, NULL);
42 assert_se(streq(w, "xxx a=AAAA b=BBBB yyy"));
45 static const char* const input_table_multiple[] = {
52 static const char* const input_table_one[] = {
57 static const char* const input_table_none[] = {
61 static const char* const input_table_quotes[] = {
69 #define QUOTES_STRING \
76 static const char * const input_table_spaces[] = {
84 #define SPACES_STRING \
91 static void test_strv_find(void) {
92 assert_se(strv_find((char **)input_table_multiple, "three"));
93 assert_se(!strv_find((char **)input_table_multiple, "four"));
96 static void test_strv_find_prefix(void) {
97 assert_se(strv_find_prefix((char **)input_table_multiple, "o"));
98 assert_se(strv_find_prefix((char **)input_table_multiple, "one"));
99 assert_se(strv_find_prefix((char **)input_table_multiple, ""));
100 assert_se(!strv_find_prefix((char **)input_table_multiple, "xxx"));
101 assert_se(!strv_find_prefix((char **)input_table_multiple, "onee"));
104 static void test_strv_join(void) {
105 _cleanup_free_ char *p = NULL, *q = NULL, *r = NULL, *s = NULL, *t = NULL;
107 p = strv_join((char **)input_table_multiple, ", ");
109 assert_se(streq(p, "one, two, three"));
111 q = strv_join((char **)input_table_multiple, ";");
113 assert_se(streq(q, "one;two;three"));
115 r = strv_join((char **)input_table_multiple, NULL);
117 assert_se(streq(r, "one two three"));
119 s = strv_join((char **)input_table_one, ", ");
121 assert_se(streq(s, "one"));
123 t = strv_join((char **)input_table_none, ", ");
125 assert_se(streq(t, ""));
128 static void test_strv_quote_unquote(const char* const *split, const char *quoted) {
129 _cleanup_free_ char *p;
130 _cleanup_strv_free_ char **s;
133 p = strv_join_quoted((char **)split);
134 printf("-%s- --- -%s-\n", p, quoted); /* fprintf deals with NULL, puts does not */
136 assert_se(streq(p, quoted));
138 s = strv_split_quoted(quoted);
142 assert_se(streq(*t, *split));
147 static void test_strv_split_nulstr(void) {
148 _cleanup_strv_free_ char **l = NULL;
149 const char nulstr[] = "str0\0str1\0str2\0str3\0";
151 l = strv_split_nulstr (nulstr);
154 assert_se(streq(l[0], "str0"));
155 assert_se(streq(l[1], "str1"));
156 assert_se(streq(l[2], "str2"));
157 assert_se(streq(l[3], "str3"));
160 static void test_strv_parse_nulstr(void) {
161 _cleanup_strv_free_ char **l = NULL;
162 const char nulstr[] = "fuck\0fuck2\0fuck3\0\0fuck5\0\0xxx";
164 l = strv_parse_nulstr(nulstr, sizeof(nulstr)-1);
166 puts("Parse nulstr:");
169 assert_se(streq(l[0], "fuck"));
170 assert_se(streq(l[1], "fuck2"));
171 assert_se(streq(l[2], "fuck3"));
172 assert_se(streq(l[3], ""));
173 assert_se(streq(l[4], "fuck5"));
174 assert_se(streq(l[5], ""));
175 assert_se(streq(l[6], "xxx"));
178 static void test_strv_overlap(void) {
179 const char * const input_table[] = {
185 const char * const input_table_overlap[] = {
189 const char * const input_table_unique[] = {
196 assert_se(strv_overlap((char **)input_table, (char**)input_table_overlap));
197 assert_se(!strv_overlap((char **)input_table, (char**)input_table_unique));
200 static void test_strv_sort(void) {
201 const char* input_table[] = {
205 "CAPITAL LETTERS FIRST",
210 strv_sort((char **)input_table);
212 assert_se(streq(input_table[0], "CAPITAL LETTERS FIRST"));
213 assert_se(streq(input_table[1], "apple"));
214 assert_se(streq(input_table[2], "banana"));
215 assert_se(streq(input_table[3], "citrus"));
216 assert_se(streq(input_table[4], "durian"));
219 static void test_strv_merge_concat(void) {
220 _cleanup_strv_free_ char **a = NULL, **b = NULL, **c = NULL;
222 a = strv_new("without", "suffix", NULL);
223 b = strv_new("with", "suffix", NULL);
227 c = strv_merge_concat(a, b, "_suffix");
230 assert_se(streq(c[0], "without"));
231 assert_se(streq(c[1], "suffix"));
232 assert_se(streq(c[2], "with_suffix"));
233 assert_se(streq(c[3], "suffix_suffix"));
236 static void test_strv_merge(void) {
237 _cleanup_strv_free_ char **a = NULL, **b = NULL, **c = NULL;
239 a = strv_new("abc", "def", "ghi", NULL);
240 b = strv_new("jkl", "mno", "pqr", NULL);
244 c = strv_merge(a, b);
247 assert_se(streq(c[0], "abc"));
248 assert_se(streq(c[1], "def"));
249 assert_se(streq(c[2], "ghi"));
250 assert_se(streq(c[3], "jkl"));
251 assert_se(streq(c[4], "mno"));
252 assert_se(streq(c[5], "pqr"));
254 assert_se(strv_length(c) == 6);
257 static void test_strv_append(void) {
258 _cleanup_strv_free_ char **a = NULL, **b = NULL, **c = NULL;
260 a = strv_new("test", "test1", NULL);
262 b = strv_append(a, "test2");
263 c = strv_append(NULL, "test3");
267 assert_se(streq(b[0], "test"));
268 assert_se(streq(b[1], "test1"));
269 assert_se(streq(b[2], "test2"));
270 assert_se(streq(c[0], "test3"));
273 static void test_strv_foreach_pair(void) {
274 _cleanup_strv_free_ char **a = NULL;
277 a = strv_new("pair_one", "pair_one",
278 "pair_two", "pair_two",
279 "pair_three", "pair_three",
282 STRV_FOREACH_PAIR(x, y, a) {
283 assert_se(streq(*x, *y));
287 int main(int argc, char *argv[]) {
288 test_specifier_printf();
289 test_strv_foreach_pair();
291 test_strv_find_prefix();
294 test_strv_quote_unquote(input_table_multiple, "\"one\" \"two\" \"three\"");
295 test_strv_quote_unquote(input_table_one, "\"one\"");
296 test_strv_quote_unquote(input_table_none, "");
297 test_strv_quote_unquote(input_table_quotes, QUOTES_STRING);
298 test_strv_quote_unquote(input_table_spaces, SPACES_STRING);
300 test_strv_split_nulstr();
301 test_strv_parse_nulstr();
305 test_strv_merge_concat();