chiark / gitweb /
8f1fcd992ca1bb9468f4a368614c86b56acc93cc
[elogind.git] / src / test / test-env-replace.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2010 Lennart Poettering
7
8   systemd is free software; you can redistribute it and/or modify it
9   under the terms of the GNU Lesser General Public License as published by
10   the Free Software Foundation; either version 2.1 of the License, or
11   (at your option) any later version.
12
13   systemd is distributed in the hope that it will be useful, but
14   WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser General Public License
19   along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <string.h>
23
24 #include "util.h"
25 #include "strv.h"
26 #include "env-util.h"
27
28 static void test_strv_env_delete(void) {
29         _cleanup_strv_free_ char **a = NULL, **b = NULL, **c = NULL, **d = NULL;
30
31         a = strv_new("FOO=BAR", "WALDO=WALDO", "WALDO=", "PIEP", "SCHLUMPF=SMURF", NULL);
32         assert_se(a);
33
34         b = strv_new("PIEP", "FOO", NULL);
35         assert_se(b);
36
37         c = strv_new("SCHLUMPF", NULL);
38         assert_se(c);
39
40         d = strv_env_delete(a, 2, b, c);
41         assert_se(d);
42
43         assert_se(streq(d[0], "WALDO=WALDO"));
44         assert_se(streq(d[1], "WALDO="));
45         assert_se(strv_length(d) == 2);
46 }
47
48 static void test_strv_env_unset(void) {
49         _cleanup_strv_free_ char **l = NULL;
50
51         l = strv_new("PIEP", "SCHLUMPF=SMURFF", "NANANANA=YES", NULL);
52         assert_se(l);
53
54         assert_se(strv_env_unset(l, "SCHLUMPF") == l);
55
56         assert_se(streq(l[0], "PIEP"));
57         assert_se(streq(l[1], "NANANANA=YES"));
58         assert_se(strv_length(l) == 2);
59 }
60
61 static void test_strv_env_set(void) {
62         _cleanup_strv_free_ char **l = NULL, **r = NULL;
63
64         l = strv_new("PIEP", "SCHLUMPF=SMURFF", "NANANANA=YES", NULL);
65         assert_se(l);
66
67         r = strv_env_set(l, "WALDO=WALDO");
68         assert_se(r);
69
70         assert_se(streq(r[0], "PIEP"));
71         assert_se(streq(r[1], "SCHLUMPF=SMURFF"));
72         assert_se(streq(r[2], "NANANANA=YES"));
73         assert_se(streq(r[3], "WALDO=WALDO"));
74         assert_se(strv_length(r) == 4);
75 }
76
77 static void test_strv_env_merge(void) {
78         _cleanup_strv_free_ char **a = NULL, **b = NULL, **r = NULL;
79
80         a = strv_new("FOO=BAR", "WALDO=WALDO", "WALDO=", "PIEP", "SCHLUMPF=SMURF", NULL);
81         assert_se(a);
82
83         b = strv_new("FOO=KKK", "FOO=", "PIEP=", "SCHLUMPF=SMURFF", "NANANANA=YES", NULL);
84         assert_se(b);
85
86         r = strv_env_merge(2, a, b);
87         assert_se(r);
88         assert_se(streq(r[0], "FOO="));
89         assert_se(streq(r[1], "WALDO="));
90         assert_se(streq(r[2], "PIEP"));
91         assert_se(streq(r[3], "SCHLUMPF=SMURFF"));
92         assert_se(streq(r[4], "PIEP="));
93         assert_se(streq(r[5], "NANANANA=YES"));
94         assert_se(strv_length(r) == 6);
95
96         assert_se(strv_env_clean(r) == r);
97         assert_se(streq(r[0], "FOO="));
98         assert_se(streq(r[1], "WALDO="));
99         assert_se(streq(r[2], "SCHLUMPF=SMURFF"));
100         assert_se(streq(r[3], "PIEP="));
101         assert_se(streq(r[4], "NANANANA=YES"));
102         assert_se(strv_length(r) == 5);
103 }
104
105 static void test_replace_env_arg(void) {
106         const char *env[] = {
107                 "FOO=BAR BAR",
108                 "BAR=waldo",
109                 NULL
110         };
111         const char *line[] = {
112                 "FOO$FOO",
113                 "FOO$FOOFOO",
114                 "FOO${FOO}$FOO",
115                 "FOO${FOO}",
116                 "${FOO}",
117                 "$FOO",
118                 "$FOO$FOO",
119                 "${FOO}${BAR}",
120                 "${FOO",
121                 NULL
122         };
123         _cleanup_strv_free_ char **r = NULL;
124
125         r = replace_env_argv((char**) line, (char**) env);
126         assert_se(r);
127         assert_se(streq(r[0], "FOO$FOO"));
128         assert_se(streq(r[1], "FOO$FOOFOO"));
129         assert_se(streq(r[2], "FOOBAR BAR$FOO"));
130         assert_se(streq(r[3], "FOOBAR BAR"));
131         assert_se(streq(r[4], "BAR BAR"));
132         assert_se(streq(r[5], "BAR"));
133         assert_se(streq(r[6], "BAR"));
134         assert_se(streq(r[7], "BAR BARwaldo"));
135         assert_se(streq(r[8], "${FOO"));
136         assert_se(strv_length(r) == 9);
137 }
138
139 static void test_one_normalize(const char *input, const char *output) {
140         _cleanup_free_ char *t;
141
142         t = normalize_env_assignment(input);
143         assert_se(t);
144         assert_se(streq(t, output));
145 }
146
147 static void test_normalize_env_assignment(void) {
148         test_one_normalize("foo=bar", "foo=bar");
149         test_one_normalize("=bar", "=bar");
150         test_one_normalize("foo=", "foo=");
151         test_one_normalize("=", "=");
152         test_one_normalize("", "");
153         test_one_normalize("a=\"waldo\"", "a=waldo");
154         test_one_normalize("a=\"waldo", "a=\"waldo");
155         test_one_normalize("a=waldo\"", "a=waldo\"");
156         test_one_normalize("a=\'", "a='");
157         test_one_normalize("a=\'\'", "a=");
158         test_one_normalize(" xyz  ", "xyz");
159         test_one_normalize(" xyz = bar  ", "xyz=bar");
160         test_one_normalize(" xyz = 'bar ' ", "xyz=bar ");
161         test_one_normalize(" ' xyz' = 'bar ' ", "' xyz'=bar ");
162 }
163
164 static void test_env_clean(void) {
165         _cleanup_strv_free_ char **e;
166
167         e = strv_new("FOOBAR=WALDO",
168                      "FOOBAR=WALDO",
169                      "FOOBAR",
170                      "F",
171                      "X=",
172                      "F=F",
173                      "=",
174                      "=F",
175                      "",
176                      "0000=000",
177                      "äöüß=abcd",
178                      "abcd=äöüß",
179                      "xyz\n=xyz",
180                      "xyz=xyz\n",
181                      "another=one",
182                      "another=final one",
183                      NULL);
184         assert_se(e);
185         assert_se(!strv_env_is_valid(e));
186         assert_se(strv_env_clean(e) == e);
187         assert_se(strv_env_is_valid(e));
188
189         assert_se(streq(e[0], "FOOBAR=WALDO"));
190         assert_se(streq(e[1], "X="));
191         assert_se(streq(e[2], "F=F"));
192         assert_se(streq(e[3], "abcd=äöüß"));
193         assert_se(streq(e[4], "another=final one"));
194         assert_se(e[5] == NULL);
195 }
196
197 static void test_env_name_is_valid(void) {
198         assert_se(env_name_is_valid("test"));
199
200         assert_se(!env_name_is_valid(NULL));
201         assert_se(!env_name_is_valid(""));
202         assert_se(!env_name_is_valid("5_starting_with_a_number_is_wrong"));
203         assert_se(!env_name_is_valid("#¤%&?_only_numbers_letters_and_underscore_allowed"));
204 }
205
206 int main(int argc, char *argv[]) {
207         test_strv_env_delete();
208         test_strv_env_unset();
209         test_strv_env_set();
210         test_strv_env_merge();
211         test_replace_env_arg();
212         test_normalize_env_assignment();
213         test_env_clean();
214         test_env_name_is_valid();
215
216         return 0;
217 }