chiark / gitweb /
env: considerably beef up environment cleaning logic
[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 <unistd.h>
23 #include <string.h>
24
25 #include "util.h"
26 #include "strv.h"
27 #include "env-util.h"
28
29 static void test_strv_env_delete(void) {
30         _cleanup_strv_free_ char **a = NULL, **b = NULL, **c = NULL, **d = NULL;
31
32         a = strv_new("FOO=BAR", "WALDO=WALDO", "WALDO=", "PIEP", "SCHLUMPF=SMURF", NULL);
33         b = strv_new("PIEP", "FOO", NULL);
34         c = strv_new("SCHLUMPF", NULL);
35
36         d = strv_env_delete(a, 2, b, c);
37
38         assert(streq(d[0], "WALDO=WALDO"));
39         assert(streq(d[1], "WALDO="));
40         assert(strv_length(d) == 2);
41 }
42
43 static void test_strv_env_unset(void) {
44         _cleanup_strv_free_ char **l = NULL;
45
46         l = strv_new("PIEP", "SCHLUMPF=SMURFF", "NANANANA=YES", NULL);
47
48         strv_env_unset(l, "SCHLUMPF");
49
50         assert(streq(l[0], "PIEP"));
51         assert(streq(l[1], "NANANANA=YES"));
52         assert(strv_length(l) == 2);
53 }
54
55 static void test_strv_env_set(void) {
56         _cleanup_strv_free_ char **l = NULL, **r = NULL;
57
58         l = strv_new("PIEP", "SCHLUMPF=SMURFF", "NANANANA=YES", NULL);
59
60         r = strv_env_set(l, "WALDO=WALDO");
61
62         assert(streq(r[0], "PIEP"));
63         assert(streq(r[1], "SCHLUMPF=SMURFF"));
64         assert(streq(r[2], "NANANANA=YES"));
65         assert(streq(r[3], "WALDO=WALDO"));
66         assert(strv_length(r) == 4);
67 }
68
69 static void test_strv_env_merge(void) {
70         _cleanup_strv_free_ char **a = NULL, **b = NULL, **r = NULL;
71
72         a = strv_new("FOO=BAR", "WALDO=WALDO", "WALDO=", "PIEP", "SCHLUMPF=SMURF", NULL);
73         b = strv_new("FOO=KKK", "FOO=", "PIEP=", "SCHLUMPF=SMURFF", "NANANANA=YES", NULL);
74
75         r = strv_env_merge(2, a, b);
76         assert(streq(r[0], "FOO="));
77         assert(streq(r[1], "WALDO="));
78         assert(streq(r[2], "PIEP"));
79         assert(streq(r[3], "SCHLUMPF=SMURFF"));
80         assert(streq(r[4], "PIEP="));
81         assert(streq(r[5], "NANANANA=YES"));
82         assert(strv_length(r) == 6);
83
84         strv_env_clean(r);
85         assert(streq(r[0], "FOO="));
86         assert(streq(r[1], "WALDO="));
87         assert(streq(r[2], "SCHLUMPF=SMURFF"));
88         assert(streq(r[3], "PIEP="));
89         assert(streq(r[4], "NANANANA=YES"));
90         assert(strv_length(r) == 5);
91 }
92
93 static void test_replace_env_arg(void) {
94         const char *env[] = {
95                 "FOO=BAR BAR",
96                 "BAR=waldo",
97                 NULL
98         };
99         const char *line[] = {
100                 "FOO$FOO",
101                 "FOO$FOOFOO",
102                 "FOO${FOO}$FOO",
103                 "FOO${FOO}",
104                 "${FOO}",
105                 "$FOO",
106                 "$FOO$FOO",
107                 "${FOO}${BAR}",
108                 "${FOO",
109                 NULL
110         };
111         _cleanup_strv_free_ char **r = NULL;
112
113         r = replace_env_argv((char**) line, (char**) env);
114         assert(streq(r[0], "FOO$FOO"));
115         assert(streq(r[1], "FOO$FOOFOO"));
116         assert(streq(r[2], "FOOBAR BAR$FOO"));
117         assert(streq(r[3], "FOOBAR BAR"));
118         assert(streq(r[4], "BAR BAR"));
119         assert(streq(r[5], "BAR"));
120         assert(streq(r[6], "BAR"));
121         assert(streq(r[7], "BAR BARwaldo"));
122         assert(streq(r[8], "${FOO"));
123         assert(strv_length(r) == 9);
124 }
125
126 static void test_one_normalize(const char *input, const char *output)
127 {
128         _cleanup_free_ char *t;
129
130         t = normalize_env_assignment(input);
131         assert(streq(t, output));
132 }
133
134 static void test_normalize_env_assignment(void) {
135         test_one_normalize("foo=bar", "foo=bar");
136         test_one_normalize("=bar", "=bar");
137         test_one_normalize("foo=", "foo=");
138         test_one_normalize("=", "=");
139         test_one_normalize("", "");
140         test_one_normalize("a=\"waldo\"", "a=waldo");
141         test_one_normalize("a=\"waldo", "a=\"waldo");
142         test_one_normalize("a=waldo\"", "a=waldo\"");
143         test_one_normalize("a=\'", "a='");
144         test_one_normalize("a=\'\'", "a=");
145         test_one_normalize(" xyz  ", "xyz");
146         test_one_normalize(" xyz = bar  ", "xyz=bar");
147         test_one_normalize(" xyz = 'bar ' ", "xyz=bar ");
148         test_one_normalize(" ' xyz' = 'bar ' ", "' xyz'=bar ");
149 }
150
151 static void test_env_clean(void) {
152
153         _cleanup_strv_free_ char **e;
154
155         e = strv_new("FOOBAR=WALDO",
156                      "FOOBAR=WALDO",
157                      "FOOBAR",
158                      "F",
159                      "X=",
160                      "F=F",
161                      "=",
162                      "=F",
163                      "",
164                      "0000=000",
165                      "äöüß=abcd",
166                      "abcd=äöüß",
167                      "xyz\n=xyz",
168                      "xyz=xyz\n",
169                      "another=one",
170                      "another=final one",
171                      NULL);
172
173         assert_se(strv_env_clean(e));
174
175         assert_se(streq(e[0], "FOOBAR=WALDO"));
176         assert_se(streq(e[1], "X="));
177         assert_se(streq(e[2], "F=F"));
178         assert_se(streq(e[3], "abcd=äöüß"));
179         assert_se(streq(e[4], "another=final one"));
180         assert_se(e[5] == NULL);
181 }
182
183 int main(int argc, char *argv[]) {
184         test_strv_env_delete();
185         test_strv_env_unset();
186         test_strv_env_set();
187         test_strv_env_merge();
188         test_replace_env_arg();
189         test_normalize_env_assignment();
190         test_env_clean();
191
192         return 0;
193 }