1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 #include "path-lookup.h"
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
);
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
;
36 ids
= strv_skip(saved_argv
, 1);
38 assert_se(lookup_paths_init(&lp
, UNIT_FILE_SYSTEM
, 0, NULL
) >= 0);
40 assert_se(unit_file_build_name_map(&lp
, &mtime
, &unit_ids
, &unit_names
, NULL
) == 1);
42 HASHMAP_FOREACH_KEY(dst
, k
, unit_ids
)
43 log_info("ids: %s → %s", k
, dst
);
45 HASHMAP_FOREACH_KEY(v
, k
, unit_names
) {
46 _cleanup_free_
char *j
= strv_join(v
, ", ");
47 log_info("aliases: %s ← %s", k
, j
);
50 char buf
[FORMAT_TIMESTAMP_MAX
];
51 log_debug("Last modification time: %s", format_timestamp(buf
, sizeof buf
, mtime
));
53 r
= unit_file_build_name_map(&lp
, &mtime
, &unit_ids
, &unit_names
, NULL
);
54 assert_se(IN_SET(r
, 0, 1));
56 log_debug("Cache rebuild skipped based on mtime.");
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
,
69 log_info("fragment: %s", fragment
);
71 SET_FOREACH(name
, names
)
72 log_info(" %s", name
);
75 /* Make sure everything still works if we don't collect names. */
76 STRV_FOREACH(id
, ids
) {
78 log_info("*** %s ***", *id
);
79 r
= unit_file_find_fragment(unit_ids
,
85 log_info("fragment: %s", fragment
);
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
));
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
));
105 DEFINE_CUSTOM_TEST_MAIN(LOG_DEBUG
, log_show_color(true), /* no outro */);