1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 Copyright © 2014 Zbigniew Jędrzejewski-Szmek
10 #include "path-lookup.h"
12 #include "string-util.h"
15 static void test_paths(UnitFileScope scope
) {
16 char template[] = "/tmp/test-path-lookup.XXXXXXX";
18 _cleanup_(lookup_paths_free
) LookupPaths lp_without_env
= {};
19 _cleanup_(lookup_paths_free
) LookupPaths lp_with_env
= {};
20 char *systemd_unit_path
;
22 assert_se(mkdtemp(template));
24 assert_se(unsetenv("SYSTEMD_UNIT_PATH") == 0);
25 assert_se(lookup_paths_init(&lp_without_env
, scope
, 0, NULL
) >= 0);
26 assert_se(!strv_isempty(lp_without_env
.search_path
));
27 assert_se(lookup_paths_reduce(&lp_without_env
) >= 0);
29 systemd_unit_path
= strjoina(template, "/systemd-unit-path");
30 assert_se(setenv("SYSTEMD_UNIT_PATH", systemd_unit_path
, 1) == 0);
31 assert_se(lookup_paths_init(&lp_with_env
, scope
, 0, NULL
) == 0);
32 assert_se(strv_length(lp_with_env
.search_path
) == 1);
33 assert_se(streq(lp_with_env
.search_path
[0], systemd_unit_path
));
34 assert_se(lookup_paths_reduce(&lp_with_env
) >= 0);
35 assert_se(strv_isempty(lp_with_env
.search_path
));
37 assert_se(rm_rf(template, REMOVE_ROOT
|REMOVE_PHYSICAL
) >= 0);
40 static void test_user_and_global_paths(void) {
41 _cleanup_(lookup_paths_free
) LookupPaths lp_global
= {}, lp_user
= {};
45 assert_se(unsetenv("SYSTEMD_UNIT_PATH") == 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 log_set_max_level(LOG_DEBUG
);
83 log_parse_environment();
86 test_paths(UNIT_FILE_SYSTEM
);
87 test_paths(UNIT_FILE_USER
);
88 test_paths(UNIT_FILE_GLOBAL
);
90 test_user_and_global_paths();
92 print_generator_binary_paths(UNIT_FILE_SYSTEM
);
93 print_generator_binary_paths(UNIT_FILE_USER
);