GoogleTest - Google Testing and Mocking Framework (grpc protobuff依赖)
https://google.github.io/googletest/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.9 KiB
101 lines
2.9 KiB
#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
|
|
|