1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 #include "alloc-util.h"
6 #include "stdio-util.h"
7 #include "string-util.h"
11 static void test_specifier_escape_one(const char *a
, const char *b
) {
12 _cleanup_free_
char *x
= NULL
;
14 x
= specifier_escape(a
);
15 assert_se(streq_ptr(x
, b
));
18 static void test_specifier_escape(void) {
19 log_info("/* %s */", __func__
);
21 test_specifier_escape_one(NULL
, NULL
);
22 test_specifier_escape_one("", "");
23 test_specifier_escape_one("%", "%%");
24 test_specifier_escape_one("foo bar", "foo bar");
25 test_specifier_escape_one("foo%bar", "foo%%bar");
26 test_specifier_escape_one("%%%%%", "%%%%%%%%%%");
29 static void test_specifier_escape_strv_one(char **a
, char **b
) {
30 _cleanup_strv_free_
char **x
= NULL
;
32 assert_se(specifier_escape_strv(a
, &x
) >= 0);
33 assert_se(strv_equal(x
, b
));
36 static void test_specifier_escape_strv(void) {
37 log_info("/* %s */", __func__
);
39 test_specifier_escape_strv_one(NULL
, NULL
);
40 test_specifier_escape_strv_one(STRV_MAKE(NULL
), STRV_MAKE(NULL
));
41 test_specifier_escape_strv_one(STRV_MAKE(""), STRV_MAKE(""));
42 test_specifier_escape_strv_one(STRV_MAKE("foo"), STRV_MAKE("foo"));
43 test_specifier_escape_strv_one(STRV_MAKE("%"), STRV_MAKE("%%"));
44 test_specifier_escape_strv_one(STRV_MAKE("foo", "%", "foo%", "%foo", "foo%foo", "quux", "%%%"),
45 STRV_MAKE("foo", "%%", "foo%%", "%%foo", "foo%%foo", "quux", "%%%%%%"));
48 /* Any specifier functions which don't need an argument. */
49 static const Specifier specifier_table
[] = {
50 { 'm', specifier_machine_id
, NULL
},
51 { 'b', specifier_boot_id
, NULL
},
52 { 'H', specifier_host_name
, NULL
},
53 { 'l', specifier_short_host_name
, NULL
},
54 { 'v', specifier_kernel_release
, NULL
},
55 { 'a', specifier_architecture
, NULL
},
56 { 'o', specifier_os_id
, NULL
},
57 { 'w', specifier_os_version_id
, NULL
},
58 { 'B', specifier_os_build_id
, NULL
},
59 { 'W', specifier_os_variant_id
, NULL
},
61 { 'g', specifier_group_name
, NULL
},
62 { 'G', specifier_group_id
, NULL
},
63 { 'U', specifier_user_id
, NULL
},
64 { 'u', specifier_user_name
, NULL
},
65 { 'h', specifier_user_home
, NULL
},
67 { 'T', specifier_tmp_dir
, NULL
},
68 { 'V', specifier_var_tmp_dir
, NULL
},
72 static void test_specifiers(void) {
73 log_info("/* %s */", __func__
);
75 for (const Specifier
*s
= specifier_table
; s
->specifier
; s
++) {
77 _cleanup_free_
char *resolved
= NULL
;
79 xsprintf(spec
, "%%%c", s
->specifier
);
81 assert_se(specifier_printf(spec
, specifier_table
, NULL
, &resolved
) >= 0);
83 log_info("%%%c → %s", s
->specifier
, resolved
);
87 int main(int argc
, char *argv
[]) {
88 test_setup_logging(LOG_DEBUG
);
90 test_specifier_escape();
91 test_specifier_escape_strv();