1 /* SPDX-License-Identifier: LGPL-2.1+ */
7 #include "path-lookup.h"
9 #include "string-util.h"
13 static void test_paths(UnitFileScope scope
) {
14 char template[] = "/tmp/test-path-lookup.XXXXXXX";
16 _cleanup_(lookup_paths_free
) LookupPaths lp_without_env
= {};
17 _cleanup_(lookup_paths_free
) LookupPaths lp_with_env
= {};
18 char *systemd_unit_path
;
20 assert_se(mkdtemp(template));
22 assert_se(unsetenv("SYSTEMD_UNIT_PATH") == 0);
23 assert_se(lookup_paths_init(&lp_without_env
, scope
, 0, NULL
) >= 0);
24 assert_se(!strv_isempty(lp_without_env
.search_path
));
25 assert_se(lookup_paths_reduce(&lp_without_env
) >= 0);
27 systemd_unit_path
= strjoina(template, "/systemd-unit-path");
28 assert_se(setenv("SYSTEMD_UNIT_PATH", systemd_unit_path
, 1) == 0);
29 assert_se(lookup_paths_init(&lp_with_env
, scope
, 0, NULL
) == 0);
30 assert_se(strv_length(lp_with_env
.search_path
) == 1);
31 assert_se(streq(lp_with_env
.search_path
[0], systemd_unit_path
));
32 assert_se(lookup_paths_reduce(&lp_with_env
) >= 0);
33 assert_se(strv_isempty(lp_with_env
.search_path
));
35 assert_se(rm_rf(template, REMOVE_ROOT
|REMOVE_PHYSICAL
) >= 0);
38 static void test_user_and_global_paths(void) {
39 _cleanup_(lookup_paths_free
) LookupPaths lp_global
= {}, lp_user
= {};
43 assert_se(unsetenv("SYSTEMD_UNIT_PATH") == 0);
44 assert_se(unsetenv("XDG_DATA_DIRS") == 0);
45 assert_se(unsetenv("XDG_CONFIG_DIRS") == 0);
47 assert_se(lookup_paths_init(&lp_global
, UNIT_FILE_GLOBAL
, 0, NULL
) == 0);
48 assert_se(lookup_paths_init(&lp_user
, UNIT_FILE_USER
, 0, NULL
) == 0);
49 g
= lp_global
.search_path
;
50 u
= lp_user
.search_path
;
52 /* Go over all entries in global search path, and verify
53 * that they also exist in the user search path. Skip any
54 * entries in user search path which don't exist in the global
55 * one, but not vice versa. */
56 log_info("/* %s */", __func__
);
58 while (u
[k
] && !streq(*p
, u
[k
])) {
59 log_info("+ %s", u
[k
]);
63 assert(u
[k
]); /* If NULL, we didn't find a matching entry */
66 STRV_FOREACH(p
, u
+ k
)
70 static void print_generator_binary_paths(UnitFileScope scope
) {
71 _cleanup_strv_free_
char **paths
;
74 log_info("Generators dirs (%s):", scope
== UNIT_FILE_SYSTEM
? "system" : "user");
76 paths
= generator_binary_paths(scope
);
77 STRV_FOREACH(dir
, paths
)
78 log_info(" %s", *dir
);
81 int main(int argc
, char **argv
) {
82 test_setup_logging(LOG_DEBUG
);
84 test_paths(UNIT_FILE_SYSTEM
);
85 test_paths(UNIT_FILE_USER
);
86 test_paths(UNIT_FILE_GLOBAL
);
88 test_user_and_global_paths();
90 print_generator_binary_paths(UNIT_FILE_SYSTEM
);
91 print_generator_binary_paths(UNIT_FILE_USER
);