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