1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Zbigniew Jędrzejewski-Szmek
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.
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.
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/>.
24 #include "path-util.h"
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"));
35 assert_se(path_equal("/goo/boo", "/goo//boo"));
36 assert_se(path_equal("//goo/boo", "/goo/boo//"));
38 assert_se(path_equal("/", "///"));
40 assert_se(!path_equal("/x", "x/"));
41 assert_se(!path_equal("x/", "/"));
43 assert_se(!path_equal("/x/./y", "x/y"));
44 assert_se(!path_equal("x/.y", "x/y"));
46 assert_se(path_is_absolute("/"));
47 assert_se(!path_is_absolute("./"));
49 assert_se(is_path("/dir"));
50 assert_se(is_path("a/b"));
51 assert_se(!is_path("."));
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.../"), ""));
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)); \
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);
72 assert_se(path_is_mount_point("/", true));
73 assert_se(path_is_mount_point("/", false));
76 char p1[] = "aaa/bbb////ccc";
77 char p2[] = "//aaa/.////ccc";
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), "/./"));
86 static void test_find_binary(const char *self) {
89 assert(find_binary("/bin/sh", &p) == 0);
91 assert(streq(p, "/bin/sh"));
94 assert(find_binary(self, &p) == 0);
96 assert(endswith(p, "/test-path-util"));
97 assert(path_is_absolute(p));
100 assert(find_binary("sh", &p) == 0);
102 assert(endswith(p, "/sh"));
103 assert(path_is_absolute(p));
106 assert(find_binary("xxxx-xxxx", &p) == -ENOENT);
108 assert(find_binary("/some/dir/xxxx-xxxx", &p) == -ENOENT);
111 static void test_prefixes(void) {
112 static const char* values[] = { "/a/b/c/d", "/a/b/c", "/a/b", "/a", "", NULL};
118 PATH_FOREACH_PREFIX_MORE(s, "/a/b/c/d") {
119 log_error("---%s---", s);
120 assert_se(streq(s, values[i++]));
122 assert_se(values[i] == NULL);
125 PATH_FOREACH_PREFIX(s, "/a/b/c/d") {
126 log_error("---%s---", s);
127 assert_se(streq(s, values[i++]));
129 assert_se(values[i] == NULL);
132 PATH_FOREACH_PREFIX_MORE(s, "////a////b////c///d///////")
133 assert_se(streq(s, values[i++]));
134 assert_se(values[i] == NULL);
137 PATH_FOREACH_PREFIX(s, "////a////b////c///d///////")
138 assert_se(streq(s, values[i++]));
139 assert_se(values[i] == NULL);
141 PATH_FOREACH_PREFIX(s, "////")
142 assert_not_reached("Wut?");
145 PATH_FOREACH_PREFIX_MORE(s, "////") {
147 assert_se(streq(s, ""));
152 PATH_FOREACH_PREFIX(s, "")
153 assert_not_reached("wut?");
156 PATH_FOREACH_PREFIX_MORE(s, "") {
158 assert(streq(s, ""));
163 static void test_fsck_exists(void) {
164 /* Ensure we use a sane default for PATH. */
167 /* fsck.minix is provided by util-linux and will probably exist. */
168 assert_se(fsck_exists("minix") == 0);
170 assert_se(fsck_exists("AbCdE") == -ENOENT);
173 static void test_make_relative(void) {
176 assert_se(path_make_relative("some/relative/path", "/some/path", &result) < 0);
177 assert_se(path_make_relative("/some/path", "some/relative/path", &result) < 0);
179 #define test(from_dir, to_path, expected) { \
180 path_make_relative(from_dir, to_path, &result); \
181 assert_se(streq(result, expected)); \
186 test("/", "/some/path", "some/path");
187 test("/some/path", "/some/path", ".");
188 test("/some/path", "/some/path/in/subdir", "in/subdir");
189 test("/some/path", "/", "../..");
190 test("/some/path", "/some/other/path", "../other/path");
191 test("//extra/////slashes///won't////fool///anybody//", "////extra///slashes////are/just///fine///", "../../../are/just/fine");
194 int main(int argc, char **argv) {
196 test_find_binary(argv[0]);
199 test_make_relative();