]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-serialize.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
11 #include "tmpfile-util.h"
13 char long_string
[LONG_LINE_MAX
+1];
15 static void test_serialize_item(void) {
16 _cleanup_(unlink_tempfilep
) char fn
[] = "/tmp/test-serialize.XXXXXX";
17 _cleanup_fclose_
FILE *f
= NULL
;
19 assert_se(fmkostemp_safe(fn
, "r+", &f
) == 0);
20 log_info("/* %s (%s) */", __func__
, fn
);
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);
25 assert_se(serialize_item(f
, "a", long_string
) == -EINVAL
);
26 assert_se(serialize_item(f
, long_string
, "a") == -EINVAL
);
27 assert_se(serialize_item(f
, long_string
, long_string
) == -EINVAL
);
31 _cleanup_free_
char *line1
= NULL
, *line2
= NULL
, *line3
= NULL
;
32 assert_se(read_line(f
, LONG_LINE_MAX
, &line1
) > 0);
33 assert_se(streq(line1
, "a=bbb"));
34 assert_se(read_line(f
, LONG_LINE_MAX
, &line2
) > 0);
35 assert_se(streq(line2
, "a=bbb"));
36 assert_se(read_line(f
, LONG_LINE_MAX
, &line3
) == 0);
37 assert_se(streq(line3
, ""));
40 static void test_serialize_item_escaped(void) {
41 _cleanup_(unlink_tempfilep
) char fn
[] = "/tmp/test-serialize.XXXXXX";
42 _cleanup_fclose_
FILE *f
= NULL
;
44 assert_se(fmkostemp_safe(fn
, "r+", &f
) == 0);
45 log_info("/* %s (%s) */", __func__
, fn
);
47 assert_se(serialize_item_escaped(f
, "a", NULL
) == 0);
48 assert_se(serialize_item_escaped(f
, "a", "bbb") == 1);
49 assert_se(serialize_item_escaped(f
, "a", "bbb") == 1);
50 assert_se(serialize_item_escaped(f
, "a", long_string
) == -EINVAL
);
51 assert_se(serialize_item_escaped(f
, long_string
, "a") == -EINVAL
);
52 assert_se(serialize_item_escaped(f
, long_string
, long_string
) == -EINVAL
);
56 _cleanup_free_
char *line1
= NULL
, *line2
= NULL
, *line3
= NULL
;
57 assert_se(read_line(f
, LONG_LINE_MAX
, &line1
) > 0);
58 assert_se(streq(line1
, "a=bbb"));
59 assert_se(read_line(f
, LONG_LINE_MAX
, &line2
) > 0);
60 assert_se(streq(line2
, "a=bbb"));
61 assert_se(read_line(f
, LONG_LINE_MAX
, &line3
) == 0);
62 assert_se(streq(line3
, ""));
65 static void test_serialize_usec(void) {
66 _cleanup_(unlink_tempfilep
) char fn
[] = "/tmp/test-serialize.XXXXXX";
67 _cleanup_fclose_
FILE *f
= NULL
;
69 assert_se(fmkostemp_safe(fn
, "r+", &f
) == 0);
70 log_info("/* %s (%s) */", __func__
, fn
);
72 assert_se(serialize_usec(f
, "usec1", USEC_INFINITY
) == 0);
73 assert_se(serialize_usec(f
, "usec2", 0) == 1);
74 assert_se(serialize_usec(f
, "usec3", USEC_INFINITY
-1) == 1);
78 _cleanup_free_
char *line1
= NULL
, *line2
= NULL
;
81 assert_se(read_line(f
, LONG_LINE_MAX
, &line1
) > 0);
82 assert_se(streq(line1
, "usec2=0"));
83 assert_se(deserialize_usec(line1
+ 6, &x
) == 0);
86 assert_se(read_line(f
, LONG_LINE_MAX
, &line2
) > 0);
87 assert_se(startswith(line2
, "usec3="));
88 assert_se(deserialize_usec(line2
+ 6, &x
) == 0);
89 assert_se(x
== USEC_INFINITY
-1);
92 static void test_serialize_strv(void) {
93 _cleanup_(unlink_tempfilep
) char fn
[] = "/tmp/test-serialize.XXXXXX";
94 _cleanup_fclose_
FILE *f
= NULL
;
96 char **strv
= STRV_MAKE("a", "b", "foo foo",
103 "\nnasty5\nfoo=bar");
105 assert_se(fmkostemp_safe(fn
, "r+", &f
) == 0);
106 log_info("/* %s (%s) */", __func__
, fn
);
108 assert_se(serialize_strv(f
, "strv1", NULL
) == 0);
109 assert_se(serialize_strv(f
, "strv2", STRV_MAKE_EMPTY
) == 0);
110 assert_se(serialize_strv(f
, "strv3", strv
) == 1);
111 assert_se(serialize_strv(f
, "strv4", STRV_MAKE(long_string
)) == -EINVAL
);
115 _cleanup_strv_free_
char **strv2
= NULL
;
117 _cleanup_free_
char *line
= NULL
;
120 r
= read_line(f
, LONG_LINE_MAX
, &line
);
125 const char *t
= startswith(line
, "strv3=");
129 assert_se(cunescape(t
, 0, &un
) >= 0);
130 assert_se(strv_consume(&strv2
, un
) >= 0);
133 assert_se(strv_equal(strv
, strv2
));
136 static void test_deserialize_environment(void) {
137 _cleanup_strv_free_
char **env
;
139 log_info("/* %s */", __func__
);
141 assert_se(env
= strv_new("A=1"));
143 assert_se(deserialize_environment("B=2", &env
) >= 0);
144 assert_se(deserialize_environment("FOO%%=a\\177b\\nc\\td e", &env
) >= 0);
146 assert_se(strv_equal(env
, STRV_MAKE("A=1", "B=2", "FOO%%=a\177b\nc\td e")));
148 assert_se(deserialize_environment("foo\\", &env
) < 0);
149 assert_se(deserialize_environment("bar\\_baz", &env
) < 0);
152 static void test_serialize_environment(void) {
153 _cleanup_strv_free_
char **env
= NULL
, **env2
= NULL
;
154 _cleanup_(unlink_tempfilep
) char fn
[] = "/tmp/test-env-util.XXXXXXX";
155 _cleanup_fclose_
FILE *f
= NULL
;
158 assert_se(fmkostemp_safe(fn
, "r+", &f
) == 0);
159 log_info("/* %s (%s) */", __func__
, fn
);
161 assert_se(env
= strv_new("A=1",
165 "FOO%%=a\177b\nc\td e"));
167 assert_se(serialize_strv(f
, "env", env
) == 1);
168 assert_se(fflush_and_check(f
) == 0);
173 _cleanup_free_
char *line
= NULL
;
176 r
= read_line(f
, LONG_LINE_MAX
, &line
);
184 assert_se(startswith(l
, "env="));
186 r
= deserialize_environment(l
+4, &env2
);
191 assert_se(strv_equal(env
, env2
));
194 int main(int argc
, char *argv
[]) {
195 test_setup_logging(LOG_INFO
);
197 memset(long_string
, 'x', sizeof(long_string
)-1);
198 char_array_0(long_string
);
200 test_serialize_item();
201 test_serialize_item_escaped();
202 test_serialize_usec();
203 test_serialize_strv();
204 test_deserialize_environment();
205 test_serialize_environment();