]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-specifier.c
Merge pull request #20598 from tomty89/order_noauto
[thirdparty/systemd.git] / src / test / test-specifier.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2
3 #include "alloc-util.h"
4 #include "log.h"
5 #include "specifier.h"
6 #include "stdio-util.h"
7 #include "string-util.h"
8 #include "strv.h"
9 #include "tests.h"
10
11 static void test_specifier_escape_one(const char *a, const char *b) {
12 _cleanup_free_ char *x = NULL;
13
14 x = specifier_escape(a);
15 assert_se(streq_ptr(x, b));
16 }
17
18 TEST(specifier_escape) {
19 test_specifier_escape_one(NULL, NULL);
20 test_specifier_escape_one("", "");
21 test_specifier_escape_one("%", "%%");
22 test_specifier_escape_one("foo bar", "foo bar");
23 test_specifier_escape_one("foo%bar", "foo%%bar");
24 test_specifier_escape_one("%%%%%", "%%%%%%%%%%");
25 }
26
27 static void test_specifier_escape_strv_one(char **a, char **b) {
28 _cleanup_strv_free_ char **x = NULL;
29
30 assert_se(specifier_escape_strv(a, &x) >= 0);
31 assert_se(strv_equal(x, b));
32 }
33
34 TEST(specifier_escape_strv) {
35 test_specifier_escape_strv_one(NULL, NULL);
36 test_specifier_escape_strv_one(STRV_MAKE(NULL), STRV_MAKE(NULL));
37 test_specifier_escape_strv_one(STRV_MAKE(""), STRV_MAKE(""));
38 test_specifier_escape_strv_one(STRV_MAKE("foo"), STRV_MAKE("foo"));
39 test_specifier_escape_strv_one(STRV_MAKE("%"), STRV_MAKE("%%"));
40 test_specifier_escape_strv_one(STRV_MAKE("foo", "%", "foo%", "%foo", "foo%foo", "quux", "%%%"),
41 STRV_MAKE("foo", "%%", "foo%%", "%%foo", "foo%%foo", "quux", "%%%%%%"));
42 }
43
44 /* Any specifier functions which don't need an argument. */
45 static const Specifier specifier_table[] = {
46 COMMON_SYSTEM_SPECIFIERS,
47
48 COMMON_CREDS_SPECIFIERS,
49 { 'h', specifier_user_home, NULL },
50
51 COMMON_TMP_SPECIFIERS,
52 {}
53 };
54
55 TEST(specifier_printf) {
56 static const Specifier table[] = {
57 { 'X', specifier_string, (char*) "AAAA" },
58 { 'Y', specifier_string, (char*) "BBBB" },
59 COMMON_SYSTEM_SPECIFIERS,
60 {}
61 };
62
63 _cleanup_free_ char *w = NULL;
64 int r;
65
66 r = specifier_printf("xxx a=%X b=%Y yyy", SIZE_MAX, table, NULL, NULL, &w);
67 assert_se(r >= 0);
68 assert_se(w);
69
70 puts(w);
71 assert_se(streq(w, "xxx a=AAAA b=BBBB yyy"));
72
73 free(w);
74 r = specifier_printf("machine=%m, boot=%b, host=%H, version=%v, arch=%a", SIZE_MAX, table, NULL, NULL, &w);
75 assert_se(r >= 0);
76 assert_se(w);
77 puts(w);
78
79 w = mfree(w);
80 specifier_printf("os=%o, os-version=%w, build=%B, variant=%W", SIZE_MAX, table, NULL, NULL, &w);
81 if (w)
82 puts(w);
83 }
84
85 TEST(specifiers) {
86 for (const Specifier *s = specifier_table; s->specifier; s++) {
87 char spec[3];
88 _cleanup_free_ char *resolved = NULL;
89
90 xsprintf(spec, "%%%c", s->specifier);
91
92 assert_se(specifier_printf(spec, SIZE_MAX, specifier_table, NULL, NULL, &resolved) >= 0);
93
94 log_info("%%%c → %s", s->specifier, resolved);
95 }
96 }
97
98 DEFINE_TEST_MAIN(LOG_DEBUG);