]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/test/test-serialize.c
ASSERT_STREQ for simple cases
[thirdparty/systemd.git] / src / test / test-serialize.c
CommitLineData
db9ecf05 1/* SPDX-License-Identifier: LGPL-2.1-or-later */
40a4c4b3 2
40a4c4b3
ZJS
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"
e4de7287 11#include "tmpfile-util.h"
40a4c4b3 12
99839c7e 13static char long_string[LONG_LINE_MAX+1];
40a4c4b3 14
c462e63e 15TEST(serialize_item) {
40a4c4b3
ZJS
16 _cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-serialize.XXXXXX";
17 _cleanup_fclose_ FILE *f = NULL;
18
19 assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
20 log_info("/* %s (%s) */", __func__, fn);
21
22 assert_se(serialize_item(f, "a", NULL) == 0);
23 assert_se(serialize_item(f, "a", "bbb") == 1);
24 assert_se(serialize_item(f, "a", "bbb") == 1);
942c40c6
LB
25 assert_se(serialize_bool_elide(f, "c", true) == 1);
26 assert_se(serialize_bool_elide(f, "d", false) == 0);
40a4c4b3
ZJS
27 assert_se(serialize_item(f, "a", long_string) == -EINVAL);
28 assert_se(serialize_item(f, long_string, "a") == -EINVAL);
29 assert_se(serialize_item(f, long_string, long_string) == -EINVAL);
30
31 rewind(f);
32
942c40c6 33 _cleanup_free_ char *line1 = NULL, *line2 = NULL, *line3 = NULL, *line4 = NULL;
40a4c4b3 34 assert_se(read_line(f, LONG_LINE_MAX, &line1) > 0);
c79e88b3 35 ASSERT_STREQ(line1, "a=bbb");
40a4c4b3 36 assert_se(read_line(f, LONG_LINE_MAX, &line2) > 0);
c79e88b3 37 ASSERT_STREQ(line2, "a=bbb");
942c40c6 38 assert_se(read_line(f, LONG_LINE_MAX, &line3) > 0);
c79e88b3 39 ASSERT_STREQ(line3, "c=yes");
942c40c6 40 assert_se(read_line(f, LONG_LINE_MAX, &line4) == 0);
c79e88b3 41 ASSERT_STREQ(line4, "");
40a4c4b3
ZJS
42}
43
c462e63e 44TEST(serialize_item_escaped) {
40a4c4b3
ZJS
45 _cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-serialize.XXXXXX";
46 _cleanup_fclose_ FILE *f = NULL;
47
48 assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
49 log_info("/* %s (%s) */", __func__, fn);
50
51 assert_se(serialize_item_escaped(f, "a", NULL) == 0);
52 assert_se(serialize_item_escaped(f, "a", "bbb") == 1);
53 assert_se(serialize_item_escaped(f, "a", "bbb") == 1);
54 assert_se(serialize_item_escaped(f, "a", long_string) == -EINVAL);
55 assert_se(serialize_item_escaped(f, long_string, "a") == -EINVAL);
56 assert_se(serialize_item_escaped(f, long_string, long_string) == -EINVAL);
57
58 rewind(f);
59
60 _cleanup_free_ char *line1 = NULL, *line2 = NULL, *line3 = NULL;
61 assert_se(read_line(f, LONG_LINE_MAX, &line1) > 0);
c79e88b3 62 ASSERT_STREQ(line1, "a=bbb");
40a4c4b3 63 assert_se(read_line(f, LONG_LINE_MAX, &line2) > 0);
c79e88b3 64 ASSERT_STREQ(line2, "a=bbb");
40a4c4b3 65 assert_se(read_line(f, LONG_LINE_MAX, &line3) == 0);
c79e88b3 66 ASSERT_STREQ(line3, "");
40a4c4b3
ZJS
67}
68
c462e63e 69TEST(serialize_usec) {
40a4c4b3
ZJS
70 _cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-serialize.XXXXXX";
71 _cleanup_fclose_ FILE *f = NULL;
72
73 assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
74 log_info("/* %s (%s) */", __func__, fn);
75
76 assert_se(serialize_usec(f, "usec1", USEC_INFINITY) == 0);
77 assert_se(serialize_usec(f, "usec2", 0) == 1);
78 assert_se(serialize_usec(f, "usec3", USEC_INFINITY-1) == 1);
79
80 rewind(f);
81
82 _cleanup_free_ char *line1 = NULL, *line2 = NULL;
83 usec_t x;
84
85 assert_se(read_line(f, LONG_LINE_MAX, &line1) > 0);
c79e88b3 86 ASSERT_STREQ(line1, "usec2=0");
40a4c4b3
ZJS
87 assert_se(deserialize_usec(line1 + 6, &x) == 0);
88 assert_se(x == 0);
89
90 assert_se(read_line(f, LONG_LINE_MAX, &line2) > 0);
91 assert_se(startswith(line2, "usec3="));
92 assert_se(deserialize_usec(line2 + 6, &x) == 0);
93 assert_se(x == USEC_INFINITY-1);
94}
95
c462e63e 96TEST(serialize_strv) {
40a4c4b3
ZJS
97 _cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-serialize.XXXXXX";
98 _cleanup_fclose_ FILE *f = NULL;
99
100 char **strv = STRV_MAKE("a", "b", "foo foo",
101 "nasty1 \"",
102 "\"nasty2 ",
103 "nasty3 '",
104 "\"nasty4 \"",
105 "nasty5\n",
106 "\nnasty5\nfoo=bar",
107 "\nnasty5\nfoo=bar");
108
109 assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
110 log_info("/* %s (%s) */", __func__, fn);
111
112 assert_se(serialize_strv(f, "strv1", NULL) == 0);
113 assert_se(serialize_strv(f, "strv2", STRV_MAKE_EMPTY) == 0);
114 assert_se(serialize_strv(f, "strv3", strv) == 1);
115 assert_se(serialize_strv(f, "strv4", STRV_MAKE(long_string)) == -EINVAL);
116
117 rewind(f);
118
119 _cleanup_strv_free_ char **strv2 = NULL;
120 for (;;) {
121 _cleanup_free_ char *line = NULL;
122 int r;
123
124 r = read_line(f, LONG_LINE_MAX, &line);
125 if (r == 0)
126 break;
127 assert_se(r > 0);
128
129 const char *t = startswith(line, "strv3=");
130 assert_se(t);
c2e42d4b 131 assert_se(deserialize_strv(t, &strv2) >= 0);
40a4c4b3
ZJS
132 }
133
134 assert_se(strv_equal(strv, strv2));
135}
136
c462e63e 137TEST(deserialize_environment) {
1c1d719a
ZJS
138 _cleanup_strv_free_ char **env;
139
bea1a013 140 assert_se(env = strv_new("A=1"));
1c1d719a
ZJS
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
c462e63e 151TEST(serialize_environment) {
1c1d719a
ZJS
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",
bea1a013 164 "FOO%%=a\177b\nc\td e"));
1c1d719a
ZJS
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
3f12c5ff
LB
193TEST(serialize_item_hexmem) {
194 _cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-serialize.XXXXXX";
195 _cleanup_fclose_ FILE *f = NULL;
196
197 assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
198 log_info("/* %s (%s) */", __func__, fn);
199
200 assert_se(serialize_item_hexmem(f, "a", NULL, 0) == 0);
201 assert_se(serialize_item_hexmem(f, "a", (uint8_t []){0xff, 0xff, 0xff}, sizeof(uint8_t) * 3) == 1);
202
203 rewind(f);
204
205 _cleanup_free_ char *line = NULL;
206 assert_se(read_line(f, LONG_LINE_MAX, &line) > 0);
c79e88b3 207 ASSERT_STREQ(line, "a=ffffff");
3f12c5ff
LB
208
209}
210
6dae20ec
LB
211TEST(serialize_item_base64mem) {
212 _cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-serialize.XXXXXX";
213 _cleanup_fclose_ FILE *f = NULL;
214
215 assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
216 log_info("/* %s (%s) */", __func__, fn);
217
218 assert_se(serialize_item_base64mem(f, "a", NULL, 0) == 0);
219 assert_se(serialize_item_base64mem(f, "a", (uint8_t []){0xff, 0xff, 0xff}, sizeof(uint8_t) * 3) == 1);
220
221 rewind(f);
222
223 _cleanup_free_ char *line = NULL;
224 assert_se(read_line(f, LONG_LINE_MAX, &line) > 0);
c79e88b3 225 ASSERT_STREQ(line, "a=////");
6dae20ec
LB
226}
227
1b30ccd8
LB
228TEST(serialize_string_set) {
229 _cleanup_(unlink_tempfilep) char fn[] = "/tmp/test-serialize.XXXXXX";
230 _cleanup_fclose_ FILE *f = NULL;
231 _cleanup_set_free_free_ Set *s = NULL;
232 _cleanup_free_ char *line1 = NULL, *line2 = NULL;
233 char *p, *q;
234
235 assert_se(fmkostemp_safe(fn, "r+", &f) == 0);
236 log_info("/* %s (%s) */", __func__, fn);
237
238 assert_se(set_ensure_allocated(&s, &string_hash_ops) >= 0);
239
240 assert_se(serialize_string_set(f, "a", s) == 0);
241
242 assert_se(set_put_strsplit(s, "abc def,ghi jkl", ",", 0) >= 0);
243
244 assert_se(serialize_string_set(f, "a", s) == 1);
245
246 rewind(f);
247
248 assert_se(read_line(f, LONG_LINE_MAX, &line1) > 0);
249 assert_se((p = startswith(line1, "a=")));
250
251 assert_se(read_line(f, LONG_LINE_MAX, &line2) > 0);
252 assert_se((q = startswith(line2, "a=")));
253
254 assert_se(!streq(p, q));
255 assert_se(STR_IN_SET(p, "abc def", "ghi jkl"));
256 assert_se(STR_IN_SET(q, "abc def", "ghi jkl"));
257}
258
99839c7e
LP
259static int intro(void) {
260 memset(long_string, 'x', sizeof(long_string)-1);
261 char_array_0(long_string);
262 return EXIT_SUCCESS;
263}
264
e85fdacc 265DEFINE_TEST_MAIN_WITH_INTRO(LOG_INFO, intro);