113481Sgiacomo.travaglini@arm.com// Copyright 2008, Google Inc.
213481Sgiacomo.travaglini@arm.com// All rights reserved.
313481Sgiacomo.travaglini@arm.com//
413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
613481Sgiacomo.travaglini@arm.com// met:
713481Sgiacomo.travaglini@arm.com//
813481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1013481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1313481Sgiacomo.travaglini@arm.com// distribution.
1413481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
1713481Sgiacomo.travaglini@arm.com//
1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2913481Sgiacomo.travaglini@arm.com//
3013481Sgiacomo.travaglini@arm.com// Authors: keith.ray@gmail.com (Keith Ray)
3113481Sgiacomo.travaglini@arm.com//
3213481Sgiacomo.travaglini@arm.com// Google Test UnitTestOptions tests
3313481Sgiacomo.travaglini@arm.com//
3413481Sgiacomo.travaglini@arm.com// This file tests classes and functions used internally by
3513481Sgiacomo.travaglini@arm.com// Google Test.  They are subject to change without notice.
3613481Sgiacomo.travaglini@arm.com//
3713481Sgiacomo.travaglini@arm.com// This file is #included from gtest.cc, to avoid changing build or
3813481Sgiacomo.travaglini@arm.com// make-files on Windows and other platforms. Do not #include this file
3913481Sgiacomo.travaglini@arm.com// anywhere else!
4013481Sgiacomo.travaglini@arm.com
4113481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h"
4213481Sgiacomo.travaglini@arm.com
4313481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS_MOBILE
4413481Sgiacomo.travaglini@arm.com# include <windows.h>
4513481Sgiacomo.travaglini@arm.com#elif GTEST_OS_WINDOWS
4613481Sgiacomo.travaglini@arm.com# include <direct.h>
4713481Sgiacomo.travaglini@arm.com#endif  // GTEST_OS_WINDOWS_MOBILE
4813481Sgiacomo.travaglini@arm.com
4913481Sgiacomo.travaglini@arm.com// Indicates that this translation unit is part of Google Test's
5013481Sgiacomo.travaglini@arm.com// implementation.  It must come before gtest-internal-inl.h is
5113481Sgiacomo.travaglini@arm.com// included, or there will be a compiler error.  This trick is to
5213481Sgiacomo.travaglini@arm.com// prevent a user from accidentally including gtest-internal-inl.h in
5313481Sgiacomo.travaglini@arm.com// his code.
5413481Sgiacomo.travaglini@arm.com#define GTEST_IMPLEMENTATION_ 1
5513481Sgiacomo.travaglini@arm.com#include "src/gtest-internal-inl.h"
5613481Sgiacomo.travaglini@arm.com#undef GTEST_IMPLEMENTATION_
5713481Sgiacomo.travaglini@arm.com
5813481Sgiacomo.travaglini@arm.comnamespace testing {
5913481Sgiacomo.travaglini@arm.comnamespace internal {
6013481Sgiacomo.travaglini@arm.comnamespace {
6113481Sgiacomo.travaglini@arm.com
6213481Sgiacomo.travaglini@arm.com// Turns the given relative path into an absolute path.
6313481Sgiacomo.travaglini@arm.comFilePath GetAbsolutePathOf(const FilePath& relative_path) {
6413481Sgiacomo.travaglini@arm.com  return FilePath::ConcatPaths(FilePath::GetCurrentDir(), relative_path);
6513481Sgiacomo.travaglini@arm.com}
6613481Sgiacomo.travaglini@arm.com
6713481Sgiacomo.travaglini@arm.com// Testing UnitTestOptions::GetOutputFormat/GetOutputFile.
6813481Sgiacomo.travaglini@arm.com
6913481Sgiacomo.travaglini@arm.comTEST(XmlOutputTest, GetOutputFormatDefault) {
7013481Sgiacomo.travaglini@arm.com  GTEST_FLAG(output) = "";
7113481Sgiacomo.travaglini@arm.com  EXPECT_STREQ("", UnitTestOptions::GetOutputFormat().c_str());
7213481Sgiacomo.travaglini@arm.com}
7313481Sgiacomo.travaglini@arm.com
7413481Sgiacomo.travaglini@arm.comTEST(XmlOutputTest, GetOutputFormat) {
7513481Sgiacomo.travaglini@arm.com  GTEST_FLAG(output) = "xml:filename";
7613481Sgiacomo.travaglini@arm.com  EXPECT_STREQ("xml", UnitTestOptions::GetOutputFormat().c_str());
7713481Sgiacomo.travaglini@arm.com}
7813481Sgiacomo.travaglini@arm.com
7913481Sgiacomo.travaglini@arm.comTEST(XmlOutputTest, GetOutputFileDefault) {
8013481Sgiacomo.travaglini@arm.com  GTEST_FLAG(output) = "";
8113481Sgiacomo.travaglini@arm.com  EXPECT_EQ(GetAbsolutePathOf(FilePath("test_detail.xml")).string(),
8213481Sgiacomo.travaglini@arm.com            UnitTestOptions::GetAbsolutePathToOutputFile());
8313481Sgiacomo.travaglini@arm.com}
8413481Sgiacomo.travaglini@arm.com
8513481Sgiacomo.travaglini@arm.comTEST(XmlOutputTest, GetOutputFileSingleFile) {
8613481Sgiacomo.travaglini@arm.com  GTEST_FLAG(output) = "xml:filename.abc";
8713481Sgiacomo.travaglini@arm.com  EXPECT_EQ(GetAbsolutePathOf(FilePath("filename.abc")).string(),
8813481Sgiacomo.travaglini@arm.com            UnitTestOptions::GetAbsolutePathToOutputFile());
8913481Sgiacomo.travaglini@arm.com}
9013481Sgiacomo.travaglini@arm.com
9113481Sgiacomo.travaglini@arm.comTEST(XmlOutputTest, GetOutputFileFromDirectoryPath) {
9213481Sgiacomo.travaglini@arm.com  GTEST_FLAG(output) = "xml:path" GTEST_PATH_SEP_;
9313481Sgiacomo.travaglini@arm.com  const std::string expected_output_file =
9413481Sgiacomo.travaglini@arm.com      GetAbsolutePathOf(
9513481Sgiacomo.travaglini@arm.com          FilePath(std::string("path") + GTEST_PATH_SEP_ +
9613481Sgiacomo.travaglini@arm.com                   GetCurrentExecutableName().string() + ".xml")).string();
9713481Sgiacomo.travaglini@arm.com  const std::string& output_file =
9813481Sgiacomo.travaglini@arm.com      UnitTestOptions::GetAbsolutePathToOutputFile();
9913481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS
10013481Sgiacomo.travaglini@arm.com  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());
10113481Sgiacomo.travaglini@arm.com#else
10213481Sgiacomo.travaglini@arm.com  EXPECT_EQ(expected_output_file, output_file.c_str());
10313481Sgiacomo.travaglini@arm.com#endif
10413481Sgiacomo.travaglini@arm.com}
10513481Sgiacomo.travaglini@arm.com
10613481Sgiacomo.travaglini@arm.comTEST(OutputFileHelpersTest, GetCurrentExecutableName) {
10713481Sgiacomo.travaglini@arm.com  const std::string exe_str = GetCurrentExecutableName().string();
10813481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS
10913481Sgiacomo.travaglini@arm.com  const bool success =
11013481Sgiacomo.travaglini@arm.com      _strcmpi("gtest-options_test", exe_str.c_str()) == 0 ||
11113481Sgiacomo.travaglini@arm.com      _strcmpi("gtest-options-ex_test", exe_str.c_str()) == 0 ||
11213481Sgiacomo.travaglini@arm.com      _strcmpi("gtest_all_test", exe_str.c_str()) == 0 ||
11313481Sgiacomo.travaglini@arm.com      _strcmpi("gtest_dll_test", exe_str.c_str()) == 0;
11413481Sgiacomo.travaglini@arm.com#else
11513481Sgiacomo.travaglini@arm.com  // TODO(wan@google.com): remove the hard-coded "lt-" prefix when
11613481Sgiacomo.travaglini@arm.com  //   Chandler Carruth's libtool replacement is ready.
11713481Sgiacomo.travaglini@arm.com  const bool success =
11813481Sgiacomo.travaglini@arm.com      exe_str == "gtest-options_test" ||
11913481Sgiacomo.travaglini@arm.com      exe_str == "gtest_all_test" ||
12013481Sgiacomo.travaglini@arm.com      exe_str == "lt-gtest_all_test" ||
12113481Sgiacomo.travaglini@arm.com      exe_str == "gtest_dll_test";
12213481Sgiacomo.travaglini@arm.com#endif  // GTEST_OS_WINDOWS
12313481Sgiacomo.travaglini@arm.com  if (!success)
12413481Sgiacomo.travaglini@arm.com    FAIL() << "GetCurrentExecutableName() returns " << exe_str;
12513481Sgiacomo.travaglini@arm.com}
12613481Sgiacomo.travaglini@arm.com
12713481Sgiacomo.travaglini@arm.comclass XmlOutputChangeDirTest : public Test {
12813481Sgiacomo.travaglini@arm.com protected:
12913481Sgiacomo.travaglini@arm.com  virtual void SetUp() {
13013481Sgiacomo.travaglini@arm.com    original_working_dir_ = FilePath::GetCurrentDir();
13113481Sgiacomo.travaglini@arm.com    posix::ChDir("..");
13213481Sgiacomo.travaglini@arm.com    // This will make the test fail if run from the root directory.
13313481Sgiacomo.travaglini@arm.com    EXPECT_NE(original_working_dir_.string(),
13413481Sgiacomo.travaglini@arm.com              FilePath::GetCurrentDir().string());
13513481Sgiacomo.travaglini@arm.com  }
13613481Sgiacomo.travaglini@arm.com
13713481Sgiacomo.travaglini@arm.com  virtual void TearDown() {
13813481Sgiacomo.travaglini@arm.com    posix::ChDir(original_working_dir_.string().c_str());
13913481Sgiacomo.travaglini@arm.com  }
14013481Sgiacomo.travaglini@arm.com
14113481Sgiacomo.travaglini@arm.com  FilePath original_working_dir_;
14213481Sgiacomo.travaglini@arm.com};
14313481Sgiacomo.travaglini@arm.com
14413481Sgiacomo.travaglini@arm.comTEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefault) {
14513481Sgiacomo.travaglini@arm.com  GTEST_FLAG(output) = "";
14613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,
14713481Sgiacomo.travaglini@arm.com                                  FilePath("test_detail.xml")).string(),
14813481Sgiacomo.travaglini@arm.com            UnitTestOptions::GetAbsolutePathToOutputFile());
14913481Sgiacomo.travaglini@arm.com}
15013481Sgiacomo.travaglini@arm.com
15113481Sgiacomo.travaglini@arm.comTEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefaultXML) {
15213481Sgiacomo.travaglini@arm.com  GTEST_FLAG(output) = "xml";
15313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,
15413481Sgiacomo.travaglini@arm.com                                  FilePath("test_detail.xml")).string(),
15513481Sgiacomo.travaglini@arm.com            UnitTestOptions::GetAbsolutePathToOutputFile());
15613481Sgiacomo.travaglini@arm.com}
15713481Sgiacomo.travaglini@arm.com
15813481Sgiacomo.travaglini@arm.comTEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativeFile) {
15913481Sgiacomo.travaglini@arm.com  GTEST_FLAG(output) = "xml:filename.abc";
16013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,
16113481Sgiacomo.travaglini@arm.com                                  FilePath("filename.abc")).string(),
16213481Sgiacomo.travaglini@arm.com            UnitTestOptions::GetAbsolutePathToOutputFile());
16313481Sgiacomo.travaglini@arm.com}
16413481Sgiacomo.travaglini@arm.com
16513481Sgiacomo.travaglini@arm.comTEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativePath) {
16613481Sgiacomo.travaglini@arm.com  GTEST_FLAG(output) = "xml:path" GTEST_PATH_SEP_;
16713481Sgiacomo.travaglini@arm.com  const std::string expected_output_file =
16813481Sgiacomo.travaglini@arm.com      FilePath::ConcatPaths(
16913481Sgiacomo.travaglini@arm.com          original_working_dir_,
17013481Sgiacomo.travaglini@arm.com          FilePath(std::string("path") + GTEST_PATH_SEP_ +
17113481Sgiacomo.travaglini@arm.com                   GetCurrentExecutableName().string() + ".xml")).string();
17213481Sgiacomo.travaglini@arm.com  const std::string& output_file =
17313481Sgiacomo.travaglini@arm.com      UnitTestOptions::GetAbsolutePathToOutputFile();
17413481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS
17513481Sgiacomo.travaglini@arm.com  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());
17613481Sgiacomo.travaglini@arm.com#else
17713481Sgiacomo.travaglini@arm.com  EXPECT_EQ(expected_output_file, output_file.c_str());
17813481Sgiacomo.travaglini@arm.com#endif
17913481Sgiacomo.travaglini@arm.com}
18013481Sgiacomo.travaglini@arm.com
18113481Sgiacomo.travaglini@arm.comTEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsoluteFile) {
18213481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS
18313481Sgiacomo.travaglini@arm.com  GTEST_FLAG(output) = "xml:c:\\tmp\\filename.abc";
18413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(FilePath("c:\\tmp\\filename.abc").string(),
18513481Sgiacomo.travaglini@arm.com            UnitTestOptions::GetAbsolutePathToOutputFile());
18613481Sgiacomo.travaglini@arm.com#else
18713481Sgiacomo.travaglini@arm.com  GTEST_FLAG(output) ="xml:/tmp/filename.abc";
18813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(FilePath("/tmp/filename.abc").string(),
18913481Sgiacomo.travaglini@arm.com            UnitTestOptions::GetAbsolutePathToOutputFile());
19013481Sgiacomo.travaglini@arm.com#endif
19113481Sgiacomo.travaglini@arm.com}
19213481Sgiacomo.travaglini@arm.com
19313481Sgiacomo.travaglini@arm.comTEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsolutePath) {
19413481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS
19513481Sgiacomo.travaglini@arm.com  const std::string path = "c:\\tmp\\";
19613481Sgiacomo.travaglini@arm.com#else
19713481Sgiacomo.travaglini@arm.com  const std::string path = "/tmp/";
19813481Sgiacomo.travaglini@arm.com#endif
19913481Sgiacomo.travaglini@arm.com
20013481Sgiacomo.travaglini@arm.com  GTEST_FLAG(output) = "xml:" + path;
20113481Sgiacomo.travaglini@arm.com  const std::string expected_output_file =
20213481Sgiacomo.travaglini@arm.com      path + GetCurrentExecutableName().string() + ".xml";
20313481Sgiacomo.travaglini@arm.com  const std::string& output_file =
20413481Sgiacomo.travaglini@arm.com      UnitTestOptions::GetAbsolutePathToOutputFile();
20513481Sgiacomo.travaglini@arm.com
20613481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS
20713481Sgiacomo.travaglini@arm.com  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());
20813481Sgiacomo.travaglini@arm.com#else
20913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(expected_output_file, output_file.c_str());
21013481Sgiacomo.travaglini@arm.com#endif
21113481Sgiacomo.travaglini@arm.com}
21213481Sgiacomo.travaglini@arm.com
21313481Sgiacomo.travaglini@arm.com}  // namespace
21413481Sgiacomo.travaglini@arm.com}  // namespace internal
21513481Sgiacomo.travaglini@arm.com}  // namespace testing
216