Home | History | Annotate | Line # | Download | only in fs
      1  1.1  jmmv // Copyright 2010 Google Inc.
      2  1.1  jmmv // All rights reserved.
      3  1.1  jmmv //
      4  1.1  jmmv // Redistribution and use in source and binary forms, with or without
      5  1.1  jmmv // modification, are permitted provided that the following conditions are
      6  1.1  jmmv // met:
      7  1.1  jmmv //
      8  1.1  jmmv // * Redistributions of source code must retain the above copyright
      9  1.1  jmmv //   notice, this list of conditions and the following disclaimer.
     10  1.1  jmmv // * Redistributions in binary form must reproduce the above copyright
     11  1.1  jmmv //   notice, this list of conditions and the following disclaimer in the
     12  1.1  jmmv //   documentation and/or other materials provided with the distribution.
     13  1.1  jmmv // * Neither the name of Google Inc. nor the names of its contributors
     14  1.1  jmmv //   may be used to endorse or promote products derived from this software
     15  1.1  jmmv //   without specific prior written permission.
     16  1.1  jmmv //
     17  1.1  jmmv // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     18  1.1  jmmv // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     19  1.1  jmmv // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     20  1.1  jmmv // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     21  1.1  jmmv // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     22  1.1  jmmv // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     23  1.1  jmmv // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     24  1.1  jmmv // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     25  1.1  jmmv // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26  1.1  jmmv // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     27  1.1  jmmv // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28  1.1  jmmv 
     29  1.1  jmmv #include "utils/fs/path.hpp"
     30  1.1  jmmv 
     31  1.1  jmmv extern "C" {
     32  1.1  jmmv #include <unistd.h>
     33  1.1  jmmv }
     34  1.1  jmmv 
     35  1.1  jmmv #include <set>
     36  1.1  jmmv 
     37  1.1  jmmv #include <atf-c++.hpp>
     38  1.1  jmmv 
     39  1.1  jmmv #include "utils/fs/exceptions.hpp"
     40  1.1  jmmv 
     41  1.1  jmmv using utils::fs::invalid_path_error;
     42  1.1  jmmv using utils::fs::join_error;
     43  1.1  jmmv using utils::fs::path;
     44  1.1  jmmv 
     45  1.1  jmmv 
     46  1.1  jmmv #define REQUIRE_JOIN_ERROR(path1, path2, expr) \
     47  1.1  jmmv     try { \
     48  1.1  jmmv         expr; \
     49  1.1  jmmv         ATF_FAIL("Expecting join_error but no error raised"); \
     50  1.1  jmmv     } catch (const join_error& e) { \
     51  1.1  jmmv         ATF_REQUIRE_EQ(path1, e.textual_path1()); \
     52  1.1  jmmv         ATF_REQUIRE_EQ(path2, e.textual_path2()); \
     53  1.1  jmmv     }
     54  1.1  jmmv 
     55  1.1  jmmv 
     56  1.1  jmmv ATF_TEST_CASE_WITHOUT_HEAD(normalize__ok);
     57  1.1  jmmv ATF_TEST_CASE_BODY(normalize__ok)
     58  1.1  jmmv {
     59  1.1  jmmv     ATF_REQUIRE_EQ(".", path(".").str());
     60  1.1  jmmv     ATF_REQUIRE_EQ("..", path("..").str());
     61  1.1  jmmv     ATF_REQUIRE_EQ("/", path("/").str());
     62  1.1  jmmv     ATF_REQUIRE_EQ("/", path("///").str());
     63  1.1  jmmv 
     64  1.1  jmmv     ATF_REQUIRE_EQ("foo", path("foo").str());
     65  1.1  jmmv     ATF_REQUIRE_EQ("foo/bar", path("foo/bar").str());
     66  1.1  jmmv     ATF_REQUIRE_EQ("foo/bar", path("foo/bar/").str());
     67  1.1  jmmv 
     68  1.1  jmmv     ATF_REQUIRE_EQ("/foo", path("/foo").str());
     69  1.1  jmmv     ATF_REQUIRE_EQ("/foo/bar", path("/foo/bar").str());
     70  1.1  jmmv     ATF_REQUIRE_EQ("/foo/bar", path("/foo/bar/").str());
     71  1.1  jmmv 
     72  1.1  jmmv     ATF_REQUIRE_EQ("/foo", path("///foo").str());
     73  1.1  jmmv     ATF_REQUIRE_EQ("/foo/bar", path("///foo///bar").str());
     74  1.1  jmmv     ATF_REQUIRE_EQ("/foo/bar", path("///foo///bar///").str());
     75  1.1  jmmv 
     76  1.1  jmmv     ATF_REQUIRE_EQ("./foo/bar", path("./foo/bar").str());
     77  1.1  jmmv     ATF_REQUIRE_EQ("./foo/bar", path("./foo/./bar").str());
     78  1.1  jmmv     ATF_REQUIRE_EQ("./foo/bar", path("././foo/./bar").str());
     79  1.1  jmmv     ATF_REQUIRE_EQ("foo/bar", path("foo/././bar").str());
     80  1.1  jmmv }
     81  1.1  jmmv 
     82  1.1  jmmv 
     83  1.1  jmmv ATF_TEST_CASE_WITHOUT_HEAD(normalize__invalid);
     84  1.1  jmmv ATF_TEST_CASE_BODY(normalize__invalid)
     85  1.1  jmmv {
     86  1.1  jmmv     try {
     87  1.1  jmmv         path("");
     88  1.1  jmmv         fail("invalid_path_error not raised");
     89  1.1  jmmv     } catch (const invalid_path_error& e) {
     90  1.1  jmmv         ATF_REQUIRE(e.invalid_path().empty());
     91  1.1  jmmv     }
     92  1.1  jmmv }
     93  1.1  jmmv 
     94  1.1  jmmv 
     95  1.1  jmmv ATF_TEST_CASE_WITHOUT_HEAD(is_absolute);
     96  1.1  jmmv ATF_TEST_CASE_BODY(is_absolute)
     97  1.1  jmmv {
     98  1.1  jmmv     ATF_REQUIRE( path("/").is_absolute());
     99  1.1  jmmv     ATF_REQUIRE( path("////").is_absolute());
    100  1.1  jmmv     ATF_REQUIRE( path("////a").is_absolute());
    101  1.1  jmmv     ATF_REQUIRE( path("//a//").is_absolute());
    102  1.1  jmmv     ATF_REQUIRE(!path("a////").is_absolute());
    103  1.1  jmmv     ATF_REQUIRE(!path("../foo").is_absolute());
    104  1.1  jmmv }
    105  1.1  jmmv 
    106  1.1  jmmv 
    107  1.1  jmmv ATF_TEST_CASE_WITHOUT_HEAD(is_parent_of);
    108  1.1  jmmv ATF_TEST_CASE_BODY(is_parent_of)
    109  1.1  jmmv {
    110  1.1  jmmv     ATF_REQUIRE( path("/").is_parent_of(path("/")));
    111  1.1  jmmv     ATF_REQUIRE( path(".").is_parent_of(path(".")));
    112  1.1  jmmv     ATF_REQUIRE( path("/a").is_parent_of(path("/a")));
    113  1.1  jmmv     ATF_REQUIRE( path("/a/b/c").is_parent_of(path("/a/b/c")));
    114  1.1  jmmv     ATF_REQUIRE( path("a").is_parent_of(path("a")));
    115  1.1  jmmv     ATF_REQUIRE( path("a/b/c").is_parent_of(path("a/b/c")));
    116  1.1  jmmv 
    117  1.1  jmmv     ATF_REQUIRE( path("/a/b/c").is_parent_of(path("/a/b/c/d")));
    118  1.1  jmmv     ATF_REQUIRE( path("/a/b/c").is_parent_of(path("/a/b/c/d/e")));
    119  1.1  jmmv     ATF_REQUIRE(!path("/a/b/c").is_parent_of(path("a/b/c")));
    120  1.1  jmmv     ATF_REQUIRE(!path("/a/b/c").is_parent_of(path("a/b/c/d/e")));
    121  1.1  jmmv 
    122  1.1  jmmv     ATF_REQUIRE( path("a/b/c").is_parent_of(path("a/b/c/d")));
    123  1.1  jmmv     ATF_REQUIRE( path("a/b/c").is_parent_of(path("a/b/c/d/e")));
    124  1.1  jmmv     ATF_REQUIRE(!path("a/b/c").is_parent_of(path("/a/b/c")));
    125  1.1  jmmv     ATF_REQUIRE(!path("a/b/c").is_parent_of(path("/a/b/c/d/e")));
    126  1.1  jmmv 
    127  1.1  jmmv     ATF_REQUIRE(!path("/a/b/c/d/e").is_parent_of(path("/a/b/c")));
    128  1.1  jmmv     ATF_REQUIRE(!path("/a/b/c/d/e").is_parent_of(path("a/b/c")));
    129  1.1  jmmv     ATF_REQUIRE(!path("a/b/c/d/e").is_parent_of(path("/a/b/c")));
    130  1.1  jmmv     ATF_REQUIRE(!path("a/b/c/d/e").is_parent_of(path("a/b/c")));
    131  1.1  jmmv }
    132  1.1  jmmv 
    133  1.1  jmmv 
    134  1.1  jmmv ATF_TEST_CASE_WITHOUT_HEAD(ncomponents);
    135  1.1  jmmv ATF_TEST_CASE_BODY(ncomponents)
    136  1.1  jmmv {
    137  1.1  jmmv     ATF_REQUIRE_EQ(1, path(".").ncomponents());
    138  1.1  jmmv     ATF_REQUIRE_EQ(1, path("/").ncomponents());
    139  1.1  jmmv 
    140  1.1  jmmv     ATF_REQUIRE_EQ(1, path("abc").ncomponents());
    141  1.1  jmmv     ATF_REQUIRE_EQ(1, path("abc/").ncomponents());
    142  1.1  jmmv 
    143  1.1  jmmv     ATF_REQUIRE_EQ(2, path("/abc").ncomponents());
    144  1.1  jmmv     ATF_REQUIRE_EQ(3, path("/abc/def").ncomponents());
    145  1.1  jmmv 
    146  1.1  jmmv     ATF_REQUIRE_EQ(2, path("abc/def").ncomponents());
    147  1.1  jmmv }
    148  1.1  jmmv 
    149  1.1  jmmv 
    150  1.1  jmmv ATF_TEST_CASE_WITHOUT_HEAD(branch_path);
    151  1.1  jmmv ATF_TEST_CASE_BODY(branch_path)
    152  1.1  jmmv {
    153  1.1  jmmv     ATF_REQUIRE_EQ(".", path(".").branch_path().str());
    154  1.1  jmmv     ATF_REQUIRE_EQ(".", path("foo").branch_path().str());
    155  1.1  jmmv     ATF_REQUIRE_EQ("foo", path("foo/bar").branch_path().str());
    156  1.1  jmmv     ATF_REQUIRE_EQ("/", path("/foo").branch_path().str());
    157  1.1  jmmv     ATF_REQUIRE_EQ("/foo", path("/foo/bar").branch_path().str());
    158  1.1  jmmv }
    159  1.1  jmmv 
    160  1.1  jmmv 
    161  1.1  jmmv ATF_TEST_CASE_WITHOUT_HEAD(leaf_name);
    162  1.1  jmmv ATF_TEST_CASE_BODY(leaf_name)
    163  1.1  jmmv {
    164  1.1  jmmv     ATF_REQUIRE_EQ(".", path(".").leaf_name());
    165  1.1  jmmv     ATF_REQUIRE_EQ("foo", path("foo").leaf_name());
    166  1.1  jmmv     ATF_REQUIRE_EQ("bar", path("foo/bar").leaf_name());
    167  1.1  jmmv     ATF_REQUIRE_EQ("foo", path("/foo").leaf_name());
    168  1.1  jmmv     ATF_REQUIRE_EQ("bar", path("/foo/bar").leaf_name());
    169  1.1  jmmv }
    170  1.1  jmmv 
    171  1.1  jmmv 
    172  1.1  jmmv ATF_TEST_CASE_WITHOUT_HEAD(to_absolute);
    173  1.1  jmmv ATF_TEST_CASE_BODY(to_absolute)
    174  1.1  jmmv {
    175  1.1  jmmv     ATF_REQUIRE(::chdir("/bin") != -1);
    176  1.1  jmmv     const std::string absolute = path("ls").to_absolute().str();
    177  1.1  jmmv     // In some systems (e.g. in Fedora 17), /bin is really a symlink to
    178  1.1  jmmv     // /usr/bin.  Doing an explicit match of 'absolute' to /bin/ls fails in such
    179  1.1  jmmv     // case.  Instead, attempt doing a search in the generated path just for a
    180  1.1  jmmv     // substring containing '/bin/ls'.  Note that this can still fail if /bin is
    181  1.1  jmmv     // linked to something arbitrary like /a/b... but let's just assume this
    182  1.1  jmmv     // does not happen.
    183  1.1  jmmv     ATF_REQUIRE(absolute.find("/bin/ls") != std::string::npos);
    184  1.1  jmmv }
    185  1.1  jmmv 
    186  1.1  jmmv 
    187  1.1  jmmv ATF_TEST_CASE_WITHOUT_HEAD(compare_less_than);
    188  1.1  jmmv ATF_TEST_CASE_BODY(compare_less_than)
    189  1.1  jmmv {
    190  1.1  jmmv     ATF_REQUIRE(!(path("/") < path("/")));
    191  1.1  jmmv     ATF_REQUIRE(!(path("/") < path("///")));
    192  1.1  jmmv 
    193  1.1  jmmv     ATF_REQUIRE(!(path("/a/b/c") < path("/a/b/c")));
    194  1.1  jmmv 
    195  1.1  jmmv     ATF_REQUIRE(  path("/a") < path("/b"));
    196  1.1  jmmv     ATF_REQUIRE(!(path("/b") < path("/a")));
    197  1.1  jmmv 
    198  1.1  jmmv     ATF_REQUIRE(  path("/a") < path("/aa"));
    199  1.1  jmmv     ATF_REQUIRE(!(path("/aa") < path("/a")));
    200  1.1  jmmv }
    201  1.1  jmmv 
    202  1.1  jmmv 
    203  1.1  jmmv ATF_TEST_CASE_WITHOUT_HEAD(compare_equal);
    204  1.1  jmmv ATF_TEST_CASE_BODY(compare_equal)
    205  1.1  jmmv {
    206  1.1  jmmv     ATF_REQUIRE(path("/") == path("///"));
    207  1.1  jmmv     ATF_REQUIRE(path("/a") == path("///a"));
    208  1.1  jmmv     ATF_REQUIRE(path("/a") == path("///a///"));
    209  1.1  jmmv 
    210  1.1  jmmv     ATF_REQUIRE(path("a/b/c") == path("a//b//c"));
    211  1.1  jmmv     ATF_REQUIRE(path("a/b/c") == path("a//b//c///"));
    212  1.1  jmmv }
    213  1.1  jmmv 
    214  1.1  jmmv 
    215  1.1  jmmv ATF_TEST_CASE_WITHOUT_HEAD(compare_different);
    216  1.1  jmmv ATF_TEST_CASE_BODY(compare_different)
    217  1.1  jmmv {
    218  1.1  jmmv     ATF_REQUIRE(path("/") != path("//a/"));
    219  1.1  jmmv     ATF_REQUIRE(path("/a") != path("a///"));
    220  1.1  jmmv 
    221  1.1  jmmv     ATF_REQUIRE(path("a/b/c") != path("a/b"));
    222  1.1  jmmv     ATF_REQUIRE(path("a/b/c") != path("a//b"));
    223  1.1  jmmv     ATF_REQUIRE(path("a/b/c") != path("/a/b/c"));
    224  1.1  jmmv     ATF_REQUIRE(path("a/b/c") != path("/a//b//c"));
    225  1.1  jmmv }
    226  1.1  jmmv 
    227  1.1  jmmv 
    228  1.1  jmmv ATF_TEST_CASE_WITHOUT_HEAD(concat__to_string);
    229  1.1  jmmv ATF_TEST_CASE_BODY(concat__to_string)
    230  1.1  jmmv {
    231  1.1  jmmv     ATF_REQUIRE_EQ("foo/bar", (path("foo") / "bar").str());
    232  1.1  jmmv     ATF_REQUIRE_EQ("foo/bar", (path("foo/") / "bar").str());
    233  1.1  jmmv     ATF_REQUIRE_EQ("foo/bar/baz", (path("foo/") / "bar//baz///").str());
    234  1.1  jmmv 
    235  1.1  jmmv     ATF_REQUIRE_THROW(invalid_path_error, path("foo") / "");
    236  1.1  jmmv     REQUIRE_JOIN_ERROR("foo", "/a/b", path("foo") / "/a/b");
    237  1.1  jmmv }
    238  1.1  jmmv 
    239  1.1  jmmv 
    240  1.1  jmmv ATF_TEST_CASE_WITHOUT_HEAD(concat__to_path);
    241  1.1  jmmv ATF_TEST_CASE_BODY(concat__to_path)
    242  1.1  jmmv {
    243  1.1  jmmv     ATF_REQUIRE_EQ("foo/bar", (path("foo") / "bar").str());
    244  1.1  jmmv     ATF_REQUIRE_EQ("foo/bar", (path("foo/") / "bar").str());
    245  1.1  jmmv     ATF_REQUIRE_EQ("foo/bar/baz", (path("foo/") / "bar//baz///").str());
    246  1.1  jmmv 
    247  1.1  jmmv     REQUIRE_JOIN_ERROR("foo", "/a/b", path("foo") / path("/a/b"));
    248  1.1  jmmv }
    249  1.1  jmmv 
    250  1.1  jmmv 
    251  1.1  jmmv ATF_TEST_CASE_WITHOUT_HEAD(use_as_key);
    252  1.1  jmmv ATF_TEST_CASE_BODY(use_as_key)
    253  1.1  jmmv {
    254  1.1  jmmv     std::set< path > paths;
    255  1.1  jmmv     paths.insert(path("/a"));
    256  1.1  jmmv     ATF_REQUIRE(paths.find(path("//a")) != paths.end());
    257  1.1  jmmv     ATF_REQUIRE(paths.find(path("a")) == paths.end());
    258  1.1  jmmv }
    259  1.1  jmmv 
    260  1.1  jmmv 
    261  1.1  jmmv ATF_INIT_TEST_CASES(tcs)
    262  1.1  jmmv {
    263  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, normalize__ok);
    264  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, normalize__invalid);
    265  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, is_absolute);
    266  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, is_parent_of);
    267  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, ncomponents);
    268  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, branch_path);
    269  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, leaf_name);
    270  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, to_absolute);
    271  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, compare_less_than);
    272  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, compare_equal);
    273  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, compare_different);
    274  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, concat__to_string);
    275  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, concat__to_path);
    276  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, use_as_key);
    277  1.1  jmmv }
    278