]>
Commit | Line | Data |
---|---|---|
d6c9574f | 1 | /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ |
c24eb49e LP |
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 | |
5430f7f2 LP |
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 | |
c24eb49e LP |
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 | |
5430f7f2 | 16 | Lesser General Public License for more details. |
c24eb49e | 17 | |
5430f7f2 | 18 | You should have received a copy of the GNU Lesser General Public License |
c24eb49e LP |
19 | along with systemd; If not, see <http://www.gnu.org/licenses/>. |
20 | ***/ | |
21 | ||
c24eb49e LP |
22 | #include <string.h> |
23 | ||
4d1a6904 | 24 | #include "env-util.h" |
07630cea LP |
25 | #include "string-util.h" |
26 | #include "strv.h" | |
27 | #include "util.h" | |
c24eb49e | 28 | |
940bd473 TA |
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); | |
9b5d6bd9 LP |
33 | assert_se(a); |
34 | ||
940bd473 | 35 | b = strv_new("PIEP", "FOO", NULL); |
9b5d6bd9 LP |
36 | assert_se(b); |
37 | ||
940bd473 | 38 | c = strv_new("SCHLUMPF", NULL); |
9b5d6bd9 | 39 | assert_se(c); |
940bd473 TA |
40 | |
41 | d = strv_env_delete(a, 2, b, c); | |
9b5d6bd9 | 42 | assert_se(d); |
940bd473 | 43 | |
9b5d6bd9 LP |
44 | assert_se(streq(d[0], "WALDO=WALDO")); |
45 | assert_se(streq(d[1], "WALDO=")); | |
46 | assert_se(strv_length(d) == 2); | |
940bd473 TA |
47 | } |
48 | ||
49 | static void test_strv_env_unset(void) { | |
50 | _cleanup_strv_free_ char **l = NULL; | |
51 | ||
52 | l = strv_new("PIEP", "SCHLUMPF=SMURFF", "NANANANA=YES", NULL); | |
9b5d6bd9 | 53 | assert_se(l); |
940bd473 | 54 | |
9b5d6bd9 | 55 | assert_se(strv_env_unset(l, "SCHLUMPF") == l); |
940bd473 | 56 | |
9b5d6bd9 LP |
57 | assert_se(streq(l[0], "PIEP")); |
58 | assert_se(streq(l[1], "NANANANA=YES")); | |
59 | assert_se(strv_length(l) == 2); | |
940bd473 TA |
60 | } |
61 | ||
62 | static void test_strv_env_set(void) { | |
63 | _cleanup_strv_free_ char **l = NULL, **r = NULL; | |
64 | ||
65 | l = strv_new("PIEP", "SCHLUMPF=SMURFF", "NANANANA=YES", NULL); | |
9b5d6bd9 | 66 | assert_se(l); |
940bd473 TA |
67 | |
68 | r = strv_env_set(l, "WALDO=WALDO"); | |
9b5d6bd9 | 69 | assert_se(r); |
940bd473 | 70 | |
9b5d6bd9 LP |
71 | assert_se(streq(r[0], "PIEP")); |
72 | assert_se(streq(r[1], "SCHLUMPF=SMURFF")); | |
73 | assert_se(streq(r[2], "NANANANA=YES")); | |
74 | assert_se(streq(r[3], "WALDO=WALDO")); | |
75 | assert_se(strv_length(r) == 4); | |
940bd473 TA |
76 | } |
77 | ||
1f28b2de TA |
78 | static void test_strv_env_merge(void) { |
79 | _cleanup_strv_free_ char **a = NULL, **b = NULL, **r = NULL; | |
80 | ||
81 | a = strv_new("FOO=BAR", "WALDO=WALDO", "WALDO=", "PIEP", "SCHLUMPF=SMURF", NULL); | |
9b5d6bd9 LP |
82 | assert_se(a); |
83 | ||
1f28b2de | 84 | b = strv_new("FOO=KKK", "FOO=", "PIEP=", "SCHLUMPF=SMURFF", "NANANANA=YES", NULL); |
9b5d6bd9 | 85 | assert_se(b); |
c24eb49e | 86 | |
1f28b2de | 87 | r = strv_env_merge(2, a, b); |
9b5d6bd9 LP |
88 | assert_se(r); |
89 | assert_se(streq(r[0], "FOO=")); | |
90 | assert_se(streq(r[1], "WALDO=")); | |
91 | assert_se(streq(r[2], "PIEP")); | |
92 | assert_se(streq(r[3], "SCHLUMPF=SMURFF")); | |
93 | assert_se(streq(r[4], "PIEP=")); | |
94 | assert_se(streq(r[5], "NANANANA=YES")); | |
95 | assert_se(strv_length(r) == 6); | |
96 | ||
97 | assert_se(strv_env_clean(r) == r); | |
98 | assert_se(streq(r[0], "FOO=")); | |
99 | assert_se(streq(r[1], "WALDO=")); | |
100 | assert_se(streq(r[2], "SCHLUMPF=SMURFF")); | |
101 | assert_se(streq(r[3], "PIEP=")); | |
102 | assert_se(streq(r[4], "NANANANA=YES")); | |
103 | assert_se(strv_length(r) == 5); | |
1f28b2de TA |
104 | } |
105 | ||
106 | static void test_replace_env_arg(void) { | |
c24eb49e LP |
107 | const char *env[] = { |
108 | "FOO=BAR BAR", | |
109 | "BAR=waldo", | |
110 | NULL | |
111 | }; | |
c24eb49e LP |
112 | const char *line[] = { |
113 | "FOO$FOO", | |
114 | "FOO$FOOFOO", | |
115 | "FOO${FOO}$FOO", | |
116 | "FOO${FOO}", | |
117 | "${FOO}", | |
118 | "$FOO", | |
119 | "$FOO$FOO", | |
120 | "${FOO}${BAR}", | |
121 | "${FOO", | |
df553b58 MS |
122 | "FOO$$${FOO}", |
123 | "$$FOO${FOO}", | |
c24eb49e LP |
124 | NULL |
125 | }; | |
1f28b2de | 126 | _cleanup_strv_free_ char **r = NULL; |
c24eb49e LP |
127 | |
128 | r = replace_env_argv((char**) line, (char**) env); | |
9b5d6bd9 LP |
129 | assert_se(r); |
130 | assert_se(streq(r[0], "FOO$FOO")); | |
131 | assert_se(streq(r[1], "FOO$FOOFOO")); | |
132 | assert_se(streq(r[2], "FOOBAR BAR$FOO")); | |
133 | assert_se(streq(r[3], "FOOBAR BAR")); | |
134 | assert_se(streq(r[4], "BAR BAR")); | |
135 | assert_se(streq(r[5], "BAR")); | |
136 | assert_se(streq(r[6], "BAR")); | |
137 | assert_se(streq(r[7], "BAR BARwaldo")); | |
138 | assert_se(streq(r[8], "${FOO")); | |
df553b58 MS |
139 | assert_se(streq(r[9], "FOO$BAR BAR")); |
140 | assert_se(streq(r[10], "$FOOBAR BAR")); | |
141 | assert_se(strv_length(r) == 11); | |
1f28b2de | 142 | } |
a6ff950e | 143 | |
4d1a6904 | 144 | static void test_env_clean(void) { |
4d1a6904 LP |
145 | _cleanup_strv_free_ char **e; |
146 | ||
147 | e = strv_new("FOOBAR=WALDO", | |
148 | "FOOBAR=WALDO", | |
149 | "FOOBAR", | |
150 | "F", | |
151 | "X=", | |
152 | "F=F", | |
153 | "=", | |
154 | "=F", | |
155 | "", | |
156 | "0000=000", | |
157 | "äöüß=abcd", | |
158 | "abcd=äöüß", | |
159 | "xyz\n=xyz", | |
160 | "xyz=xyz\n", | |
161 | "another=one", | |
162 | "another=final one", | |
163 | NULL); | |
9b5d6bd9 LP |
164 | assert_se(e); |
165 | assert_se(!strv_env_is_valid(e)); | |
166 | assert_se(strv_env_clean(e) == e); | |
167 | assert_se(strv_env_is_valid(e)); | |
4d1a6904 LP |
168 | |
169 | assert_se(streq(e[0], "FOOBAR=WALDO")); | |
170 | assert_se(streq(e[1], "X=")); | |
171 | assert_se(streq(e[2], "F=F")); | |
172 | assert_se(streq(e[3], "abcd=äöüß")); | |
173 | assert_se(streq(e[4], "another=final one")); | |
174 | assert_se(e[5] == NULL); | |
175 | } | |
176 | ||
8354c34e TA |
177 | static void test_env_name_is_valid(void) { |
178 | assert_se(env_name_is_valid("test")); | |
179 | ||
180 | assert_se(!env_name_is_valid(NULL)); | |
181 | assert_se(!env_name_is_valid("")); | |
182 | assert_se(!env_name_is_valid("5_starting_with_a_number_is_wrong")); | |
183 | assert_se(!env_name_is_valid("#¤%&?_only_numbers_letters_and_underscore_allowed")); | |
184 | } | |
185 | ||
1f28b2de | 186 | int main(int argc, char *argv[]) { |
940bd473 TA |
187 | test_strv_env_delete(); |
188 | test_strv_env_unset(); | |
189 | test_strv_env_set(); | |
1f28b2de TA |
190 | test_strv_env_merge(); |
191 | test_replace_env_arg(); | |
4d1a6904 | 192 | test_env_clean(); |
8354c34e | 193 | test_env_name_is_valid(); |
a6ff950e | 194 | |
5f7c426e | 195 | return 0; |
c24eb49e | 196 | } |