-
Notifications
You must be signed in to change notification settings - Fork 10.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Defined a testing::SrcDir() function that returns the name of a direc…
…tory where ancillary data files can be found. PiperOrigin-RevId: 487896836 Change-Id: Ie6b1ba734e900fa33872b63090879ee6efe33411
- Loading branch information
1 parent
44c0364
commit 912db74
Showing
3 changed files
with
140 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
#include <sys/stat.h> | ||
|
||
#include <cstdlib> | ||
#include <cstring> | ||
#include <string> | ||
|
||
#include "gtest/gtest.h" | ||
#include "gtest/internal/gtest-port.h" | ||
|
||
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(), ""); | ||
} | ||
|
||
} // namespace |
ЛОЛ