1*b0d29bc4SBrooks Davis // Copyright 2015 The Kyua Authors.
2*b0d29bc4SBrooks Davis // All rights reserved.
3*b0d29bc4SBrooks Davis //
4*b0d29bc4SBrooks Davis // Redistribution and use in source and binary forms, with or without
5*b0d29bc4SBrooks Davis // modification, are permitted provided that the following conditions are
6*b0d29bc4SBrooks Davis // met:
7*b0d29bc4SBrooks Davis //
8*b0d29bc4SBrooks Davis // * Redistributions of source code must retain the above copyright
9*b0d29bc4SBrooks Davis // notice, this list of conditions and the following disclaimer.
10*b0d29bc4SBrooks Davis // * Redistributions in binary form must reproduce the above copyright
11*b0d29bc4SBrooks Davis // notice, this list of conditions and the following disclaimer in the
12*b0d29bc4SBrooks Davis // documentation and/or other materials provided with the distribution.
13*b0d29bc4SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors
14*b0d29bc4SBrooks Davis // may be used to endorse or promote products derived from this software
15*b0d29bc4SBrooks Davis // without specific prior written permission.
16*b0d29bc4SBrooks Davis //
17*b0d29bc4SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*b0d29bc4SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*b0d29bc4SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*b0d29bc4SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*b0d29bc4SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*b0d29bc4SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*b0d29bc4SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*b0d29bc4SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*b0d29bc4SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*b0d29bc4SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*b0d29bc4SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*b0d29bc4SBrooks Davis
29*b0d29bc4SBrooks Davis #include "utils/fs/directory.hpp"
30*b0d29bc4SBrooks Davis
31*b0d29bc4SBrooks Davis #include <sstream>
32*b0d29bc4SBrooks Davis
33*b0d29bc4SBrooks Davis #include <atf-c++.hpp>
34*b0d29bc4SBrooks Davis
35*b0d29bc4SBrooks Davis #include "utils/format/containers.ipp"
36*b0d29bc4SBrooks Davis #include "utils/fs/exceptions.hpp"
37*b0d29bc4SBrooks Davis #include "utils/fs/operations.hpp"
38*b0d29bc4SBrooks Davis #include "utils/fs/path.hpp"
39*b0d29bc4SBrooks Davis
40*b0d29bc4SBrooks Davis namespace fs = utils::fs;
41*b0d29bc4SBrooks Davis
42*b0d29bc4SBrooks Davis
43*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(directory_entry__public_fields);
ATF_TEST_CASE_BODY(directory_entry__public_fields)44*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(directory_entry__public_fields)
45*b0d29bc4SBrooks Davis {
46*b0d29bc4SBrooks Davis const fs::directory_entry entry("name");
47*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("name", entry.name);
48*b0d29bc4SBrooks Davis }
49*b0d29bc4SBrooks Davis
50*b0d29bc4SBrooks Davis
51*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(directory_entry__equality);
ATF_TEST_CASE_BODY(directory_entry__equality)52*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(directory_entry__equality)
53*b0d29bc4SBrooks Davis {
54*b0d29bc4SBrooks Davis const fs::directory_entry entry1("name");
55*b0d29bc4SBrooks Davis const fs::directory_entry entry2("other-name");
56*b0d29bc4SBrooks Davis
57*b0d29bc4SBrooks Davis ATF_REQUIRE( entry1 == entry1);
58*b0d29bc4SBrooks Davis ATF_REQUIRE(!(entry1 != entry1));
59*b0d29bc4SBrooks Davis
60*b0d29bc4SBrooks Davis ATF_REQUIRE(!(entry1 == entry2));
61*b0d29bc4SBrooks Davis ATF_REQUIRE( entry1 != entry2);
62*b0d29bc4SBrooks Davis }
63*b0d29bc4SBrooks Davis
64*b0d29bc4SBrooks Davis
65*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(directory_entry__sorting);
ATF_TEST_CASE_BODY(directory_entry__sorting)66*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(directory_entry__sorting)
67*b0d29bc4SBrooks Davis {
68*b0d29bc4SBrooks Davis const fs::directory_entry entry1("name");
69*b0d29bc4SBrooks Davis const fs::directory_entry entry2("other-name");
70*b0d29bc4SBrooks Davis
71*b0d29bc4SBrooks Davis ATF_REQUIRE(!(entry1 < entry1));
72*b0d29bc4SBrooks Davis ATF_REQUIRE(!(entry2 < entry2));
73*b0d29bc4SBrooks Davis ATF_REQUIRE( entry1 < entry2);
74*b0d29bc4SBrooks Davis ATF_REQUIRE(!(entry2 < entry1));
75*b0d29bc4SBrooks Davis }
76*b0d29bc4SBrooks Davis
77*b0d29bc4SBrooks Davis
78*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(directory_entry__format);
ATF_TEST_CASE_BODY(directory_entry__format)79*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(directory_entry__format)
80*b0d29bc4SBrooks Davis {
81*b0d29bc4SBrooks Davis const fs::directory_entry entry("this is the name");
82*b0d29bc4SBrooks Davis std::ostringstream output;
83*b0d29bc4SBrooks Davis output << entry;
84*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("directory_entry{name='this is the name'}", output.str());
85*b0d29bc4SBrooks Davis }
86*b0d29bc4SBrooks Davis
87*b0d29bc4SBrooks Davis
88*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(integration__empty);
ATF_TEST_CASE_BODY(integration__empty)89*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(integration__empty)
90*b0d29bc4SBrooks Davis {
91*b0d29bc4SBrooks Davis fs::mkdir(fs::path("empty"), 0755);
92*b0d29bc4SBrooks Davis
93*b0d29bc4SBrooks Davis std::set< fs::directory_entry > contents;
94*b0d29bc4SBrooks Davis const fs::directory dir(fs::path("empty"));
95*b0d29bc4SBrooks Davis for (fs::directory::const_iterator iter = dir.begin(); iter != dir.end();
96*b0d29bc4SBrooks Davis ++iter) {
97*b0d29bc4SBrooks Davis contents.insert(*iter);
98*b0d29bc4SBrooks Davis // While we are here, make sure both * and -> represent the same.
99*b0d29bc4SBrooks Davis ATF_REQUIRE((*iter).name == iter->name);
100*b0d29bc4SBrooks Davis }
101*b0d29bc4SBrooks Davis
102*b0d29bc4SBrooks Davis std::set< fs::directory_entry > exp_contents;
103*b0d29bc4SBrooks Davis exp_contents.insert(fs::directory_entry("."));
104*b0d29bc4SBrooks Davis exp_contents.insert(fs::directory_entry(".."));
105*b0d29bc4SBrooks Davis
106*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(exp_contents, contents);
107*b0d29bc4SBrooks Davis }
108*b0d29bc4SBrooks Davis
109*b0d29bc4SBrooks Davis
110*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(integration__some_contents);
ATF_TEST_CASE_BODY(integration__some_contents)111*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(integration__some_contents)
112*b0d29bc4SBrooks Davis {
113*b0d29bc4SBrooks Davis fs::mkdir(fs::path("full"), 0755);
114*b0d29bc4SBrooks Davis atf::utils::create_file("full/a file", "");
115*b0d29bc4SBrooks Davis atf::utils::create_file("full/something-else", "");
116*b0d29bc4SBrooks Davis atf::utils::create_file("full/.hidden", "");
117*b0d29bc4SBrooks Davis fs::mkdir(fs::path("full/subdir"), 0755);
118*b0d29bc4SBrooks Davis atf::utils::create_file("full/subdir/not-listed", "");
119*b0d29bc4SBrooks Davis
120*b0d29bc4SBrooks Davis std::set< fs::directory_entry > contents;
121*b0d29bc4SBrooks Davis const fs::directory dir(fs::path("full"));
122*b0d29bc4SBrooks Davis for (fs::directory::const_iterator iter = dir.begin(); iter != dir.end();
123*b0d29bc4SBrooks Davis ++iter) {
124*b0d29bc4SBrooks Davis contents.insert(*iter);
125*b0d29bc4SBrooks Davis // While we are here, make sure both * and -> represent the same.
126*b0d29bc4SBrooks Davis ATF_REQUIRE((*iter).name == iter->name);
127*b0d29bc4SBrooks Davis }
128*b0d29bc4SBrooks Davis
129*b0d29bc4SBrooks Davis std::set< fs::directory_entry > exp_contents;
130*b0d29bc4SBrooks Davis exp_contents.insert(fs::directory_entry("."));
131*b0d29bc4SBrooks Davis exp_contents.insert(fs::directory_entry(".."));
132*b0d29bc4SBrooks Davis exp_contents.insert(fs::directory_entry(".hidden"));
133*b0d29bc4SBrooks Davis exp_contents.insert(fs::directory_entry("a file"));
134*b0d29bc4SBrooks Davis exp_contents.insert(fs::directory_entry("something-else"));
135*b0d29bc4SBrooks Davis exp_contents.insert(fs::directory_entry("subdir"));
136*b0d29bc4SBrooks Davis
137*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(exp_contents, contents);
138*b0d29bc4SBrooks Davis }
139*b0d29bc4SBrooks Davis
140*b0d29bc4SBrooks Davis
141*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(integration__open_failure);
ATF_TEST_CASE_BODY(integration__open_failure)142*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(integration__open_failure)
143*b0d29bc4SBrooks Davis {
144*b0d29bc4SBrooks Davis const fs::directory directory(fs::path("non-existent"));
145*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW_RE(fs::system_error, "opendir(.*non-existent.*) failed",
146*b0d29bc4SBrooks Davis directory.begin());
147*b0d29bc4SBrooks Davis }
148*b0d29bc4SBrooks Davis
149*b0d29bc4SBrooks Davis
150*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(integration__iterators_equality);
ATF_TEST_CASE_BODY(integration__iterators_equality)151*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(integration__iterators_equality)
152*b0d29bc4SBrooks Davis {
153*b0d29bc4SBrooks Davis const fs::directory directory(fs::path("."));
154*b0d29bc4SBrooks Davis
155*b0d29bc4SBrooks Davis fs::directory::const_iterator iter_ok1 = directory.begin();
156*b0d29bc4SBrooks Davis fs::directory::const_iterator iter_ok2 = directory.begin();
157*b0d29bc4SBrooks Davis fs::directory::const_iterator iter_end = directory.end();
158*b0d29bc4SBrooks Davis
159*b0d29bc4SBrooks Davis ATF_REQUIRE( iter_ok1 == iter_ok1);
160*b0d29bc4SBrooks Davis ATF_REQUIRE(!(iter_ok1 != iter_ok1));
161*b0d29bc4SBrooks Davis
162*b0d29bc4SBrooks Davis ATF_REQUIRE( iter_ok2 == iter_ok2);
163*b0d29bc4SBrooks Davis ATF_REQUIRE(!(iter_ok2 != iter_ok2));
164*b0d29bc4SBrooks Davis
165*b0d29bc4SBrooks Davis ATF_REQUIRE(!(iter_ok1 == iter_ok2));
166*b0d29bc4SBrooks Davis ATF_REQUIRE( iter_ok1 != iter_ok2);
167*b0d29bc4SBrooks Davis
168*b0d29bc4SBrooks Davis ATF_REQUIRE(!(iter_ok1 == iter_end));
169*b0d29bc4SBrooks Davis ATF_REQUIRE( iter_ok1 != iter_end);
170*b0d29bc4SBrooks Davis
171*b0d29bc4SBrooks Davis ATF_REQUIRE(!(iter_ok2 == iter_end));
172*b0d29bc4SBrooks Davis ATF_REQUIRE( iter_ok2 != iter_end);
173*b0d29bc4SBrooks Davis
174*b0d29bc4SBrooks Davis ATF_REQUIRE( iter_end == iter_end);
175*b0d29bc4SBrooks Davis ATF_REQUIRE(!(iter_end != iter_end));
176*b0d29bc4SBrooks Davis }
177*b0d29bc4SBrooks Davis
178*b0d29bc4SBrooks Davis
ATF_INIT_TEST_CASES(tcs)179*b0d29bc4SBrooks Davis ATF_INIT_TEST_CASES(tcs)
180*b0d29bc4SBrooks Davis {
181*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, directory_entry__public_fields);
182*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, directory_entry__equality);
183*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, directory_entry__sorting);
184*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, directory_entry__format);
185*b0d29bc4SBrooks Davis
186*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, integration__empty);
187*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, integration__some_contents);
188*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, integration__open_failure);
189*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, integration__iterators_equality);
190*b0d29bc4SBrooks Davis }
191