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// path temp_directory_path(); 156e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier// path temp_directory_path(error_code& ec); 166e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 176e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include <experimental/filesystem> 186e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include <memory> 196e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include <cstdlib> 206e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include <cstring> 216e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include <cassert> 226e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 236e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include "test_macros.h" 246e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include "rapid-cxx-test.hpp" 256e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier#include "filesystem_test_helper.hpp" 266e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 276e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselierusing namespace std::experimental::filesystem; 286e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 296e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliervoid PutEnv(std::string var, std::string value) { 306e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier assert(::setenv(var.c_str(), value.c_str(), /* overwrite */ 1) == 0); 316e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} 326e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 336e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiseliervoid UnsetEnv(std::string var) { 346e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier assert(::unsetenv(var.c_str()) == 0); 356e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} 366e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 376e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_SUITE(filesystem_temp_directory_path_test_suite) 386e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 396e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_CASE(signature_test) 406e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier{ 416e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier std::error_code ec; ((void)ec); 426e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier ASSERT_NOT_NOEXCEPT(temp_directory_path()); 436e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier ASSERT_NOT_NOEXCEPT(temp_directory_path(ec)); 446e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} 456e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 466e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_CASE(basic_tests) 476e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier{ 486e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier scoped_test_env env; 496e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier const path dne = env.make_env_path("dne"); 506e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier const path file = env.create_file("file", 42); 516e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier const path dir_perms = env.create_dir("bad_perms_dir"); 526e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier const path nested_dir = env.create_dir("bad_perms_dir/nested"); 536e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier permissions(dir_perms, perms::none); 546e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier const std::error_code expect_ec = std::make_error_code(std::errc::not_a_directory); 556e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier struct TestCase { 566e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier std::string name; 576e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier path p; 586e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier } cases[] = { 596e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier {"TMPDIR", env.create_dir("dir1")}, 606e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier {"TMP", env.create_dir("dir2")}, 616e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier {"TEMP", env.create_dir("dir3")}, 626e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier {"TEMPDIR", env.create_dir("dir4")} 636e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier }; 646e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier for (auto& TC : cases) { 656e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier PutEnv(TC.name, TC.p); 666e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier } 676e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier for (auto& TC : cases) { 68c4a7e9177a4532fb130bc2d0e638edf5cc6d886dEric Fiselier std::error_code ec = GetTestEC(); 696e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier path ret = temp_directory_path(ec); 706e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(!ec); 716e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(ret == TC.p); 726e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(is_directory(ret)); 736e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 746e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier // Set the env variable to a path that does not exist and check 756e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier // that it fails. 766e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier PutEnv(TC.name, dne); 77c4a7e9177a4532fb130bc2d0e638edf5cc6d886dEric Fiselier ec = GetTestEC(); 786e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier ret = temp_directory_path(ec); 79c4a7e9177a4532fb130bc2d0e638edf5cc6d886dEric Fiselier LIBCPP_ONLY(TEST_CHECK(ec == expect_ec)); 80c4a7e9177a4532fb130bc2d0e638edf5cc6d886dEric Fiselier TEST_CHECK(ec != GetTestEC()); 81c4a7e9177a4532fb130bc2d0e638edf5cc6d886dEric Fiselier TEST_CHECK(ec); 826e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(ret == ""); 836e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 846e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier // Set the env variable to point to a file and check that it fails. 856e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier PutEnv(TC.name, file); 86c4a7e9177a4532fb130bc2d0e638edf5cc6d886dEric Fiselier ec = GetTestEC(); 876e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier ret = temp_directory_path(ec); 88c4a7e9177a4532fb130bc2d0e638edf5cc6d886dEric Fiselier LIBCPP_ONLY(TEST_CHECK(ec == expect_ec)); 89c4a7e9177a4532fb130bc2d0e638edf5cc6d886dEric Fiselier TEST_CHECK(ec != GetTestEC()); 90c4a7e9177a4532fb130bc2d0e638edf5cc6d886dEric Fiselier TEST_CHECK(ec); 916e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(ret == ""); 926e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 936e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier // Set the env variable to point to a dir we can't access 946e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier PutEnv(TC.name, nested_dir); 95c4a7e9177a4532fb130bc2d0e638edf5cc6d886dEric Fiselier ec = GetTestEC(); 966e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier ret = temp_directory_path(ec); 976e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(ec == std::make_error_code(std::errc::permission_denied)); 986e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(ret == ""); 996e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 1007566869dabd82699f26c8c95f18de331ec3950ceSaleem Abdulrasool // Set the env variable to point to a non-existent dir 1017566869dabd82699f26c8c95f18de331ec3950ceSaleem Abdulrasool PutEnv(TC.name, TC.p / "does_not_exist"); 1027566869dabd82699f26c8c95f18de331ec3950ceSaleem Abdulrasool ec = GetTestEC(); 1037566869dabd82699f26c8c95f18de331ec3950ceSaleem Abdulrasool ret = temp_directory_path(ec); 1047566869dabd82699f26c8c95f18de331ec3950ceSaleem Abdulrasool TEST_CHECK(ec != GetTestEC()); 1057566869dabd82699f26c8c95f18de331ec3950ceSaleem Abdulrasool TEST_CHECK(ec); 1067566869dabd82699f26c8c95f18de331ec3950ceSaleem Abdulrasool TEST_CHECK(ret == ""); 1077566869dabd82699f26c8c95f18de331ec3950ceSaleem Abdulrasool 1086e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier // Finally erase this env variable 1096e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier UnsetEnv(TC.name); 1106e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier } 1116e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier // No env variables are defined 1126e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier { 113c4a7e9177a4532fb130bc2d0e638edf5cc6d886dEric Fiselier std::error_code ec = GetTestEC(); 1146e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier path ret = temp_directory_path(ec); 1156e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(!ec); 1166e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(ret == "/tmp"); 1176e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier TEST_CHECK(is_directory(ret)); 1186e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier } 1196e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier} 1206e9a694dce70319e60dbdfb09cf055bacb4c948eEric Fiselier 1216e9a694dce70319e60dbdfb09cf055bacb4c948eEric FiselierTEST_SUITE_END() 122