]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-path-util.c
test-path-util: fix running with separate build dir
[thirdparty/systemd.git] / src / test / test-path-util.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4 This file is part of systemd.
5
6 Copyright 2013 Zbigniew Jędrzejewski-Szmek
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <stdio.h>
23
24 #include "path-util.h"
25 #include "util.h"
26 #include "macro.h"
27
28
29 static void test_path(void) {
30 assert_se(path_equal("/goo", "/goo"));
31 assert_se(path_equal("//goo", "/goo"));
32 assert_se(path_equal("//goo/////", "/goo"));
33 assert_se(path_equal("goo/////", "goo"));
34
35 assert_se(path_equal("/goo/boo", "/goo//boo"));
36 assert_se(path_equal("//goo/boo", "/goo/boo//"));
37
38 assert_se(path_equal("/", "///"));
39
40 assert_se(!path_equal("/x", "x/"));
41 assert_se(!path_equal("x/", "/"));
42
43 assert_se(!path_equal("/x/./y", "x/y"));
44 assert_se(!path_equal("x/.y", "x/y"));
45
46 assert_se(path_is_absolute("/"));
47 assert_se(!path_is_absolute("./"));
48
49 assert_se(is_path("/dir"));
50 assert_se(is_path("a/b"));
51 assert_se(!is_path("."));
52
53 assert_se(streq(basename("./aa/bb/../file.da."), "file.da."));
54 assert_se(streq(basename("/aa///.file"), ".file"));
55 assert_se(streq(basename("/aa///file..."), "file..."));
56 assert_se(streq(basename("file.../"), ""));
57
58 #define test_parent(x, y) { \
59 char _cleanup_free_ *z = NULL; \
60 int r = path_get_parent(x, &z); \
61 printf("expected: %s\n", y ? y : "error"); \
62 printf("actual: %s\n", r<0 ? "error" : z); \
63 assert_se((y==NULL) ^ (r==0)); \
64 assert_se(y==NULL || path_equal(z, y)); \
65 }
66
67 test_parent("./aa/bb/../file.da.", "./aa/bb/..");
68 test_parent("/aa///.file", "/aa///");
69 test_parent("/aa///file...", "/aa///");
70 test_parent("file.../", NULL);
71
72 assert_se(path_is_mount_point("/", true));
73 assert_se(path_is_mount_point("/", false));
74
75 {
76 char p1[] = "aaa/bbb////ccc";
77 char p2[] = "//aaa/.////ccc";
78 char p3[] = "/./";
79
80 assert(path_equal(path_kill_slashes(p1), "aaa/bbb/ccc"));
81 assert(path_equal(path_kill_slashes(p2), "/aaa/./ccc"));
82 assert(path_equal(path_kill_slashes(p3), "/./"));
83 }
84 }
85
86 static void test_find_binary(const char *self) {
87 char *p;
88
89 assert(find_binary("/bin/sh", &p) == 0);
90 puts(p);
91 assert(streq(p, "/bin/sh"));
92 free(p);
93
94 assert(find_binary(self, &p) == 0);
95 puts(p);
96 assert(endswith(p, "/test-path-util"));
97 assert(path_is_absolute(p));
98 free(p);
99
100 assert(find_binary("sh", &p) == 0);
101 puts(p);
102 assert(endswith(p, "/sh"));
103 assert(path_is_absolute(p));
104 free(p);
105
106 assert(find_binary("xxxx-xxxx", &p) == -ENOENT);
107
108 assert(find_binary("/some/dir/xxxx-xxxx", &p) == -ENOENT);
109 }
110
111 static void test_prefixes(void) {
112 static const char* values[] = { "/a/b/c/d", "/a/b/c", "/a/b", "/a", "", NULL};
113 unsigned i;
114 char s[PATH_MAX];
115 bool b;
116
117 i = 0;
118 PATH_FOREACH_PREFIX_MORE(s, "/a/b/c/d") {
119 log_error("---%s---", s);
120 assert_se(streq(s, values[i++]));
121 }
122 assert_se(values[i] == NULL);
123
124 i = 1;
125 PATH_FOREACH_PREFIX(s, "/a/b/c/d") {
126 log_error("---%s---", s);
127 assert_se(streq(s, values[i++]));
128 }
129 assert_se(values[i] == NULL);
130
131 i = 0;
132 PATH_FOREACH_PREFIX_MORE(s, "////a////b////c///d///////")
133 assert_se(streq(s, values[i++]));
134 assert_se(values[i] == NULL);
135
136 i = 1;
137 PATH_FOREACH_PREFIX(s, "////a////b////c///d///////")
138 assert_se(streq(s, values[i++]));
139 assert_se(values[i] == NULL);
140
141 PATH_FOREACH_PREFIX(s, "////")
142 assert_not_reached("Wut?");
143
144 b = false;
145 PATH_FOREACH_PREFIX_MORE(s, "////") {
146 assert_se(!b);
147 assert_se(streq(s, ""));
148 b = true;
149 }
150 assert_se(b);
151
152 PATH_FOREACH_PREFIX(s, "")
153 assert_not_reached("wut?");
154
155 b = false;
156 PATH_FOREACH_PREFIX_MORE(s, "") {
157 assert(!b);
158 assert(streq(s, ""));
159 b = true;
160 }
161 }
162
163 static void test_fsck_exists(void) {
164 /* Ensure we use a sane default for PATH. */
165 unsetenv("PATH");
166
167 /* fsck.minix is provided by util-linux and will probably exist. */
168 assert_se(fsck_exists("minix") == 0);
169
170 assert_se(fsck_exists("AbCdE") == -ENOENT);
171 }
172
173 int main(int argc, char **argv) {
174 test_path();
175 test_find_binary(argv[0]);
176 test_prefixes();
177 test_fsck_exists();
178 return 0;
179 }