1*6a6c8299Sjmmv // Copyright 2010 Google Inc.
2*6a6c8299Sjmmv // All rights reserved.
3*6a6c8299Sjmmv //
4*6a6c8299Sjmmv // Redistribution and use in source and binary forms, with or without
5*6a6c8299Sjmmv // modification, are permitted provided that the following conditions are
6*6a6c8299Sjmmv // met:
7*6a6c8299Sjmmv //
8*6a6c8299Sjmmv // * Redistributions of source code must retain the above copyright
9*6a6c8299Sjmmv //   notice, this list of conditions and the following disclaimer.
10*6a6c8299Sjmmv // * Redistributions in binary form must reproduce the above copyright
11*6a6c8299Sjmmv //   notice, this list of conditions and the following disclaimer in the
12*6a6c8299Sjmmv //   documentation and/or other materials provided with the distribution.
13*6a6c8299Sjmmv // * Neither the name of Google Inc. nor the names of its contributors
14*6a6c8299Sjmmv //   may be used to endorse or promote products derived from this software
15*6a6c8299Sjmmv //   without specific prior written permission.
16*6a6c8299Sjmmv //
17*6a6c8299Sjmmv // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*6a6c8299Sjmmv // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*6a6c8299Sjmmv // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*6a6c8299Sjmmv // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*6a6c8299Sjmmv // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*6a6c8299Sjmmv // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*6a6c8299Sjmmv // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*6a6c8299Sjmmv // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*6a6c8299Sjmmv // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*6a6c8299Sjmmv // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*6a6c8299Sjmmv // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*6a6c8299Sjmmv 
29*6a6c8299Sjmmv #include "utils/fs/operations.hpp"
30*6a6c8299Sjmmv 
31*6a6c8299Sjmmv extern "C" {
32*6a6c8299Sjmmv #include <sys/types.h>
33*6a6c8299Sjmmv #include <sys/stat.h>
34*6a6c8299Sjmmv #include <sys/wait.h>
35*6a6c8299Sjmmv 
36*6a6c8299Sjmmv #include <dirent.h>
37*6a6c8299Sjmmv #include <signal.h>
38*6a6c8299Sjmmv #include <unistd.h>
39*6a6c8299Sjmmv }
40*6a6c8299Sjmmv 
41*6a6c8299Sjmmv #include <cerrno>
42*6a6c8299Sjmmv #include <cstdlib>
43*6a6c8299Sjmmv #include <cstring>
44*6a6c8299Sjmmv #include <fstream>
45*6a6c8299Sjmmv #include <iostream>
46*6a6c8299Sjmmv #include <string>
47*6a6c8299Sjmmv #include <vector>
48*6a6c8299Sjmmv 
49*6a6c8299Sjmmv #include <atf-c++.hpp>
50*6a6c8299Sjmmv 
51*6a6c8299Sjmmv #include "utils/env.hpp"
52*6a6c8299Sjmmv #include "utils/format/macros.hpp"
53*6a6c8299Sjmmv #include "utils/fs/exceptions.hpp"
54*6a6c8299Sjmmv #include "utils/fs/path.hpp"
55*6a6c8299Sjmmv #include "utils/optional.ipp"
56*6a6c8299Sjmmv 
57*6a6c8299Sjmmv namespace fs = utils::fs;
58*6a6c8299Sjmmv 
59*6a6c8299Sjmmv using utils::optional;
60*6a6c8299Sjmmv 
61*6a6c8299Sjmmv 
62*6a6c8299Sjmmv namespace {
63*6a6c8299Sjmmv 
64*6a6c8299Sjmmv 
65*6a6c8299Sjmmv /// Checks if a directory entry exists and matches a specific type.
66*6a6c8299Sjmmv ///
67*6a6c8299Sjmmv /// \param dir The directory in which to look for the entry.
68*6a6c8299Sjmmv /// \param name The name of the entry to look up.
69*6a6c8299Sjmmv /// \param expected_type The expected type of the file as given by dir(5).
70*6a6c8299Sjmmv ///
71*6a6c8299Sjmmv /// \return True if the entry exists and matches the given type; false
72*6a6c8299Sjmmv /// otherwise.
73*6a6c8299Sjmmv static bool
lookup(const char * dir,const char * name,const int expected_type)74*6a6c8299Sjmmv lookup(const char* dir, const char* name, const int expected_type)
75*6a6c8299Sjmmv {
76*6a6c8299Sjmmv     DIR* dirp = ::opendir(dir);
77*6a6c8299Sjmmv     ATF_REQUIRE(dirp != NULL);
78*6a6c8299Sjmmv 
79*6a6c8299Sjmmv     bool found = false;
80*6a6c8299Sjmmv     struct dirent* dp;
81*6a6c8299Sjmmv     while (!found && (dp = readdir(dirp)) != NULL) {
82*6a6c8299Sjmmv         if (std::strcmp(dp->d_name, name) == 0 &&
83*6a6c8299Sjmmv             dp->d_type == expected_type) {
84*6a6c8299Sjmmv             found = true;
85*6a6c8299Sjmmv         }
86*6a6c8299Sjmmv     }
87*6a6c8299Sjmmv     ::closedir(dirp);
88*6a6c8299Sjmmv     return found;
89*6a6c8299Sjmmv }
90*6a6c8299Sjmmv 
91*6a6c8299Sjmmv 
92*6a6c8299Sjmmv }  // anonymous namespace
93*6a6c8299Sjmmv 
94*6a6c8299Sjmmv 
95*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(current_path__ok);
ATF_TEST_CASE_BODY(current_path__ok)96*6a6c8299Sjmmv ATF_TEST_CASE_BODY(current_path__ok)
97*6a6c8299Sjmmv {
98*6a6c8299Sjmmv     const fs::path previous = fs::current_path();
99*6a6c8299Sjmmv     fs::mkdir(fs::path("root"), 0755);
100*6a6c8299Sjmmv     ATF_REQUIRE(::chdir("root") != -1);
101*6a6c8299Sjmmv     const fs::path cwd = fs::current_path();
102*6a6c8299Sjmmv     ATF_REQUIRE_EQ(cwd.str().length() - 5, cwd.str().find("/root"));
103*6a6c8299Sjmmv     ATF_REQUIRE_EQ(previous / "root", cwd);
104*6a6c8299Sjmmv }
105*6a6c8299Sjmmv 
106*6a6c8299Sjmmv 
107*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(current_path__enoent);
ATF_TEST_CASE_BODY(current_path__enoent)108*6a6c8299Sjmmv ATF_TEST_CASE_BODY(current_path__enoent)
109*6a6c8299Sjmmv {
110*6a6c8299Sjmmv     const fs::path previous = fs::current_path();
111*6a6c8299Sjmmv     fs::mkdir(fs::path("root"), 0755);
112*6a6c8299Sjmmv     ATF_REQUIRE(::chdir("root") != -1);
113*6a6c8299Sjmmv     ATF_REQUIRE(::rmdir("../root") != -1);
114*6a6c8299Sjmmv     try {
115*6a6c8299Sjmmv         (void)fs::current_path();
116*6a6c8299Sjmmv         fail("system_errpr not raised");
117*6a6c8299Sjmmv     } catch (const fs::system_error& e) {
118*6a6c8299Sjmmv         ATF_REQUIRE_EQ(ENOENT, e.original_errno());
119*6a6c8299Sjmmv     }
120*6a6c8299Sjmmv }
121*6a6c8299Sjmmv 
122*6a6c8299Sjmmv 
123*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(exists);
ATF_TEST_CASE_BODY(exists)124*6a6c8299Sjmmv ATF_TEST_CASE_BODY(exists)
125*6a6c8299Sjmmv {
126*6a6c8299Sjmmv     const fs::path dir("dir");
127*6a6c8299Sjmmv     ATF_REQUIRE(!fs::exists(dir));
128*6a6c8299Sjmmv     fs::mkdir(dir, 0755);
129*6a6c8299Sjmmv     ATF_REQUIRE(fs::exists(dir));
130*6a6c8299Sjmmv }
131*6a6c8299Sjmmv 
132*6a6c8299Sjmmv 
133*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(find_in_path__no_path);
ATF_TEST_CASE_BODY(find_in_path__no_path)134*6a6c8299Sjmmv ATF_TEST_CASE_BODY(find_in_path__no_path)
135*6a6c8299Sjmmv {
136*6a6c8299Sjmmv     utils::unsetenv("PATH");
137*6a6c8299Sjmmv     ATF_REQUIRE(!fs::find_in_path("ls"));
138*6a6c8299Sjmmv     atf::utils::create_file("ls", "");
139*6a6c8299Sjmmv     ATF_REQUIRE(!fs::find_in_path("ls"));
140*6a6c8299Sjmmv }
141*6a6c8299Sjmmv 
142*6a6c8299Sjmmv 
143*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(find_in_path__empty_path);
ATF_TEST_CASE_BODY(find_in_path__empty_path)144*6a6c8299Sjmmv ATF_TEST_CASE_BODY(find_in_path__empty_path)
145*6a6c8299Sjmmv {
146*6a6c8299Sjmmv     utils::setenv("PATH", "");
147*6a6c8299Sjmmv     ATF_REQUIRE(!fs::find_in_path("ls"));
148*6a6c8299Sjmmv     atf::utils::create_file("ls", "");
149*6a6c8299Sjmmv     ATF_REQUIRE(!fs::find_in_path("ls"));
150*6a6c8299Sjmmv }
151*6a6c8299Sjmmv 
152*6a6c8299Sjmmv 
153*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(find_in_path__one_component);
ATF_TEST_CASE_BODY(find_in_path__one_component)154*6a6c8299Sjmmv ATF_TEST_CASE_BODY(find_in_path__one_component)
155*6a6c8299Sjmmv {
156*6a6c8299Sjmmv     const fs::path dir = fs::current_path() / "bin";
157*6a6c8299Sjmmv     fs::mkdir(dir, 0755);
158*6a6c8299Sjmmv     utils::setenv("PATH", dir.str());
159*6a6c8299Sjmmv 
160*6a6c8299Sjmmv     ATF_REQUIRE(!fs::find_in_path("ls"));
161*6a6c8299Sjmmv     atf::utils::create_file((dir / "ls").str(), "");
162*6a6c8299Sjmmv     ATF_REQUIRE_EQ(dir / "ls", fs::find_in_path("ls").get());
163*6a6c8299Sjmmv }
164*6a6c8299Sjmmv 
165*6a6c8299Sjmmv 
166*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(find_in_path__many_components);
ATF_TEST_CASE_BODY(find_in_path__many_components)167*6a6c8299Sjmmv ATF_TEST_CASE_BODY(find_in_path__many_components)
168*6a6c8299Sjmmv {
169*6a6c8299Sjmmv     const fs::path dir1 = fs::current_path() / "dir1";
170*6a6c8299Sjmmv     const fs::path dir2 = fs::current_path() / "dir2";
171*6a6c8299Sjmmv     fs::mkdir(dir1, 0755);
172*6a6c8299Sjmmv     fs::mkdir(dir2, 0755);
173*6a6c8299Sjmmv     utils::setenv("PATH", dir1.str() + ":" + dir2.str());
174*6a6c8299Sjmmv 
175*6a6c8299Sjmmv     ATF_REQUIRE(!fs::find_in_path("ls"));
176*6a6c8299Sjmmv     atf::utils::create_file((dir2 / "ls").str(), "");
177*6a6c8299Sjmmv     ATF_REQUIRE_EQ(dir2 / "ls", fs::find_in_path("ls").get());
178*6a6c8299Sjmmv     atf::utils::create_file((dir1 / "ls").str(), "");
179*6a6c8299Sjmmv     ATF_REQUIRE_EQ(dir1 / "ls", fs::find_in_path("ls").get());
180*6a6c8299Sjmmv }
181*6a6c8299Sjmmv 
182*6a6c8299Sjmmv 
183*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(find_in_path__current_directory);
ATF_TEST_CASE_BODY(find_in_path__current_directory)184*6a6c8299Sjmmv ATF_TEST_CASE_BODY(find_in_path__current_directory)
185*6a6c8299Sjmmv {
186*6a6c8299Sjmmv     utils::setenv("PATH", "bin:");
187*6a6c8299Sjmmv 
188*6a6c8299Sjmmv     ATF_REQUIRE(!fs::find_in_path("foo-bar"));
189*6a6c8299Sjmmv     atf::utils::create_file("foo-bar", "");
190*6a6c8299Sjmmv     ATF_REQUIRE_EQ(fs::path("foo-bar").to_absolute(),
191*6a6c8299Sjmmv                    fs::find_in_path("foo-bar").get());
192*6a6c8299Sjmmv }
193*6a6c8299Sjmmv 
194*6a6c8299Sjmmv 
195*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(find_in_path__always_absolute);
ATF_TEST_CASE_BODY(find_in_path__always_absolute)196*6a6c8299Sjmmv ATF_TEST_CASE_BODY(find_in_path__always_absolute)
197*6a6c8299Sjmmv {
198*6a6c8299Sjmmv     fs::mkdir(fs::path("my-bin"), 0755);
199*6a6c8299Sjmmv     utils::setenv("PATH", "my-bin");
200*6a6c8299Sjmmv 
201*6a6c8299Sjmmv     ATF_REQUIRE(!fs::find_in_path("abcd"));
202*6a6c8299Sjmmv     atf::utils::create_file("my-bin/abcd", "");
203*6a6c8299Sjmmv     ATF_REQUIRE_EQ(fs::path("my-bin/abcd").to_absolute(),
204*6a6c8299Sjmmv                    fs::find_in_path("abcd").get());
205*6a6c8299Sjmmv }
206*6a6c8299Sjmmv 
207*6a6c8299Sjmmv 
208*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(mkdir__ok);
ATF_TEST_CASE_BODY(mkdir__ok)209*6a6c8299Sjmmv ATF_TEST_CASE_BODY(mkdir__ok)
210*6a6c8299Sjmmv {
211*6a6c8299Sjmmv     fs::mkdir(fs::path("dir"), 0755);
212*6a6c8299Sjmmv     ATF_REQUIRE(lookup(".", "dir", DT_DIR));
213*6a6c8299Sjmmv }
214*6a6c8299Sjmmv 
215*6a6c8299Sjmmv 
216*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(mkdir__enoent);
ATF_TEST_CASE_BODY(mkdir__enoent)217*6a6c8299Sjmmv ATF_TEST_CASE_BODY(mkdir__enoent)
218*6a6c8299Sjmmv {
219*6a6c8299Sjmmv     try {
220*6a6c8299Sjmmv         fs::mkdir(fs::path("dir1/dir2"), 0755);
221*6a6c8299Sjmmv         fail("system_error not raised");
222*6a6c8299Sjmmv     } catch (const fs::system_error& e) {
223*6a6c8299Sjmmv         ATF_REQUIRE_EQ(ENOENT, e.original_errno());
224*6a6c8299Sjmmv     }
225*6a6c8299Sjmmv     ATF_REQUIRE(!lookup(".", "dir1", DT_DIR));
226*6a6c8299Sjmmv     ATF_REQUIRE(!lookup(".", "dir2", DT_DIR));
227*6a6c8299Sjmmv }
228*6a6c8299Sjmmv 
229*6a6c8299Sjmmv 
230*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(mkdir_p__one_component);
ATF_TEST_CASE_BODY(mkdir_p__one_component)231*6a6c8299Sjmmv ATF_TEST_CASE_BODY(mkdir_p__one_component)
232*6a6c8299Sjmmv {
233*6a6c8299Sjmmv     ATF_REQUIRE(!lookup(".", "new-dir", DT_DIR));
234*6a6c8299Sjmmv     fs::mkdir_p(fs::path("new-dir"), 0755);
235*6a6c8299Sjmmv     ATF_REQUIRE(lookup(".", "new-dir", DT_DIR));
236*6a6c8299Sjmmv }
237*6a6c8299Sjmmv 
238*6a6c8299Sjmmv 
239*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(mkdir_p__many_components);
ATF_TEST_CASE_BODY(mkdir_p__many_components)240*6a6c8299Sjmmv ATF_TEST_CASE_BODY(mkdir_p__many_components)
241*6a6c8299Sjmmv {
242*6a6c8299Sjmmv     ATF_REQUIRE(!lookup(".", "a", DT_DIR));
243*6a6c8299Sjmmv     fs::mkdir_p(fs::path("a/b/c"), 0755);
244*6a6c8299Sjmmv     ATF_REQUIRE(lookup(".", "a", DT_DIR));
245*6a6c8299Sjmmv     ATF_REQUIRE(lookup("a", "b", DT_DIR));
246*6a6c8299Sjmmv     ATF_REQUIRE(lookup("a/b", "c", DT_DIR));
247*6a6c8299Sjmmv }
248*6a6c8299Sjmmv 
249*6a6c8299Sjmmv 
250*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(mkdir_p__already_exists);
ATF_TEST_CASE_BODY(mkdir_p__already_exists)251*6a6c8299Sjmmv ATF_TEST_CASE_BODY(mkdir_p__already_exists)
252*6a6c8299Sjmmv {
253*6a6c8299Sjmmv     fs::mkdir(fs::path("a"), 0755);
254*6a6c8299Sjmmv     fs::mkdir(fs::path("a/b"), 0755);
255*6a6c8299Sjmmv     fs::mkdir_p(fs::path("a/b"), 0755);
256*6a6c8299Sjmmv }
257*6a6c8299Sjmmv 
258*6a6c8299Sjmmv 
259*6a6c8299Sjmmv ATF_TEST_CASE(mkdir_p__eacces)
ATF_TEST_CASE_HEAD(mkdir_p__eacces)260*6a6c8299Sjmmv ATF_TEST_CASE_HEAD(mkdir_p__eacces)
261*6a6c8299Sjmmv {
262*6a6c8299Sjmmv     set_md_var("require.user", "unprivileged");
263*6a6c8299Sjmmv }
ATF_TEST_CASE_BODY(mkdir_p__eacces)264*6a6c8299Sjmmv ATF_TEST_CASE_BODY(mkdir_p__eacces)
265*6a6c8299Sjmmv {
266*6a6c8299Sjmmv     fs::mkdir(fs::path("a"), 0755);
267*6a6c8299Sjmmv     fs::mkdir(fs::path("a/b"), 0755);
268*6a6c8299Sjmmv     ATF_REQUIRE(::chmod("a/b", 0555) != -1);
269*6a6c8299Sjmmv     try {
270*6a6c8299Sjmmv         fs::mkdir_p(fs::path("a/b/c/d"), 0755);
271*6a6c8299Sjmmv         fail("system_error not raised");
272*6a6c8299Sjmmv     } catch (const fs::system_error& e) {
273*6a6c8299Sjmmv         ATF_REQUIRE_EQ(EACCES, e.original_errno());
274*6a6c8299Sjmmv     }
275*6a6c8299Sjmmv     ATF_REQUIRE(lookup(".", "a", DT_DIR));
276*6a6c8299Sjmmv     ATF_REQUIRE(lookup("a", "b", DT_DIR));
277*6a6c8299Sjmmv     ATF_REQUIRE(!lookup(".", "c", DT_DIR));
278*6a6c8299Sjmmv     ATF_REQUIRE(!lookup("a", "c", DT_DIR));
279*6a6c8299Sjmmv     ATF_REQUIRE(!lookup("a/b", "c", DT_DIR));
280*6a6c8299Sjmmv }
281*6a6c8299Sjmmv 
282*6a6c8299Sjmmv 
283*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(mkdtemp)
ATF_TEST_CASE_BODY(mkdtemp)284*6a6c8299Sjmmv ATF_TEST_CASE_BODY(mkdtemp)
285*6a6c8299Sjmmv {
286*6a6c8299Sjmmv     const fs::path tmpdir = fs::current_path() / "tmp";
287*6a6c8299Sjmmv     utils::setenv("TMPDIR", tmpdir.str());
288*6a6c8299Sjmmv     fs::mkdir(tmpdir, 0755);
289*6a6c8299Sjmmv 
290*6a6c8299Sjmmv     const std::string dir_template("tempdir.XXXXXX");
291*6a6c8299Sjmmv     const fs::path tempdir = fs::mkdtemp(dir_template);
292*6a6c8299Sjmmv     ATF_REQUIRE(!lookup("tmp", dir_template.c_str(), DT_DIR));
293*6a6c8299Sjmmv     ATF_REQUIRE(lookup("tmp", tempdir.leaf_name().c_str(), DT_DIR));
294*6a6c8299Sjmmv }
295*6a6c8299Sjmmv 
296*6a6c8299Sjmmv 
297*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(mkstemp)
ATF_TEST_CASE_BODY(mkstemp)298*6a6c8299Sjmmv ATF_TEST_CASE_BODY(mkstemp)
299*6a6c8299Sjmmv {
300*6a6c8299Sjmmv     const fs::path tmpdir = fs::current_path() / "tmp";
301*6a6c8299Sjmmv     utils::setenv("TMPDIR", tmpdir.str());
302*6a6c8299Sjmmv     fs::mkdir(tmpdir, 0755);
303*6a6c8299Sjmmv 
304*6a6c8299Sjmmv     const std::string file_template("tempfile.XXXXXX");
305*6a6c8299Sjmmv     const fs::path tempfile = fs::mkstemp(file_template);
306*6a6c8299Sjmmv     ATF_REQUIRE(!lookup("tmp", file_template.c_str(), DT_REG));
307*6a6c8299Sjmmv     ATF_REQUIRE(lookup("tmp", tempfile.leaf_name().c_str(), DT_REG));
308*6a6c8299Sjmmv }
309*6a6c8299Sjmmv 
310*6a6c8299Sjmmv 
311*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(rm_r__empty);
ATF_TEST_CASE_BODY(rm_r__empty)312*6a6c8299Sjmmv ATF_TEST_CASE_BODY(rm_r__empty)
313*6a6c8299Sjmmv {
314*6a6c8299Sjmmv     fs::mkdir(fs::path("root"), 0755);
315*6a6c8299Sjmmv     ATF_REQUIRE(lookup(".", "root", DT_DIR));
316*6a6c8299Sjmmv     fs::rm_r(fs::path("root"));
317*6a6c8299Sjmmv     ATF_REQUIRE(!lookup(".", "root", DT_DIR));
318*6a6c8299Sjmmv }
319*6a6c8299Sjmmv 
320*6a6c8299Sjmmv 
321*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(rm_r__files_and_directories);
ATF_TEST_CASE_BODY(rm_r__files_and_directories)322*6a6c8299Sjmmv ATF_TEST_CASE_BODY(rm_r__files_and_directories)
323*6a6c8299Sjmmv {
324*6a6c8299Sjmmv     fs::mkdir(fs::path("root"), 0755);
325*6a6c8299Sjmmv     atf::utils::create_file("root/.hidden_file", "");
326*6a6c8299Sjmmv     fs::mkdir(fs::path("root/.hidden_dir"), 0755);
327*6a6c8299Sjmmv     atf::utils::create_file("root/.hidden_dir/a", "");
328*6a6c8299Sjmmv     atf::utils::create_file("root/file", "");
329*6a6c8299Sjmmv     atf::utils::create_file("root/with spaces", "");
330*6a6c8299Sjmmv     fs::mkdir(fs::path("root/dir1"), 0755);
331*6a6c8299Sjmmv     fs::mkdir(fs::path("root/dir1/dir2"), 0755);
332*6a6c8299Sjmmv     atf::utils::create_file("root/dir1/dir2/file", "");
333*6a6c8299Sjmmv     fs::mkdir(fs::path("root/dir1/dir3"), 0755);
334*6a6c8299Sjmmv     ATF_REQUIRE(lookup(".", "root", DT_DIR));
335*6a6c8299Sjmmv     fs::rm_r(fs::path("root"));
336*6a6c8299Sjmmv     ATF_REQUIRE(!lookup(".", "root", DT_DIR));
337*6a6c8299Sjmmv }
338*6a6c8299Sjmmv 
339*6a6c8299Sjmmv 
340*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(rmdir__ok)
ATF_TEST_CASE_BODY(rmdir__ok)341*6a6c8299Sjmmv ATF_TEST_CASE_BODY(rmdir__ok)
342*6a6c8299Sjmmv {
343*6a6c8299Sjmmv     ATF_REQUIRE(::mkdir("foo", 0755) != -1);
344*6a6c8299Sjmmv     ATF_REQUIRE(::access("foo", X_OK) == 0);
345*6a6c8299Sjmmv     fs::rmdir(fs::path("foo"));
346*6a6c8299Sjmmv     ATF_REQUIRE(::access("foo", X_OK) == -1);
347*6a6c8299Sjmmv }
348*6a6c8299Sjmmv 
349*6a6c8299Sjmmv 
350*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(rmdir__fail)
ATF_TEST_CASE_BODY(rmdir__fail)351*6a6c8299Sjmmv ATF_TEST_CASE_BODY(rmdir__fail)
352*6a6c8299Sjmmv {
353*6a6c8299Sjmmv     ATF_REQUIRE_THROW_RE(fs::system_error, "Removal of foo failed",
354*6a6c8299Sjmmv                          fs::rmdir(fs::path("foo")));
355*6a6c8299Sjmmv }
356*6a6c8299Sjmmv 
357*6a6c8299Sjmmv 
358*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(unlink__ok)
ATF_TEST_CASE_BODY(unlink__ok)359*6a6c8299Sjmmv ATF_TEST_CASE_BODY(unlink__ok)
360*6a6c8299Sjmmv {
361*6a6c8299Sjmmv     atf::utils::create_file("foo", "");
362*6a6c8299Sjmmv     ATF_REQUIRE(::access("foo", R_OK) == 0);
363*6a6c8299Sjmmv     fs::unlink(fs::path("foo"));
364*6a6c8299Sjmmv     ATF_REQUIRE(::access("foo", R_OK) == -1);
365*6a6c8299Sjmmv }
366*6a6c8299Sjmmv 
367*6a6c8299Sjmmv 
368*6a6c8299Sjmmv ATF_TEST_CASE_WITHOUT_HEAD(unlink__fail)
ATF_TEST_CASE_BODY(unlink__fail)369*6a6c8299Sjmmv ATF_TEST_CASE_BODY(unlink__fail)
370*6a6c8299Sjmmv {
371*6a6c8299Sjmmv     ATF_REQUIRE_THROW_RE(fs::system_error, "Removal of foo failed",
372*6a6c8299Sjmmv                          fs::unlink(fs::path("foo")));
373*6a6c8299Sjmmv }
374*6a6c8299Sjmmv 
375*6a6c8299Sjmmv 
ATF_INIT_TEST_CASES(tcs)376*6a6c8299Sjmmv ATF_INIT_TEST_CASES(tcs)
377*6a6c8299Sjmmv {
378*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, current_path__ok);
379*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, current_path__enoent);
380*6a6c8299Sjmmv 
381*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, exists);
382*6a6c8299Sjmmv 
383*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, find_in_path__no_path);
384*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, find_in_path__empty_path);
385*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, find_in_path__one_component);
386*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, find_in_path__many_components);
387*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, find_in_path__current_directory);
388*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, find_in_path__always_absolute);
389*6a6c8299Sjmmv 
390*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, mkdir__ok);
391*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, mkdir__enoent);
392*6a6c8299Sjmmv 
393*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, mkdir_p__one_component);
394*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, mkdir_p__many_components);
395*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, mkdir_p__already_exists);
396*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, mkdir_p__eacces);
397*6a6c8299Sjmmv 
398*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, mkdtemp);
399*6a6c8299Sjmmv 
400*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, mkstemp);
401*6a6c8299Sjmmv 
402*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, rm_r__empty);
403*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, rm_r__files_and_directories);
404*6a6c8299Sjmmv 
405*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, rmdir__ok);
406*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, rmdir__fail);
407*6a6c8299Sjmmv 
408*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, unlink__ok);
409*6a6c8299Sjmmv     ATF_ADD_TEST_CASE(tcs, unlink__fail);
410*6a6c8299Sjmmv }
411