]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-serialize.c
pkgconfig: define variables relative to ${prefix}/${rootprefix}/${sysconfdir}
[thirdparty/systemd.git] / src / test / test-serialize.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2
3 #include "escape.h"
4 #include "fd-util.h"
5 #include "fileio.h"
6 #include "fs-util.h"
7 #include "log.h"
8 #include "serialize.h"
9 #include "strv.h"
10 #include "tests.h"
11
12 char long_string[LONG_LINE_MAX+1];
13
14 static void test_serialize_item(void) {
15 _cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-serialize.XXXXXX";
16 _cleanup_fclose_ FILE *f = NULL;
17
18 assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
19 log_info("/* %s (%s) */", __func__, fn);
20
21 assert_se(serialize_item(f, "a", NULL) == 0);
22 assert_se(serialize_item(f, "a", "bbb") == 1);
23 assert_se(serialize_item(f, "a", "bbb") == 1);
24 assert_se(serialize_item(f, "a", long_string) == -EINVAL);
25 assert_se(serialize_item(f, long_string, "a") == -EINVAL);
26 assert_se(serialize_item(f, long_string, long_string) == -EINVAL);
27
28 rewind(f);
29
30 _cleanup_free_ char *line1 = NULL, *line2 = NULL, *line3 = NULL;
31 assert_se(read_line(f, LONG_LINE_MAX, &line1) > 0);
32 assert_se(streq(line1, "a=bbb"));
33 assert_se(read_line(f, LONG_LINE_MAX, &line2) > 0);
34 assert_se(streq(line2, "a=bbb"));
35 assert_se(read_line(f, LONG_LINE_MAX, &line3) == 0);
36 assert_se(streq(line3, ""));
37 }
38
39 static void test_serialize_item_escaped(void) {
40 _cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-serialize.XXXXXX";
41 _cleanup_fclose_ FILE *f = NULL;
42
43 assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
44 log_info("/* %s (%s) */", __func__, fn);
45
46 assert_se(serialize_item_escaped(f, "a", NULL) == 0);
47 assert_se(serialize_item_escaped(f, "a", "bbb") == 1);
48 assert_se(serialize_item_escaped(f, "a", "bbb") == 1);
49 assert_se(serialize_item_escaped(f, "a", long_string) == -EINVAL);
50 assert_se(serialize_item_escaped(f, long_string, "a") == -EINVAL);
51 assert_se(serialize_item_escaped(f, long_string, long_string) == -EINVAL);
52
53 rewind(f);
54
55 _cleanup_free_ char *line1 = NULL, *line2 = NULL, *line3 = NULL;
56 assert_se(read_line(f, LONG_LINE_MAX, &line1) > 0);
57 assert_se(streq(line1, "a=bbb"));
58 assert_se(read_line(f, LONG_LINE_MAX, &line2) > 0);
59 assert_se(streq(line2, "a=bbb"));
60 assert_se(read_line(f, LONG_LINE_MAX, &line3) == 0);
61 assert_se(streq(line3, ""));
62 }
63
64 static void test_serialize_usec(void) {
65 _cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-serialize.XXXXXX";
66 _cleanup_fclose_ FILE *f = NULL;
67
68 assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
69 log_info("/* %s (%s) */", __func__, fn);
70
71 assert_se(serialize_usec(f, "usec1", USEC_INFINITY) == 0);
72 assert_se(serialize_usec(f, "usec2", 0) == 1);
73 assert_se(serialize_usec(f, "usec3", USEC_INFINITY-1) == 1);
74
75 rewind(f);
76
77 _cleanup_free_ char *line1 = NULL, *line2 = NULL;
78 usec_t x;
79
80 assert_se(read_line(f, LONG_LINE_MAX, &line1) > 0);
81 assert_se(streq(line1, "usec2=0"));
82 assert_se(deserialize_usec(line1 + 6, &x) == 0);
83 assert_se(x == 0);
84
85 assert_se(read_line(f, LONG_LINE_MAX, &line2) > 0);
86 assert_se(startswith(line2, "usec3="));
87 assert_se(deserialize_usec(line2 + 6, &x) == 0);
88 assert_se(x == USEC_INFINITY-1);
89 }
90
91 static void test_serialize_strv(void) {
92 _cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-serialize.XXXXXX";
93 _cleanup_fclose_ FILE *f = NULL;
94
95 char **strv = STRV_MAKE("a", "b", "foo foo",
96 "nasty1 \"",
97 "\"nasty2 ",
98 "nasty3 '",
99 "\"nasty4 \"",
100 "nasty5\n",
101 "\nnasty5\nfoo=bar",
102 "\nnasty5\nfoo=bar");
103
104 assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
105 log_info("/* %s (%s) */", __func__, fn);
106
107 assert_se(serialize_strv(f, "strv1", NULL) == 0);
108 assert_se(serialize_strv(f, "strv2", STRV_MAKE_EMPTY) == 0);
109 assert_se(serialize_strv(f, "strv3", strv) == 1);
110 assert_se(serialize_strv(f, "strv4", STRV_MAKE(long_string)) == -EINVAL);
111
112 rewind(f);
113
114 _cleanup_strv_free_ char **strv2 = NULL;
115 for (;;) {
116 _cleanup_free_ char *line = NULL;
117 int r;
118
119 r = read_line(f, LONG_LINE_MAX, &line);
120 if (r == 0)
121 break;
122 assert_se(r > 0);
123
124 const char *t = startswith(line, "strv3=");
125 assert_se(t);
126
127 char *un;
128 assert_se(cunescape(t, 0, &un) >= 0);
129 assert_se(strv_consume(&strv2, un) >= 0);
130 }
131
132 assert_se(strv_equal(strv, strv2));
133 }
134
135 static void test_deserialize_environment(void) {
136 _cleanup_strv_free_ char **env;
137
138 log_info("/* %s */", __func__);
139
140 assert_se(env = strv_new("A=1"));
141
142 assert_se(deserialize_environment("B=2", &env) >= 0);
143 assert_se(deserialize_environment("FOO%%=a\\177b\\nc\\td e", &env) >= 0);
144
145 assert_se(strv_equal(env, STRV_MAKE("A=1", "B=2", "FOO%%=a\177b\nc\td e")));
146
147 assert_se(deserialize_environment("foo\\", &env) < 0);
148 assert_se(deserialize_environment("bar\\_baz", &env) < 0);
149 }
150
151 static void test_serialize_environment(void) {
152 _cleanup_strv_free_ char **env = NULL, **env2 = NULL;
153 _cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-env-util.XXXXXXX";
154 _cleanup_fclose_ FILE *f = NULL;
155 int r;
156
157 assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
158 log_info("/* %s (%s) */", __func__, fn);
159
160 assert_se(env = strv_new("A=1",
161 "B=2",
162 "C=ąęółń",
163 "D=D=a\\x0Ab",
164 "FOO%%=a\177b\nc\td e"));
165
166 assert_se(serialize_strv(f, "env", env) == 1);
167 assert_se(fflush_and_check(f) == 0);
168
169 rewind(f);
170
171 for (;;) {
172 _cleanup_free_ char *line = NULL;
173 const char *l;
174
175 r = read_line(f, LONG_LINE_MAX, &line);
176 assert_se(r >= 0);
177
178 if (r == 0)
179 break;
180
181 l = strstrip(line);
182
183 assert_se(startswith(l, "env="));
184
185 r = deserialize_environment(l+4, &env2);
186 assert_se(r >= 0);
187 }
188 assert_se(feof(f));
189
190 assert_se(strv_equal(env, env2));
191 }
192
193 int main(int argc, char *argv[]) {
194 test_setup_logging(LOG_INFO);
195
196 memset(long_string, 'x', sizeof(long_string)-1);
197 char_array_0(long_string);
198
199 test_serialize_item();
200 test_serialize_item_escaped();
201 test_serialize_usec();
202 test_serialize_strv();
203 test_deserialize_environment();
204 test_serialize_environment();
205
206 return EXIT_SUCCESS;
207 }