chiark / gitweb /
shared: add ring buffer
[elogind.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 }