1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 #include "path-lookup.h"
10 static void test_unit_validate_alias_symlink_and_warn(void) {
11 log_info("/* %s */", __func__
);
13 assert_se(unit_validate_alias_symlink_and_warn("/path/a.service", "/other/b.service") == 0);
14 assert_se(unit_validate_alias_symlink_and_warn("/path/a.service", "/other/b.socket") == -EXDEV
);
15 assert_se(unit_validate_alias_symlink_and_warn("/path/a.service", "/other/b.foobar") == -EXDEV
);
16 assert_se(unit_validate_alias_symlink_and_warn("/path/a@.service", "/other/b@.service") == 0);
17 assert_se(unit_validate_alias_symlink_and_warn("/path/a@.service", "/other/b@.socket") == -EXDEV
);
18 assert_se(unit_validate_alias_symlink_and_warn("/path/a@XXX.service", "/other/b@YYY.service") == -EXDEV
);
19 assert_se(unit_validate_alias_symlink_and_warn("/path/a@XXX.service", "/other/b@YYY.socket") == -EXDEV
);
20 assert_se(unit_validate_alias_symlink_and_warn("/path/a@.service", "/other/b@YYY.service") == -EXDEV
);
21 assert_se(unit_validate_alias_symlink_and_warn("/path/a@XXX.service", "/other/b@XXX.service") == 0);
22 assert_se(unit_validate_alias_symlink_and_warn("/path/a@XXX.service", "/other/b@.service") == 0);
23 assert_se(unit_validate_alias_symlink_and_warn("/path/a@.service", "/other/b.service") == -EXDEV
);
24 assert_se(unit_validate_alias_symlink_and_warn("/path/a.service", "/other/b@.service") == -EXDEV
);
25 assert_se(unit_validate_alias_symlink_and_warn("/path/a@.slice", "/other/b.slice") == -EINVAL
);
26 assert_se(unit_validate_alias_symlink_and_warn("/path/a.slice", "/other/b.slice") == -EINVAL
);
29 static void test_unit_file_build_name_map(char **ids
) {
30 _cleanup_(lookup_paths_free
) LookupPaths lp
= {};
31 _cleanup_hashmap_free_ Hashmap
*unit_ids
= NULL
;
32 _cleanup_hashmap_free_ Hashmap
*unit_names
= NULL
;
39 assert_se(lookup_paths_init(&lp
, UNIT_FILE_SYSTEM
, 0, NULL
) >= 0);
41 assert_se(unit_file_build_name_map(&lp
, &mtime
, &unit_ids
, &unit_names
, NULL
) == 1);
43 HASHMAP_FOREACH_KEY(dst
, k
, unit_ids
, i
)
44 log_info("ids: %s → %s", k
, dst
);
46 HASHMAP_FOREACH_KEY(v
, k
, unit_names
, i
) {
47 _cleanup_free_
char *j
= strv_join(v
, ", ");
48 log_info("aliases: %s ← %s", k
, j
);
51 char buf
[FORMAT_TIMESTAMP_MAX
];
52 log_debug("Last modification time: %s", format_timestamp(buf
, sizeof buf
, mtime
));
54 r
= unit_file_build_name_map(&lp
, &mtime
, &unit_ids
, &unit_names
, NULL
);
55 assert_se(IN_SET(r
, 0, 1));
57 log_debug("Cache rebuild skipped based on mtime.");
61 STRV_FOREACH(id
, ids
) {
62 const char *fragment
, *name
;
64 _cleanup_set_free_free_ Set
*names
= NULL
;
65 log_info("*** %s ***", *id
);
66 r
= unit_file_find_fragment(unit_ids
,
72 log_info("fragment: %s", fragment
);
74 SET_FOREACH(name
, names
, it
)
75 log_info(" %s", name
);
79 static void test_runlevel_to_target(void) {
80 log_info("/* %s */", __func__
);
82 in_initrd_force(false);
83 assert_se(streq_ptr(runlevel_to_target(NULL
), NULL
));
84 assert_se(streq_ptr(runlevel_to_target("unknown-runlevel"), NULL
));
85 assert_se(streq_ptr(runlevel_to_target("rd.unknown-runlevel"), NULL
));
86 assert_se(streq_ptr(runlevel_to_target("3"), SPECIAL_MULTI_USER_TARGET
));
87 assert_se(streq_ptr(runlevel_to_target("rd.rescue"), NULL
));
89 in_initrd_force(true);
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"), NULL
));
94 assert_se(streq_ptr(runlevel_to_target("rd.rescue"), SPECIAL_RESCUE_TARGET
));
97 int main(int argc
, char **argv
) {
98 test_setup_logging(LOG_DEBUG
);
100 test_unit_validate_alias_symlink_and_warn();
101 test_unit_file_build_name_map(strv_skip(argv
, 1));
102 test_runlevel_to_target();