diff options
Diffstat (limited to 'googletest/test/gtest_dirs_test.cc')
-rw-r--r-- | googletest/test/gtest_dirs_test.cc | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/googletest/test/gtest_dirs_test.cc b/googletest/test/gtest_dirs_test.cc new file mode 100644 index 000000000000..1a5b63d3c28f --- /dev/null +++ b/googletest/test/gtest_dirs_test.cc @@ -0,0 +1,101 @@ +#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 |