aboutsummaryrefslogtreecommitdiff
path: root/googletest/test/gtest_dirs_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'googletest/test/gtest_dirs_test.cc')
-rw-r--r--googletest/test/gtest_dirs_test.cc101
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 00000000..1a5b63d3
--- /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