| #include <sys/stat.h> |
| |
| #include <cstdlib> |
| #include <cstring> |
| #include <string> |
| |
| #include "gtest/gtest.h" |
| #include "gtest/internal/gtest-port.h" |
| |
| #if GTEST_HAS_FILE_SYSTEM |
| |
| namespace { |
| |
| class SetEnv { |
| public: |
| // Sets the environment value with name `name` to `value`, unless `value` is |
| // nullptr, in which case it unsets it. Restores the original value on |
| // destruction. |
| SetEnv(const char* name, const char* value) : name_(name) { |
| const char* old_value = getenv(name); |
| if (old_value != nullptr) { |
| saved_value_ = old_value; |
| have_saved_value_ = true; |
| } |
| if (value == nullptr) { |
| GTEST_CHECK_POSIX_SUCCESS_(unsetenv(name)); |
| } else { |
| GTEST_CHECK_POSIX_SUCCESS_(setenv(name, value, 1 /*overwrite*/)); |
| } |
| } |
| |
| ~SetEnv() { |
| if (have_saved_value_) { |
| GTEST_CHECK_POSIX_SUCCESS_( |
| setenv(name_.c_str(), saved_value_.c_str(), 1 /*overwrite*/)); |
| } else { |
| GTEST_CHECK_POSIX_SUCCESS_(unsetenv(name_.c_str())); |
| } |
| } |
| |
| private: |
| std::string name_; |
| bool have_saved_value_ = false; |
| std::string saved_value_; |
| }; |
| |
| class MakeTempDir { |
| public: |
| // Creates a directory with a unique name including `testname`. |
| // The destructor removes it. |
| explicit MakeTempDir(const std::string& testname) { |
| // mkdtemp requires that the last 6 characters of the input pattern |
| // are Xs, and the string is modified by replacing those characters. |
| std::string pattern = "/tmp/" + testname + "_XXXXXX"; |
| GTEST_CHECK_(mkdtemp(pattern.data()) != nullptr); |
| dirname_ = pattern; |
| } |
| |
| ~MakeTempDir() { GTEST_CHECK_POSIX_SUCCESS_(rmdir(dirname_.c_str())); } |
| |
| const char* DirName() const { return dirname_.c_str(); } |
| |
| private: |
| std::string dirname_; |
| }; |
| |
| bool StartsWith(const std::string& str, const std::string& prefix) { |
| return str.substr(0, prefix.size()) == prefix; |
| } |
| |
| TEST(TempDirTest, InEnvironment) { |
| // Since the test infrastructure might be verifying directory existence or |
| // even creating subdirectories, we need to be careful that the directories we |
| // specify are actually valid. |
| MakeTempDir temp_dir("TempDirTest_InEnvironment"); |
| SetEnv set_env("TEST_TMPDIR", temp_dir.DirName()); |
| EXPECT_TRUE(StartsWith(testing::TempDir(), temp_dir.DirName())); |
| } |
| |
| TEST(TempDirTest, NotInEnvironment) { |
| SetEnv set_env("TEST_TMPDIR", nullptr); |
| EXPECT_NE(testing::TempDir(), ""); |
| } |
| |
| TEST(SrcDirTest, InEnvironment) { |
| // Since the test infrastructure might be verifying directory existence or |
| // even creating subdirectories, we need to be careful that the directories we |
| // specify are actually valid. |
| MakeTempDir temp_dir("SrcDirTest_InEnvironment"); |
| SetEnv set_env("TEST_SRCDIR", temp_dir.DirName()); |
| EXPECT_TRUE(StartsWith(testing::SrcDir(), temp_dir.DirName())); |
| } |
| |
| TEST(SrcDirTest, NotInEnvironment) { |
| SetEnv set_env("TEST_SRCDIR", nullptr); |
| EXPECT_NE(testing::SrcDir(), ""); |
| } |
| |
| #endif // GTEST_HAS_FILE_SYSTEM |
| |
| } // namespace |