16e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier//===----------------------------------------------------------------------===// 26e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// 36e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// The LLVM Compiler Infrastructure 46e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// 56e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// This file is dual licensed under the MIT and the University of Illinois Open 66e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// Source Licenses. See LICENSE.TXT for details. 76e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// 86e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier//===----------------------------------------------------------------------===// 96e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 106e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// UNSUPPORTED: c++98, c++03 116e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 126e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// <experimental/filesystem> 136e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 146e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// bool create_directory(const path& p, const path& attr); 156e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// bool create_directory(const path& p, const path& attr, error_code& ec) noexcept; 166e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 176e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include <experimental/filesystem> 186e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include <type_traits> 196e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include <cassert> 206e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 216e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include "test_macros.h" 226e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include "rapid-cxx-test.hpp" 236e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include "filesystem_test_helper.hpp" 246e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 256e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselierusing namespace std::experimental::filesystem; 266e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliernamespace fs = std::experimental::filesystem; 276e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 286e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_SUITE(filesystem_create_directory_test_suite) 296e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 306e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_CASE(test_signatures) 316e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier{ 326e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier const path p; ((void)p); 336e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier std::error_code ec; ((void)ec); 346e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier ASSERT_SAME_TYPE(decltype(fs::create_directory(p, p)), bool); 356e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier ASSERT_SAME_TYPE(decltype(fs::create_directory(p, p, ec)), bool); 366e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier ASSERT_NOT_NOEXCEPT(fs::create_directory(p, p)); 376e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier ASSERT_NOEXCEPT(fs::create_directory(p, p, ec)); 386e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} 396e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 406e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_CASE(create_existing_directory) 416e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier{ 426e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier scoped_test_env env; 436e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier const path dir = env.create_dir("dir1"); 446e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier const path dir2 = env.create_dir("dir2"); 456e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 466e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier const perms orig_p = status(dir).permissions(); 476e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier permissions(dir2, perms::none); 486e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 496e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier std::error_code ec; 506e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(fs::create_directory(dir, dir2, ec) == false); 516e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(!ec); 526e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 536e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier // Check that the permissions were unchanged 546e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(orig_p == status(dir).permissions()); 556e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 566e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier // Test throwing version 576e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(fs::create_directory(dir, dir2) == false); 586e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} 596e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 606e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_CASE(create_directory_one_level) 616e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier{ 626e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier scoped_test_env env; 63b9c20327ac630cf3351d4230686f41020b082e74Jonas Hahnfeld // Remove setgid which mkdir would inherit 64b9c20327ac630cf3351d4230686f41020b082e74Jonas Hahnfeld permissions(env.test_root, perms::remove_perms | perms::set_gid); 65b9c20327ac630cf3351d4230686f41020b082e74Jonas Hahnfeld 666e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier const path dir = env.make_env_path("dir1"); 676e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier const path attr_dir = env.create_dir("dir2"); 686e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier permissions(attr_dir, perms::none); 696e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 706e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier std::error_code ec; 716e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(fs::create_directory(dir, attr_dir, ec) == true); 726e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(!ec); 736e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(is_directory(dir)); 746e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 756e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier // Check that the new directory has the same permissions as attr_dir 766e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier auto st = status(dir); 776e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(st.permissions() == perms::none); 786e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} 796e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 806e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_CASE(create_directory_multi_level) 816e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier{ 826e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier scoped_test_env env; 836e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier const path dir = env.make_env_path("dir1/dir2"); 846e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier const path dir1 = env.make_env_path("dir1"); 856e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier const path attr_dir = env.create_dir("attr_dir"); 866e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier std::error_code ec; 876e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(fs::create_directory(dir, attr_dir, ec) == false); 886e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(ec); 896e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(!is_directory(dir)); 906e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(!is_directory(dir1)); 916e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} 926e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 936e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_CASE(dest_is_file) 946e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier{ 956e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier scoped_test_env env; 966e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier const path file = env.create_file("file", 42); 976e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier const path attr_dir = env.create_dir("attr_dir"); 986e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier std::error_code ec; 996e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(fs::create_directory(file, attr_dir, ec) == false); 1006e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(ec); 1016e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(is_regular_file(file)); 1026e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} 1036e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 1046e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_SUITE_END() 105