diff options
author | Eric Fiselier <eric@efcs.ca> | 2018-07-25 04:46:32 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2018-07-25 04:46:32 +0000 |
commit | 84e48004cf7e2a9827cd025d35719808a699ed27 (patch) | |
tree | 6b42345a1473adb372b30666efb71a09d1aaadc3 /libcxx/test/std/experimental/filesystem | |
parent | 6508929da9b2d7729f0047ce798fd648e3d63c3a (diff) | |
download | bcm5719-llvm-84e48004cf7e2a9827cd025d35719808a699ed27.tar.gz bcm5719-llvm-84e48004cf7e2a9827cd025d35719808a699ed27.zip |
Fix bugs in create_directory implementation.
Libc++ was incorrectly reporting an error when the target of create_directory
already exists, but was not a directory. This behavior is not specified
in the most recent standard, which says no error should be reported.
Additionally, libc++ failed to report an error when the attribute directory
path didn't exist or didn't name a directory. This has been fixed as well.
Although it's not clear if we should call status or symlink_status on the
attribute directory. This patch chooses to still call status.
llvm-svn: 337888
Diffstat (limited to 'libcxx/test/std/experimental/filesystem')
3 files changed, 67 insertions, 6 deletions
diff --git a/libcxx/test/std/experimental/filesystem/fs.op.funcs/fs.op.create_directories/create_directories.pass.cpp b/libcxx/test/std/experimental/filesystem/fs.op.funcs/fs.op.create_directories/create_directories.pass.cpp index e7962941cf7..8afc6102e39 100644 --- a/libcxx/test/std/experimental/filesystem/fs.op.funcs/fs.op.create_directories/create_directories.pass.cpp +++ b/libcxx/test/std/experimental/filesystem/fs.op.funcs/fs.op.create_directories/create_directories.pass.cpp @@ -66,4 +66,36 @@ TEST_CASE(create_directories_multi_level) TEST_CHECK(is_directory(dir)); } +TEST_CASE(create_directory_symlinks) { + scoped_test_env env; + const path root = env.create_dir("dir"); + const path sym_dest_dead = env.make_env_path("dead"); + const path dead_sym = env.create_symlink(sym_dest_dead, "dir/sym_dir"); + const path target = env.make_env_path("dir/sym_dir/foo"); + { + std::error_code ec = GetTestEC(); + TEST_CHECK(create_directories(target, ec) == false); + TEST_CHECK(ec); + TEST_CHECK(!exists(sym_dest_dead)); + TEST_CHECK(!exists(dead_sym)); + } +} + + +TEST_CASE(create_directory_through_symlinks) { + scoped_test_env env; + const path root = env.create_dir("dir"); + const path sym_dir = env.create_symlink(root, "sym_dir"); + const path target = env.make_env_path("sym_dir/foo"); + const path resolved_target = env.make_env_path("dir/foo"); + TEST_REQUIRE(is_directory(sym_dir)); + { + std::error_code ec = GetTestEC(); + TEST_CHECK(create_directories(target, ec) == true); + TEST_CHECK(!ec); + TEST_CHECK(is_directory(target)); + TEST_CHECK(is_directory(resolved_target)); + } +} + TEST_SUITE_END() diff --git a/libcxx/test/std/experimental/filesystem/fs.op.funcs/fs.op.create_directory/create_directory.pass.cpp b/libcxx/test/std/experimental/filesystem/fs.op.funcs/fs.op.create_directory/create_directory.pass.cpp index 4bc30c2b3e5..7885c4a54be 100644 --- a/libcxx/test/std/experimental/filesystem/fs.op.funcs/fs.op.create_directory/create_directory.pass.cpp +++ b/libcxx/test/std/experimental/filesystem/fs.op.funcs/fs.op.create_directory/create_directory.pass.cpp @@ -94,9 +94,9 @@ TEST_CASE(dest_is_file) { scoped_test_env env; const path file = env.create_file("file", 42); - std::error_code ec; + std::error_code ec = GetTestEC(); TEST_CHECK(fs::create_directory(file, ec) == false); - TEST_CHECK(ec); + TEST_CHECK(!ec); TEST_CHECK(is_regular_file(file)); } diff --git a/libcxx/test/std/experimental/filesystem/fs.op.funcs/fs.op.create_directory/create_directory_with_attributes.pass.cpp b/libcxx/test/std/experimental/filesystem/fs.op.funcs/fs.op.create_directory/create_directory_with_attributes.pass.cpp index 8ec22f1f913..2ee55fc4cb0 100644 --- a/libcxx/test/std/experimental/filesystem/fs.op.funcs/fs.op.create_directory/create_directory_with_attributes.pass.cpp +++ b/libcxx/test/std/experimental/filesystem/fs.op.funcs/fs.op.create_directory/create_directory_with_attributes.pass.cpp @@ -82,9 +82,9 @@ TEST_CASE(create_directory_multi_level) const path dir = env.make_env_path("dir1/dir2"); const path dir1 = env.make_env_path("dir1"); const path attr_dir = env.create_dir("attr_dir"); - std::error_code ec; + std::error_code ec = GetTestEC(); TEST_CHECK(fs::create_directory(dir, attr_dir, ec) == false); - TEST_CHECK(ec); + TEST_CHECK(ErrorIs(ec, std::errc::no_such_file_or_directory)); TEST_CHECK(!is_directory(dir)); TEST_CHECK(!is_directory(dir1)); } @@ -94,10 +94,39 @@ TEST_CASE(dest_is_file) scoped_test_env env; const path file = env.create_file("file", 42); const path attr_dir = env.create_dir("attr_dir"); - std::error_code ec; + std::error_code ec = GetTestEC(); TEST_CHECK(fs::create_directory(file, attr_dir, ec) == false); - TEST_CHECK(ec); + TEST_CHECK(!ec); TEST_CHECK(is_regular_file(file)); } +TEST_CASE(attr_dir_is_invalid) { + scoped_test_env env; + const path file = env.create_file("file", 42); + const path dest = env.make_env_path("dir"); + const path dne = env.make_env_path("dne"); + { + std::error_code ec = GetTestEC(); + TEST_CHECK(create_directory(dest, file, ec) == false); + TEST_CHECK(ErrorIs(ec, std::errc::not_a_directory)); + } + TEST_REQUIRE(!exists(dest)); + { + std::error_code ec = GetTestEC(); + TEST_CHECK(create_directory(dest, dne, ec) == false); + TEST_CHECK(ErrorIs(ec, std::errc::not_a_directory)); + } +} + +TEST_CASE(dest_is_symlink) { + scoped_test_env env; + const path dir = env.create_dir("dir"); + const path sym = env.create_symlink("dne_sym", "dne_sym_name"); + { + std::error_code ec = GetTestEC(); + TEST_CHECK(create_directory(sym, dir, ec) == false); + TEST_CHECK(!ec); + } +} + TEST_SUITE_END() |