1 #include <ccan/tal/path/path.h>
2 #include <ccan/tal/path/path.c>
3 #include <ccan/tap/tap.h>
7 char cwd[1024], *path, *ctx = tal_strdup(NULL, "ctx");
11 if (!getcwd(cwd, sizeof(cwd)))
14 rmdir("run-simplify-foo");
15 unlink("run-simplify-link");
16 if (mkdir("run-simplify-foo", 0700) != 0)
18 if (symlink("run-simplify-foo", "run-simplify-link") != 0)
21 /* Handling of . and .. */
22 path = path_simplify(ctx, ".");
23 ok1(streq(path, "."));
24 ok1(tal_parent(path) == ctx);
27 path = path_simplify(ctx, "./");
28 ok1(streq(path, "."));
29 ok1(tal_parent(path) == ctx);
32 path = path_simplify(ctx, "..");
33 ok1(streq(path, ".."));
34 ok1(tal_parent(path) == ctx);
37 path = path_simplify(ctx, "../");
38 ok1(streq(path, ".."));
39 ok1(tal_parent(path) == ctx);
42 path = path_simplify(ctx, "./..");
43 ok1(streq(path, ".."));
44 ok1(tal_parent(path) == ctx);
47 path = path_simplify(ctx, "./../");
48 ok1(streq(path, ".."));
49 ok1(tal_parent(path) == ctx);
52 path = path_simplify(ctx, "./../.");
53 ok1(streq(path, ".."));
54 ok1(tal_parent(path) == ctx);
57 path = path_simplify(ctx, "./.././");
58 ok1(streq(path, ".."));
59 ok1(tal_parent(path) == ctx);
62 path = path_simplify(ctx, "./../..");
63 ok1(streq(path, "../.."));
64 ok1(tal_parent(path) == ctx);
67 path = path_simplify(ctx, "./../../");
68 ok1(streq(path, "../.."));
69 ok1(tal_parent(path) == ctx);
72 /* Handling of /. and /.. */
73 path = path_simplify(ctx, "/");
74 ok1(streq(path, "/"));
75 ok1(tal_parent(path) == ctx);
78 path = path_simplify(ctx, "//");
79 ok1(streq(path, "/"));
80 ok1(tal_parent(path) == ctx);
83 path = path_simplify(ctx, "/.");
84 ok1(streq(path, "/"));
85 ok1(tal_parent(path) == ctx);
88 path = path_simplify(ctx, "/./");
89 ok1(streq(path, "/"));
90 ok1(tal_parent(path) == ctx);
93 path = path_simplify(ctx, "/..");
94 ok1(streq(path, "/"));
95 ok1(tal_parent(path) == ctx);
98 path = path_simplify(ctx, "/../");
99 ok1(streq(path, "/"));
100 ok1(tal_parent(path) == ctx);
103 path = path_simplify(ctx, "/./..");
104 ok1(streq(path, "/"));
105 ok1(tal_parent(path) == ctx);
108 path = path_simplify(ctx, "/./../");
109 ok1(streq(path, "/"));
110 ok1(tal_parent(path) == ctx);
113 path = path_simplify(ctx, "/./../.");
114 ok1(streq(path, "/"));
115 ok1(tal_parent(path) == ctx);
118 path = path_simplify(ctx, "/./.././");
119 ok1(streq(path, "/"));
120 ok1(tal_parent(path) == ctx);
123 path = path_simplify(ctx, "/./../..");
124 ok1(streq(path, "/"));
125 ok1(tal_parent(path) == ctx);
128 path = path_simplify(ctx, "/./../../");
129 ok1(streq(path, "/"));
130 ok1(tal_parent(path) == ctx);
133 /* Don't trace back over a symlink link */
134 path = path_simplify(ctx, "run-simplify-foo");
135 ok1(streq(path, "run-simplify-foo"));
136 ok1(tal_parent(path) == ctx);
139 path = path_simplify(ctx, "./run-simplify-foo");
140 ok1(streq(path, "run-simplify-foo"));
141 ok1(tal_parent(path) == ctx);
144 path = path_simplify(ctx, "./run-simplify-foo/.");
145 ok1(streq(path, "run-simplify-foo"));
146 ok1(tal_parent(path) == ctx);
149 path = path_simplify(ctx, "run-simplify-link");
150 ok1(streq(path, "run-simplify-link"));
151 ok1(tal_parent(path) == ctx);
154 path = path_simplify(ctx, "./run-simplify-link");
155 ok1(streq(path, "run-simplify-link"));
156 ok1(tal_parent(path) == ctx);
159 path = path_simplify(ctx, "./run-simplify-link/.");
160 ok1(streq(path, "run-simplify-link"));
161 ok1(tal_parent(path) == ctx);
164 path = path_simplify(ctx, "run-simplify-foo/..");
165 ok1(streq(path, "."));
166 ok1(tal_parent(path) == ctx);
169 path = path_simplify(ctx, "run-simplify-foo//..");
170 ok1(streq(path, "."));
171 ok1(tal_parent(path) == ctx);
174 path = path_simplify(ctx, "run-simplify-foo//../");
175 ok1(streq(path, "."));
176 ok1(tal_parent(path) == ctx);
179 /* This is expected to be a real directory. */
180 path = path_simplify(ctx, "/tmp");
181 ok1(streq(path, "/tmp"));
182 ok1(tal_parent(path) == ctx);
185 path = path_simplify(ctx, "/tmp/");
186 ok1(streq(path, "/tmp"));
187 ok1(tal_parent(path) == ctx);
190 path = path_simplify(ctx, "/tmp/.");
191 ok1(streq(path, "/tmp"));
192 ok1(tal_parent(path) == ctx);
195 path = path_simplify(ctx, "/./tmp/.");
196 ok1(streq(path, "/tmp"));
197 ok1(tal_parent(path) == ctx);
200 path = path_simplify(ctx, "/../tmp/.");
201 ok1(streq(path, "/tmp"));
202 ok1(tal_parent(path) == ctx);
205 path = path_simplify(ctx, "/tmp/..");
206 ok1(streq(path, "/"));
207 ok1(tal_parent(path) == ctx);
210 path = path_simplify(ctx, "/tmp/../");
211 ok1(streq(path, "/"));
212 ok1(tal_parent(path) == ctx);
215 path = path_simplify(ctx, "/tmp/../tmp");
216 ok1(streq(path, "/tmp"));
217 ok1(tal_parent(path) == ctx);
220 path = path_simplify(ctx, "/tmp/../tmp/");
221 ok1(streq(path, "/tmp"));
222 ok1(tal_parent(path) == ctx);
225 path = path_simplify(ctx, "/tmp/../tmp/.");
226 ok1(streq(path, "/tmp"));
227 ok1(tal_parent(path) == ctx);
231 path = path_simplify(ctx, take(tal_strdup(ctx, "/tmp/../tmp/.")));
232 ok1(streq(path, "/tmp"));
233 ok1(tal_parent(path) == ctx);
235 ok1(tal_first(ctx) == NULL);
237 path = path_simplify(ctx, take(NULL));
239 ok1(tal_first(ctx) == NULL);
243 return exit_status();