]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/test/test-unit-file.c
strv: make iterator in STRV_FOREACH() declaread in the loop
[thirdparty/systemd.git] / src / test / test-unit-file.c
CommitLineData
db9ecf05 1/* SPDX-License-Identifier: LGPL-2.1-or-later */
7d1e91d1
ZJS
2
3#include "path-lookup.h"
80276543 4#include "set.h"
da33cba0 5#include "special.h"
7d1e91d1
ZJS
6#include "strv.h"
7#include "tests.h"
8#include "unit-file.h"
9
4f7452a8 10TEST(unit_validate_alias_symlink_and_warn) {
7d1e91d1
ZJS
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
4f7452a8 27TEST(unit_file_build_name_map) {
e8630e69
ZJS
28 _cleanup_(lookup_paths_free) LookupPaths lp = {};
29 _cleanup_hashmap_free_ Hashmap *unit_ids = NULL;
30 _cleanup_hashmap_free_ Hashmap *unit_names = NULL;
e8630e69 31 const char *k, *dst;
4f7452a8 32 char **v, **ids;
91e0ee5f
ZJS
33 usec_t mtime = 0;
34 int r;
e8630e69 35
4f7452a8
JJ
36 ids = strv_skip(saved_argv, 1);
37
e8630e69
ZJS
38 assert_se(lookup_paths_init(&lp, UNIT_FILE_SYSTEM, 0, NULL) >= 0);
39
91e0ee5f 40 assert_se(unit_file_build_name_map(&lp, &mtime, &unit_ids, &unit_names, NULL) == 1);
e8630e69 41
90e74a66 42 HASHMAP_FOREACH_KEY(dst, k, unit_ids)
e8630e69
ZJS
43 log_info("ids: %s → %s", k, dst);
44
90e74a66 45 HASHMAP_FOREACH_KEY(v, k, unit_names) {
e8630e69
ZJS
46 _cleanup_free_ char *j = strv_join(v, ", ");
47 log_info("aliases: %s ← %s", k, j);
48 }
91e0ee5f
ZJS
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.");
80276543 57
80276543
ZJS
58 STRV_FOREACH(id, ids) {
59 const char *fragment, *name;
80276543
ZJS
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);
f21b863e 67 assert_se(r == 0);
80276543
ZJS
68 log_info("fragment: %s", fragment);
69 log_info("names:");
90e74a66 70 SET_FOREACH(name, names)
80276543
ZJS
71 log_info(" %s", name);
72 }
11e9347b
DDM
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 }
e8630e69
ZJS
86}
87
4f7452a8 88TEST(runlevel_to_target) {
da33cba0
ZJS
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
99839c7e
LP
104static int intro(void) {
105 log_show_color(true);
106 return EXIT_SUCCESS;
107}
108
e85fdacc 109DEFINE_TEST_MAIN_WITH_INTRO(LOG_DEBUG, intro);