]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-unit-file.c
Merge pull request #22791 from keszybz/bootctl-invert-order
[thirdparty/systemd.git] / src / test / test-unit-file.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2
3 #include "path-lookup.h"
4 #include "set.h"
5 #include "special.h"
6 #include "strv.h"
7 #include "tests.h"
8 #include "unit-file.h"
9
10 TEST(unit_validate_alias_symlink_and_warn) {
11 assert_se(unit_validate_alias_symlink_and_warn("/path/a.service", "/other/b.service") == 0);
12 assert_se(unit_validate_alias_symlink_and_warn("/path/a.service", "/other/b.socket") == -EXDEV);
13 assert_se(unit_validate_alias_symlink_and_warn("/path/a.service", "/other/b.foobar") == -EXDEV);
14 assert_se(unit_validate_alias_symlink_and_warn("/path/a@.service", "/other/b@.service") == 0);
15 assert_se(unit_validate_alias_symlink_and_warn("/path/a@.service", "/other/b@.socket") == -EXDEV);
16 assert_se(unit_validate_alias_symlink_and_warn("/path/a@XXX.service", "/other/b@YYY.service") == -EXDEV);
17 assert_se(unit_validate_alias_symlink_and_warn("/path/a@XXX.service", "/other/b@YYY.socket") == -EXDEV);
18 assert_se(unit_validate_alias_symlink_and_warn("/path/a@.service", "/other/b@YYY.service") == -EXDEV);
19 assert_se(unit_validate_alias_symlink_and_warn("/path/a@XXX.service", "/other/b@XXX.service") == 0);
20 assert_se(unit_validate_alias_symlink_and_warn("/path/a@XXX.service", "/other/b@.service") == 0);
21 assert_se(unit_validate_alias_symlink_and_warn("/path/a@.service", "/other/b.service") == -EXDEV);
22 assert_se(unit_validate_alias_symlink_and_warn("/path/a.service", "/other/b@.service") == -EXDEV);
23 assert_se(unit_validate_alias_symlink_and_warn("/path/a@.slice", "/other/b.slice") == -EINVAL);
24 assert_se(unit_validate_alias_symlink_and_warn("/path/a.slice", "/other/b.slice") == -EINVAL);
25 }
26
27 TEST(unit_file_build_name_map) {
28 _cleanup_(lookup_paths_free) LookupPaths lp = {};
29 _cleanup_hashmap_free_ Hashmap *unit_ids = NULL;
30 _cleanup_hashmap_free_ Hashmap *unit_names = NULL;
31 const char *k, *dst;
32 char **v, **ids;
33 usec_t mtime = 0;
34 int r;
35
36 ids = strv_skip(saved_argv, 1);
37
38 assert_se(lookup_paths_init(&lp, UNIT_FILE_SYSTEM, 0, NULL) >= 0);
39
40 assert_se(unit_file_build_name_map(&lp, &mtime, &unit_ids, &unit_names, NULL) == 1);
41
42 HASHMAP_FOREACH_KEY(dst, k, unit_ids)
43 log_info("ids: %s → %s", k, dst);
44
45 HASHMAP_FOREACH_KEY(v, k, unit_names) {
46 _cleanup_free_ char *j = strv_join(v, ", ");
47 log_info("aliases: %s ← %s", k, j);
48 }
49
50 char buf[FORMAT_TIMESTAMP_MAX];
51 log_debug("Last modification time: %s", format_timestamp(buf, sizeof buf, mtime));
52
53 r = unit_file_build_name_map(&lp, &mtime, &unit_ids, &unit_names, NULL);
54 assert_se(IN_SET(r, 0, 1));
55 if (r == 0)
56 log_debug("Cache rebuild skipped based on mtime.");
57
58 STRV_FOREACH(id, ids) {
59 const char *fragment, *name;
60 _cleanup_set_free_free_ Set *names = NULL;
61 log_info("*** %s ***", *id);
62 r = unit_file_find_fragment(unit_ids,
63 unit_names,
64 *id,
65 &fragment,
66 &names);
67 assert_se(r == 0);
68 log_info("fragment: %s", fragment);
69 log_info("names:");
70 SET_FOREACH(name, names)
71 log_info(" %s", name);
72 }
73
74 /* Make sure everything still works if we don't collect names. */
75 STRV_FOREACH(id, ids) {
76 const char *fragment;
77 log_info("*** %s ***", *id);
78 r = unit_file_find_fragment(unit_ids,
79 unit_names,
80 *id,
81 &fragment,
82 NULL);
83 assert_se(r == 0);
84 log_info("fragment: %s", fragment);
85 }
86 }
87
88 TEST(runlevel_to_target) {
89 in_initrd_force(false);
90 assert_se(streq_ptr(runlevel_to_target(NULL), NULL));
91 assert_se(streq_ptr(runlevel_to_target("unknown-runlevel"), NULL));
92 assert_se(streq_ptr(runlevel_to_target("rd.unknown-runlevel"), NULL));
93 assert_se(streq_ptr(runlevel_to_target("3"), SPECIAL_MULTI_USER_TARGET));
94 assert_se(streq_ptr(runlevel_to_target("rd.rescue"), NULL));
95
96 in_initrd_force(true);
97 assert_se(streq_ptr(runlevel_to_target(NULL), NULL));
98 assert_se(streq_ptr(runlevel_to_target("unknown-runlevel"), NULL));
99 assert_se(streq_ptr(runlevel_to_target("rd.unknown-runlevel"), NULL));
100 assert_se(streq_ptr(runlevel_to_target("3"), NULL));
101 assert_se(streq_ptr(runlevel_to_target("rd.rescue"), SPECIAL_RESCUE_TARGET));
102 }
103
104 static int intro(void) {
105 log_show_color(true);
106 return EXIT_SUCCESS;
107 }
108
109 DEFINE_TEST_MAIN_WITH_INTRO(LOG_DEBUG, intro);