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