Home | History | Annotate | Line # | Download | only in tools
      1  1.1  jmmv //
      2  1.1  jmmv // Automated Testing Framework (atf)
      3  1.1  jmmv //
      4  1.1  jmmv // Copyright (c) 2007 The NetBSD Foundation, Inc.
      5  1.1  jmmv // All rights reserved.
      6  1.1  jmmv //
      7  1.1  jmmv // Redistribution and use in source and binary forms, with or without
      8  1.1  jmmv // modification, are permitted provided that the following conditions
      9  1.1  jmmv // are met:
     10  1.1  jmmv // 1. Redistributions of source code must retain the above copyright
     11  1.1  jmmv //    notice, this list of conditions and the following disclaimer.
     12  1.1  jmmv // 2. Redistributions in binary form must reproduce the above copyright
     13  1.1  jmmv //    notice, this list of conditions and the following disclaimer in the
     14  1.1  jmmv //    documentation and/or other materials provided with the distribution.
     15  1.1  jmmv //
     16  1.1  jmmv // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
     17  1.1  jmmv // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
     18  1.1  jmmv // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     19  1.1  jmmv // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     20  1.1  jmmv // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
     21  1.1  jmmv // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     22  1.1  jmmv // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
     23  1.1  jmmv // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     24  1.1  jmmv // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
     25  1.1  jmmv // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     26  1.1  jmmv // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     27  1.1  jmmv // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28  1.1  jmmv //
     29  1.1  jmmv 
     30  1.1  jmmv extern "C" {
     31  1.1  jmmv #include <sys/types.h>
     32  1.1  jmmv #include <sys/stat.h>
     33  1.1  jmmv }
     34  1.1  jmmv 
     35  1.1  jmmv #include <cerrno>
     36  1.1  jmmv #include <cstdio>
     37  1.1  jmmv #include <fstream>
     38  1.1  jmmv 
     39  1.1  jmmv #include <atf-c++.hpp>
     40  1.1  jmmv 
     41  1.1  jmmv #include "exceptions.hpp"
     42  1.1  jmmv #include "fs.hpp"
     43  1.1  jmmv #include "user.hpp"
     44  1.1  jmmv 
     45  1.1  jmmv // ------------------------------------------------------------------------
     46  1.1  jmmv // Auxiliary functions.
     47  1.1  jmmv // ------------------------------------------------------------------------
     48  1.1  jmmv 
     49  1.1  jmmv static
     50  1.1  jmmv void
     51  1.1  jmmv create_file(const char *name)
     52  1.1  jmmv {
     53  1.1  jmmv     std::ofstream os(name);
     54  1.1  jmmv     os.close();
     55  1.1  jmmv }
     56  1.1  jmmv 
     57  1.1  jmmv static
     58  1.1  jmmv void
     59  1.1  jmmv create_files(void)
     60  1.1  jmmv {
     61  1.1  jmmv     ::mkdir("files", 0755);
     62  1.1  jmmv     ::mkdir("files/dir", 0755);
     63  1.1  jmmv 
     64  1.1  jmmv     std::ofstream os("files/reg");
     65  1.1  jmmv     os.close();
     66  1.1  jmmv 
     67  1.1  jmmv     // TODO: Should create all other file types (blk, chr, fifo, lnk, sock)
     68  1.1  jmmv     // and test for them... but the underlying file system may not support
     69  1.1  jmmv     // most of these.  Specially as we are working on /tmp, which can be
     70  1.1  jmmv     // mounted with flags such as "nodev".  See how to deal with this
     71  1.1  jmmv     // situation.
     72  1.1  jmmv }
     73  1.1  jmmv 
     74  1.1  jmmv // ------------------------------------------------------------------------
     75  1.1  jmmv // Test cases for the "path" class.
     76  1.1  jmmv // ------------------------------------------------------------------------
     77  1.1  jmmv 
     78  1.1  jmmv ATF_TEST_CASE(path_normalize);
     79  1.1  jmmv ATF_TEST_CASE_HEAD(path_normalize)
     80  1.1  jmmv {
     81  1.1  jmmv     set_md_var("descr", "Tests the path's normalization");
     82  1.1  jmmv }
     83  1.1  jmmv ATF_TEST_CASE_BODY(path_normalize)
     84  1.1  jmmv {
     85  1.1  jmmv     using tools::fs::path;
     86  1.1  jmmv 
     87  1.1  jmmv     ATF_REQUIRE_EQ(path(".").str(), ".");
     88  1.1  jmmv     ATF_REQUIRE_EQ(path("..").str(), "..");
     89  1.1  jmmv 
     90  1.1  jmmv     ATF_REQUIRE_EQ(path("foo").str(), "foo");
     91  1.1  jmmv     ATF_REQUIRE_EQ(path("foo/bar").str(), "foo/bar");
     92  1.1  jmmv     ATF_REQUIRE_EQ(path("foo/bar/").str(), "foo/bar");
     93  1.1  jmmv 
     94  1.1  jmmv     ATF_REQUIRE_EQ(path("/foo").str(), "/foo");
     95  1.1  jmmv     ATF_REQUIRE_EQ(path("/foo/bar").str(), "/foo/bar");
     96  1.1  jmmv     ATF_REQUIRE_EQ(path("/foo/bar/").str(), "/foo/bar");
     97  1.1  jmmv 
     98  1.1  jmmv     ATF_REQUIRE_EQ(path("///foo").str(), "/foo");
     99  1.1  jmmv     ATF_REQUIRE_EQ(path("///foo///bar").str(), "/foo/bar");
    100  1.1  jmmv     ATF_REQUIRE_EQ(path("///foo///bar///").str(), "/foo/bar");
    101  1.1  jmmv }
    102  1.1  jmmv 
    103  1.1  jmmv ATF_TEST_CASE(path_is_absolute);
    104  1.1  jmmv ATF_TEST_CASE_HEAD(path_is_absolute)
    105  1.1  jmmv {
    106  1.1  jmmv     set_md_var("descr", "Tests the path::is_absolute function");
    107  1.1  jmmv }
    108  1.1  jmmv ATF_TEST_CASE_BODY(path_is_absolute)
    109  1.1  jmmv {
    110  1.1  jmmv     using tools::fs::path;
    111  1.1  jmmv 
    112  1.1  jmmv     ATF_REQUIRE( path("/").is_absolute());
    113  1.1  jmmv     ATF_REQUIRE( path("////").is_absolute());
    114  1.1  jmmv     ATF_REQUIRE( path("////a").is_absolute());
    115  1.1  jmmv     ATF_REQUIRE( path("//a//").is_absolute());
    116  1.1  jmmv     ATF_REQUIRE(!path("a////").is_absolute());
    117  1.1  jmmv     ATF_REQUIRE(!path("../foo").is_absolute());
    118  1.1  jmmv }
    119  1.1  jmmv 
    120  1.1  jmmv ATF_TEST_CASE(path_is_root);
    121  1.1  jmmv ATF_TEST_CASE_HEAD(path_is_root)
    122  1.1  jmmv {
    123  1.1  jmmv     set_md_var("descr", "Tests the path::is_root function");
    124  1.1  jmmv }
    125  1.1  jmmv ATF_TEST_CASE_BODY(path_is_root)
    126  1.1  jmmv {
    127  1.1  jmmv     using tools::fs::path;
    128  1.1  jmmv 
    129  1.1  jmmv     ATF_REQUIRE( path("/").is_root());
    130  1.1  jmmv     ATF_REQUIRE( path("////").is_root());
    131  1.1  jmmv     ATF_REQUIRE(!path("////a").is_root());
    132  1.1  jmmv     ATF_REQUIRE(!path("//a//").is_root());
    133  1.1  jmmv     ATF_REQUIRE(!path("a////").is_root());
    134  1.1  jmmv     ATF_REQUIRE(!path("../foo").is_root());
    135  1.1  jmmv }
    136  1.1  jmmv 
    137  1.1  jmmv ATF_TEST_CASE(path_branch_path);
    138  1.1  jmmv ATF_TEST_CASE_HEAD(path_branch_path)
    139  1.1  jmmv {
    140  1.1  jmmv     set_md_var("descr", "Tests the path::branch_path function");
    141  1.1  jmmv }
    142  1.1  jmmv ATF_TEST_CASE_BODY(path_branch_path)
    143  1.1  jmmv {
    144  1.1  jmmv     using tools::fs::path;
    145  1.1  jmmv 
    146  1.1  jmmv     ATF_REQUIRE_EQ(path(".").branch_path().str(), ".");
    147  1.1  jmmv     ATF_REQUIRE_EQ(path("foo").branch_path().str(), ".");
    148  1.1  jmmv     ATF_REQUIRE_EQ(path("foo/bar").branch_path().str(), "foo");
    149  1.1  jmmv     ATF_REQUIRE_EQ(path("/foo").branch_path().str(), "/");
    150  1.1  jmmv     ATF_REQUIRE_EQ(path("/foo/bar").branch_path().str(), "/foo");
    151  1.1  jmmv }
    152  1.1  jmmv 
    153  1.1  jmmv ATF_TEST_CASE(path_leaf_name);
    154  1.1  jmmv ATF_TEST_CASE_HEAD(path_leaf_name)
    155  1.1  jmmv {
    156  1.1  jmmv     set_md_var("descr", "Tests the path::leaf_name function");
    157  1.1  jmmv }
    158  1.1  jmmv ATF_TEST_CASE_BODY(path_leaf_name)
    159  1.1  jmmv {
    160  1.1  jmmv     using tools::fs::path;
    161  1.1  jmmv 
    162  1.1  jmmv     ATF_REQUIRE_EQ(path(".").leaf_name(), ".");
    163  1.1  jmmv     ATF_REQUIRE_EQ(path("foo").leaf_name(), "foo");
    164  1.1  jmmv     ATF_REQUIRE_EQ(path("foo/bar").leaf_name(), "bar");
    165  1.1  jmmv     ATF_REQUIRE_EQ(path("/foo").leaf_name(), "foo");
    166  1.1  jmmv     ATF_REQUIRE_EQ(path("/foo/bar").leaf_name(), "bar");
    167  1.1  jmmv }
    168  1.1  jmmv 
    169  1.1  jmmv ATF_TEST_CASE(path_compare_equal);
    170  1.1  jmmv ATF_TEST_CASE_HEAD(path_compare_equal)
    171  1.1  jmmv {
    172  1.1  jmmv     set_md_var("descr", "Tests the comparison for equality between paths");
    173  1.1  jmmv }
    174  1.1  jmmv ATF_TEST_CASE_BODY(path_compare_equal)
    175  1.1  jmmv {
    176  1.1  jmmv     using tools::fs::path;
    177  1.1  jmmv 
    178  1.1  jmmv     ATF_REQUIRE(path("/") == path("///"));
    179  1.1  jmmv     ATF_REQUIRE(path("/a") == path("///a"));
    180  1.1  jmmv     ATF_REQUIRE(path("/a") == path("///a///"));
    181  1.1  jmmv 
    182  1.1  jmmv     ATF_REQUIRE(path("a/b/c") == path("a//b//c"));
    183  1.1  jmmv     ATF_REQUIRE(path("a/b/c") == path("a//b//c///"));
    184  1.1  jmmv }
    185  1.1  jmmv 
    186  1.1  jmmv ATF_TEST_CASE(path_compare_different);
    187  1.1  jmmv ATF_TEST_CASE_HEAD(path_compare_different)
    188  1.1  jmmv {
    189  1.1  jmmv     set_md_var("descr", "Tests the comparison for difference between paths");
    190  1.1  jmmv }
    191  1.1  jmmv ATF_TEST_CASE_BODY(path_compare_different)
    192  1.1  jmmv {
    193  1.1  jmmv     using tools::fs::path;
    194  1.1  jmmv 
    195  1.1  jmmv     ATF_REQUIRE(path("/") != path("//a/"));
    196  1.1  jmmv     ATF_REQUIRE(path("/a") != path("a///"));
    197  1.1  jmmv 
    198  1.1  jmmv     ATF_REQUIRE(path("a/b/c") != path("a/b"));
    199  1.1  jmmv     ATF_REQUIRE(path("a/b/c") != path("a//b"));
    200  1.1  jmmv     ATF_REQUIRE(path("a/b/c") != path("/a/b/c"));
    201  1.1  jmmv     ATF_REQUIRE(path("a/b/c") != path("/a//b//c"));
    202  1.1  jmmv }
    203  1.1  jmmv 
    204  1.1  jmmv ATF_TEST_CASE(path_concat);
    205  1.1  jmmv ATF_TEST_CASE_HEAD(path_concat)
    206  1.1  jmmv {
    207  1.1  jmmv     set_md_var("descr", "Tests the concatenation of multiple paths");
    208  1.1  jmmv }
    209  1.1  jmmv ATF_TEST_CASE_BODY(path_concat)
    210  1.1  jmmv {
    211  1.1  jmmv     using tools::fs::path;
    212  1.1  jmmv 
    213  1.1  jmmv     ATF_REQUIRE_EQ((path("foo") / "bar").str(), "foo/bar");
    214  1.1  jmmv     ATF_REQUIRE_EQ((path("foo/") / "/bar").str(), "foo/bar");
    215  1.1  jmmv     ATF_REQUIRE_EQ((path("foo/") / "/bar/baz").str(), "foo/bar/baz");
    216  1.1  jmmv     ATF_REQUIRE_EQ((path("foo/") / "///bar///baz").str(), "foo/bar/baz");
    217  1.1  jmmv }
    218  1.1  jmmv 
    219  1.1  jmmv ATF_TEST_CASE(path_to_absolute);
    220  1.1  jmmv ATF_TEST_CASE_HEAD(path_to_absolute)
    221  1.1  jmmv {
    222  1.1  jmmv     set_md_var("descr", "Tests the conversion of a relative path to an "
    223  1.1  jmmv                "absolute one");
    224  1.1  jmmv }
    225  1.1  jmmv ATF_TEST_CASE_BODY(path_to_absolute)
    226  1.1  jmmv {
    227  1.1  jmmv     using tools::fs::file_info;
    228  1.1  jmmv     using tools::fs::path;
    229  1.1  jmmv 
    230  1.1  jmmv     create_files();
    231  1.1  jmmv 
    232  1.1  jmmv     {
    233  1.1  jmmv         const path p(".");
    234  1.1  jmmv         path pa = p.to_absolute();
    235  1.1  jmmv         ATF_REQUIRE(pa.is_absolute());
    236  1.1  jmmv 
    237  1.1  jmmv         file_info fi(p);
    238  1.1  jmmv         file_info fia(pa);
    239  1.1  jmmv         ATF_REQUIRE_EQ(fi.get_device(), fia.get_device());
    240  1.1  jmmv         ATF_REQUIRE_EQ(fi.get_inode(), fia.get_inode());
    241  1.1  jmmv     }
    242  1.1  jmmv 
    243  1.1  jmmv     {
    244  1.1  jmmv         const path p("files/reg");
    245  1.1  jmmv         path pa = p.to_absolute();
    246  1.1  jmmv         ATF_REQUIRE(pa.is_absolute());
    247  1.1  jmmv 
    248  1.1  jmmv         file_info fi(p);
    249  1.1  jmmv         file_info fia(pa);
    250  1.1  jmmv         ATF_REQUIRE_EQ(fi.get_device(), fia.get_device());
    251  1.1  jmmv         ATF_REQUIRE_EQ(fi.get_inode(), fia.get_inode());
    252  1.1  jmmv     }
    253  1.1  jmmv }
    254  1.1  jmmv 
    255  1.1  jmmv ATF_TEST_CASE(path_op_less);
    256  1.1  jmmv ATF_TEST_CASE_HEAD(path_op_less)
    257  1.1  jmmv {
    258  1.1  jmmv     set_md_var("descr", "Tests that the path's less-than operator works");
    259  1.1  jmmv }
    260  1.1  jmmv ATF_TEST_CASE_BODY(path_op_less)
    261  1.1  jmmv {
    262  1.1  jmmv     using tools::fs::path;
    263  1.1  jmmv 
    264  1.1  jmmv     create_files();
    265  1.1  jmmv 
    266  1.1  jmmv     ATF_REQUIRE(!(path("aaa") < path("aaa")));
    267  1.1  jmmv 
    268  1.1  jmmv     ATF_REQUIRE(  path("aab") < path("abc"));
    269  1.1  jmmv     ATF_REQUIRE(!(path("abc") < path("aab")));
    270  1.1  jmmv }
    271  1.1  jmmv 
    272  1.1  jmmv // ------------------------------------------------------------------------
    273  1.1  jmmv // Test cases for the "directory" class.
    274  1.1  jmmv // ------------------------------------------------------------------------
    275  1.1  jmmv 
    276  1.1  jmmv ATF_TEST_CASE(directory_read);
    277  1.1  jmmv ATF_TEST_CASE_HEAD(directory_read)
    278  1.1  jmmv {
    279  1.1  jmmv     set_md_var("descr", "Tests the directory class creation, which reads "
    280  1.1  jmmv                "the contents of a directory");
    281  1.1  jmmv }
    282  1.1  jmmv ATF_TEST_CASE_BODY(directory_read)
    283  1.1  jmmv {
    284  1.1  jmmv     using tools::fs::directory;
    285  1.1  jmmv     using tools::fs::path;
    286  1.1  jmmv 
    287  1.1  jmmv     create_files();
    288  1.1  jmmv 
    289  1.1  jmmv     directory d(path("files"));
    290  1.1  jmmv     ATF_REQUIRE_EQ(d.size(), 4);
    291  1.1  jmmv     ATF_REQUIRE(d.find(".") != d.end());
    292  1.1  jmmv     ATF_REQUIRE(d.find("..") != d.end());
    293  1.1  jmmv     ATF_REQUIRE(d.find("dir") != d.end());
    294  1.1  jmmv     ATF_REQUIRE(d.find("reg") != d.end());
    295  1.1  jmmv }
    296  1.1  jmmv 
    297  1.1  jmmv ATF_TEST_CASE(directory_file_info);
    298  1.1  jmmv ATF_TEST_CASE_HEAD(directory_file_info)
    299  1.1  jmmv {
    300  1.1  jmmv     set_md_var("descr", "Tests that the file_info objects attached to the "
    301  1.1  jmmv                "directory are valid");
    302  1.1  jmmv }
    303  1.1  jmmv ATF_TEST_CASE_BODY(directory_file_info)
    304  1.1  jmmv {
    305  1.1  jmmv     using tools::fs::directory;
    306  1.1  jmmv     using tools::fs::file_info;
    307  1.1  jmmv     using tools::fs::path;
    308  1.1  jmmv 
    309  1.1  jmmv     create_files();
    310  1.1  jmmv 
    311  1.1  jmmv     directory d(path("files"));
    312  1.1  jmmv 
    313  1.1  jmmv     {
    314  1.1  jmmv         directory::const_iterator iter = d.find("dir");
    315  1.1  jmmv         ATF_REQUIRE(iter != d.end());
    316  1.1  jmmv         const file_info& fi = (*iter).second;
    317  1.1  jmmv         ATF_REQUIRE(fi.get_type() == file_info::dir_type);
    318  1.1  jmmv     }
    319  1.1  jmmv 
    320  1.1  jmmv     {
    321  1.1  jmmv         directory::const_iterator iter = d.find("reg");
    322  1.1  jmmv         ATF_REQUIRE(iter != d.end());
    323  1.1  jmmv         const file_info& fi = (*iter).second;
    324  1.1  jmmv         ATF_REQUIRE(fi.get_type() == file_info::reg_type);
    325  1.1  jmmv     }
    326  1.1  jmmv }
    327  1.1  jmmv 
    328  1.1  jmmv ATF_TEST_CASE(directory_names);
    329  1.1  jmmv ATF_TEST_CASE_HEAD(directory_names)
    330  1.1  jmmv {
    331  1.1  jmmv     set_md_var("descr", "Tests the directory's names method");
    332  1.1  jmmv }
    333  1.1  jmmv ATF_TEST_CASE_BODY(directory_names)
    334  1.1  jmmv {
    335  1.1  jmmv     using tools::fs::directory;
    336  1.1  jmmv     using tools::fs::path;
    337  1.1  jmmv 
    338  1.1  jmmv     create_files();
    339  1.1  jmmv 
    340  1.1  jmmv     directory d(path("files"));
    341  1.1  jmmv     std::set< std::string > ns = d.names();
    342  1.1  jmmv     ATF_REQUIRE_EQ(ns.size(), 4);
    343  1.1  jmmv     ATF_REQUIRE(ns.find(".") != ns.end());
    344  1.1  jmmv     ATF_REQUIRE(ns.find("..") != ns.end());
    345  1.1  jmmv     ATF_REQUIRE(ns.find("dir") != ns.end());
    346  1.1  jmmv     ATF_REQUIRE(ns.find("reg") != ns.end());
    347  1.1  jmmv }
    348  1.1  jmmv 
    349  1.1  jmmv // ------------------------------------------------------------------------
    350  1.1  jmmv // Test cases for the "file_info" class.
    351  1.1  jmmv // ------------------------------------------------------------------------
    352  1.1  jmmv 
    353  1.1  jmmv ATF_TEST_CASE(file_info_stat);
    354  1.1  jmmv ATF_TEST_CASE_HEAD(file_info_stat)
    355  1.1  jmmv {
    356  1.1  jmmv     set_md_var("descr", "Tests the file_info creation and its basic contents");
    357  1.1  jmmv }
    358  1.1  jmmv ATF_TEST_CASE_BODY(file_info_stat)
    359  1.1  jmmv {
    360  1.1  jmmv     using tools::fs::file_info;
    361  1.1  jmmv     using tools::fs::path;
    362  1.1  jmmv 
    363  1.1  jmmv     create_files();
    364  1.1  jmmv 
    365  1.1  jmmv     {
    366  1.1  jmmv         path p("files/dir");
    367  1.1  jmmv         file_info fi(p);
    368  1.1  jmmv         ATF_REQUIRE(fi.get_type() == file_info::dir_type);
    369  1.1  jmmv     }
    370  1.1  jmmv 
    371  1.1  jmmv     {
    372  1.1  jmmv         path p("files/reg");
    373  1.1  jmmv         file_info fi(p);
    374  1.1  jmmv         ATF_REQUIRE(fi.get_type() == file_info::reg_type);
    375  1.1  jmmv     }
    376  1.1  jmmv }
    377  1.1  jmmv 
    378  1.1  jmmv ATF_TEST_CASE(file_info_perms);
    379  1.1  jmmv ATF_TEST_CASE_HEAD(file_info_perms)
    380  1.1  jmmv {
    381  1.1  jmmv     set_md_var("descr", "Tests the file_info methods to get the file's "
    382  1.1  jmmv                "permissions");
    383  1.1  jmmv }
    384  1.1  jmmv ATF_TEST_CASE_BODY(file_info_perms)
    385  1.1  jmmv {
    386  1.1  jmmv     using tools::fs::file_info;
    387  1.1  jmmv     using tools::fs::path;
    388  1.1  jmmv 
    389  1.1  jmmv     path p("file");
    390  1.1  jmmv 
    391  1.1  jmmv     std::ofstream os(p.c_str());
    392  1.1  jmmv     os.close();
    393  1.1  jmmv 
    394  1.1  jmmv #define perms(ur, uw, ux, gr, gw, gx, othr, othw, othx) \
    395  1.1  jmmv     { \
    396  1.1  jmmv         file_info fi(p); \
    397  1.1  jmmv         ATF_REQUIRE(fi.is_owner_readable() == ur); \
    398  1.1  jmmv         ATF_REQUIRE(fi.is_owner_writable() == uw); \
    399  1.1  jmmv         ATF_REQUIRE(fi.is_owner_executable() == ux); \
    400  1.1  jmmv         ATF_REQUIRE(fi.is_group_readable() == gr); \
    401  1.1  jmmv         ATF_REQUIRE(fi.is_group_writable() == gw); \
    402  1.1  jmmv         ATF_REQUIRE(fi.is_group_executable() == gx); \
    403  1.1  jmmv         ATF_REQUIRE(fi.is_other_readable() == othr); \
    404  1.1  jmmv         ATF_REQUIRE(fi.is_other_writable() == othw); \
    405  1.1  jmmv         ATF_REQUIRE(fi.is_other_executable() == othx); \
    406  1.1  jmmv     }
    407  1.1  jmmv 
    408  1.1  jmmv     ::chmod(p.c_str(), 0000);
    409  1.1  jmmv     perms(false, false, false, false, false, false, false, false, false);
    410  1.1  jmmv 
    411  1.1  jmmv     ::chmod(p.c_str(), 0001);
    412  1.1  jmmv     perms(false, false, false, false, false, false, false, false, true);
    413  1.1  jmmv 
    414  1.1  jmmv     ::chmod(p.c_str(), 0010);
    415  1.1  jmmv     perms(false, false, false, false, false, true, false, false, false);
    416  1.1  jmmv 
    417  1.1  jmmv     ::chmod(p.c_str(), 0100);
    418  1.1  jmmv     perms(false, false, true, false, false, false, false, false, false);
    419  1.1  jmmv 
    420  1.1  jmmv     ::chmod(p.c_str(), 0002);
    421  1.1  jmmv     perms(false, false, false, false, false, false, false, true, false);
    422  1.1  jmmv 
    423  1.1  jmmv     ::chmod(p.c_str(), 0020);
    424  1.1  jmmv     perms(false, false, false, false, true, false, false, false, false);
    425  1.1  jmmv 
    426  1.1  jmmv     ::chmod(p.c_str(), 0200);
    427  1.1  jmmv     perms(false, true, false, false, false, false, false, false, false);
    428  1.1  jmmv 
    429  1.1  jmmv     ::chmod(p.c_str(), 0004);
    430  1.1  jmmv     perms(false, false, false, false, false, false, true, false, false);
    431  1.1  jmmv 
    432  1.1  jmmv     ::chmod(p.c_str(), 0040);
    433  1.1  jmmv     perms(false, false, false, true, false, false, false, false, false);
    434  1.1  jmmv 
    435  1.1  jmmv     ::chmod(p.c_str(), 0400);
    436  1.1  jmmv     perms(true, false, false, false, false, false, false, false, false);
    437  1.1  jmmv 
    438  1.1  jmmv     ::chmod(p.c_str(), 0644);
    439  1.1  jmmv     perms(true, true, false, true, false, false, true, false, false);
    440  1.1  jmmv 
    441  1.1  jmmv     ::chmod(p.c_str(), 0755);
    442  1.1  jmmv     perms(true, true, true, true, false, true, true, false, true);
    443  1.1  jmmv 
    444  1.1  jmmv     ::chmod(p.c_str(), 0777);
    445  1.1  jmmv     perms(true, true, true, true, true, true, true, true, true);
    446  1.1  jmmv 
    447  1.1  jmmv #undef perms
    448  1.1  jmmv }
    449  1.1  jmmv 
    450  1.1  jmmv // ------------------------------------------------------------------------
    451  1.1  jmmv // Test cases for the "temp_dir" class.
    452  1.1  jmmv // ------------------------------------------------------------------------
    453  1.1  jmmv 
    454  1.1  jmmv ATF_TEST_CASE(temp_dir_raii);
    455  1.1  jmmv ATF_TEST_CASE_HEAD(temp_dir_raii)
    456  1.1  jmmv {
    457  1.1  jmmv     set_md_var("descr", "Tests the RAII behavior of the temp_dir class");
    458  1.1  jmmv }
    459  1.1  jmmv ATF_TEST_CASE_BODY(temp_dir_raii)
    460  1.1  jmmv {
    461  1.1  jmmv     tools::fs::path t1("non-existent");
    462  1.1  jmmv     tools::fs::path t2("non-existent");
    463  1.1  jmmv 
    464  1.1  jmmv     {
    465  1.1  jmmv         tools::fs::path tmpl("testdir.XXXXXX");
    466  1.1  jmmv         tools::fs::temp_dir td1(tmpl);
    467  1.1  jmmv         tools::fs::temp_dir td2(tmpl);
    468  1.1  jmmv         t1 = td1.get_path();
    469  1.1  jmmv         t2 = td2.get_path();
    470  1.1  jmmv         ATF_REQUIRE(t1.str().find("XXXXXX") == std::string::npos);
    471  1.1  jmmv         ATF_REQUIRE(t2.str().find("XXXXXX") == std::string::npos);
    472  1.1  jmmv         ATF_REQUIRE(t1 != t2);
    473  1.1  jmmv         ATF_REQUIRE(!tools::fs::exists(tmpl));
    474  1.1  jmmv         ATF_REQUIRE( tools::fs::exists(t1));
    475  1.1  jmmv         ATF_REQUIRE( tools::fs::exists(t2));
    476  1.1  jmmv 
    477  1.1  jmmv         tools::fs::file_info fi1(t1);
    478  1.1  jmmv         ATF_REQUIRE( fi1.is_owner_readable());
    479  1.1  jmmv         ATF_REQUIRE( fi1.is_owner_writable());
    480  1.1  jmmv         ATF_REQUIRE( fi1.is_owner_executable());
    481  1.1  jmmv         ATF_REQUIRE(!fi1.is_group_readable());
    482  1.1  jmmv         ATF_REQUIRE(!fi1.is_group_writable());
    483  1.1  jmmv         ATF_REQUIRE(!fi1.is_group_executable());
    484  1.1  jmmv         ATF_REQUIRE(!fi1.is_other_readable());
    485  1.1  jmmv         ATF_REQUIRE(!fi1.is_other_writable());
    486  1.1  jmmv         ATF_REQUIRE(!fi1.is_other_executable());
    487  1.1  jmmv 
    488  1.1  jmmv         tools::fs::file_info fi2(t2);
    489  1.1  jmmv         ATF_REQUIRE( fi2.is_owner_readable());
    490  1.1  jmmv         ATF_REQUIRE( fi2.is_owner_writable());
    491  1.1  jmmv         ATF_REQUIRE( fi2.is_owner_executable());
    492  1.1  jmmv         ATF_REQUIRE(!fi2.is_group_readable());
    493  1.1  jmmv         ATF_REQUIRE(!fi2.is_group_writable());
    494  1.1  jmmv         ATF_REQUIRE(!fi2.is_group_executable());
    495  1.1  jmmv         ATF_REQUIRE(!fi2.is_other_readable());
    496  1.1  jmmv         ATF_REQUIRE(!fi2.is_other_writable());
    497  1.1  jmmv         ATF_REQUIRE(!fi2.is_other_executable());
    498  1.1  jmmv     }
    499  1.1  jmmv 
    500  1.1  jmmv     ATF_REQUIRE(t1.str() != "non-existent");
    501  1.1  jmmv     ATF_REQUIRE(!tools::fs::exists(t1));
    502  1.1  jmmv     ATF_REQUIRE(t2.str() != "non-existent");
    503  1.1  jmmv     ATF_REQUIRE(!tools::fs::exists(t2));
    504  1.1  jmmv }
    505  1.1  jmmv 
    506  1.1  jmmv 
    507  1.1  jmmv // ------------------------------------------------------------------------
    508  1.1  jmmv // Test cases for the free functions.
    509  1.1  jmmv // ------------------------------------------------------------------------
    510  1.1  jmmv 
    511  1.1  jmmv ATF_TEST_CASE(exists);
    512  1.1  jmmv ATF_TEST_CASE_HEAD(exists)
    513  1.1  jmmv {
    514  1.1  jmmv     set_md_var("descr", "Tests the exists function");
    515  1.1  jmmv }
    516  1.1  jmmv ATF_TEST_CASE_BODY(exists)
    517  1.1  jmmv {
    518  1.1  jmmv     using tools::fs::exists;
    519  1.1  jmmv     using tools::fs::path;
    520  1.1  jmmv 
    521  1.1  jmmv     create_files();
    522  1.1  jmmv 
    523  1.1  jmmv     ATF_REQUIRE( exists(path("files")));
    524  1.1  jmmv     ATF_REQUIRE(!exists(path("file")));
    525  1.1  jmmv     ATF_REQUIRE(!exists(path("files2")));
    526  1.1  jmmv 
    527  1.1  jmmv     ATF_REQUIRE( exists(path("files/.")));
    528  1.1  jmmv     ATF_REQUIRE( exists(path("files/..")));
    529  1.1  jmmv     ATF_REQUIRE( exists(path("files/dir")));
    530  1.1  jmmv     ATF_REQUIRE( exists(path("files/reg")));
    531  1.1  jmmv     ATF_REQUIRE(!exists(path("files/foo")));
    532  1.1  jmmv }
    533  1.1  jmmv 
    534  1.1  jmmv ATF_TEST_CASE(is_executable);
    535  1.1  jmmv ATF_TEST_CASE_HEAD(is_executable)
    536  1.1  jmmv {
    537  1.1  jmmv     set_md_var("descr", "Tests the is_executable function");
    538  1.1  jmmv }
    539  1.1  jmmv ATF_TEST_CASE_BODY(is_executable)
    540  1.1  jmmv {
    541  1.1  jmmv     using tools::fs::is_executable;
    542  1.1  jmmv     using tools::fs::path;
    543  1.1  jmmv 
    544  1.1  jmmv     create_files();
    545  1.1  jmmv 
    546  1.1  jmmv     ATF_REQUIRE( is_executable(path("files")));
    547  1.1  jmmv     ATF_REQUIRE( is_executable(path("files/.")));
    548  1.1  jmmv     ATF_REQUIRE( is_executable(path("files/..")));
    549  1.1  jmmv     ATF_REQUIRE( is_executable(path("files/dir")));
    550  1.1  jmmv 
    551  1.1  jmmv     ATF_REQUIRE(!is_executable(path("non-existent")));
    552  1.1  jmmv 
    553  1.1  jmmv     ATF_REQUIRE(!is_executable(path("files/reg")));
    554  1.1  jmmv     ATF_REQUIRE(::chmod("files/reg", 0755) != -1);
    555  1.1  jmmv     ATF_REQUIRE( is_executable(path("files/reg")));
    556  1.1  jmmv }
    557  1.1  jmmv 
    558  1.1  jmmv ATF_TEST_CASE(remove);
    559  1.1  jmmv ATF_TEST_CASE_HEAD(remove)
    560  1.1  jmmv {
    561  1.1  jmmv     set_md_var("descr", "Tests the remove function");
    562  1.1  jmmv }
    563  1.1  jmmv ATF_TEST_CASE_BODY(remove)
    564  1.1  jmmv {
    565  1.1  jmmv     using tools::fs::exists;
    566  1.1  jmmv     using tools::fs::path;
    567  1.1  jmmv     using tools::fs::remove;
    568  1.1  jmmv 
    569  1.1  jmmv     create_files();
    570  1.1  jmmv 
    571  1.1  jmmv     ATF_REQUIRE( exists(path("files/reg")));
    572  1.1  jmmv     remove(path("files/reg"));
    573  1.1  jmmv     ATF_REQUIRE(!exists(path("files/reg")));
    574  1.1  jmmv 
    575  1.1  jmmv     ATF_REQUIRE( exists(path("files/dir")));
    576  1.1  jmmv     ATF_REQUIRE_THROW(tools::system_error, remove(path("files/dir")));
    577  1.1  jmmv     ATF_REQUIRE( exists(path("files/dir")));
    578  1.1  jmmv }
    579  1.1  jmmv 
    580  1.1  jmmv ATF_TEST_CASE(cleanup);
    581  1.1  jmmv ATF_TEST_CASE_HEAD(cleanup)
    582  1.1  jmmv {
    583  1.1  jmmv     set_md_var("descr", "Tests the cleanup function");
    584  1.1  jmmv }
    585  1.1  jmmv ATF_TEST_CASE_BODY(cleanup)
    586  1.1  jmmv {
    587  1.1  jmmv     using tools::fs::cleanup;
    588  1.1  jmmv 
    589  1.1  jmmv     ::mkdir("root", 0755);
    590  1.1  jmmv     ::mkdir("root/dir", 0755);
    591  1.1  jmmv     ::mkdir("root/dir/1", 0100);
    592  1.1  jmmv     ::mkdir("root/dir/2", 0644);
    593  1.1  jmmv     create_file("root/reg");
    594  1.1  jmmv 
    595  1.1  jmmv     tools::fs::path p("root");
    596  1.1  jmmv     ATF_REQUIRE(tools::fs::exists(p));
    597  1.1  jmmv     ATF_REQUIRE(tools::fs::exists(p / "dir"));
    598  1.1  jmmv     ATF_REQUIRE(tools::fs::exists(p / "dir/1"));
    599  1.1  jmmv     ATF_REQUIRE(tools::fs::exists(p / "dir/2"));
    600  1.1  jmmv     ATF_REQUIRE(tools::fs::exists(p / "reg"));
    601  1.1  jmmv     cleanup(p);
    602  1.1  jmmv     ATF_REQUIRE(!tools::fs::exists(p));
    603  1.1  jmmv }
    604  1.1  jmmv 
    605  1.1  jmmv ATF_TEST_CASE(cleanup_eacces_on_root);
    606  1.1  jmmv ATF_TEST_CASE_HEAD(cleanup_eacces_on_root)
    607  1.1  jmmv {
    608  1.1  jmmv     set_md_var("descr", "Tests the cleanup function");
    609  1.1  jmmv }
    610  1.1  jmmv ATF_TEST_CASE_BODY(cleanup_eacces_on_root)
    611  1.1  jmmv {
    612  1.1  jmmv     using tools::fs::cleanup;
    613  1.1  jmmv 
    614  1.1  jmmv     ::mkdir("aux", 0755);
    615  1.1  jmmv     ::mkdir("aux/root", 0755);
    616  1.1  jmmv     ATF_REQUIRE(::chmod("aux", 0555) != -1);
    617  1.1  jmmv 
    618  1.1  jmmv     try {
    619  1.1  jmmv         cleanup(tools::fs::path("aux/root"));
    620  1.1  jmmv         ATF_REQUIRE(tools::user::is_root());
    621  1.1  jmmv     } catch (const tools::system_error& e) {
    622  1.1  jmmv         ATF_REQUIRE(!tools::user::is_root());
    623  1.1  jmmv         ATF_REQUIRE_EQ(EACCES, e.code());
    624  1.1  jmmv     }
    625  1.1  jmmv }
    626  1.1  jmmv 
    627  1.1  jmmv ATF_TEST_CASE(cleanup_eacces_on_subdir);
    628  1.1  jmmv ATF_TEST_CASE_HEAD(cleanup_eacces_on_subdir)
    629  1.1  jmmv {
    630  1.1  jmmv     set_md_var("descr", "Tests the cleanup function");
    631  1.1  jmmv }
    632  1.1  jmmv ATF_TEST_CASE_BODY(cleanup_eacces_on_subdir)
    633  1.1  jmmv {
    634  1.1  jmmv     using tools::fs::cleanup;
    635  1.1  jmmv 
    636  1.1  jmmv     ::mkdir("root", 0755);
    637  1.1  jmmv     ::mkdir("root/1", 0755);
    638  1.1  jmmv     ::mkdir("root/1/2", 0755);
    639  1.1  jmmv     ::mkdir("root/1/2/3", 0755);
    640  1.1  jmmv     ATF_REQUIRE(::chmod("root/1/2", 0555) != -1);
    641  1.1  jmmv     ATF_REQUIRE(::chmod("root/1", 0555) != -1);
    642  1.1  jmmv 
    643  1.1  jmmv     const tools::fs::path p("root");
    644  1.1  jmmv     cleanup(p);
    645  1.1  jmmv     ATF_REQUIRE(!tools::fs::exists(p));
    646  1.1  jmmv }
    647  1.1  jmmv 
    648  1.1  jmmv ATF_TEST_CASE(change_directory);
    649  1.1  jmmv ATF_TEST_CASE_HEAD(change_directory)
    650  1.1  jmmv {
    651  1.1  jmmv     set_md_var("descr", "Tests the change_directory function");
    652  1.1  jmmv }
    653  1.1  jmmv ATF_TEST_CASE_BODY(change_directory)
    654  1.1  jmmv {
    655  1.1  jmmv     using tools::fs::change_directory;
    656  1.1  jmmv     using tools::fs::get_current_dir;
    657  1.1  jmmv 
    658  1.1  jmmv     ::mkdir("files", 0755);
    659  1.1  jmmv     ::mkdir("files/dir", 0755);
    660  1.1  jmmv     create_file("files/reg");
    661  1.1  jmmv 
    662  1.1  jmmv     const tools::fs::path old = get_current_dir();
    663  1.1  jmmv 
    664  1.1  jmmv     ATF_REQUIRE_THROW(tools::system_error,
    665  1.1  jmmv                     change_directory(tools::fs::path("files/reg")));
    666  1.1  jmmv     ATF_REQUIRE(get_current_dir() == old);
    667  1.1  jmmv 
    668  1.1  jmmv     tools::fs::path old2 = change_directory(tools::fs::path("files"));
    669  1.1  jmmv     ATF_REQUIRE(old2 == old);
    670  1.1  jmmv     tools::fs::path old3 = change_directory(tools::fs::path("dir"));
    671  1.1  jmmv     ATF_REQUIRE(old3 == old2 / "files");
    672  1.1  jmmv     tools::fs::path old4 = change_directory(tools::fs::path("../.."));
    673  1.1  jmmv     ATF_REQUIRE(old4 == old3 / "dir");
    674  1.1  jmmv     ATF_REQUIRE(get_current_dir() == old);
    675  1.1  jmmv }
    676  1.1  jmmv 
    677  1.1  jmmv ATF_TEST_CASE(get_current_dir);
    678  1.1  jmmv ATF_TEST_CASE_HEAD(get_current_dir)
    679  1.1  jmmv {
    680  1.1  jmmv     set_md_var("descr", "Tests the get_current_dir function");
    681  1.1  jmmv }
    682  1.1  jmmv ATF_TEST_CASE_BODY(get_current_dir)
    683  1.1  jmmv {
    684  1.1  jmmv     using tools::fs::change_directory;
    685  1.1  jmmv     using tools::fs::get_current_dir;
    686  1.1  jmmv 
    687  1.1  jmmv     ::mkdir("files", 0755);
    688  1.1  jmmv     ::mkdir("files/dir", 0755);
    689  1.1  jmmv     create_file("files/reg");
    690  1.1  jmmv 
    691  1.1  jmmv     tools::fs::path curdir = get_current_dir();
    692  1.1  jmmv     change_directory(tools::fs::path("."));
    693  1.1  jmmv     ATF_REQUIRE(get_current_dir() == curdir);
    694  1.1  jmmv     change_directory(tools::fs::path("files"));
    695  1.1  jmmv     ATF_REQUIRE(get_current_dir() == curdir / "files");
    696  1.1  jmmv     change_directory(tools::fs::path("dir"));
    697  1.1  jmmv     ATF_REQUIRE(get_current_dir() == curdir / "files/dir");
    698  1.1  jmmv     change_directory(tools::fs::path(".."));
    699  1.1  jmmv     ATF_REQUIRE(get_current_dir() == curdir / "files");
    700  1.1  jmmv     change_directory(tools::fs::path(".."));
    701  1.1  jmmv     ATF_REQUIRE(get_current_dir() == curdir);
    702  1.1  jmmv }
    703  1.1  jmmv 
    704  1.1  jmmv // ------------------------------------------------------------------------
    705  1.1  jmmv // Main.
    706  1.1  jmmv // ------------------------------------------------------------------------
    707  1.1  jmmv 
    708  1.1  jmmv ATF_INIT_TEST_CASES(tcs)
    709  1.1  jmmv {
    710  1.1  jmmv     // Add the tests for the "path" class.
    711  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, path_normalize);
    712  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, path_is_absolute);
    713  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, path_is_root);
    714  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, path_branch_path);
    715  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, path_leaf_name);
    716  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, path_compare_equal);
    717  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, path_compare_different);
    718  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, path_concat);
    719  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, path_to_absolute);
    720  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, path_op_less);
    721  1.1  jmmv 
    722  1.1  jmmv     // Add the tests for the "file_info" class.
    723  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, file_info_stat);
    724  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, file_info_perms);
    725  1.1  jmmv 
    726  1.1  jmmv     // Add the tests for the "directory" class.
    727  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, directory_read);
    728  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, directory_names);
    729  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, directory_file_info);
    730  1.1  jmmv 
    731  1.1  jmmv     // Add the tests for the "temp_dir" class.
    732  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, temp_dir_raii);
    733  1.1  jmmv 
    734  1.1  jmmv     // Add the tests for the free functions.
    735  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, exists);
    736  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, is_executable);
    737  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, remove);
    738  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, cleanup);
    739  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, cleanup_eacces_on_root);
    740  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, cleanup_eacces_on_subdir);
    741  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, change_directory);
    742  1.1  jmmv     ATF_ADD_TEST_CASE(tcs, get_current_dir);
    743  1.1  jmmv }
    744