diff options
author | zhanyong.wan <zhanyong.wan@861a406c-534a-0410-8894-cb66d6ee9925> | 2009-01-26 19:21:32 +0000 |
---|---|---|
committer | zhanyong.wan <zhanyong.wan@861a406c-534a-0410-8894-cb66d6ee9925> | 2009-01-26 19:21:32 +0000 |
commit | 650d5bf3ba200ecbeccbfcec6e7b6cc6f40a1f60 (patch) | |
tree | 2c3c7d9501a94340bd4ee3bd4858ebc305bca3eb /test | |
parent | b593ccbbbe6dcef342f833a37e41af0b750c7f14 (diff) | |
download | googletest-650d5bf3ba200ecbeccbfcec6e7b6cc6f40a1f60.tar.gz googletest-650d5bf3ba200ecbeccbfcec6e7b6cc6f40a1f60.tar.bz2 googletest-650d5bf3ba200ecbeccbfcec6e7b6cc6f40a1f60.zip |
Fixes the bug where the XML output path is affected by test changing the current directory. By Stefan Weigand.
Diffstat (limited to 'test')
-rw-r--r-- | test/gtest-filepath_test.cc | 84 | ||||
-rw-r--r-- | test/gtest-options_test.cc | 163 |
2 files changed, 224 insertions, 23 deletions
diff --git a/test/gtest-filepath_test.cc b/test/gtest-filepath_test.cc index d87c7c8c..589442fe 100644 --- a/test/gtest-filepath_test.cc +++ b/test/gtest-filepath_test.cc @@ -52,9 +52,9 @@ #ifdef GTEST_OS_WINDOWS #ifdef _WIN32_WCE -#include <windows.h> +#include <windows.h> // NOLINT #else -#include <direct.h> +#include <direct.h> // NOLINT #endif // _WIN32_WCE #define PATH_SEP "\\" #else @@ -217,6 +217,65 @@ TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberGtZero) { EXPECT_STREQ("foo" PATH_SEP "bar_12.xml", actual.c_str()); } +TEST(MakeFileNameTest, GenerateWhenNumberIsZeroAndDirIsEmpty) { + FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"), + 0, "xml"); + EXPECT_STREQ("bar.xml", actual.c_str()); +} + +TEST(MakeFileNameTest, GenerateWhenNumberIsNotZeroAndDirIsEmpty) { + FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"), + 14, "xml"); + EXPECT_STREQ("bar_14.xml", actual.c_str()); +} + +TEST(ConcatPathsTest, WorksWhenDirDoesNotEndWithPathSep) { + FilePath actual = FilePath::ConcatPaths(FilePath("foo"), + FilePath("bar.xml")); + EXPECT_STREQ("foo" PATH_SEP "bar.xml", actual.c_str()); +} + +TEST(ConcatPathsTest, WorksWhenPath1EndsWithPathSep) { + FilePath actual = FilePath::ConcatPaths(FilePath("foo" PATH_SEP), + FilePath("bar.xml")); + EXPECT_STREQ("foo" PATH_SEP "bar.xml", actual.c_str()); +} + +TEST(ConcatPathsTest, Path1BeingEmpty) { + FilePath actual = FilePath::ConcatPaths(FilePath(""), + FilePath("bar.xml")); + EXPECT_STREQ("bar.xml", actual.c_str()); +} + +TEST(ConcatPathsTest, Path2BeingEmpty) { + FilePath actual = FilePath::ConcatPaths(FilePath("foo"), + FilePath("")); + EXPECT_STREQ("foo" PATH_SEP, actual.c_str()); +} + +TEST(ConcatPathsTest, BothPathBeingEmpty) { + FilePath actual = FilePath::ConcatPaths(FilePath(""), + FilePath("")); + EXPECT_STREQ("", actual.c_str()); +} + +TEST(ConcatPathsTest, Path1ContainsPathSep) { + FilePath actual = FilePath::ConcatPaths(FilePath("foo" PATH_SEP "bar"), + FilePath("foobar.xml")); + EXPECT_STREQ("foo" PATH_SEP "bar" PATH_SEP "foobar.xml", actual.c_str()); +} + +TEST(ConcatPathsTest, Path2ContainsPathSep) { + FilePath actual = FilePath::ConcatPaths(FilePath("foo" PATH_SEP), + FilePath("bar" PATH_SEP "bar.xml")); + EXPECT_STREQ("foo" PATH_SEP "bar" PATH_SEP "bar.xml", actual.c_str()); +} + +TEST(ConcatPathsTest, Path2EndsWithPathSep) { + FilePath actual = FilePath::ConcatPaths(FilePath("foo"), + FilePath("bar" PATH_SEP)); + EXPECT_STREQ("foo" PATH_SEP "bar" PATH_SEP, actual.c_str()); +} // RemoveTrailingPathSeparator "" -> "" TEST(RemoveTrailingPathSeparatorTest, EmptyString) { @@ -251,7 +310,7 @@ TEST(RemoveTrailingPathSeparatorTest, ShouldReturnUnmodified) { TEST(DirectoryTest, RootDirectoryExists) { #ifdef GTEST_OS_WINDOWS // We are on Windows. - char current_drive[_MAX_PATH]; + char current_drive[_MAX_PATH]; // NOLINT current_drive[0] = _getdrive() + 'A' - 1; current_drive[1] = ':'; current_drive[2] = '\\'; @@ -268,7 +327,7 @@ TEST(DirectoryTest, RootOfWrongDriveDoesNotExists) { // Find a drive that doesn't exist. Start with 'Z' to avoid common ones. for (char drive = 'Z'; drive >= 'A'; drive--) if (_chdrive(drive - 'A' + 1) == -1) { - char non_drive[_MAX_PATH]; + char non_drive[_MAX_PATH]; // NOLINT non_drive[0] = drive; non_drive[1] = ':'; non_drive[2] = '\\'; @@ -278,14 +337,14 @@ TEST(DirectoryTest, RootOfWrongDriveDoesNotExists) { } _chdrive(saved_drive_); } -#endif // GTEST_OS_WINDOWS +#endif // GTEST_OS_WINDOWS #ifndef _WIN32_WCE // Windows CE _does_ consider an empty directory to exist. TEST(DirectoryTest, EmptyPathDirectoryDoesNotExist) { EXPECT_FALSE(FilePath("").DirectoryExists()); } -#endif // ! _WIN32_WCE +#endif // ! _WIN32_WCE TEST(DirectoryTest, CurrentDirectoryExists) { #ifdef GTEST_OS_WINDOWS // We are on Windows. @@ -529,6 +588,19 @@ TEST(FilePathTest, IsDirectory) { EXPECT_TRUE(FilePath("koala" PATH_SEP).IsDirectory()); } +TEST(FilePathTest, IsAbsolutePath) { + EXPECT_FALSE(FilePath("is" PATH_SEP "relative").IsAbsolutePath()); + EXPECT_FALSE(FilePath("").IsAbsolutePath()); +#ifdef GTEST_OS_WINDOWS + EXPECT_TRUE(FilePath("c:\\" PATH_SEP "is_not" PATH_SEP "relative") + .IsAbsolutePath()); + EXPECT_FALSE(FilePath("c:foo" PATH_SEP "bar").IsAbsolutePath()); +#else + EXPECT_TRUE(FilePath(PATH_SEP "is_not" PATH_SEP "relative") + .IsAbsolutePath()); +#endif // GTEST_OS_WINDOWS +} + } // namespace } // namespace internal } // namespace testing diff --git a/test/gtest-options_test.cc b/test/gtest-options_test.cc index 93f49e20..e3e7bd79 100644 --- a/test/gtest-options_test.cc +++ b/test/gtest-options_test.cc @@ -40,6 +40,12 @@ #include <gtest/gtest.h> +#ifdef _WIN32_WCE +#include <windows.h> +#elif defined(GTEST_OS_WINDOWS) +#include <direct.h> +#endif // _WIN32_WCE + // Indicates that this translation unit is part of Google Test's // implementation. It must come before gtest-internal-inl.h is // included, or there will be a compiler error. This trick is to @@ -50,10 +56,14 @@ #undef GTEST_IMPLEMENTATION namespace testing { - namespace internal { namespace { +// Turns the given relative path into an absolute path. +FilePath GetAbsolutePathOf(const FilePath& relative_path) { + return FilePath::ConcatPaths(FilePath::GetCurrentDir(), relative_path); +} + // Testing UnitTestOptions::GetOutputFormat/GetOutputFile. TEST(XmlOutputTest, GetOutputFormatDefault) { @@ -68,36 +78,43 @@ TEST(XmlOutputTest, GetOutputFormat) { TEST(XmlOutputTest, GetOutputFileDefault) { GTEST_FLAG(output) = ""; - EXPECT_STREQ("test_detail.xml", - UnitTestOptions::GetOutputFile().c_str()); + EXPECT_STREQ(GetAbsolutePathOf(FilePath("test_detail.xml")).c_str(), + UnitTestOptions::GetAbsolutePathToOutputFile().c_str()); } TEST(XmlOutputTest, GetOutputFileSingleFile) { GTEST_FLAG(output) = "xml:filename.abc"; - EXPECT_STREQ("filename.abc", - UnitTestOptions::GetOutputFile().c_str()); + EXPECT_STREQ(GetAbsolutePathOf(FilePath("filename.abc")).c_str(), + UnitTestOptions::GetAbsolutePathToOutputFile().c_str()); } TEST(XmlOutputTest, GetOutputFileFromDirectoryPath) { #ifdef GTEST_OS_WINDOWS - GTEST_FLAG(output) = "xml:pathname\\"; - const String& output_file = UnitTestOptions::GetOutputFile(); - EXPECT_TRUE(_strcmpi(output_file.c_str(), - "pathname\\gtest-options_test.xml") == 0 || - _strcmpi(output_file.c_str(), - "pathname\\gtest-options-ex_test.xml") == 0) - << " output_file = " << output_file; + GTEST_FLAG(output) = "xml:path\\"; + const String& output_file = UnitTestOptions::GetAbsolutePathToOutputFile(); + EXPECT_TRUE( + _strcmpi(output_file.c_str(), + GetAbsolutePathOf( + FilePath("path\\gtest-options_test.xml")).c_str()) == 0 || + _strcmpi(output_file.c_str(), + GetAbsolutePathOf( + FilePath("path\\gtest-options-ex_test.xml")).c_str()) == 0) + << " output_file = " << output_file; #else - GTEST_FLAG(output) = "xml:pathname/"; - const String& output_file = UnitTestOptions::GetOutputFile(); + GTEST_FLAG(output) = "xml:path/"; + const String& output_file = UnitTestOptions::GetAbsolutePathToOutputFile(); // TODO(wan@google.com): libtool causes the test binary file to be // named lt-gtest-options_test. Therefore the output file may be // named .../lt-gtest-options_test.xml. We should remove this // hard-coded logic when Chandler Carruth's libtool replacement is // ready. - EXPECT_TRUE(output_file == "pathname/gtest-options_test.xml" || - output_file == "pathname/lt-gtest-options_test.xml") - << " output_file = " << output_file; + EXPECT_TRUE(output_file == + GetAbsolutePathOf( + FilePath("path/gtest-options_test.xml")).c_str() || + output_file == + GetAbsolutePathOf( + FilePath("path/lt-gtest-options_test.xml")).c_str()) + << " output_file = " << output_file; #endif } @@ -117,6 +134,118 @@ TEST(OutputFileHelpersTest, GetCurrentExecutableName) { #endif } +class XmlOutputChangeDirTest : public Test { + protected: + virtual void SetUp() { + original_working_dir_ = FilePath::GetCurrentDir(); + ChDir(".."); + // This will make the test fail if run from the root directory. + EXPECT_STRNE(original_working_dir_.c_str(), + FilePath::GetCurrentDir().c_str()); + } + + virtual void TearDown() { + ChDir(original_working_dir_.c_str()); + } + + void ChDir(const char* dir) { +#ifdef GTEST_OS_WINDOWS + _chdir(dir); +#else + chdir(dir); +#endif + } + + FilePath original_working_dir_; +}; + +TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefault) { + GTEST_FLAG(output) = ""; + EXPECT_STREQ(FilePath::ConcatPaths(original_working_dir_, + FilePath("test_detail.xml")).c_str(), + UnitTestOptions::GetAbsolutePathToOutputFile().c_str()); +} + +TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefaultXML) { + GTEST_FLAG(output) = "xml"; + EXPECT_STREQ(FilePath::ConcatPaths(original_working_dir_, + FilePath("test_detail.xml")).c_str(), + UnitTestOptions::GetAbsolutePathToOutputFile().c_str()); +} + +TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativeFile) { + GTEST_FLAG(output) = "xml:filename.abc"; + EXPECT_STREQ(FilePath::ConcatPaths(original_working_dir_, + FilePath("filename.abc")).c_str(), + UnitTestOptions::GetAbsolutePathToOutputFile().c_str()); +} + +TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativePath) { +#ifdef GTEST_OS_WINDOWS + GTEST_FLAG(output) = "xml:path\\"; + const String& output_file = UnitTestOptions::GetAbsolutePathToOutputFile(); + EXPECT_TRUE( + _strcmpi(output_file.c_str(), + FilePath::ConcatPaths( + original_working_dir_, + FilePath("path\\gtest-options_test.xml")).c_str()) == 0 || + _strcmpi(output_file.c_str(), + FilePath::ConcatPaths( + original_working_dir_, + FilePath("path\\gtest-options-ex_test.xml")).c_str()) == 0) + << " output_file = " << output_file; +#else + GTEST_FLAG(output) = "xml:path/"; + const String& output_file = UnitTestOptions::GetAbsolutePathToOutputFile(); + // TODO(wan@google.com): libtool causes the test binary file to be + // named lt-gtest-options_test. Therefore the output file may be + // named .../lt-gtest-options_test.xml. We should remove this + // hard-coded logic when Chandler Carruth's libtool replacement is + // ready. + EXPECT_TRUE(output_file == FilePath::ConcatPaths(original_working_dir_, + FilePath("path/gtest-options_test.xml")).c_str() || + output_file == FilePath::ConcatPaths(original_working_dir_, + FilePath("path/lt-gtest-options_test.xml")).c_str()) + << " output_file = " << output_file; +#endif +} + +TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsoluteFile) { +#ifdef GTEST_OS_WINDOWS + GTEST_FLAG(output) = "xml:c:\\tmp\\filename.abc"; + EXPECT_STREQ(FilePath("c:\\tmp\\filename.abc").c_str(), + UnitTestOptions::GetAbsolutePathToOutputFile().c_str()); +#else + GTEST_FLAG(output) ="xml:/tmp/filename.abc"; + EXPECT_STREQ(FilePath("/tmp/filename.abc").c_str(), + UnitTestOptions::GetAbsolutePathToOutputFile().c_str()); +#endif +} + +TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsolutePath) { +#ifdef GTEST_OS_WINDOWS + GTEST_FLAG(output) = "xml:c:\\tmp\\"; + const String& output_file = UnitTestOptions::GetAbsolutePathToOutputFile(); + EXPECT_TRUE( + _strcmpi(output_file.c_str(), + FilePath("c:\\tmp\\gtest-options_test.xml").c_str()) == 0 || + _strcmpi(output_file.c_str(), + FilePath("c:\\tmp\\gtest-options-ex_test.xml").c_str()) == 0) + << " output_file = " << output_file; +#else + GTEST_FLAG(output) = "xml:/tmp/"; + const String& output_file = UnitTestOptions::GetAbsolutePathToOutputFile(); + // TODO(wan@google.com): libtool causes the test binary file to be + // named lt-gtest-options_test. Therefore the output file may be + // named .../lt-gtest-options_test.xml. We should remove this + // hard-coded logic when Chandler Carruth's libtool replacement is + // ready. + EXPECT_TRUE(output_file == "/tmp/gtest-options_test.xml" || + output_file == "/tmp/lt-gtest-options_test.xml") + << " output_file = " << output_file; +#endif +} + } // namespace } // namespace internal } // namespace testing |