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