Sacado Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
gtest_dirs_test.cc
Go to the documentation of this file.
1 #include <sys/stat.h>
2 
3 #include <cstdlib>
4 #include <cstring>
5 #include <string>
6 
7 #include "gtest/gtest.h"
9 
10 #if GTEST_HAS_FILE_SYSTEM
11 
12 namespace {
13 
14 class SetEnv {
15  public:
16  // Sets the environment value with name `name` to `value`, unless `value` is
17  // nullptr, in which case it unsets it. Restores the original value on
18  // destruction.
19  SetEnv(const char* name, const char* value) : name_(name) {
20  const char* old_value = getenv(name);
21  if (old_value != nullptr) {
22  saved_value_ = old_value;
23  have_saved_value_ = true;
24  }
25  if (value == nullptr) {
26  GTEST_CHECK_POSIX_SUCCESS_(unsetenv(name));
27  } else {
28  GTEST_CHECK_POSIX_SUCCESS_(setenv(name, value, 1 /*overwrite*/));
29  }
30  }
31 
32  ~SetEnv() {
33  if (have_saved_value_) {
35  setenv(name_.c_str(), saved_value_.c_str(), 1 /*overwrite*/));
36  } else {
37  GTEST_CHECK_POSIX_SUCCESS_(unsetenv(name_.c_str()));
38  }
39  }
40 
41  private:
42  std::string name_;
43  bool have_saved_value_ = false;
44  std::string saved_value_;
45 };
46 
47 class MakeTempDir {
48  public:
49  // Creates a directory with a unique name including `testname`.
50  // The destructor removes it.
51  explicit MakeTempDir(const std::string& testname) {
52  // mkdtemp requires that the last 6 characters of the input pattern
53  // are Xs, and the string is modified by replacing those characters.
54  std::string pattern = "/tmp/" + testname + "_XXXXXX";
55  GTEST_CHECK_(mkdtemp(pattern.data()) != nullptr);
56  dirname_ = pattern;
57  }
58 
59  ~MakeTempDir() { GTEST_CHECK_POSIX_SUCCESS_(rmdir(dirname_.c_str())); }
60 
61  const char* DirName() const { return dirname_.c_str(); }
62 
63  private:
64  std::string dirname_;
65 };
66 
67 bool StartsWith(const std::string& str, const std::string& prefix) {
68  return str.substr(0, prefix.size()) == prefix;
69 }
70 
71 TEST(TempDirTest, InEnvironment) {
72  // Since the test infrastructure might be verifying directory existence or
73  // even creating subdirectories, we need to be careful that the directories we
74  // specify are actually valid.
75  MakeTempDir temp_dir("TempDirTest_InEnvironment");
76  SetEnv set_env("TEST_TMPDIR", temp_dir.DirName());
77  EXPECT_TRUE(StartsWith(testing::TempDir(), temp_dir.DirName()));
78 }
79 
80 TEST(TempDirTest, NotInEnvironment) {
81  SetEnv set_env("TEST_TMPDIR", nullptr);
83 }
84 
85 TEST(SrcDirTest, InEnvironment) {
86  // Since the test infrastructure might be verifying directory existence or
87  // even creating subdirectories, we need to be careful that the directories we
88  // specify are actually valid.
89  MakeTempDir temp_dir("SrcDirTest_InEnvironment");
90  SetEnv set_env("TEST_SRCDIR", temp_dir.DirName());
91  EXPECT_TRUE(StartsWith(testing::SrcDir(), temp_dir.DirName()));
92 }
93 
94 TEST(SrcDirTest, NotInEnvironment) {
95  SetEnv set_env("TEST_SRCDIR", nullptr);
97 }
98 
99 #endif // GTEST_HAS_FILE_SYSTEM
100 
101 } // namespace
constexpr bool StartsWith(const char(&prefix)[N], const char(&str)[M])
#define EXPECT_NE(val1, val2)
Definition: gtest.h:1886
#define TEST(test_suite_name, test_name)
Definition: gtest.h:2192
GTEST_API_ std::string SrcDir()
#define GTEST_CHECK_(condition)
Definition: gtest-port.h:1118
int value
#define GTEST_CHECK_POSIX_SUCCESS_(posix_call)
Definition: gtest-port.h:1131
#define EXPECT_TRUE(condition)
Definition: gtest.h:1823
GTEST_API_ std::string TempDir()
Definition: gtest.cc:6941