]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-unit-file.c
sd-boot+bootctl: invert order of entries w/o sort-key
[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 char **id;
59 STRV_FOREACH(id, ids) {
60 const char *fragment, *name;
61 _cleanup_set_free_free_ Set *names = NULL;
62 log_info("*** %s ***", *id);
63 r = unit_file_find_fragment(unit_ids,
64 unit_names,
65 *id,
66 &fragment,
67 &names);
68 assert_se(r == 0);
69 log_info("fragment: %s", fragment);
70 log_info("names:");
71 SET_FOREACH(name, names)
72 log_info(" %s", name);
73 }
74
75 /* Make sure everything still works if we don't collect names. */
76 STRV_FOREACH(id, ids) {
77 const char *fragment;
78 log_info("*** %s ***", *id);
79 r = unit_file_find_fragment(unit_ids,
80 unit_names,
81 *id,
82 &fragment,
83 NULL);
84 assert_se(r == 0);
85 log_info("fragment: %s", fragment);
86 }
87 }
88
89 TEST(runlevel_to_target) {
90 in_initrd_force(false);
91 assert_se(streq_ptr(runlevel_to_target(NULL), NULL));
92 assert_se(streq_ptr(runlevel_to_target("unknown-runlevel"), NULL));
93 assert_se(streq_ptr(runlevel_to_target("rd.unknown-runlevel"), NULL));
94 assert_se(streq_ptr(runlevel_to_target("3"), SPECIAL_MULTI_USER_TARGET));
95 assert_se(streq_ptr(runlevel_to_target("rd.rescue"), NULL));
96
97 in_initrd_force(true);
98 assert_se(streq_ptr(runlevel_to_target(NULL), NULL));
99 assert_se(streq_ptr(runlevel_to_target("unknown-runlevel"), NULL));
100 assert_se(streq_ptr(runlevel_to_target("rd.unknown-runlevel"), NULL));
101 assert_se(streq_ptr(runlevel_to_target("3"), NULL));
102 assert_se(streq_ptr(runlevel_to_target("rd.rescue"), SPECIAL_RESCUE_TARGET));
103 }
104
105 static int intro(void) {
106 log_show_color(true);
107 return EXIT_SUCCESS;
108 }
109
110 DEFINE_TEST_MAIN_WITH_INTRO(LOG_DEBUG, intro);