xref: /freebsd/contrib/atf/atf-c/detail/fs_test.c (revision 1a6a36a98ad5dc86862541b91686b00cf88e9f76)
10677dfd1SJulio Merino /* Copyright (c) 2007 The NetBSD Foundation, Inc.
2c243e490SMarcel Moolenaar  * All rights reserved.
3c243e490SMarcel Moolenaar  *
4c243e490SMarcel Moolenaar  * Redistribution and use in source and binary forms, with or without
5c243e490SMarcel Moolenaar  * modification, are permitted provided that the following conditions
6c243e490SMarcel Moolenaar  * are met:
7c243e490SMarcel Moolenaar  * 1. Redistributions of source code must retain the above copyright
8c243e490SMarcel Moolenaar  *    notice, this list of conditions and the following disclaimer.
9c243e490SMarcel Moolenaar  * 2. Redistributions in binary form must reproduce the above copyright
10c243e490SMarcel Moolenaar  *    notice, this list of conditions and the following disclaimer in the
11c243e490SMarcel Moolenaar  *    documentation and/or other materials provided with the distribution.
12c243e490SMarcel Moolenaar  *
13c243e490SMarcel Moolenaar  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
14c243e490SMarcel Moolenaar  * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
15c243e490SMarcel Moolenaar  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16c243e490SMarcel Moolenaar  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17c243e490SMarcel Moolenaar  * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
18c243e490SMarcel Moolenaar  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19c243e490SMarcel Moolenaar  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
20c243e490SMarcel Moolenaar  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21c243e490SMarcel Moolenaar  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22c243e490SMarcel Moolenaar  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23c243e490SMarcel Moolenaar  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
240677dfd1SJulio Merino  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */
250677dfd1SJulio Merino 
260677dfd1SJulio Merino #include "atf-c/detail/fs.h"
27c243e490SMarcel Moolenaar 
28c243e490SMarcel Moolenaar #include <sys/types.h>
29c243e490SMarcel Moolenaar #include <sys/stat.h>
30c243e490SMarcel Moolenaar 
31c243e490SMarcel Moolenaar #include <errno.h>
32c243e490SMarcel Moolenaar #include <fcntl.h>
33c243e490SMarcel Moolenaar #include <stdio.h>
34c243e490SMarcel Moolenaar #include <stdlib.h>
35c243e490SMarcel Moolenaar #include <string.h>
36c243e490SMarcel Moolenaar #include <unistd.h>
37c243e490SMarcel Moolenaar 
38c243e490SMarcel Moolenaar #include <atf-c.h>
39c243e490SMarcel Moolenaar 
400677dfd1SJulio Merino #include "atf-c/detail/test_helpers.h"
410677dfd1SJulio Merino #include "atf-c/detail/user.h"
42c243e490SMarcel Moolenaar 
43c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
44c243e490SMarcel Moolenaar  * Auxiliary functions.
45c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
46c243e490SMarcel Moolenaar 
47c243e490SMarcel Moolenaar static
48c243e490SMarcel Moolenaar void
create_dir(const char * p,int mode)49c243e490SMarcel Moolenaar create_dir(const char *p, int mode)
50c243e490SMarcel Moolenaar {
51c243e490SMarcel Moolenaar     int ret;
52c243e490SMarcel Moolenaar 
53c243e490SMarcel Moolenaar     ret = mkdir(p, mode);
54c243e490SMarcel Moolenaar     if (ret == -1)
55c243e490SMarcel Moolenaar         atf_tc_fail("Could not create helper directory %s", p);
56c243e490SMarcel Moolenaar }
57c243e490SMarcel Moolenaar 
58c243e490SMarcel Moolenaar static
59c243e490SMarcel Moolenaar void
create_file(const char * p,int mode)60c243e490SMarcel Moolenaar create_file(const char *p, int mode)
61c243e490SMarcel Moolenaar {
62c243e490SMarcel Moolenaar     int fd;
63c243e490SMarcel Moolenaar 
64c243e490SMarcel Moolenaar     fd = open(p, O_CREAT | O_WRONLY | O_TRUNC, mode);
65c243e490SMarcel Moolenaar     if (fd == -1)
66c243e490SMarcel Moolenaar         atf_tc_fail("Could not create helper file %s", p);
67c243e490SMarcel Moolenaar     close(fd);
68c243e490SMarcel Moolenaar }
69c243e490SMarcel Moolenaar 
70c243e490SMarcel Moolenaar static
71c243e490SMarcel Moolenaar bool
exists(const atf_fs_path_t * p)72c243e490SMarcel Moolenaar exists(const atf_fs_path_t *p)
73c243e490SMarcel Moolenaar {
74c243e490SMarcel Moolenaar     return access(atf_fs_path_cstring(p), F_OK) == 0;
75c243e490SMarcel Moolenaar }
76c243e490SMarcel Moolenaar 
77c243e490SMarcel Moolenaar static
78c243e490SMarcel Moolenaar atf_error_t
mkstemp_discard_fd(atf_fs_path_t * p)79c243e490SMarcel Moolenaar mkstemp_discard_fd(atf_fs_path_t *p)
80c243e490SMarcel Moolenaar {
81c243e490SMarcel Moolenaar     int fd;
82c243e490SMarcel Moolenaar     atf_error_t err = atf_fs_mkstemp(p, &fd);
83c243e490SMarcel Moolenaar     if (!atf_is_error(err))
84c243e490SMarcel Moolenaar         close(fd);
85c243e490SMarcel Moolenaar     return err;
86c243e490SMarcel Moolenaar }
87c243e490SMarcel Moolenaar 
88c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
89c243e490SMarcel Moolenaar  * Test cases for the "atf_fs_path" type.
90c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
91c243e490SMarcel Moolenaar 
92c243e490SMarcel Moolenaar ATF_TC(path_normalize);
ATF_TC_HEAD(path_normalize,tc)93c243e490SMarcel Moolenaar ATF_TC_HEAD(path_normalize, tc)
94c243e490SMarcel Moolenaar {
95c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the path's normalization");
96c243e490SMarcel Moolenaar }
ATF_TC_BODY(path_normalize,tc)97c243e490SMarcel Moolenaar ATF_TC_BODY(path_normalize, tc)
98c243e490SMarcel Moolenaar {
99c243e490SMarcel Moolenaar     struct test {
100c243e490SMarcel Moolenaar         const char *in;
101c243e490SMarcel Moolenaar         const char *out;
102c243e490SMarcel Moolenaar     } tests[] = {
103c243e490SMarcel Moolenaar         { ".", ".", },
104c243e490SMarcel Moolenaar         { "..", "..", },
105c243e490SMarcel Moolenaar 
106c243e490SMarcel Moolenaar         { "/", "/", },
107c243e490SMarcel Moolenaar         { "//", "/", }, /* NO_CHECK_STYLE */
108c243e490SMarcel Moolenaar         { "///", "/", }, /* NO_CHECK_STYLE */
109c243e490SMarcel Moolenaar 
110c243e490SMarcel Moolenaar         { "foo", "foo", },
111c243e490SMarcel Moolenaar         { "foo/", "foo", },
112c243e490SMarcel Moolenaar         { "foo/bar", "foo/bar", },
113c243e490SMarcel Moolenaar         { "foo/bar/", "foo/bar", },
114c243e490SMarcel Moolenaar 
115c243e490SMarcel Moolenaar         { "/foo", "/foo", },
116c243e490SMarcel Moolenaar         { "/foo/bar", "/foo/bar", },
117c243e490SMarcel Moolenaar         { "/foo/bar/", "/foo/bar", },
118c243e490SMarcel Moolenaar 
119c243e490SMarcel Moolenaar         { "///foo", "/foo", }, /* NO_CHECK_STYLE */
120c243e490SMarcel Moolenaar         { "///foo///bar", "/foo/bar", }, /* NO_CHECK_STYLE */
121c243e490SMarcel Moolenaar         { "///foo///bar///", "/foo/bar", }, /* NO_CHECK_STYLE */
122c243e490SMarcel Moolenaar 
123c243e490SMarcel Moolenaar         { NULL, NULL }
124c243e490SMarcel Moolenaar     };
125c243e490SMarcel Moolenaar     struct test *t;
126c243e490SMarcel Moolenaar 
127c243e490SMarcel Moolenaar     for (t = &tests[0]; t->in != NULL; t++) {
128c243e490SMarcel Moolenaar         atf_fs_path_t p;
129c243e490SMarcel Moolenaar 
130c243e490SMarcel Moolenaar         printf("Input          : >%s<\n", t->in);
131c243e490SMarcel Moolenaar         printf("Expected output: >%s<\n", t->out);
132c243e490SMarcel Moolenaar 
133c243e490SMarcel Moolenaar         RE(atf_fs_path_init_fmt(&p, "%s", t->in));
134c243e490SMarcel Moolenaar         printf("Output         : >%s<\n", atf_fs_path_cstring(&p));
135c243e490SMarcel Moolenaar         ATF_REQUIRE(strcmp(atf_fs_path_cstring(&p), t->out) == 0);
136c243e490SMarcel Moolenaar         atf_fs_path_fini(&p);
137c243e490SMarcel Moolenaar 
138c243e490SMarcel Moolenaar         printf("\n");
139c243e490SMarcel Moolenaar     }
140c243e490SMarcel Moolenaar }
141c243e490SMarcel Moolenaar 
142c243e490SMarcel Moolenaar ATF_TC(path_copy);
ATF_TC_HEAD(path_copy,tc)143c243e490SMarcel Moolenaar ATF_TC_HEAD(path_copy, tc)
144c243e490SMarcel Moolenaar {
145c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_path_copy constructor");
146c243e490SMarcel Moolenaar }
ATF_TC_BODY(path_copy,tc)147c243e490SMarcel Moolenaar ATF_TC_BODY(path_copy, tc)
148c243e490SMarcel Moolenaar {
149c243e490SMarcel Moolenaar     atf_fs_path_t str, str2;
150c243e490SMarcel Moolenaar 
151c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&str, "foo"));
152c243e490SMarcel Moolenaar     RE(atf_fs_path_copy(&str2, &str));
153c243e490SMarcel Moolenaar 
154c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_equal_fs_path_fs_path(&str, &str2));
155c243e490SMarcel Moolenaar 
156c243e490SMarcel Moolenaar     RE(atf_fs_path_append_fmt(&str2, "bar"));
157c243e490SMarcel Moolenaar 
158c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_equal_fs_path_fs_path(&str, &str2));
159c243e490SMarcel Moolenaar 
160c243e490SMarcel Moolenaar     atf_fs_path_fini(&str2);
161c243e490SMarcel Moolenaar     atf_fs_path_fini(&str);
162c243e490SMarcel Moolenaar }
163c243e490SMarcel Moolenaar 
164c243e490SMarcel Moolenaar ATF_TC(path_is_absolute);
ATF_TC_HEAD(path_is_absolute,tc)165c243e490SMarcel Moolenaar ATF_TC_HEAD(path_is_absolute, tc)
166c243e490SMarcel Moolenaar {
167c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the path::is_absolute function");
168c243e490SMarcel Moolenaar }
ATF_TC_BODY(path_is_absolute,tc)169c243e490SMarcel Moolenaar ATF_TC_BODY(path_is_absolute, tc)
170c243e490SMarcel Moolenaar {
171c243e490SMarcel Moolenaar     struct test {
172c243e490SMarcel Moolenaar         const char *in;
173c243e490SMarcel Moolenaar         bool abs;
174c243e490SMarcel Moolenaar     } tests[] = {
175c243e490SMarcel Moolenaar         { "/", true },
176c243e490SMarcel Moolenaar         { "////", true }, /* NO_CHECK_STYLE */
177c243e490SMarcel Moolenaar         { "////a", true }, /* NO_CHECK_STYLE */
178c243e490SMarcel Moolenaar         { "//a//", true }, /* NO_CHECK_STYLE */
179c243e490SMarcel Moolenaar         { "a////", false }, /* NO_CHECK_STYLE */
180c243e490SMarcel Moolenaar         { "../foo", false },
181c243e490SMarcel Moolenaar         { NULL, false },
182c243e490SMarcel Moolenaar     };
183c243e490SMarcel Moolenaar     struct test *t;
184c243e490SMarcel Moolenaar 
185c243e490SMarcel Moolenaar     for (t = &tests[0]; t->in != NULL; t++) {
186c243e490SMarcel Moolenaar         atf_fs_path_t p;
187c243e490SMarcel Moolenaar 
188c243e490SMarcel Moolenaar         printf("Input          : %s\n", t->in);
189c243e490SMarcel Moolenaar         printf("Expected result: %s\n", t->abs ? "true" : "false");
190c243e490SMarcel Moolenaar 
191c243e490SMarcel Moolenaar         RE(atf_fs_path_init_fmt(&p, "%s", t->in));
192c243e490SMarcel Moolenaar         printf("Result         : %s\n",
193c243e490SMarcel Moolenaar                atf_fs_path_is_absolute(&p) ? "true" : "false");
194c243e490SMarcel Moolenaar         if (t->abs)
195c243e490SMarcel Moolenaar             ATF_REQUIRE(atf_fs_path_is_absolute(&p));
196c243e490SMarcel Moolenaar         else
197c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf_fs_path_is_absolute(&p));
198c243e490SMarcel Moolenaar         atf_fs_path_fini(&p);
199c243e490SMarcel Moolenaar 
200c243e490SMarcel Moolenaar         printf("\n");
201c243e490SMarcel Moolenaar     }
202c243e490SMarcel Moolenaar }
203c243e490SMarcel Moolenaar 
204c243e490SMarcel Moolenaar ATF_TC(path_is_root);
ATF_TC_HEAD(path_is_root,tc)205c243e490SMarcel Moolenaar ATF_TC_HEAD(path_is_root, tc)
206c243e490SMarcel Moolenaar {
207c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the path::is_root function");
208c243e490SMarcel Moolenaar }
ATF_TC_BODY(path_is_root,tc)209c243e490SMarcel Moolenaar ATF_TC_BODY(path_is_root, tc)
210c243e490SMarcel Moolenaar {
211c243e490SMarcel Moolenaar     struct test {
212c243e490SMarcel Moolenaar         const char *in;
213c243e490SMarcel Moolenaar         bool root;
214c243e490SMarcel Moolenaar     } tests[] = {
215c243e490SMarcel Moolenaar         { "/", true },
216c243e490SMarcel Moolenaar         { "////", true }, /* NO_CHECK_STYLE */
217c243e490SMarcel Moolenaar         { "////a", false }, /* NO_CHECK_STYLE */
218c243e490SMarcel Moolenaar         { "//a//", false }, /* NO_CHECK_STYLE */
219c243e490SMarcel Moolenaar         { "a////", false }, /* NO_CHECK_STYLE */
220c243e490SMarcel Moolenaar         { "../foo", false },
221c243e490SMarcel Moolenaar         { NULL, false },
222c243e490SMarcel Moolenaar     };
223c243e490SMarcel Moolenaar     struct test *t;
224c243e490SMarcel Moolenaar 
225c243e490SMarcel Moolenaar     for (t = &tests[0]; t->in != NULL; t++) {
226c243e490SMarcel Moolenaar         atf_fs_path_t p;
227c243e490SMarcel Moolenaar 
228c243e490SMarcel Moolenaar         printf("Input          : %s\n", t->in);
229c243e490SMarcel Moolenaar         printf("Expected result: %s\n", t->root ? "true" : "false");
230c243e490SMarcel Moolenaar 
231c243e490SMarcel Moolenaar         RE(atf_fs_path_init_fmt(&p, "%s", t->in));
232c243e490SMarcel Moolenaar         printf("Result         : %s\n",
233c243e490SMarcel Moolenaar                atf_fs_path_is_root(&p) ? "true" : "false");
234c243e490SMarcel Moolenaar         if (t->root)
235c243e490SMarcel Moolenaar             ATF_REQUIRE(atf_fs_path_is_root(&p));
236c243e490SMarcel Moolenaar         else
237c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf_fs_path_is_root(&p));
238c243e490SMarcel Moolenaar         atf_fs_path_fini(&p);
239c243e490SMarcel Moolenaar 
240c243e490SMarcel Moolenaar         printf("\n");
241c243e490SMarcel Moolenaar     }
242c243e490SMarcel Moolenaar }
243c243e490SMarcel Moolenaar 
244c243e490SMarcel Moolenaar ATF_TC(path_branch_path);
ATF_TC_HEAD(path_branch_path,tc)245c243e490SMarcel Moolenaar ATF_TC_HEAD(path_branch_path, tc)
246c243e490SMarcel Moolenaar {
247c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_path_branch_path "
248c243e490SMarcel Moolenaar                       "function");
249c243e490SMarcel Moolenaar }
ATF_TC_BODY(path_branch_path,tc)250c243e490SMarcel Moolenaar ATF_TC_BODY(path_branch_path, tc)
251c243e490SMarcel Moolenaar {
252c243e490SMarcel Moolenaar     struct test {
253c243e490SMarcel Moolenaar         const char *in;
254c243e490SMarcel Moolenaar         const char *branch;
255c243e490SMarcel Moolenaar     } tests[] = {
256c243e490SMarcel Moolenaar         { ".", "." },
257c243e490SMarcel Moolenaar         { "foo", "." },
258c243e490SMarcel Moolenaar         { "foo/bar", "foo" },
259c243e490SMarcel Moolenaar         { "/foo", "/" },
260c243e490SMarcel Moolenaar         { "/foo/bar", "/foo" },
261c243e490SMarcel Moolenaar         { NULL, NULL },
262c243e490SMarcel Moolenaar     };
263c243e490SMarcel Moolenaar     struct test *t;
264c243e490SMarcel Moolenaar 
265c243e490SMarcel Moolenaar     for (t = &tests[0]; t->in != NULL; t++) {
266c243e490SMarcel Moolenaar         atf_fs_path_t p, bp;
267c243e490SMarcel Moolenaar 
268c243e490SMarcel Moolenaar         printf("Input          : %s\n", t->in);
269c243e490SMarcel Moolenaar         printf("Expected output: %s\n", t->branch);
270c243e490SMarcel Moolenaar 
271c243e490SMarcel Moolenaar         RE(atf_fs_path_init_fmt(&p, "%s", t->in));
272c243e490SMarcel Moolenaar         RE(atf_fs_path_branch_path(&p, &bp));
273c243e490SMarcel Moolenaar         printf("Output         : %s\n", atf_fs_path_cstring(&bp));
274c243e490SMarcel Moolenaar         ATF_REQUIRE(strcmp(atf_fs_path_cstring(&bp), t->branch) == 0);
275c243e490SMarcel Moolenaar         atf_fs_path_fini(&bp);
276c243e490SMarcel Moolenaar         atf_fs_path_fini(&p);
277c243e490SMarcel Moolenaar 
278c243e490SMarcel Moolenaar         printf("\n");
279c243e490SMarcel Moolenaar     }
280c243e490SMarcel Moolenaar }
281c243e490SMarcel Moolenaar 
282c243e490SMarcel Moolenaar ATF_TC(path_leaf_name);
ATF_TC_HEAD(path_leaf_name,tc)283c243e490SMarcel Moolenaar ATF_TC_HEAD(path_leaf_name, tc)
284c243e490SMarcel Moolenaar {
285c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_path_leaf_name "
286c243e490SMarcel Moolenaar                       "function");
287c243e490SMarcel Moolenaar }
ATF_TC_BODY(path_leaf_name,tc)288c243e490SMarcel Moolenaar ATF_TC_BODY(path_leaf_name, tc)
289c243e490SMarcel Moolenaar {
290c243e490SMarcel Moolenaar     struct test {
291c243e490SMarcel Moolenaar         const char *in;
292c243e490SMarcel Moolenaar         const char *leaf;
293c243e490SMarcel Moolenaar     } tests[] = {
294c243e490SMarcel Moolenaar         { ".", "." },
295c243e490SMarcel Moolenaar         { "foo", "foo" },
296c243e490SMarcel Moolenaar         { "foo/bar", "bar" },
297c243e490SMarcel Moolenaar         { "/foo", "foo" },
298c243e490SMarcel Moolenaar         { "/foo/bar", "bar" },
299c243e490SMarcel Moolenaar         { NULL, NULL },
300c243e490SMarcel Moolenaar     };
301c243e490SMarcel Moolenaar     struct test *t;
302c243e490SMarcel Moolenaar 
303c243e490SMarcel Moolenaar     for (t = &tests[0]; t->in != NULL; t++) {
304c243e490SMarcel Moolenaar         atf_fs_path_t p;
305c243e490SMarcel Moolenaar         atf_dynstr_t ln;
306c243e490SMarcel Moolenaar 
307c243e490SMarcel Moolenaar         printf("Input          : %s\n", t->in);
308c243e490SMarcel Moolenaar         printf("Expected output: %s\n", t->leaf);
309c243e490SMarcel Moolenaar 
310c243e490SMarcel Moolenaar         RE(atf_fs_path_init_fmt(&p, "%s", t->in));
311c243e490SMarcel Moolenaar         RE(atf_fs_path_leaf_name(&p, &ln));
312c243e490SMarcel Moolenaar         printf("Output         : %s\n", atf_dynstr_cstring(&ln));
313c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_equal_dynstr_cstring(&ln, t->leaf));
314c243e490SMarcel Moolenaar         atf_dynstr_fini(&ln);
315c243e490SMarcel Moolenaar         atf_fs_path_fini(&p);
316c243e490SMarcel Moolenaar 
317c243e490SMarcel Moolenaar         printf("\n");
318c243e490SMarcel Moolenaar     }
319c243e490SMarcel Moolenaar }
320c243e490SMarcel Moolenaar 
321c243e490SMarcel Moolenaar ATF_TC(path_append);
ATF_TC_HEAD(path_append,tc)322c243e490SMarcel Moolenaar ATF_TC_HEAD(path_append, tc)
323c243e490SMarcel Moolenaar {
324c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the concatenation of multiple "
325c243e490SMarcel Moolenaar                       "paths");
326c243e490SMarcel Moolenaar }
ATF_TC_BODY(path_append,tc)327c243e490SMarcel Moolenaar ATF_TC_BODY(path_append, tc)
328c243e490SMarcel Moolenaar {
329c243e490SMarcel Moolenaar     struct test {
330c243e490SMarcel Moolenaar         const char *in;
331c243e490SMarcel Moolenaar         const char *ap;
332c243e490SMarcel Moolenaar         const char *out;
333c243e490SMarcel Moolenaar     } tests[] = {
334c243e490SMarcel Moolenaar         { "foo", "bar", "foo/bar" },
335c243e490SMarcel Moolenaar         { "foo/", "/bar", "foo/bar" },
336c243e490SMarcel Moolenaar         { "foo/", "/bar/baz", "foo/bar/baz" },
337c243e490SMarcel Moolenaar         { "foo/", "///bar///baz", "foo/bar/baz" }, /* NO_CHECK_STYLE */
338c243e490SMarcel Moolenaar 
339c243e490SMarcel Moolenaar         { NULL, NULL, NULL }
340c243e490SMarcel Moolenaar     };
341c243e490SMarcel Moolenaar     struct test *t;
342c243e490SMarcel Moolenaar 
343c243e490SMarcel Moolenaar     for (t = &tests[0]; t->in != NULL; t++) {
344c243e490SMarcel Moolenaar         atf_fs_path_t p;
345c243e490SMarcel Moolenaar 
346c243e490SMarcel Moolenaar         printf("Input          : >%s<\n", t->in);
347c243e490SMarcel Moolenaar         printf("Append         : >%s<\n", t->ap);
348c243e490SMarcel Moolenaar         printf("Expected output: >%s<\n", t->out);
349c243e490SMarcel Moolenaar 
350c243e490SMarcel Moolenaar         RE(atf_fs_path_init_fmt(&p, "%s", t->in));
351c243e490SMarcel Moolenaar 
352c243e490SMarcel Moolenaar         RE(atf_fs_path_append_fmt(&p, "%s", t->ap));
353c243e490SMarcel Moolenaar 
354c243e490SMarcel Moolenaar         printf("Output         : >%s<\n", atf_fs_path_cstring(&p));
355c243e490SMarcel Moolenaar         ATF_REQUIRE(strcmp(atf_fs_path_cstring(&p), t->out) == 0);
356c243e490SMarcel Moolenaar 
357c243e490SMarcel Moolenaar         atf_fs_path_fini(&p);
358c243e490SMarcel Moolenaar 
359c243e490SMarcel Moolenaar         printf("\n");
360c243e490SMarcel Moolenaar     }
361c243e490SMarcel Moolenaar }
362c243e490SMarcel Moolenaar 
363c243e490SMarcel Moolenaar ATF_TC(path_to_absolute);
ATF_TC_HEAD(path_to_absolute,tc)364c243e490SMarcel Moolenaar ATF_TC_HEAD(path_to_absolute, tc)
365c243e490SMarcel Moolenaar {
366c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_path_to_absolute "
367c243e490SMarcel Moolenaar                       "function");
368c243e490SMarcel Moolenaar }
ATF_TC_BODY(path_to_absolute,tc)369c243e490SMarcel Moolenaar ATF_TC_BODY(path_to_absolute, tc)
370c243e490SMarcel Moolenaar {
371c243e490SMarcel Moolenaar     const char *names[] = { ".", "dir", NULL };
372c243e490SMarcel Moolenaar     const char **n;
373c243e490SMarcel Moolenaar 
374c243e490SMarcel Moolenaar     ATF_REQUIRE(mkdir("dir", 0755) != -1);
375c243e490SMarcel Moolenaar 
376c243e490SMarcel Moolenaar     for (n = names; *n != NULL; n++) {
377c243e490SMarcel Moolenaar         atf_fs_path_t p, p2;
378c243e490SMarcel Moolenaar         atf_fs_stat_t st1, st2;
379c243e490SMarcel Moolenaar 
380c243e490SMarcel Moolenaar         RE(atf_fs_path_init_fmt(&p, "%s", *n));
381c243e490SMarcel Moolenaar         RE(atf_fs_stat_init(&st1, &p));
382c243e490SMarcel Moolenaar         printf("Relative path: %s\n", atf_fs_path_cstring(&p));
383c243e490SMarcel Moolenaar 
384c243e490SMarcel Moolenaar         RE(atf_fs_path_to_absolute(&p, &p2));
385c243e490SMarcel Moolenaar         printf("Absolute path: %s\n", atf_fs_path_cstring(&p2));
386c243e490SMarcel Moolenaar 
387c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_fs_path_is_absolute(&p2));
388c243e490SMarcel Moolenaar         RE(atf_fs_stat_init(&st2, &p2));
389c243e490SMarcel Moolenaar 
390c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(atf_fs_stat_get_device(&st1),
391c243e490SMarcel Moolenaar                         atf_fs_stat_get_device(&st2));
392c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(atf_fs_stat_get_inode(&st1),
393c243e490SMarcel Moolenaar                         atf_fs_stat_get_inode(&st2));
394c243e490SMarcel Moolenaar 
395c243e490SMarcel Moolenaar         atf_fs_stat_fini(&st2);
396c243e490SMarcel Moolenaar         atf_fs_stat_fini(&st1);
397c243e490SMarcel Moolenaar         atf_fs_path_fini(&p2);
398c243e490SMarcel Moolenaar         atf_fs_path_fini(&p);
399c243e490SMarcel Moolenaar 
400c243e490SMarcel Moolenaar         printf("\n");
401c243e490SMarcel Moolenaar     }
402c243e490SMarcel Moolenaar }
403c243e490SMarcel Moolenaar 
404c243e490SMarcel Moolenaar ATF_TC(path_equal);
ATF_TC_HEAD(path_equal,tc)405c243e490SMarcel Moolenaar ATF_TC_HEAD(path_equal, tc)
406c243e490SMarcel Moolenaar {
407c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the equality operators for paths");
408c243e490SMarcel Moolenaar }
ATF_TC_BODY(path_equal,tc)409c243e490SMarcel Moolenaar ATF_TC_BODY(path_equal, tc)
410c243e490SMarcel Moolenaar {
411c243e490SMarcel Moolenaar     atf_fs_path_t p1, p2;
412c243e490SMarcel Moolenaar 
413c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p1, "foo"));
414c243e490SMarcel Moolenaar 
415c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p2, "foo"));
416c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_equal_fs_path_fs_path(&p1, &p2));
417c243e490SMarcel Moolenaar     atf_fs_path_fini(&p2);
418c243e490SMarcel Moolenaar 
419c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p2, "bar"));
420c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_equal_fs_path_fs_path(&p1, &p2));
421c243e490SMarcel Moolenaar     atf_fs_path_fini(&p2);
422c243e490SMarcel Moolenaar 
423c243e490SMarcel Moolenaar     atf_fs_path_fini(&p1);
424c243e490SMarcel Moolenaar }
425c243e490SMarcel Moolenaar 
426c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
427c243e490SMarcel Moolenaar  * Test cases for the "atf_fs_stat" type.
428c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
429c243e490SMarcel Moolenaar 
430c243e490SMarcel Moolenaar ATF_TC(stat_mode);
ATF_TC_HEAD(stat_mode,tc)431c243e490SMarcel Moolenaar ATF_TC_HEAD(stat_mode, tc)
432c243e490SMarcel Moolenaar {
433c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_stat_get_mode function "
434c243e490SMarcel Moolenaar                       "and, indirectly, the constructor");
435c243e490SMarcel Moolenaar }
ATF_TC_BODY(stat_mode,tc)436c243e490SMarcel Moolenaar ATF_TC_BODY(stat_mode, tc)
437c243e490SMarcel Moolenaar {
438c243e490SMarcel Moolenaar     atf_fs_path_t p;
439c243e490SMarcel Moolenaar     atf_fs_stat_t st;
440c243e490SMarcel Moolenaar 
441c243e490SMarcel Moolenaar     create_file("f1", 0400);
442c243e490SMarcel Moolenaar     create_file("f2", 0644);
443c243e490SMarcel Moolenaar 
444c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p, "f1"));
445c243e490SMarcel Moolenaar     RE(atf_fs_stat_init(&st, &p));
446c243e490SMarcel Moolenaar     ATF_CHECK_EQ(0400, atf_fs_stat_get_mode(&st));
447c243e490SMarcel Moolenaar     atf_fs_stat_fini(&st);
448c243e490SMarcel Moolenaar     atf_fs_path_fini(&p);
449c243e490SMarcel Moolenaar 
450c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p, "f2"));
451c243e490SMarcel Moolenaar     RE(atf_fs_stat_init(&st, &p));
452c243e490SMarcel Moolenaar     ATF_CHECK_EQ(0644, atf_fs_stat_get_mode(&st));
453c243e490SMarcel Moolenaar     atf_fs_stat_fini(&st);
454c243e490SMarcel Moolenaar     atf_fs_path_fini(&p);
455c243e490SMarcel Moolenaar }
456c243e490SMarcel Moolenaar 
457c243e490SMarcel Moolenaar ATF_TC(stat_type);
ATF_TC_HEAD(stat_type,tc)458c243e490SMarcel Moolenaar ATF_TC_HEAD(stat_type, tc)
459c243e490SMarcel Moolenaar {
460c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_stat_get_type function "
461c243e490SMarcel Moolenaar                       "and, indirectly, the constructor");
462c243e490SMarcel Moolenaar }
ATF_TC_BODY(stat_type,tc)463c243e490SMarcel Moolenaar ATF_TC_BODY(stat_type, tc)
464c243e490SMarcel Moolenaar {
465c243e490SMarcel Moolenaar     atf_fs_path_t p;
466c243e490SMarcel Moolenaar     atf_fs_stat_t st;
467c243e490SMarcel Moolenaar 
468c243e490SMarcel Moolenaar     create_dir("dir", 0755);
469c243e490SMarcel Moolenaar     create_file("reg", 0644);
470c243e490SMarcel Moolenaar 
471c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p, "dir"));
472c243e490SMarcel Moolenaar     RE(atf_fs_stat_init(&st, &p));
473c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(atf_fs_stat_get_type(&st), atf_fs_stat_dir_type);
474c243e490SMarcel Moolenaar     atf_fs_stat_fini(&st);
475c243e490SMarcel Moolenaar     atf_fs_path_fini(&p);
476c243e490SMarcel Moolenaar 
477c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p, "reg"));
478c243e490SMarcel Moolenaar     RE(atf_fs_stat_init(&st, &p));
479c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(atf_fs_stat_get_type(&st), atf_fs_stat_reg_type);
480c243e490SMarcel Moolenaar     atf_fs_stat_fini(&st);
481c243e490SMarcel Moolenaar     atf_fs_path_fini(&p);
482c243e490SMarcel Moolenaar }
483c243e490SMarcel Moolenaar 
484c243e490SMarcel Moolenaar ATF_TC(stat_perms);
ATF_TC_HEAD(stat_perms,tc)485c243e490SMarcel Moolenaar ATF_TC_HEAD(stat_perms, tc)
486c243e490SMarcel Moolenaar {
487c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_stat_is_* functions");
488c243e490SMarcel Moolenaar }
ATF_TC_BODY(stat_perms,tc)489c243e490SMarcel Moolenaar ATF_TC_BODY(stat_perms, tc)
490c243e490SMarcel Moolenaar {
491c243e490SMarcel Moolenaar     atf_fs_path_t p;
492c243e490SMarcel Moolenaar     atf_fs_stat_t st;
493c243e490SMarcel Moolenaar 
494c243e490SMarcel Moolenaar     create_file("reg", 0);
495c243e490SMarcel Moolenaar 
496c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p, "reg"));
497c243e490SMarcel Moolenaar 
498c243e490SMarcel Moolenaar #define perms(ur, uw, ux, gr, gw, gx, othr, othw, othx) \
499c243e490SMarcel Moolenaar     { \
500c243e490SMarcel Moolenaar         RE(atf_fs_stat_init(&st, &p)); \
501c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_fs_stat_is_owner_readable(&st) == ur); \
502c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_fs_stat_is_owner_writable(&st) == uw); \
503c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_fs_stat_is_owner_executable(&st) == ux); \
504c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_fs_stat_is_group_readable(&st) == gr); \
505c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_fs_stat_is_group_writable(&st) == gw); \
506c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_fs_stat_is_group_executable(&st) == gx); \
507c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_fs_stat_is_other_readable(&st) == othr); \
508c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_fs_stat_is_other_writable(&st) == othw); \
509c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_fs_stat_is_other_executable(&st) == othx); \
510c243e490SMarcel Moolenaar         atf_fs_stat_fini(&st); \
511c243e490SMarcel Moolenaar     }
512c243e490SMarcel Moolenaar 
513c243e490SMarcel Moolenaar     chmod("reg", 0000);
514c243e490SMarcel Moolenaar     perms(false, false, false, false, false, false, false, false, false);
515c243e490SMarcel Moolenaar 
516c243e490SMarcel Moolenaar     chmod("reg", 0001);
517c243e490SMarcel Moolenaar     perms(false, false, false, false, false, false, false, false, true);
518c243e490SMarcel Moolenaar 
519c243e490SMarcel Moolenaar     chmod("reg", 0010);
520c243e490SMarcel Moolenaar     perms(false, false, false, false, false, true, false, false, false);
521c243e490SMarcel Moolenaar 
522c243e490SMarcel Moolenaar     chmod("reg", 0100);
523c243e490SMarcel Moolenaar     perms(false, false, true, false, false, false, false, false, false);
524c243e490SMarcel Moolenaar 
525c243e490SMarcel Moolenaar     chmod("reg", 0002);
526c243e490SMarcel Moolenaar     perms(false, false, false, false, false, false, false, true, false);
527c243e490SMarcel Moolenaar 
528c243e490SMarcel Moolenaar     chmod("reg", 0020);
529c243e490SMarcel Moolenaar     perms(false, false, false, false, true, false, false, false, false);
530c243e490SMarcel Moolenaar 
531c243e490SMarcel Moolenaar     chmod("reg", 0200);
532c243e490SMarcel Moolenaar     perms(false, true, false, false, false, false, false, false, false);
533c243e490SMarcel Moolenaar 
534c243e490SMarcel Moolenaar     chmod("reg", 0004);
535c243e490SMarcel Moolenaar     perms(false, false, false, false, false, false, true, false, false);
536c243e490SMarcel Moolenaar 
537c243e490SMarcel Moolenaar     chmod("reg", 0040);
538c243e490SMarcel Moolenaar     perms(false, false, false, true, false, false, false, false, false);
539c243e490SMarcel Moolenaar 
540c243e490SMarcel Moolenaar     chmod("reg", 0400);
541c243e490SMarcel Moolenaar     perms(true, false, false, false, false, false, false, false, false);
542c243e490SMarcel Moolenaar 
543c243e490SMarcel Moolenaar     chmod("reg", 0644);
544c243e490SMarcel Moolenaar     perms(true, true, false, true, false, false, true, false, false);
545c243e490SMarcel Moolenaar 
546c243e490SMarcel Moolenaar     chmod("reg", 0755);
547c243e490SMarcel Moolenaar     perms(true, true, true, true, false, true, true, false, true);
548c243e490SMarcel Moolenaar 
549c243e490SMarcel Moolenaar     chmod("reg", 0777);
550c243e490SMarcel Moolenaar     perms(true, true, true, true, true, true, true, true, true);
551c243e490SMarcel Moolenaar 
552c243e490SMarcel Moolenaar #undef perms
553c243e490SMarcel Moolenaar 
554c243e490SMarcel Moolenaar     atf_fs_path_fini(&p);
555c243e490SMarcel Moolenaar }
556c243e490SMarcel Moolenaar 
557c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
558c243e490SMarcel Moolenaar  * Test cases for the free functions.
559c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
560c243e490SMarcel Moolenaar 
561c243e490SMarcel Moolenaar ATF_TC(exists);
ATF_TC_HEAD(exists,tc)562c243e490SMarcel Moolenaar ATF_TC_HEAD(exists, tc)
563c243e490SMarcel Moolenaar {
564c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_exists function");
565c243e490SMarcel Moolenaar }
ATF_TC_BODY(exists,tc)566c243e490SMarcel Moolenaar ATF_TC_BODY(exists, tc)
567c243e490SMarcel Moolenaar {
568c243e490SMarcel Moolenaar     atf_error_t err;
569c243e490SMarcel Moolenaar     atf_fs_path_t pdir, pfile;
570c243e490SMarcel Moolenaar     bool b;
571c243e490SMarcel Moolenaar 
572c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&pdir, "dir"));
573c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&pfile, "dir/file"));
574c243e490SMarcel Moolenaar 
575c243e490SMarcel Moolenaar     create_dir(atf_fs_path_cstring(&pdir), 0755);
576c243e490SMarcel Moolenaar     create_file(atf_fs_path_cstring(&pfile), 0644);
577c243e490SMarcel Moolenaar 
578c243e490SMarcel Moolenaar     printf("Checking existence of a directory\n");
579c243e490SMarcel Moolenaar     RE(atf_fs_exists(&pdir, &b));
580c243e490SMarcel Moolenaar     ATF_REQUIRE(b);
581c243e490SMarcel Moolenaar 
582c243e490SMarcel Moolenaar     printf("Checking existence of a file\n");
583c243e490SMarcel Moolenaar     RE(atf_fs_exists(&pfile, &b));
584c243e490SMarcel Moolenaar     ATF_REQUIRE(b);
585c243e490SMarcel Moolenaar 
586c243e490SMarcel Moolenaar     /* XXX: This should probably be a separate test case to let the user
587c243e490SMarcel Moolenaar      * be aware that some tests were skipped because privileges were not
588c243e490SMarcel Moolenaar      * correct. */
589c243e490SMarcel Moolenaar     if (!atf_user_is_root()) {
590c243e490SMarcel Moolenaar         printf("Checking existence of a file inside a directory without "
591c243e490SMarcel Moolenaar                "permissions\n");
592c243e490SMarcel Moolenaar         ATF_REQUIRE(chmod(atf_fs_path_cstring(&pdir), 0000) != -1);
593c243e490SMarcel Moolenaar         err = atf_fs_exists(&pfile, &b);
594c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_is_error(err));
595c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_error_is(err, "libc"));
596c243e490SMarcel Moolenaar         ATF_REQUIRE(chmod(atf_fs_path_cstring(&pdir), 0755) != -1);
597c243e490SMarcel Moolenaar         atf_error_free(err);
598c243e490SMarcel Moolenaar     }
599c243e490SMarcel Moolenaar 
600c243e490SMarcel Moolenaar     printf("Checking existence of a non-existent file\n");
601c243e490SMarcel Moolenaar     ATF_REQUIRE(unlink(atf_fs_path_cstring(&pfile)) != -1);
602c243e490SMarcel Moolenaar     RE(atf_fs_exists(&pfile, &b));
603c243e490SMarcel Moolenaar     ATF_REQUIRE(!b);
604c243e490SMarcel Moolenaar 
605c243e490SMarcel Moolenaar     atf_fs_path_fini(&pfile);
606c243e490SMarcel Moolenaar     atf_fs_path_fini(&pdir);
607c243e490SMarcel Moolenaar }
608c243e490SMarcel Moolenaar 
609c243e490SMarcel Moolenaar ATF_TC(eaccess);
ATF_TC_HEAD(eaccess,tc)610c243e490SMarcel Moolenaar ATF_TC_HEAD(eaccess, tc)
611c243e490SMarcel Moolenaar {
612c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_eaccess function");
613c243e490SMarcel Moolenaar }
ATF_TC_BODY(eaccess,tc)614c243e490SMarcel Moolenaar ATF_TC_BODY(eaccess, tc)
615c243e490SMarcel Moolenaar {
616c243e490SMarcel Moolenaar     const int modes[] = { atf_fs_access_f, atf_fs_access_r, atf_fs_access_w,
617c243e490SMarcel Moolenaar                           atf_fs_access_x, 0 };
618c243e490SMarcel Moolenaar     const int *m;
619c243e490SMarcel Moolenaar     struct tests {
620c243e490SMarcel Moolenaar         mode_t fmode;
621c243e490SMarcel Moolenaar         int amode;
622c243e490SMarcel Moolenaar         int uerror;
623c243e490SMarcel Moolenaar         int rerror;
624c243e490SMarcel Moolenaar     } tests[] = {
625c243e490SMarcel Moolenaar         { 0000, atf_fs_access_r, EACCES, 0 },
626c243e490SMarcel Moolenaar         { 0000, atf_fs_access_w, EACCES, 0 },
627c243e490SMarcel Moolenaar         { 0000, atf_fs_access_x, EACCES, EACCES },
628c243e490SMarcel Moolenaar 
629c243e490SMarcel Moolenaar         { 0001, atf_fs_access_r, EACCES, 0 },
630c243e490SMarcel Moolenaar         { 0001, atf_fs_access_w, EACCES, 0 },
631c243e490SMarcel Moolenaar         { 0001, atf_fs_access_x, EACCES, 0 },
632c243e490SMarcel Moolenaar         { 0002, atf_fs_access_r, EACCES, 0 },
633c243e490SMarcel Moolenaar         { 0002, atf_fs_access_w, EACCES, 0 },
634c243e490SMarcel Moolenaar         { 0002, atf_fs_access_x, EACCES, EACCES },
635c243e490SMarcel Moolenaar         { 0004, atf_fs_access_r, EACCES, 0 },
636c243e490SMarcel Moolenaar         { 0004, atf_fs_access_w, EACCES, 0 },
637c243e490SMarcel Moolenaar         { 0004, atf_fs_access_x, EACCES, EACCES },
638c243e490SMarcel Moolenaar 
639c243e490SMarcel Moolenaar         { 0010, atf_fs_access_r, EACCES, 0 },
640c243e490SMarcel Moolenaar         { 0010, atf_fs_access_w, EACCES, 0 },
641c243e490SMarcel Moolenaar         { 0010, atf_fs_access_x, 0,      0 },
642c243e490SMarcel Moolenaar         { 0020, atf_fs_access_r, EACCES, 0 },
643c243e490SMarcel Moolenaar         { 0020, atf_fs_access_w, 0,      0 },
644c243e490SMarcel Moolenaar         { 0020, atf_fs_access_x, EACCES, EACCES },
645c243e490SMarcel Moolenaar         { 0040, atf_fs_access_r, 0,      0 },
646c243e490SMarcel Moolenaar         { 0040, atf_fs_access_w, EACCES, 0 },
647c243e490SMarcel Moolenaar         { 0040, atf_fs_access_x, EACCES, EACCES },
648c243e490SMarcel Moolenaar 
649c243e490SMarcel Moolenaar         { 0100, atf_fs_access_r, EACCES, 0 },
650c243e490SMarcel Moolenaar         { 0100, atf_fs_access_w, EACCES, 0 },
651c243e490SMarcel Moolenaar         { 0100, atf_fs_access_x, 0,      0 },
652c243e490SMarcel Moolenaar         { 0200, atf_fs_access_r, EACCES, 0 },
653c243e490SMarcel Moolenaar         { 0200, atf_fs_access_w, 0,      0 },
654c243e490SMarcel Moolenaar         { 0200, atf_fs_access_x, EACCES, EACCES },
655c243e490SMarcel Moolenaar         { 0400, atf_fs_access_r, 0,      0 },
656c243e490SMarcel Moolenaar         { 0400, atf_fs_access_w, EACCES, 0 },
657c243e490SMarcel Moolenaar         { 0400, atf_fs_access_x, EACCES, EACCES },
658c243e490SMarcel Moolenaar 
659c243e490SMarcel Moolenaar         { 0, 0, 0, 0 }
660c243e490SMarcel Moolenaar     };
661c243e490SMarcel Moolenaar     struct tests *t;
662c243e490SMarcel Moolenaar     atf_fs_path_t p;
663c243e490SMarcel Moolenaar     atf_error_t err;
664c243e490SMarcel Moolenaar 
665c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p, "the-file"));
666c243e490SMarcel Moolenaar 
667c243e490SMarcel Moolenaar     printf("Non-existent file checks\n");
668c243e490SMarcel Moolenaar     for (m = &modes[0]; *m != 0; m++) {
669c243e490SMarcel Moolenaar         err = atf_fs_eaccess(&p, *m);
670c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_is_error(err));
671c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_error_is(err, "libc"));
672c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(atf_libc_error_code(err), ENOENT);
673c243e490SMarcel Moolenaar         atf_error_free(err);
674c243e490SMarcel Moolenaar     }
675c243e490SMarcel Moolenaar 
676c243e490SMarcel Moolenaar     create_file(atf_fs_path_cstring(&p), 0000);
677c243e490SMarcel Moolenaar     ATF_REQUIRE(chown(atf_fs_path_cstring(&p), geteuid(), getegid()) != -1);
678c243e490SMarcel Moolenaar 
679c243e490SMarcel Moolenaar     for (t = &tests[0]; t->amode != 0; t++) {
680c243e490SMarcel Moolenaar         const int experr = atf_user_is_root() ? t->rerror : t->uerror;
681c243e490SMarcel Moolenaar 
682c243e490SMarcel Moolenaar         printf("\n");
683c243e490SMarcel Moolenaar         printf("File mode     : %04o\n", (unsigned int)t->fmode);
684c243e490SMarcel Moolenaar         printf("Access mode   : 0x%02x\n", t->amode);
685c243e490SMarcel Moolenaar 
686c243e490SMarcel Moolenaar         ATF_REQUIRE(chmod(atf_fs_path_cstring(&p), t->fmode) != -1);
687c243e490SMarcel Moolenaar 
688c243e490SMarcel Moolenaar         /* First, existence check. */
689c243e490SMarcel Moolenaar         err = atf_fs_eaccess(&p, atf_fs_access_f);
690c243e490SMarcel Moolenaar         ATF_REQUIRE(!atf_is_error(err));
691c243e490SMarcel Moolenaar 
692c243e490SMarcel Moolenaar         /* Now do the specific test case. */
693c243e490SMarcel Moolenaar         printf("Expected error: %d\n", experr);
694c243e490SMarcel Moolenaar         err = atf_fs_eaccess(&p, t->amode);
695c243e490SMarcel Moolenaar         if (atf_is_error(err)) {
696c243e490SMarcel Moolenaar             if (atf_error_is(err, "libc"))
697c243e490SMarcel Moolenaar                 printf("Error         : %d\n", atf_libc_error_code(err));
698c243e490SMarcel Moolenaar             else
699c243e490SMarcel Moolenaar                 printf("Error         : Non-libc error\n");
700c243e490SMarcel Moolenaar         } else
701c243e490SMarcel Moolenaar                 printf("Error         : None\n");
702c243e490SMarcel Moolenaar         if (experr == 0) {
703c243e490SMarcel Moolenaar             ATF_REQUIRE(!atf_is_error(err));
704c243e490SMarcel Moolenaar         } else {
705c243e490SMarcel Moolenaar             ATF_REQUIRE(atf_is_error(err));
706c243e490SMarcel Moolenaar             ATF_REQUIRE(atf_error_is(err, "libc"));
707c243e490SMarcel Moolenaar             ATF_REQUIRE_EQ(atf_libc_error_code(err), experr);
708c243e490SMarcel Moolenaar             atf_error_free(err);
709c243e490SMarcel Moolenaar         }
710c243e490SMarcel Moolenaar     }
711c243e490SMarcel Moolenaar 
712c243e490SMarcel Moolenaar     atf_fs_path_fini(&p);
713c243e490SMarcel Moolenaar }
714c243e490SMarcel Moolenaar 
715c243e490SMarcel Moolenaar ATF_TC(getcwd);
ATF_TC_HEAD(getcwd,tc)716c243e490SMarcel Moolenaar ATF_TC_HEAD(getcwd, tc)
717c243e490SMarcel Moolenaar {
718c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_getcwd function");
719c243e490SMarcel Moolenaar }
ATF_TC_BODY(getcwd,tc)720c243e490SMarcel Moolenaar ATF_TC_BODY(getcwd, tc)
721c243e490SMarcel Moolenaar {
722c243e490SMarcel Moolenaar     atf_fs_path_t cwd1, cwd2;
723c243e490SMarcel Moolenaar 
724c243e490SMarcel Moolenaar     create_dir ("root", 0755);
725c243e490SMarcel Moolenaar 
726c243e490SMarcel Moolenaar     RE(atf_fs_getcwd(&cwd1));
727c243e490SMarcel Moolenaar     ATF_REQUIRE(chdir("root") != -1);
728c243e490SMarcel Moolenaar     RE(atf_fs_getcwd(&cwd2));
729c243e490SMarcel Moolenaar 
730c243e490SMarcel Moolenaar     RE(atf_fs_path_append_fmt(&cwd1, "root"));
731c243e490SMarcel Moolenaar 
732c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_equal_fs_path_fs_path(&cwd1, &cwd2));
733c243e490SMarcel Moolenaar 
734c243e490SMarcel Moolenaar     atf_fs_path_fini(&cwd2);
735c243e490SMarcel Moolenaar     atf_fs_path_fini(&cwd1);
736c243e490SMarcel Moolenaar }
737c243e490SMarcel Moolenaar 
738c243e490SMarcel Moolenaar ATF_TC(rmdir_empty);
ATF_TC_HEAD(rmdir_empty,tc)739c243e490SMarcel Moolenaar ATF_TC_HEAD(rmdir_empty, tc)
740c243e490SMarcel Moolenaar {
741c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_rmdir function");
742c243e490SMarcel Moolenaar }
ATF_TC_BODY(rmdir_empty,tc)743c243e490SMarcel Moolenaar ATF_TC_BODY(rmdir_empty, tc)
744c243e490SMarcel Moolenaar {
745c243e490SMarcel Moolenaar     atf_fs_path_t p;
746c243e490SMarcel Moolenaar 
747c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p, "test-dir"));
748c243e490SMarcel Moolenaar 
749c243e490SMarcel Moolenaar     ATF_REQUIRE(mkdir("test-dir", 0755) != -1);
750c243e490SMarcel Moolenaar     ATF_REQUIRE(exists(&p));
751c243e490SMarcel Moolenaar     RE(atf_fs_rmdir(&p));
752c243e490SMarcel Moolenaar     ATF_REQUIRE(!exists(&p));
753c243e490SMarcel Moolenaar 
754c243e490SMarcel Moolenaar     atf_fs_path_fini(&p);
755c243e490SMarcel Moolenaar }
756c243e490SMarcel Moolenaar 
757c243e490SMarcel Moolenaar ATF_TC(rmdir_enotempty);
ATF_TC_HEAD(rmdir_enotempty,tc)758c243e490SMarcel Moolenaar ATF_TC_HEAD(rmdir_enotempty, tc)
759c243e490SMarcel Moolenaar {
760c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_rmdir function");
761c243e490SMarcel Moolenaar }
ATF_TC_BODY(rmdir_enotempty,tc)762c243e490SMarcel Moolenaar ATF_TC_BODY(rmdir_enotempty, tc)
763c243e490SMarcel Moolenaar {
764c243e490SMarcel Moolenaar     atf_fs_path_t p;
765c243e490SMarcel Moolenaar     atf_error_t err;
766c243e490SMarcel Moolenaar 
767c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p, "test-dir"));
768c243e490SMarcel Moolenaar 
769c243e490SMarcel Moolenaar     ATF_REQUIRE(mkdir("test-dir", 0755) != -1);
770c243e490SMarcel Moolenaar     ATF_REQUIRE(exists(&p));
771c243e490SMarcel Moolenaar     create_file("test-dir/foo", 0644);
772c243e490SMarcel Moolenaar 
773c243e490SMarcel Moolenaar     err = atf_fs_rmdir(&p);
774c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_is_error(err));
775c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_error_is(err, "libc"));
776c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(atf_libc_error_code(err), ENOTEMPTY);
777c243e490SMarcel Moolenaar     atf_error_free(err);
778c243e490SMarcel Moolenaar 
779c243e490SMarcel Moolenaar     atf_fs_path_fini(&p);
780c243e490SMarcel Moolenaar }
781c243e490SMarcel Moolenaar 
782c203bd70SAlex Richardson ATF_TC_WITH_CLEANUP(rmdir_eperm);
ATF_TC_HEAD(rmdir_eperm,tc)783c243e490SMarcel Moolenaar ATF_TC_HEAD(rmdir_eperm, tc)
784c243e490SMarcel Moolenaar {
785c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_rmdir function");
786c243e490SMarcel Moolenaar }
ATF_TC_BODY(rmdir_eperm,tc)787c243e490SMarcel Moolenaar ATF_TC_BODY(rmdir_eperm, tc)
788c243e490SMarcel Moolenaar {
789c243e490SMarcel Moolenaar     atf_fs_path_t p;
790c243e490SMarcel Moolenaar     atf_error_t err;
791c243e490SMarcel Moolenaar 
792c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p, "test-dir/foo"));
793c243e490SMarcel Moolenaar 
794c243e490SMarcel Moolenaar     ATF_REQUIRE(mkdir("test-dir", 0755) != -1);
795c243e490SMarcel Moolenaar     ATF_REQUIRE(mkdir("test-dir/foo", 0755) != -1);
796c243e490SMarcel Moolenaar     ATF_REQUIRE(chmod("test-dir", 0555) != -1);
797c243e490SMarcel Moolenaar     ATF_REQUIRE(exists(&p));
798c243e490SMarcel Moolenaar 
799c243e490SMarcel Moolenaar     err = atf_fs_rmdir(&p);
800c243e490SMarcel Moolenaar     if (atf_user_is_root()) {
801c243e490SMarcel Moolenaar         ATF_REQUIRE(!atf_is_error(err));
802c243e490SMarcel Moolenaar     } else {
803c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_is_error(err));
804c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_error_is(err, "libc"));
805c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(atf_libc_error_code(err), EACCES);
806c243e490SMarcel Moolenaar         atf_error_free(err);
807c243e490SMarcel Moolenaar     }
808c243e490SMarcel Moolenaar 
809c243e490SMarcel Moolenaar     atf_fs_path_fini(&p);
810c243e490SMarcel Moolenaar }
ATF_TC_CLEANUP(rmdir_eperm,tc)811c203bd70SAlex Richardson ATF_TC_CLEANUP(rmdir_eperm, tc)
812c203bd70SAlex Richardson {
813c203bd70SAlex Richardson     if (chmod("test-dir", 0755) == -1) {
814c203bd70SAlex Richardson         fprintf(stderr, "Failed to unprotect test-dir; test directory "
815c203bd70SAlex Richardson                 "cleanup will fail\n");
816c203bd70SAlex Richardson     }
817c203bd70SAlex Richardson }
818c243e490SMarcel Moolenaar 
819c243e490SMarcel Moolenaar ATF_TC(mkdtemp_ok);
ATF_TC_HEAD(mkdtemp_ok,tc)820c243e490SMarcel Moolenaar ATF_TC_HEAD(mkdtemp_ok, tc)
821c243e490SMarcel Moolenaar {
822c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_mkdtemp function, "
823c243e490SMarcel Moolenaar                       "successful execution");
824c243e490SMarcel Moolenaar }
ATF_TC_BODY(mkdtemp_ok,tc)825c243e490SMarcel Moolenaar ATF_TC_BODY(mkdtemp_ok, tc)
826c243e490SMarcel Moolenaar {
827c243e490SMarcel Moolenaar     atf_fs_path_t p1, p2;
828c243e490SMarcel Moolenaar     atf_fs_stat_t s1, s2;
829c243e490SMarcel Moolenaar 
830c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p1, "testdir.XXXXXX"));
831c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p2, "testdir.XXXXXX"));
832c243e490SMarcel Moolenaar     RE(atf_fs_mkdtemp(&p1));
833c243e490SMarcel Moolenaar     RE(atf_fs_mkdtemp(&p2));
834c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_equal_fs_path_fs_path(&p1, &p2));
835c243e490SMarcel Moolenaar     ATF_REQUIRE(exists(&p1));
836c243e490SMarcel Moolenaar     ATF_REQUIRE(exists(&p2));
837c243e490SMarcel Moolenaar 
838c243e490SMarcel Moolenaar     RE(atf_fs_stat_init(&s1, &p1));
839c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(atf_fs_stat_get_type(&s1), atf_fs_stat_dir_type);
840c243e490SMarcel Moolenaar     ATF_REQUIRE( atf_fs_stat_is_owner_readable(&s1));
841c243e490SMarcel Moolenaar     ATF_REQUIRE( atf_fs_stat_is_owner_writable(&s1));
842c243e490SMarcel Moolenaar     ATF_REQUIRE( atf_fs_stat_is_owner_executable(&s1));
843c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_fs_stat_is_group_readable(&s1));
844c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_fs_stat_is_group_writable(&s1));
845c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_fs_stat_is_group_executable(&s1));
846c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_fs_stat_is_other_readable(&s1));
847c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_fs_stat_is_other_writable(&s1));
848c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_fs_stat_is_other_executable(&s1));
849c243e490SMarcel Moolenaar 
850c243e490SMarcel Moolenaar     RE(atf_fs_stat_init(&s2, &p2));
851c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(atf_fs_stat_get_type(&s2), atf_fs_stat_dir_type);
852c243e490SMarcel Moolenaar     ATF_REQUIRE( atf_fs_stat_is_owner_readable(&s2));
853c243e490SMarcel Moolenaar     ATF_REQUIRE( atf_fs_stat_is_owner_writable(&s2));
854c243e490SMarcel Moolenaar     ATF_REQUIRE( atf_fs_stat_is_owner_executable(&s2));
855c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_fs_stat_is_group_readable(&s2));
856c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_fs_stat_is_group_writable(&s2));
857c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_fs_stat_is_group_executable(&s2));
858c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_fs_stat_is_other_readable(&s2));
859c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_fs_stat_is_other_writable(&s2));
860c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_fs_stat_is_other_executable(&s2));
861c243e490SMarcel Moolenaar 
862c243e490SMarcel Moolenaar     atf_fs_stat_fini(&s2);
863c243e490SMarcel Moolenaar     atf_fs_stat_fini(&s1);
864c243e490SMarcel Moolenaar     atf_fs_path_fini(&p2);
865c243e490SMarcel Moolenaar     atf_fs_path_fini(&p1);
866c243e490SMarcel Moolenaar }
867c243e490SMarcel Moolenaar 
868c243e490SMarcel Moolenaar ATF_TC(mkdtemp_err);
ATF_TC_HEAD(mkdtemp_err,tc)869c243e490SMarcel Moolenaar ATF_TC_HEAD(mkdtemp_err, tc)
870c243e490SMarcel Moolenaar {
871c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_mkdtemp function, "
872c243e490SMarcel Moolenaar                       "error conditions");
873c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "require.user", "unprivileged");
874c243e490SMarcel Moolenaar }
ATF_TC_BODY(mkdtemp_err,tc)875c243e490SMarcel Moolenaar ATF_TC_BODY(mkdtemp_err, tc)
876c243e490SMarcel Moolenaar {
877c243e490SMarcel Moolenaar     atf_error_t err;
878c243e490SMarcel Moolenaar     atf_fs_path_t p;
879c243e490SMarcel Moolenaar 
880c243e490SMarcel Moolenaar     ATF_REQUIRE(mkdir("dir", 0555) != -1);
881c243e490SMarcel Moolenaar 
882c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p, "dir/testdir.XXXXXX"));
883c243e490SMarcel Moolenaar 
884c243e490SMarcel Moolenaar     err = atf_fs_mkdtemp(&p);
885c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_is_error(err));
886c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_error_is(err, "libc"));
887c243e490SMarcel Moolenaar     ATF_CHECK_EQ(atf_libc_error_code(err), EACCES);
888c243e490SMarcel Moolenaar     atf_error_free(err);
889c243e490SMarcel Moolenaar 
890c243e490SMarcel Moolenaar     ATF_CHECK(!exists(&p));
891c243e490SMarcel Moolenaar     ATF_CHECK(strcmp(atf_fs_path_cstring(&p), "dir/testdir.XXXXXX") == 0);
892c243e490SMarcel Moolenaar 
893c243e490SMarcel Moolenaar     atf_fs_path_fini(&p);
894c243e490SMarcel Moolenaar }
895c243e490SMarcel Moolenaar 
896c243e490SMarcel Moolenaar static
897c243e490SMarcel Moolenaar void
do_umask_check(atf_error_t (* const mk_func)(atf_fs_path_t *),atf_error_t (* const rm_func)(const atf_fs_path_t *),atf_fs_path_t * tmpl,const mode_t test_mask,const char * exp_name)898c243e490SMarcel Moolenaar do_umask_check(atf_error_t (*const mk_func)(atf_fs_path_t *),
899*1a6a36a9SDag-Erling Smørgrav                atf_error_t (*const rm_func)(const atf_fs_path_t *),
900*1a6a36a9SDag-Erling Smørgrav                atf_fs_path_t *tmpl, const mode_t test_mask,
901*1a6a36a9SDag-Erling Smørgrav                const char *exp_name)
902c243e490SMarcel Moolenaar {
903*1a6a36a9SDag-Erling Smørgrav     atf_fs_path_t path;
904*1a6a36a9SDag-Erling Smørgrav     int pre_mask, post_mask;
905c243e490SMarcel Moolenaar     atf_error_t err;
906c243e490SMarcel Moolenaar 
907*1a6a36a9SDag-Erling Smørgrav     printf("Creating temporary %s with umask %05o\n", exp_name, test_mask);
908c243e490SMarcel Moolenaar 
909*1a6a36a9SDag-Erling Smørgrav     RE(atf_fs_path_copy(&path, tmpl));
910c243e490SMarcel Moolenaar 
911*1a6a36a9SDag-Erling Smørgrav     pre_mask = umask(test_mask);
912*1a6a36a9SDag-Erling Smørgrav     err = mk_func(&path);
913*1a6a36a9SDag-Erling Smørgrav     post_mask = umask(pre_mask);
914*1a6a36a9SDag-Erling Smørgrav 
915*1a6a36a9SDag-Erling Smørgrav     ATF_REQUIRE(!atf_is_error(err));
916*1a6a36a9SDag-Erling Smørgrav     ATF_CHECK_EQ(post_mask, test_mask);
917*1a6a36a9SDag-Erling Smørgrav     RE(rm_func(&path));
918c243e490SMarcel Moolenaar }
919c243e490SMarcel Moolenaar 
920c243e490SMarcel Moolenaar ATF_TC(mkdtemp_umask);
ATF_TC_HEAD(mkdtemp_umask,tc)921c243e490SMarcel Moolenaar ATF_TC_HEAD(mkdtemp_umask, tc)
922c243e490SMarcel Moolenaar {
923c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_mkdtemp function "
924c243e490SMarcel Moolenaar                       "causing an error due to a too strict umask");
925c243e490SMarcel Moolenaar }
ATF_TC_BODY(mkdtemp_umask,tc)926c243e490SMarcel Moolenaar ATF_TC_BODY(mkdtemp_umask, tc)
927c243e490SMarcel Moolenaar {
928c243e490SMarcel Moolenaar     atf_fs_path_t p;
929c243e490SMarcel Moolenaar 
930c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p, "testdir.XXXXXX"));
931c243e490SMarcel Moolenaar 
932*1a6a36a9SDag-Erling Smørgrav     do_umask_check(atf_fs_mkdtemp, atf_fs_rmdir, &p, 00100, "directory");
933*1a6a36a9SDag-Erling Smørgrav     do_umask_check(atf_fs_mkdtemp, atf_fs_rmdir, &p, 00200, "directory");
934*1a6a36a9SDag-Erling Smørgrav     do_umask_check(atf_fs_mkdtemp, atf_fs_rmdir, &p, 00400, "directory");
935*1a6a36a9SDag-Erling Smørgrav     do_umask_check(atf_fs_mkdtemp, atf_fs_rmdir, &p, 00500, "directory");
936*1a6a36a9SDag-Erling Smørgrav     do_umask_check(atf_fs_mkdtemp, atf_fs_rmdir, &p, 00600, "directory");
937c243e490SMarcel Moolenaar 
938c243e490SMarcel Moolenaar     atf_fs_path_fini(&p);
939c243e490SMarcel Moolenaar }
940c243e490SMarcel Moolenaar 
941c243e490SMarcel Moolenaar ATF_TC(mkstemp_ok);
ATF_TC_HEAD(mkstemp_ok,tc)942c243e490SMarcel Moolenaar ATF_TC_HEAD(mkstemp_ok, tc)
943c243e490SMarcel Moolenaar {
944c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_mkstemp function, "
945c243e490SMarcel Moolenaar                       "successful execution");
946c243e490SMarcel Moolenaar }
ATF_TC_BODY(mkstemp_ok,tc)947c243e490SMarcel Moolenaar ATF_TC_BODY(mkstemp_ok, tc)
948c243e490SMarcel Moolenaar {
949c243e490SMarcel Moolenaar     int fd1, fd2;
950c243e490SMarcel Moolenaar     atf_fs_path_t p1, p2;
951c243e490SMarcel Moolenaar     atf_fs_stat_t s1, s2;
952c243e490SMarcel Moolenaar 
953c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p1, "testfile.XXXXXX"));
954c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p2, "testfile.XXXXXX"));
955c243e490SMarcel Moolenaar     fd1 = fd2 = -1;
956c243e490SMarcel Moolenaar     RE(atf_fs_mkstemp(&p1, &fd1));
957c243e490SMarcel Moolenaar     RE(atf_fs_mkstemp(&p2, &fd2));
958c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_equal_fs_path_fs_path(&p1, &p2));
959c243e490SMarcel Moolenaar     ATF_REQUIRE(exists(&p1));
960c243e490SMarcel Moolenaar     ATF_REQUIRE(exists(&p2));
961c243e490SMarcel Moolenaar 
962c243e490SMarcel Moolenaar     ATF_CHECK(fd1 != -1);
963c243e490SMarcel Moolenaar     ATF_CHECK(fd2 != -1);
964c243e490SMarcel Moolenaar     ATF_CHECK(write(fd1, "foo", 3) == 3);
965c243e490SMarcel Moolenaar     ATF_CHECK(write(fd2, "bar", 3) == 3);
966c243e490SMarcel Moolenaar     close(fd1);
967c243e490SMarcel Moolenaar     close(fd2);
968c243e490SMarcel Moolenaar 
969c243e490SMarcel Moolenaar     RE(atf_fs_stat_init(&s1, &p1));
970c243e490SMarcel Moolenaar     ATF_CHECK_EQ(atf_fs_stat_get_type(&s1), atf_fs_stat_reg_type);
971c243e490SMarcel Moolenaar     ATF_CHECK( atf_fs_stat_is_owner_readable(&s1));
972c243e490SMarcel Moolenaar     ATF_CHECK( atf_fs_stat_is_owner_writable(&s1));
973c243e490SMarcel Moolenaar     ATF_CHECK(!atf_fs_stat_is_owner_executable(&s1));
974c243e490SMarcel Moolenaar     ATF_CHECK(!atf_fs_stat_is_group_readable(&s1));
975c243e490SMarcel Moolenaar     ATF_CHECK(!atf_fs_stat_is_group_writable(&s1));
976c243e490SMarcel Moolenaar     ATF_CHECK(!atf_fs_stat_is_group_executable(&s1));
977c243e490SMarcel Moolenaar     ATF_CHECK(!atf_fs_stat_is_other_readable(&s1));
978c243e490SMarcel Moolenaar     ATF_CHECK(!atf_fs_stat_is_other_writable(&s1));
979c243e490SMarcel Moolenaar     ATF_CHECK(!atf_fs_stat_is_other_executable(&s1));
980c243e490SMarcel Moolenaar 
981c243e490SMarcel Moolenaar     RE(atf_fs_stat_init(&s2, &p2));
982c243e490SMarcel Moolenaar     ATF_CHECK_EQ(atf_fs_stat_get_type(&s2), atf_fs_stat_reg_type);
983c243e490SMarcel Moolenaar     ATF_CHECK( atf_fs_stat_is_owner_readable(&s2));
984c243e490SMarcel Moolenaar     ATF_CHECK( atf_fs_stat_is_owner_writable(&s2));
985c243e490SMarcel Moolenaar     ATF_CHECK(!atf_fs_stat_is_owner_executable(&s2));
986c243e490SMarcel Moolenaar     ATF_CHECK(!atf_fs_stat_is_group_readable(&s2));
987c243e490SMarcel Moolenaar     ATF_CHECK(!atf_fs_stat_is_group_writable(&s2));
988c243e490SMarcel Moolenaar     ATF_CHECK(!atf_fs_stat_is_group_executable(&s2));
989c243e490SMarcel Moolenaar     ATF_CHECK(!atf_fs_stat_is_other_readable(&s2));
990c243e490SMarcel Moolenaar     ATF_CHECK(!atf_fs_stat_is_other_writable(&s2));
991c243e490SMarcel Moolenaar     ATF_CHECK(!atf_fs_stat_is_other_executable(&s2));
992c243e490SMarcel Moolenaar 
993c243e490SMarcel Moolenaar     atf_fs_stat_fini(&s2);
994c243e490SMarcel Moolenaar     atf_fs_stat_fini(&s1);
995c243e490SMarcel Moolenaar     atf_fs_path_fini(&p2);
996c243e490SMarcel Moolenaar     atf_fs_path_fini(&p1);
997c243e490SMarcel Moolenaar }
998c243e490SMarcel Moolenaar 
999c243e490SMarcel Moolenaar ATF_TC(mkstemp_err);
ATF_TC_HEAD(mkstemp_err,tc)1000c243e490SMarcel Moolenaar ATF_TC_HEAD(mkstemp_err, tc)
1001c243e490SMarcel Moolenaar {
1002c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_mkstemp function, "
1003c243e490SMarcel Moolenaar                       "error conditions");
1004c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "require.user", "unprivileged");
1005c243e490SMarcel Moolenaar }
ATF_TC_BODY(mkstemp_err,tc)1006c243e490SMarcel Moolenaar ATF_TC_BODY(mkstemp_err, tc)
1007c243e490SMarcel Moolenaar {
1008c243e490SMarcel Moolenaar     int fd;
1009c243e490SMarcel Moolenaar     atf_error_t err;
1010c243e490SMarcel Moolenaar     atf_fs_path_t p;
1011c243e490SMarcel Moolenaar 
1012c243e490SMarcel Moolenaar     ATF_REQUIRE(mkdir("dir", 0555) != -1);
1013c243e490SMarcel Moolenaar 
1014c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p, "dir/testfile.XXXXXX"));
1015c243e490SMarcel Moolenaar     fd = 1234;
1016c243e490SMarcel Moolenaar 
1017c243e490SMarcel Moolenaar     err = atf_fs_mkstemp(&p, &fd);
1018c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_is_error(err));
1019c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_error_is(err, "libc"));
1020c243e490SMarcel Moolenaar     ATF_CHECK_EQ(atf_libc_error_code(err), EACCES);
1021c243e490SMarcel Moolenaar     atf_error_free(err);
1022c243e490SMarcel Moolenaar 
1023c243e490SMarcel Moolenaar     ATF_CHECK(!exists(&p));
1024c243e490SMarcel Moolenaar     ATF_CHECK(strcmp(atf_fs_path_cstring(&p), "dir/testfile.XXXXXX") == 0);
1025c243e490SMarcel Moolenaar     ATF_CHECK_EQ(fd, 1234);
1026c243e490SMarcel Moolenaar 
1027c243e490SMarcel Moolenaar     atf_fs_path_fini(&p);
1028c243e490SMarcel Moolenaar }
1029c243e490SMarcel Moolenaar 
1030c243e490SMarcel Moolenaar ATF_TC(mkstemp_umask);
ATF_TC_HEAD(mkstemp_umask,tc)1031c243e490SMarcel Moolenaar ATF_TC_HEAD(mkstemp_umask, tc)
1032c243e490SMarcel Moolenaar {
1033c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Tests the atf_fs_mkstemp function "
1034c243e490SMarcel Moolenaar                       "causing an error due to a too strict umask");
1035c243e490SMarcel Moolenaar }
ATF_TC_BODY(mkstemp_umask,tc)1036c243e490SMarcel Moolenaar ATF_TC_BODY(mkstemp_umask, tc)
1037c243e490SMarcel Moolenaar {
1038c243e490SMarcel Moolenaar     atf_fs_path_t p;
1039c243e490SMarcel Moolenaar 
1040c243e490SMarcel Moolenaar     RE(atf_fs_path_init_fmt(&p, "testfile.XXXXXX"));
1041c243e490SMarcel Moolenaar 
1042*1a6a36a9SDag-Erling Smørgrav     do_umask_check(mkstemp_discard_fd, atf_fs_unlink, &p, 00100, "regular file");
1043*1a6a36a9SDag-Erling Smørgrav     do_umask_check(mkstemp_discard_fd, atf_fs_unlink, &p, 00200, "regular file");
1044*1a6a36a9SDag-Erling Smørgrav     do_umask_check(mkstemp_discard_fd, atf_fs_unlink, &p, 00400, "regular file");
1045c243e490SMarcel Moolenaar 
1046c243e490SMarcel Moolenaar     atf_fs_path_fini(&p);
1047c243e490SMarcel Moolenaar }
1048c243e490SMarcel Moolenaar 
1049c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
1050c243e490SMarcel Moolenaar  * Main.
1051c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
1052c243e490SMarcel Moolenaar 
ATF_TP_ADD_TCS(tp)1053c243e490SMarcel Moolenaar ATF_TP_ADD_TCS(tp)
1054c243e490SMarcel Moolenaar {
1055c243e490SMarcel Moolenaar     /* Add the tests for the "atf_fs_path" type. */
1056c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, path_normalize);
1057c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, path_copy);
1058c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, path_is_absolute);
1059c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, path_is_root);
1060c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, path_branch_path);
1061c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, path_leaf_name);
1062c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, path_append);
1063c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, path_to_absolute);
1064c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, path_equal);
1065c243e490SMarcel Moolenaar 
1066c243e490SMarcel Moolenaar     /* Add the tests for the "atf_fs_stat" type. */
1067c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, stat_mode);
1068c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, stat_type);
1069c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, stat_perms);
1070c243e490SMarcel Moolenaar 
1071c243e490SMarcel Moolenaar     /* Add the tests for the free functions. */
1072c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, eaccess);
1073c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, exists);
1074c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, getcwd);
1075c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, rmdir_empty);
1076c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, rmdir_enotempty);
1077c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, rmdir_eperm);
1078c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, mkdtemp_ok);
1079c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, mkdtemp_err);
1080c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, mkdtemp_umask);
1081c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, mkstemp_ok);
1082c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, mkstemp_err);
1083c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, mkstemp_umask);
1084c243e490SMarcel Moolenaar 
1085c243e490SMarcel Moolenaar     return atf_no_error();
1086c243e490SMarcel Moolenaar }
1087