10ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Copyright 2008, Google Inc.
20ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// All rights reserved.
30ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
40ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Redistribution and use in source and binary forms, with or without
50ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// modification, are permitted provided that the following conditions are
60ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// met:
70ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
80ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Redistributions of source code must retain the above copyright
90ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// notice, this list of conditions and the following disclaimer.
100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Redistributions in binary form must reproduce the above
110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// copyright notice, this list of conditions and the following disclaimer
120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// in the documentation and/or other materials provided with the
130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// distribution.
140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Neither the name of Google Inc. nor the names of its
150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// contributors may be used to endorse or promote products derived from
160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// this software without specific prior written permission.
170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Author: mheule@google.com (Markus Heule)
310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Google C++ Testing Framework (Google Test)
330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Sometimes it's desirable to build Google Test by compiling a single file.
350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This file serves this purpose.
360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This line ensures that gtest.h can be compiled on its own, even
380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// when it's fused.
390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <gtest/gtest.h>
400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The following lines pull in the real gtest *.cc files.
420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Copyright 2005, Google Inc.
430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// All rights reserved.
440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Redistribution and use in source and binary forms, with or without
460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// modification, are permitted provided that the following conditions are
470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// met:
480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Redistributions of source code must retain the above copyright
500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// notice, this list of conditions and the following disclaimer.
510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Redistributions in binary form must reproduce the above
520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// copyright notice, this list of conditions and the following disclaimer
530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// in the documentation and/or other materials provided with the
540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// distribution.
550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Neither the name of Google Inc. nor the names of its
560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// contributors may be used to endorse or promote products derived from
570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// this software without specific prior written permission.
580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Author: wan@google.com (Zhanyong Wan)
720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The Google C++ Testing Framework (Google Test)
740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Copyright 2007, Google Inc.
760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// All rights reserved.
770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Redistribution and use in source and binary forms, with or without
790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// modification, are permitted provided that the following conditions are
800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// met:
810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Redistributions of source code must retain the above copyright
830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// notice, this list of conditions and the following disclaimer.
840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Redistributions in binary form must reproduce the above
850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// copyright notice, this list of conditions and the following disclaimer
860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// in the documentation and/or other materials provided with the
870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// distribution.
880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Neither the name of Google Inc. nor the names of its
890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// contributors may be used to endorse or promote products derived from
900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// this software without specific prior written permission.
910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
1040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Author: wan@google.com (Zhanyong Wan)
1050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
1060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Utilities for testing Google Test itself and code that uses Google Test
1070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// (e.g. frameworks built on top of Google Test).
1080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
1100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
1110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace testing {
1140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This helper class can be used to mock out Google Test failure reporting
1160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// so that we can test Google Test or code that builds on Google Test.
1170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
1180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// An object of this class appends a TestPartResult object to the
1190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TestPartResultArray object given in the constructor whenever a Google Test
1200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// failure is reported. It can either intercept only failures that are
1210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// generated in the same thread that created this object or it can intercept
1220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// all generated failures. The scope of this mock object can be controlled with
1230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the second argument to the two arguments constructor.
1240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass GTEST_API_ ScopedFakeTestPartResultReporter
1250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    : public TestPartResultReporterInterface {
1260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
1270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The two possible mocking modes of this object.
1280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  enum InterceptMode {
1290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.
1300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    INTERCEPT_ALL_THREADS           // Intercepts all failures.
1310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  };
1320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The c'tor sets this object as the test part result reporter used
1340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // by Google Test.  The 'result' parameter specifies where to report the
1350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // results. This reporter will only catch failures generated in the current
1360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // thread. DEPRECATED
1370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
1380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Same as above, but you can choose the interception scope of this object.
1400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
1410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                   TestPartResultArray* result);
1420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The d'tor restores the previous test part result reporter.
1440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual ~ScopedFakeTestPartResultReporter();
1450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Appends the TestPartResult object to the TestPartResultArray
1470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // received in the constructor.
1480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //
1490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // This method is from the TestPartResultReporterInterface
1500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // interface.
1510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void ReportTestPartResult(const TestPartResult& result);
1520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
1530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void Init();
1540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const InterceptMode intercept_mode_;
1560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestPartResultReporterInterface* old_reporter_;
1570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestPartResultArray* const result_;
1580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
1600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
1610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
1630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A helper class for implementing EXPECT_FATAL_FAILURE() and
1650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given
1660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TestPartResultArray contains exactly one failure that has the given
1670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// type and contains the given substring.  If that's not the case, a
1680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// non-fatal failure will be generated.
1690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass GTEST_API_ SingleFailureChecker {
1700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
1710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The constructor remembers the arguments.
1720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  SingleFailureChecker(const TestPartResultArray* results,
1730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                       TestPartResult::Type type,
1740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                       const char* substr);
1750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ~SingleFailureChecker();
1760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
1770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const TestPartResultArray* const results_;
1780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const TestPartResult::Type type_;
1790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String substr_;
1800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
1820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
1830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
1850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace testing
1870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A set of macros for testing Google Test assertions or code that's expected
1890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// to generate Google Test fatal failures.  It verifies that the given
1900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// statement will cause exactly one fatal Google Test failure with 'substr'
1910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// being part of the failure message.
1920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
1930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
1940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// affects and considers failures generated in the current thread and
1950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
1960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
1970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The verification of the assertion is done correctly even when the statement
1980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// throws an exception or aborts the current function.
1990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
2000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Known restrictions:
2010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   - 'statement' cannot reference local non-static variables or
2020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     non-static members of the current object.
2030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   - 'statement' cannot return a value.
2040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   - You cannot stream a failure message to this macro.
2050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
2060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Note that even though the implementations of the following two
2070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// macros are much alike, we cannot refactor them to use a common
2080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// helper macro, due to some peculiarity in how the preprocessor
2090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// works.  The AcceptsMacroThatExpandsToUnprotectedComma test in
2100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// gtest_unittest.cc will fail to compile if we do that.
2110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define EXPECT_FATAL_FAILURE(statement, substr) \
2120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  do { \
2130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    class GTestExpectFatalFailureHelper {\
2140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson     public:\
2150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      static void Execute() { statement; }\
2160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    };\
2170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ::testing::TestPartResultArray gtest_failures;\
2180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ::testing::internal::SingleFailureChecker gtest_checker(\
2190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
2200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    {\
2210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
2220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          ::testing::ScopedFakeTestPartResultReporter:: \
2230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
2240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      GTestExpectFatalFailureHelper::Execute();\
2250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }\
2260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } while (::testing::internal::AlwaysFalse())
2270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
2280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
2290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  do { \
2300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    class GTestExpectFatalFailureHelper {\
2310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson     public:\
2320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      static void Execute() { statement; }\
2330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    };\
2340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ::testing::TestPartResultArray gtest_failures;\
2350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ::testing::internal::SingleFailureChecker gtest_checker(\
2360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
2370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    {\
2380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
2390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          ::testing::ScopedFakeTestPartResultReporter:: \
2400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          INTERCEPT_ALL_THREADS, &gtest_failures);\
2410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      GTestExpectFatalFailureHelper::Execute();\
2420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }\
2430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } while (::testing::internal::AlwaysFalse())
2440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
2450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A macro for testing Google Test assertions or code that's expected to
2460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// generate Google Test non-fatal failures.  It asserts that the given
2470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// statement will cause exactly one non-fatal Google Test failure with 'substr'
2480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// being part of the failure message.
2490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
2500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
2510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// affects and considers failures generated in the current thread and
2520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
2530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
2540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// 'statement' is allowed to reference local variables and members of
2550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the current object.
2560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
2570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The verification of the assertion is done correctly even when the statement
2580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// throws an exception or aborts the current function.
2590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
2600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Known restrictions:
2610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   - You cannot stream a failure message to this macro.
2620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
2630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Note that even though the implementations of the following two
2640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// macros are much alike, we cannot refactor them to use a common
2650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// helper macro, due to some peculiarity in how the preprocessor
2660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// works.  If we do that, the code won't compile when the user gives
2670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
2680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// expands to code containing an unprotected comma.  The
2690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
2700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// catches that.
2710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
2720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// For the same reason, we have to write
2730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   if (::testing::internal::AlwaysTrue()) { statement; }
2740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// instead of
2750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
2760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// to avoid an MSVC warning on unreachable code.
2770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define EXPECT_NONFATAL_FAILURE(statement, substr) \
2780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  do {\
2790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ::testing::TestPartResultArray gtest_failures;\
2800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ::testing::internal::SingleFailureChecker gtest_checker(\
2810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
2820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        (substr));\
2830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    {\
2840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
2850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          ::testing::ScopedFakeTestPartResultReporter:: \
2860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
2870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if (::testing::internal::AlwaysTrue()) { statement; }\
2880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }\
2890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } while (::testing::internal::AlwaysFalse())
2900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
2910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
2920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  do {\
2930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ::testing::TestPartResultArray gtest_failures;\
2940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ::testing::internal::SingleFailureChecker gtest_checker(\
2950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
2960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        (substr));\
2970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    {\
2980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
2990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\
3000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          &gtest_failures);\
3010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if (::testing::internal::AlwaysTrue()) { statement; }\
3020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }\
3030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } while (::testing::internal::AlwaysFalse())
3040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
3060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <ctype.h>
3080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <math.h>
3090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <stdarg.h>
3100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <stdio.h>
3110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <stdlib.h>
3120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <wchar.h>
3130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <wctype.h>
3140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <algorithm>
3160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <ostream>
3170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <sstream>
3180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <vector>
3190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_LINUX
3210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TODO(kenton@google.com): Use autoconf to detect availability of
3230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// gettimeofday().
3240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_HAS_GETTIMEOFDAY_ 1
3250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <fcntl.h>
3270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <limits.h>
3280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <sched.h>
3290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Declares vsnprintf().  This header is not available on Windows.
3300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <strings.h>
3310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <sys/mman.h>
3320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <sys/time.h>
3330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <unistd.h>
3340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <string>
3350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <vector>
3360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#elif GTEST_OS_SYMBIAN
3380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_HAS_GETTIMEOFDAY_ 1
3390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <sys/time.h>  // NOLINT
3400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#elif GTEST_OS_ZOS
3420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_HAS_GETTIMEOFDAY_ 1
3430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <sys/time.h>  // NOLINT
3440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// On z/OS we additionally need strings.h for strcasecmp.
3460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <strings.h>  // NOLINT
3470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#elif GTEST_OS_WINDOWS_MOBILE  // We are on Windows CE.
3490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <windows.h>  // NOLINT
3510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#elif GTEST_OS_WINDOWS  // We are on Windows proper.
3530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <io.h>  // NOLINT
3550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <sys/timeb.h>  // NOLINT
3560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <sys/types.h>  // NOLINT
3570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <sys/stat.h>  // NOLINT
3580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS_MINGW
3600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// MinGW has gettimeofday() but not _ftime64().
3610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TODO(kenton@google.com): Use autoconf to detect availability of
3620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   gettimeofday().
3630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TODO(kenton@google.com): There are other ways to get the time on
3640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   Windows, like GetTickCount() or GetSystemTimeAsFileTime().  MinGW
3650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   supports these.  consider using them instead.
3660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_HAS_GETTIMEOFDAY_ 1
3670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <sys/time.h>  // NOLINT
3680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS_MINGW
3690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// cpplint thinks that the header is already included, so we want to
3710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// silence it.
3720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <windows.h>  // NOLINT
3730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
3750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Assume other platforms have gettimeofday().
3770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TODO(kenton@google.com): Use autoconf to detect availability of
3780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   gettimeofday().
3790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_HAS_GETTIMEOFDAY_ 1
3800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// cpplint thinks that the header is already included, so we want to
3820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// silence it.
3830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <sys/time.h>  // NOLINT
3840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <unistd.h>  // NOLINT
3850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_LINUX
3870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_EXCEPTIONS
3890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <stdexcept>
3900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif
3910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Indicates that this translation unit is part of Google Test's
3930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// implementation.  It must come before gtest-internal-inl.h is
3940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// included, or there will be a compiler error.  This trick is to
3950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// prevent a user from accidentally including gtest-internal-inl.h in
3960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// his code.
3970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_IMPLEMENTATION_ 1
3980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Copyright 2005, Google Inc.
3990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// All rights reserved.
4000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
4010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Redistribution and use in source and binary forms, with or without
4020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// modification, are permitted provided that the following conditions are
4030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// met:
4040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
4050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Redistributions of source code must retain the above copyright
4060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// notice, this list of conditions and the following disclaimer.
4070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Redistributions in binary form must reproduce the above
4080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// copyright notice, this list of conditions and the following disclaimer
4090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// in the documentation and/or other materials provided with the
4100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// distribution.
4110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Neither the name of Google Inc. nor the names of its
4120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// contributors may be used to endorse or promote products derived from
4130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// this software without specific prior written permission.
4140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
4150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
4170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
4180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
4190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
4200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
4220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
4230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
4240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
4250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Utility functions and classes used by the Google C++ testing framework.
4280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
4290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Author: wan@google.com (Zhanyong Wan)
4300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
4310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This file contains purely Google Test's internal implementation.  Please
4320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// DO NOT #INCLUDE IT IN A USER PROGRAM.
4330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
4350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_SRC_GTEST_INTERNAL_INL_H_
4360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is
4380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// part of Google Test's implementation; otherwise it's undefined.
4390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if !GTEST_IMPLEMENTATION_
4400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A user is trying to include this from his code - just say no.
4410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#error "gtest-internal-inl.h is part of Google Test's internal implementation."
4420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#error "It must not be included except by Google Test itself."
4430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_IMPLEMENTATION_
4440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#ifndef _WIN32_WCE
4460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <errno.h>
4470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // !_WIN32_WCE
4480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <stddef.h>
4490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <stdlib.h>  // For strtoll/_strtoul64/malloc/free.
4500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <string.h>  // For memmove.
4510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <algorithm>
4530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <string>
4540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <vector>
4550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
4580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <windows.h>  // For DWORD.
4590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
4600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace testing {
4630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Declares the flags.
4650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
4660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// We don't want the users to modify this flag in the code, but want
4670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Google Test's own unit tests to be able to access it. Therefore we
4680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// declare it here as opposed to in gtest.h.
4690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DECLARE_bool_(death_test_use_fork);
4700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
4720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The value of GetTestTypeId() as seen from within the Google Test
4740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// library.  This is solely for testing GetTestTypeId().
4750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;
4760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Names of the flags (needed for parsing Google Test flags).
4780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests";
4790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kBreakOnFailureFlag[] = "break_on_failure";
4800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kCatchExceptionsFlag[] = "catch_exceptions";
4810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kColorFlag[] = "color";
4820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kFilterFlag[] = "filter";
4830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kListTestsFlag[] = "list_tests";
4840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kOutputFlag[] = "output";
4850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kPrintTimeFlag[] = "print_time";
4860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kRandomSeedFlag[] = "random_seed";
4870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kRepeatFlag[] = "repeat";
4880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kShuffleFlag[] = "shuffle";
4890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kStackTraceDepthFlag[] = "stack_trace_depth";
4900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kThrowOnFailureFlag[] = "throw_on_failure";
4910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A valid random seed must be in [1, kMaxRandomSeed].
4930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst int kMaxRandomSeed = 99999;
4940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// g_help_flag is true iff the --help flag or an equivalent form is
4960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// specified on the command line.
4970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ extern bool g_help_flag;
4980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the current time in milliseconds.
5000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ TimeInMillis GetTimeInMillis();
5010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff Google Test should use colors in the output.
5030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
5040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Formats the given time in milliseconds as seconds.
5060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
5070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Parses a string for an Int32 flag, in the form of "--flag=value".
5090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
5100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// On success, stores the value of the flag in *value, and returns
5110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// true.  On failure, returns false without changing *value.
5120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ bool ParseInt32Flag(
5130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* str, const char* flag, Int32* value);
5140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns a random seed in range [1, kMaxRandomSeed] based on the
5160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// given --gtest_random_seed flag value.
5170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsoninline int GetRandomSeedFromFlag(Int32 random_seed_flag) {
5180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const unsigned int raw_seed = (random_seed_flag == 0) ?
5190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      static_cast<unsigned int>(GetTimeInMillis()) :
5200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      static_cast<unsigned int>(random_seed_flag);
5210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Normalizes the actual seed to range [1, kMaxRandomSeed] such that
5230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // it's easy to type.
5240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int normalized_seed =
5250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      static_cast<int>((raw_seed - 1U) %
5260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                       static_cast<unsigned int>(kMaxRandomSeed)) + 1;
5270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return normalized_seed;
5280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
5290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the first valid random seed after 'seed'.  The behavior is
5310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// undefined if 'seed' is invalid.  The seed after kMaxRandomSeed is
5320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// considered to be 1.
5330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsoninline int GetNextRandomSeed(int seed) {
5340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)
5350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "Invalid random seed " << seed << " - must be in [1, "
5360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << kMaxRandomSeed << "].";
5370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int next_seed = seed + 1;
5380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return (next_seed > kMaxRandomSeed) ? 1 : next_seed;
5390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
5400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This class saves the values of all Google Test flags in its c'tor, and
5420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// restores them in its d'tor.
5430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass GTestFlagSaver {
5440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
5450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The c'tor.
5460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTestFlagSaver() {
5470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);
5480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    break_on_failure_ = GTEST_FLAG(break_on_failure);
5490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    catch_exceptions_ = GTEST_FLAG(catch_exceptions);
5500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    color_ = GTEST_FLAG(color);
5510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    death_test_style_ = GTEST_FLAG(death_test_style);
5520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);
5530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    filter_ = GTEST_FLAG(filter);
5540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);
5550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    list_tests_ = GTEST_FLAG(list_tests);
5560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    output_ = GTEST_FLAG(output);
5570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    print_time_ = GTEST_FLAG(print_time);
5580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    random_seed_ = GTEST_FLAG(random_seed);
5590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    repeat_ = GTEST_FLAG(repeat);
5600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    shuffle_ = GTEST_FLAG(shuffle);
5610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);
5620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    throw_on_failure_ = GTEST_FLAG(throw_on_failure);
5630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
5640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The d'tor is not virtual.  DO NOT INHERIT FROM THIS CLASS.
5660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ~GTestFlagSaver() {
5670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;
5680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_FLAG(break_on_failure) = break_on_failure_;
5690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_FLAG(catch_exceptions) = catch_exceptions_;
5700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_FLAG(color) = color_;
5710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_FLAG(death_test_style) = death_test_style_;
5720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;
5730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_FLAG(filter) = filter_;
5740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;
5750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_FLAG(list_tests) = list_tests_;
5760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_FLAG(output) = output_;
5770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_FLAG(print_time) = print_time_;
5780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_FLAG(random_seed) = random_seed_;
5790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_FLAG(repeat) = repeat_;
5800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_FLAG(shuffle) = shuffle_;
5810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;
5820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_FLAG(throw_on_failure) = throw_on_failure_;
5830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
5840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
5850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Fields for saving the original values of flags.
5860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool also_run_disabled_tests_;
5870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool break_on_failure_;
5880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool catch_exceptions_;
5890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  String color_;
5900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  String death_test_style_;
5910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool death_test_use_fork_;
5920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  String filter_;
5930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  String internal_run_death_test_;
5940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool list_tests_;
5950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  String output_;
5960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool print_time_;
5970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool pretty_;
5980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::Int32 random_seed_;
5990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::Int32 repeat_;
6000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool shuffle_;
6010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::Int32 stack_trace_depth_;
6020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool throw_on_failure_;
6030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson} GTEST_ATTRIBUTE_UNUSED_;
6040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Converts a Unicode code point to a narrow string in UTF-8 encoding.
6060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// code_point parameter is of type UInt32 because wchar_t may not be
6070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// wide enough to contain a code point.
6080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The output buffer str must containt at least 32 characters.
6090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The function returns the address of the output buffer.
6100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// If the code_point is not a valid Unicode code point
6110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output
6120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// as '(Invalid Unicode 0xXXXXXXXX)'.
6130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ char* CodePointToUtf8(UInt32 code_point, char* str);
6140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Converts a wide string to a narrow string in UTF-8 encoding.
6160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The wide string is assumed to have the following encoding:
6170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
6180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
6190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Parameter str points to a null-terminated wide string.
6200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Parameter num_chars may additionally limit the number
6210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// of wchar_t characters processed. -1 is used when the entire string
6220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// should be processed.
6230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// If the string contains code points that are not valid Unicode code points
6240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
6250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
6260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// and contains invalid UTF-16 surrogate pairs, values in those pairs
6270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// will be encoded as individual Unicode characters from Basic Normal Plane.
6280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ String WideStringToUtf8(const wchar_t* str, int num_chars);
6290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
6310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// if the variable is present. If a file already exists at this location, this
6320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// function will write over it. If the variable is present, but the file cannot
6330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// be created, prints an error and exits.
6340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid WriteToShardStatusFileIfNeeded();
6350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Checks whether sharding is enabled by examining the relevant
6370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// environment variable values. If the variables are present,
6380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// but inconsistent (e.g., shard_index >= total_shards), prints
6390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// an error and exits. If in_subprocess_for_death_test, sharding is
6400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// disabled because it must only be applied to the original test
6410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// process. Otherwise, we could filter out death tests we intended to execute.
6420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ bool ShouldShard(const char* total_shards_str,
6430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                            const char* shard_index_str,
6440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                            bool in_subprocess_for_death_test);
6450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Parses the environment variable var as an Int32. If it is unset,
6470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// returns default_val. If it is not an Int32, prints an error and
6480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// and aborts.
6490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);
6500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Given the total number of shards, the shard index, and the test id,
6520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// returns true iff the test should be run on this shard. The test id is
6530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// some arbitrary but unique non-negative integer assigned to each test
6540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// method. Assumes that 0 <= shard_index < total_shards.
6550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ bool ShouldRunTestOnShard(
6560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    int total_shards, int shard_index, int test_id);
6570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// STL container utilities.
6590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the number of elements in the given container that satisfy
6610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the given predicate.
6620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsontemplate <class Container, typename Predicate>
6630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsoninline int CountIf(const Container& c, Predicate predicate) {
6640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return static_cast<int>(std::count_if(c.begin(), c.end(), predicate));
6650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
6660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Applies a function/functor to each element in the container.
6680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsontemplate <class Container, typename Functor>
6690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid ForEach(const Container& c, Functor functor) {
6700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  std::for_each(c.begin(), c.end(), functor);
6710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
6720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the i-th element of the vector, or default_value if i is not
6740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// in range [0, v.size()).
6750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsontemplate <typename E>
6760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsoninline E GetElementOr(const std::vector<E>& v, int i, E default_value) {
6770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];
6780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
6790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Performs an in-place shuffle of a range of the vector's elements.
6810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// 'begin' and 'end' are element indices as an STL-style range;
6820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// i.e. [begin, end) are shuffled, where 'end' == size() means to
6830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// shuffle to the end of the vector.
6840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsontemplate <typename E>
6850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid ShuffleRange(internal::Random* random, int begin, int end,
6860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                  std::vector<E>* v) {
6870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int size = static_cast<int>(v->size());
6880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_CHECK_(0 <= begin && begin <= size)
6890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "Invalid shuffle range start " << begin << ": must be in range [0, "
6900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << size << "].";
6910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_CHECK_(begin <= end && end <= size)
6920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "Invalid shuffle range finish " << end << ": must be in range ["
6930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << begin << ", " << size << "].";
6940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Fisher-Yates shuffle, from
6960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
6970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (int range_width = end - begin; range_width >= 2; range_width--) {
6980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const int last_in_range = begin + range_width - 1;
6990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const int selected = begin + random->Generate(range_width);
7000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    std::swap((*v)[selected], (*v)[last_in_range]);
7010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
7020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
7030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Performs an in-place shuffle of the vector's elements.
7050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsontemplate <typename E>
7060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsoninline void Shuffle(internal::Random* random, std::vector<E>* v) {
7070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ShuffleRange(random, 0, static_cast<int>(v->size()), v);
7080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
7090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A function for deleting an object.  Handy for being used as a
7110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// functor.
7120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsontemplate <typename T>
7130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic void Delete(T* x) {
7140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  delete x;
7150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
7160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A predicate that checks the key of a TestProperty against a known key.
7180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
7190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TestPropertyKeyIs is copyable.
7200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass TestPropertyKeyIs {
7210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
7220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Constructor.
7230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //
7240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // TestPropertyKeyIs has NO default constructor.
7250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  explicit TestPropertyKeyIs(const char* key)
7260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      : key_(key) {}
7270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns true iff the test name of test property matches on key_.
7290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool operator()(const TestProperty& test_property) const {
7300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return String(test_property.key()).Compare(key_) == 0;
7310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
7320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
7340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  String key_;
7350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
7360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass TestInfoImpl {
7380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
7390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestInfoImpl(TestInfo* parent, const char* test_case_name,
7400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson               const char* name, const char* test_case_comment,
7410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson               const char* comment, TypeId fixture_class_id,
7420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson               internal::TestFactoryBase* factory);
7430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ~TestInfoImpl();
7440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns true if this test should run.
7460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool should_run() const { return should_run_; }
7470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Sets the should_run member.
7490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void set_should_run(bool should) { should_run_ = should; }
7500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns true if this test is disabled. Disabled tests are not run.
7520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool is_disabled() const { return is_disabled_; }
7530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Sets the is_disabled member.
7550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void set_is_disabled(bool is) { is_disabled_ = is; }
7560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns true if this test matches the filter specified by the user.
7580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool matches_filter() const { return matches_filter_; }
7590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Sets the matches_filter member.
7610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void set_matches_filter(bool matches) { matches_filter_ = matches; }
7620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the test case name.
7640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* test_case_name() const { return test_case_name_.c_str(); }
7650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the test name.
7670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* name() const { return name_.c_str(); }
7680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the test case comment.
7700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* test_case_comment() const { return test_case_comment_.c_str(); }
7710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the test comment.
7730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* comment() const { return comment_.c_str(); }
7740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the ID of the test fixture class.
7760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TypeId fixture_class_id() const { return fixture_class_id_; }
7770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the test result.
7790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestResult* result() { return &result_; }
7800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const TestResult* result() const { return &result_; }
7810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Creates the test object, runs it, records its result, and then
7830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // deletes it.
7840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void Run();
7850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Clears the test result.
7870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void ClearResult() { result_.Clear(); }
7880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Clears the test result in the given TestInfo object.
7900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static void ClearTestResult(TestInfo * test_info) {
7910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    test_info->impl()->ClearResult();
7920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
7930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
7940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
7950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // These fields are immutable properties of the test.
7960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestInfo* const parent_;          // The owner of this object
7970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String test_case_name_;     // Test case name
7980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String name_;               // Test name
7990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String test_case_comment_;  // Test case comment
8000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String comment_;            // Test comment
8010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const TypeId fixture_class_id_;   // ID of the test fixture class
8020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool should_run_;                 // True iff this test should run
8030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool is_disabled_;                // True iff this test is disabled
8040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool matches_filter_;             // True if this test matches the
8050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                    // user-specified filter.
8060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::TestFactoryBase* const factory_;  // The factory that creates
8070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                              // the test object
8080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
8090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // This field is mutable and needs to be reset before running the
8100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // test for the second time.
8110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestResult result_;
8120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
8130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfoImpl);
8140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
8150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
8160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Class UnitTestOptions.
8170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
8180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This class contains functions for processing options the user
8190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// specifies when running the tests.  It has only static members.
8200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
8210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// In most cases, the user can specify an option using either an
8220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// environment variable or a command line flag.  E.g. you can set the
8230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// test filter using either GTEST_FILTER or --gtest_filter.  If both
8240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the variable and the flag are present, the latter overrides the
8250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// former.
8260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass GTEST_API_ UnitTestOptions {
8270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
8280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Functions for processing the gtest_output flag.
8290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
8300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the output format, or "" for normal printed output.
8310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static String GetOutputFormat();
8320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
8330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the absolute path of the requested output file, or the
8340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // default (test_detail.xml in the original working directory) if
8350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // none was explicitly specified.
8360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static String GetAbsolutePathToOutputFile();
8370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
8380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Functions for processing the gtest_filter flag.
8390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
8400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns true iff the wildcard pattern matches the string.  The
8410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // first ':' or '\0' character in pattern marks the end of it.
8420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //
8430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // This recursive algorithm isn't very efficient, but is clear and
8440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // works well enough for matching test names, which are short.
8450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static bool PatternMatchesString(const char *pattern, const char *str);
8460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
8470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns true iff the user-specified filter matches the test case
8480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // name and the test name.
8490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static bool FilterMatchesTest(const String &test_case_name,
8500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                const String &test_name);
8510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
8520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
8530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Function for supporting the gtest_catch_exception flag.
8540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
8550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
8560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
8570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // This function is useful as an __except condition.
8580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static int GTestShouldProcessSEH(DWORD exception_code);
8590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
8600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
8610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns true if "name" matches the ':' separated list of glob-style
8620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // filters in "filter".
8630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static bool MatchesFilter(const String& name, const char* filter);
8640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
8650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
8660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the current application's name, removing directory path if that
8670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// is present.  Used by UnitTestOptions::GetOutputFile.
8680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ FilePath GetCurrentExecutableName();
8690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
8700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The role interface for getting the OS stack trace as a string.
8710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass OsStackTraceGetterInterface {
8720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
8730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  OsStackTraceGetterInterface() {}
8740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual ~OsStackTraceGetterInterface() {}
8750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
8760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the current OS stack trace as a String.  Parameters:
8770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //
8780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //   max_depth  - the maximum number of stack frames to be included
8790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //                in the trace.
8800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //   skip_count - the number of top frames to be skipped; doesn't count
8810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //                against max_depth.
8820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual String CurrentStackTrace(int max_depth, int skip_count) = 0;
8830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
8840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // UponLeavingGTest() should be called immediately before Google Test calls
8850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // user code. It saves some information about the current stack that
8860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // CurrentStackTrace() will use to find and hide Google Test stack frames.
8870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void UponLeavingGTest() = 0;
8880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
8890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
8900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);
8910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
8920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
8930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A working implementation of the OsStackTraceGetterInterface interface.
8940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass OsStackTraceGetter : public OsStackTraceGetterInterface {
8950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
8960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  OsStackTraceGetter() : caller_frame_(NULL) {}
8970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual String CurrentStackTrace(int max_depth, int skip_count);
8980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void UponLeavingGTest();
8990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // This string is inserted in place of stack frames that are part of
9010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Google Test's implementation.
9020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static const char* const kElidedFramesMarker;
9030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
9050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Mutex mutex_;  // protects all internal state
9060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // We save the stack frame below the frame that calls user code.
9080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // We do this because the address of the frame immediately below
9090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // the user code changes between the call to UponLeavingGTest()
9100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // and any calls to CurrentStackTrace() from within the user code.
9110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void* caller_frame_;
9120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);
9140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
9150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Information about a Google Test trace point.
9170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstruct TraceInfo {
9180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* file;
9190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int line;
9200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  String message;
9210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
9220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This is the default global test part result reporter used in UnitTestImpl.
9240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This class should only be used by UnitTestImpl.
9250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass DefaultGlobalTestPartResultReporter
9260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  : public TestPartResultReporterInterface {
9270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
9280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);
9290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Implements the TestPartResultReporterInterface. Reports the test part
9300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // result in the current test.
9310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void ReportTestPartResult(const TestPartResult& result);
9320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
9340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  UnitTestImpl* const unit_test_;
9350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);
9370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
9380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This is the default per thread test part result reporter used in
9400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// UnitTestImpl. This class should only be used by UnitTestImpl.
9410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass DefaultPerThreadTestPartResultReporter
9420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    : public TestPartResultReporterInterface {
9430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
9440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);
9450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Implements the TestPartResultReporterInterface. The implementation just
9460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // delegates to the current global test part result reporter of *unit_test_.
9470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void ReportTestPartResult(const TestPartResult& result);
9480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
9500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  UnitTestImpl* const unit_test_;
9510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);
9530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
9540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The private implementation of the UnitTest class.  We don't protect
9560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the methods under a mutex, as this class is not accessible by a
9570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// user and the UnitTest class that delegates work to this class does
9580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// proper locking.
9590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass GTEST_API_ UnitTestImpl {
9600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
9610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  explicit UnitTestImpl(UnitTest* parent);
9620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual ~UnitTestImpl();
9630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // There are two different ways to register your own TestPartResultReporter.
9650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // You can register your own repoter to listen either only for test results
9660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // from the current thread or for results from all threads.
9670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // By default, each per-thread test result repoter just passes a new
9680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // TestPartResult to the global test result reporter, which registers the
9690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // test part result for the currently running test.
9700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the global test part result reporter.
9720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
9730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Sets the global test part result reporter.
9750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void SetGlobalTestPartResultReporter(
9760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      TestPartResultReporterInterface* reporter);
9770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the test part result reporter for the current thread.
9790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
9800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Sets the test part result reporter for the current thread.
9820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void SetTestPartResultReporterForCurrentThread(
9830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      TestPartResultReporterInterface* reporter);
9840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the number of successful test cases.
9860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int successful_test_case_count() const;
9870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the number of failed test cases.
9890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int failed_test_case_count() const;
9900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the number of all test cases.
9920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int total_test_case_count() const;
9930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the number of all test cases that contain at least one test
9950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // that should run.
9960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int test_case_to_run_count() const;
9970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
9980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the number of successful tests.
9990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int successful_test_count() const;
10000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
10010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the number of failed tests.
10020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int failed_test_count() const;
10030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
10040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the number of disabled tests.
10050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int disabled_test_count() const;
10060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
10070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the number of all tests.
10080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int total_test_count() const;
10090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
10100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the number of tests that should run.
10110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int test_to_run_count() const;
10120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
10130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the elapsed time, in milliseconds.
10140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TimeInMillis elapsed_time() const { return elapsed_time_; }
10150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
10160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns true iff the unit test passed (i.e. all test cases passed).
10170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool Passed() const { return !Failed(); }
10180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
10190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns true iff the unit test failed (i.e. some test case failed
10200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // or something outside of all tests failed).
10210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool Failed() const {
10220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();
10230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
10240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
10250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the i-th test case among all the test cases. i can range from 0 to
10260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // total_test_case_count() - 1. If i is not in that range, returns NULL.
10270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const TestCase* GetTestCase(int i) const {
10280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const int index = GetElementOr(test_case_indices_, i, -1);
10290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return index < 0 ? NULL : test_cases_[i];
10300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
10310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
10320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the i-th test case among all the test cases. i can range from 0 to
10330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // total_test_case_count() - 1. If i is not in that range, returns NULL.
10340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestCase* GetMutableTestCase(int i) {
10350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const int index = GetElementOr(test_case_indices_, i, -1);
10360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return index < 0 ? NULL : test_cases_[index];
10370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
10380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
10390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Provides access to the event listener list.
10400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestEventListeners* listeners() { return &listeners_; }
10410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
10420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the TestResult for the test that's currently running, or
10430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // the TestResult for the ad hoc test if no test is running.
10440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestResult* current_test_result();
10450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
10460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the TestResult for the ad hoc test.
10470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }
10480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
10490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Sets the OS stack trace getter.
10500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //
10510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Does nothing if the input and the current OS stack trace getter
10520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // are the same; otherwise, deletes the old getter and makes the
10530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // input the current getter.
10540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);
10550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
10560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the current OS stack trace getter if it is not NULL;
10570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // otherwise, creates an OsStackTraceGetter, makes it the current
10580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // getter, and returns it.
10590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  OsStackTraceGetterInterface* os_stack_trace_getter();
10600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
10610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the current OS stack trace as a String.
10620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //
10630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The maximum number of stack frames to be included is specified by
10640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // the gtest_stack_trace_depth flag.  The skip_count parameter
10650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // specifies the number of top frames to be skipped, which doesn't
10660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // count against the number of frames to be included.
10670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //
10680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // For example, if Foo() calls Bar(), which in turn calls
10690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
10700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
10710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  String CurrentOsStackTraceExceptTop(int skip_count);
10720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
10730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Finds and returns a TestCase with the given name.  If one doesn't
10740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // exist, creates one and returns it.
10750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //
10760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Arguments:
10770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //
10780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //   test_case_name: name of the test case
10790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //   set_up_tc:      pointer to the function that sets up the test case
10800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //   tear_down_tc:   pointer to the function that tears down the test case
10810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestCase* GetTestCase(const char* test_case_name,
10820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                        const char* comment,
10830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                        Test::SetUpTestCaseFunc set_up_tc,
10840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                        Test::TearDownTestCaseFunc tear_down_tc);
10850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
10860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Adds a TestInfo to the unit test.
10870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //
10880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Arguments:
10890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //
10900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //   set_up_tc:    pointer to the function that sets up the test case
10910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //   tear_down_tc: pointer to the function that tears down the test case
10920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //   test_info:    the TestInfo object
10930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,
10940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   Test::TearDownTestCaseFunc tear_down_tc,
10950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   TestInfo * test_info) {
10960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // In order to support thread-safe death tests, we need to
10970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // remember the original working directory when the test program
10980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // was first invoked.  We cannot do this in RUN_ALL_TESTS(), as
10990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // the user may have changed the current directory before calling
11000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // RUN_ALL_TESTS().  Therefore we capture the current directory in
11010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // AddTestInfo(), which is called to register a TEST or TEST_F
11020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // before main() is reached.
11030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (original_working_dir_.IsEmpty()) {
11040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      original_working_dir_.Set(FilePath::GetCurrentDir());
11050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      GTEST_CHECK_(!original_working_dir_.IsEmpty())
11060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "Failed to get the current working directory.";
11070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
11080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
11090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GetTestCase(test_info->test_case_name(),
11100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                test_info->test_case_comment(),
11110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                set_up_tc,
11120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                tear_down_tc)->AddTestInfo(test_info);
11130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
11140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
11150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_PARAM_TEST
11160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns ParameterizedTestCaseRegistry object used to keep track of
11170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // value-parameterized tests and instantiate and register them.
11180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {
11190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return parameterized_test_registry_;
11200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
11210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_PARAM_TEST
11220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
11230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Sets the TestCase object for the test that's currently running.
11240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void set_current_test_case(TestCase* a_current_test_case) {
11250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    current_test_case_ = a_current_test_case;
11260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
11270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
11280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Sets the TestInfo object for the test that's currently running.  If
11290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // current_test_info is NULL, the assertion results will be stored in
11300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // ad_hoc_test_result_.
11310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void set_current_test_info(TestInfo* a_current_test_info) {
11320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    current_test_info_ = a_current_test_info;
11330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
11340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
11350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Registers all parameterized tests defined using TEST_P and
11360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // INSTANTIATE_TEST_P, creating regular tests for each test/parameter
11370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // combination. This method can be called more then once; it has
11380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // guards protecting from registering the tests more then once.
11390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // If value-parameterized tests are disabled, RegisterParameterizedTests
11400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // is present but does nothing.
11410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void RegisterParameterizedTests();
11420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
11430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Runs all tests in this UnitTest object, prints the result, and
11440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // returns 0 if all tests are successful, or 1 otherwise.  If any
11450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // exception is thrown during a test on Windows, this test is
11460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // considered to be failed, but the rest of the tests will still be
11470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // run.  (We disable exceptions on Linux and Mac OS X, so the issue
11480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // doesn't apply there.)
11490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int RunAllTests();
11500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
11510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Clears the results of all tests, including the ad hoc test.
11520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void ClearResult() {
11530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ForEach(test_cases_, TestCase::ClearTestCaseResult);
11540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ad_hoc_test_result_.Clear();
11550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
11560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
11570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  enum ReactionToSharding {
11580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    HONOR_SHARDING_PROTOCOL,
11590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    IGNORE_SHARDING_PROTOCOL
11600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  };
11610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
11620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Matches the full name of each test against the user-specified
11630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // filter to decide whether the test should run, then records the
11640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // result in each TestCase and TestInfo object.
11650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests
11660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // based on sharding variables in the environment.
11670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the number of tests that should run.
11680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int FilterTests(ReactionToSharding shard_tests);
11690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
11700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Prints the names of the tests matching the user-specified filter flag.
11710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void ListTestsMatchingFilter();
11720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
11730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const TestCase* current_test_case() const { return current_test_case_; }
11740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestInfo* current_test_info() { return current_test_info_; }
11750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const TestInfo* current_test_info() const { return current_test_info_; }
11760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
11770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the vector of environments that need to be set-up/torn-down
11780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // before/after the tests are run.
11790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  std::vector<Environment*>& environments() { return environments_; }
11800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
11810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Getters for the per-thread Google Test trace stack.
11820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  std::vector<TraceInfo>& gtest_trace_stack() {
11830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return *(gtest_trace_stack_.pointer());
11840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
11850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const std::vector<TraceInfo>& gtest_trace_stack() const {
11860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return gtest_trace_stack_.get();
11870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
11880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
11890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_DEATH_TEST
11900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void InitDeathTestSubprocessControlInfo() {
11910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
11920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
11930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns a pointer to the parsed --gtest_internal_run_death_test
11940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // flag, or NULL if that flag was not specified.
11950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // This information is useful only in a death test child process.
11960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Must not be called before a call to InitGoogleTest.
11970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const InternalRunDeathTestFlag* internal_run_death_test_flag() const {
11980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return internal_run_death_test_flag_.get();
11990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
12000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns a pointer to the current death test factory.
12020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::DeathTestFactory* death_test_factory() {
12030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return death_test_factory_.get();
12040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
12050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void SuppressTestEventsIfInSubprocess();
12070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  friend class ReplaceDeathTestFactory;
12090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_DEATH_TEST
12100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Initializes the event listener performing XML output as specified by
12120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // UnitTestOptions. Must not be called before InitGoogleTest.
12130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void ConfigureXmlOutput();
12140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Performs initialization dependent upon flag values obtained in
12160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
12170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
12180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // this function is also called from RunAllTests.  Since this function can be
12190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // called more than once, it has to be idempotent.
12200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void PostFlagParsingInit();
12210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the random seed used at the start of the current test iteration.
12230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int random_seed() const { return random_seed_; }
12240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the random number generator.
12260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::Random* random() { return &random_; }
12270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Shuffles all test cases, and the tests within each test case,
12290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // making sure that death tests are still run first.
12300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void ShuffleTests();
12310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Restores the test cases and tests to their order before the first shuffle.
12330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void UnshuffleTests();
12340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
12360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  friend class ::testing::UnitTest;
12370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The UnitTest object that owns this implementation object.
12390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  UnitTest* const parent_;
12400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The working directory when the first TEST() or TEST_F() was
12420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // executed.
12430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::FilePath original_working_dir_;
12440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The default test part result reporters.
12460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;
12470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  DefaultPerThreadTestPartResultReporter
12480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      default_per_thread_test_part_result_reporter_;
12490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Points to (but doesn't own) the global test part result reporter.
12510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestPartResultReporterInterface* global_test_part_result_repoter_;
12520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Protects read and write access to global_test_part_result_reporter_.
12540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::Mutex global_test_part_result_reporter_mutex_;
12550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Points to (but doesn't own) the per-thread test part result reporter.
12570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::ThreadLocal<TestPartResultReporterInterface*>
12580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      per_thread_test_part_result_reporter_;
12590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The vector of environments that need to be set-up/torn-down
12610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // before/after the tests are run.
12620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  std::vector<Environment*> environments_;
12630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The vector of TestCases in their original order.  It owns the
12650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // elements in the vector.
12660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  std::vector<TestCase*> test_cases_;
12670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Provides a level of indirection for the test case list to allow
12690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // easy shuffling and restoring the test case order.  The i-th
12700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // element of this vector is the index of the i-th test case in the
12710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // shuffled order.
12720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  std::vector<int> test_case_indices_;
12730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_PARAM_TEST
12750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // ParameterizedTestRegistry object used to register value-parameterized
12760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // tests.
12770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::ParameterizedTestCaseRegistry parameterized_test_registry_;
12780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Indicates whether RegisterParameterizedTests() has been called already.
12800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool parameterized_tests_registered_;
12810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_PARAM_TEST
12820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Index of the last death test case registered.  Initially -1.
12840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int last_death_test_case_;
12850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // This points to the TestCase for the currently running test.  It
12870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // changes as Google Test goes through one test case after another.
12880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // When no test is running, this is set to NULL and Google Test
12890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // stores assertion results in ad_hoc_test_result_.  Initially NULL.
12900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestCase* current_test_case_;
12910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // This points to the TestInfo for the currently running test.  It
12930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // changes as Google Test goes through one test after another.  When
12940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // no test is running, this is set to NULL and Google Test stores
12950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // assertion results in ad_hoc_test_result_.  Initially NULL.
12960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestInfo* current_test_info_;
12970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
12980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Normally, a user only writes assertions inside a TEST or TEST_F,
12990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // or inside a function called by a TEST or TEST_F.  Since Google
13000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Test keeps track of which test is current running, it can
13010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // associate such an assertion with the test it belongs to.
13020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //
13030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // If an assertion is encountered when no TEST or TEST_F is running,
13040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Google Test attributes the assertion result to an imaginary "ad hoc"
13050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // test, and records the result in ad_hoc_test_result_.
13060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestResult ad_hoc_test_result_;
13070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The list of event listeners that can be used to track events inside
13090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Google Test.
13100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestEventListeners listeners_;
13110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The OS stack trace getter.  Will be deleted when the UnitTest
13130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // object is destructed.  By default, an OsStackTraceGetter is used,
13140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // but the user can set this field to use a custom getter if that is
13150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // desired.
13160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  OsStackTraceGetterInterface* os_stack_trace_getter_;
13170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // True iff PostFlagParsingInit() has been called.
13190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool post_flag_parse_init_performed_;
13200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The random number seed used at the beginning of the test run.
13220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int random_seed_;
13230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Our random number generator.
13250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::Random random_;
13260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // How long the test took to run, in milliseconds.
13280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TimeInMillis elapsed_time_;
13290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_DEATH_TEST
13310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The decomposed components of the gtest_internal_run_death_test flag,
13320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // parsed when RUN_ALL_TESTS is called.
13330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
13340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;
13350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_DEATH_TEST
13360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // A per-thread stack of traces created by the SCOPED_TRACE() macro.
13380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;
13390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);
13410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};  // class UnitTestImpl
13420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Convenience function for accessing the global UnitTest
13440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// implementation object.
13450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsoninline UnitTestImpl* GetUnitTestImpl() {
13460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return UnitTest::GetInstance()->impl();
13470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
13480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Internal helper functions for implementing the simple regular
13500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// expression matcher.
13510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ bool IsInSet(char ch, const char* str);
13520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ bool IsDigit(char ch);
13530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ bool IsPunct(char ch);
13540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ bool IsRepeat(char ch);
13550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ bool IsWhiteSpace(char ch);
13560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ bool IsWordChar(char ch);
13570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ bool IsValidEscape(char ch);
13580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);
13590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ bool ValidateRegex(const char* regex);
13600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);
13610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ bool MatchRepetitionAndRegexAtHead(
13620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    bool escaped, char ch, char repeat, const char* regex, const char* str);
13630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);
13640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Parses the command line for Google Test flags, without initializing
13660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// other parts of Google Test.
13670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);
13680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
13690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_DEATH_TEST
13710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the message describing the last system error, regardless of the
13730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// platform.
13740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString GetLastErrnoDescription();
13750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
13770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Provides leak-safe Windows kernel handle ownership.
13780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass AutoHandle {
13790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
13800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  AutoHandle() : handle_(INVALID_HANDLE_VALUE) {}
13810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  explicit AutoHandle(HANDLE handle) : handle_(handle) {}
13820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ~AutoHandle() { Reset(); }
13840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  HANDLE Get() const { return handle_; }
13860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void Reset() { Reset(INVALID_HANDLE_VALUE); }
13870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void Reset(HANDLE handle) {
13880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (handle != handle_) {
13890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if (handle_ != INVALID_HANDLE_VALUE)
13900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ::CloseHandle(handle_);
13910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      handle_ = handle;
13920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
13930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
13940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
13960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  HANDLE handle_;
13970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
13980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
13990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
14000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
14010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
14020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Attempts to parse a string into a positive integer pointed to by the
14030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// number parameter.  Returns true if that is possible.
14040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use
14050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// it here.
14060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsontemplate <typename Integer>
14070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool ParseNaturalNumber(const ::std::string& str, Integer* number) {
14080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Fail fast if the given string does not begin with a digit;
14090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // this bypasses strtoXXX's "optional leading whitespace and plus
14100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // or minus sign" semantics, which are undesirable here.
14110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (str.empty() || !isdigit(str[0])) {
14120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return false;
14130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
14140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  errno = 0;
14150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
14160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char* end;
14170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // BiggestConvertible is the largest integer type that system-provided
14180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // string-to-number conversion routines can return.
14190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS && !defined(__GNUC__)
14200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // MSVC and C++ Builder define __int64 instead of the standard long long.
14210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  typedef unsigned __int64 BiggestConvertible;
14220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);
14230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
14240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  typedef unsigned long long BiggestConvertible;  // NOLINT
14250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
14260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS && !defined(__GNUC__)
14270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const bool parse_success = *end == '\0' && errno == 0;
14280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
14290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // TODO(vladl@google.com): Convert this to compile time assertion when it is
14300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // available.
14310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
14320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
14330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const Integer result = static_cast<Integer>(parsed);
14340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {
14350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    *number = result;
14360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return true;
14370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
14380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return false;
14390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
14400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_DEATH_TEST
14410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
14420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TestResult contains some private methods that should be hidden from
14430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Google Test user but are required for testing. This class allow our tests
14440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// to access them.
14450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
14460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This class is supplied only for the purpose of testing Google Test's own
14470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// constructs. Do not use it in user tests, either directly or indirectly.
14480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass TestResultAccessor {
14490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
14500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static void RecordProperty(TestResult* test_result,
14510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                             const TestProperty& property) {
14520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    test_result->RecordProperty(property);
14530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
14540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
14550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static void ClearTestPartResults(TestResult* test_result) {
14560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    test_result->ClearTestPartResults();
14570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
14580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
14590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static const std::vector<testing::TestPartResult>& test_part_results(
14600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      const TestResult& test_result) {
14610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return test_result.test_part_results();
14620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
14630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
14640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
14650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
14660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace testing
14670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
14680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_SRC_GTEST_INTERNAL_INL_H_
14690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#undef GTEST_IMPLEMENTATION_
14700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
14710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
14720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define vsnprintf _vsnprintf
14730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
14740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
14750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace testing {
14760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
14770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonusing internal::CountIf;
14780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonusing internal::ForEach;
14790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonusing internal::GetElementOr;
14800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonusing internal::Shuffle;
14810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
14820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Constants.
14830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
14840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A test whose test case name or test name matches this filter is
14850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// disabled and not run.
14860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*";
14870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
14880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A test case whose name matches this filter is considered a death
14890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// test case and will be run before test cases whose name doesn't
14900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// match this filter.
14910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*";
14920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
14930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A test filter that matches everything.
14940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic const char kUniversalFilter[] = "*";
14950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
14960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The default output file for XML output.
14970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic const char kDefaultOutputFile[] = "test_detail.xml";
14980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
14990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The environment variable name for the test shard index.
15000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic const char kTestShardIndex[] = "GTEST_SHARD_INDEX";
15010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The environment variable name for the total number of test shards.
15020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS";
15030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The environment variable name for the test shard status file.
15040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE";
15050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
15060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
15070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
15080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The text used in failure messages to indicate the start of the
15090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// stack trace.
15100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kStackTraceMarker[] = "\nStack trace:\n";
15110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
15120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// g_help_flag is true iff the --help flag or an equivalent form is
15130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// specified on the command line.
15140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool g_help_flag = false;
15150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
15160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
15170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
15180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DEFINE_bool_(
15190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    also_run_disabled_tests,
15200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal::BoolFromGTestEnv("also_run_disabled_tests", false),
15210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "Run disabled tests too, in addition to the tests normally being run.");
15220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
15230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DEFINE_bool_(
15240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    break_on_failure,
15250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal::BoolFromGTestEnv("break_on_failure", false),
15260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "True iff a failed assertion should be a debugger break-point.");
15270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
15280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DEFINE_bool_(
15290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    catch_exceptions,
15300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal::BoolFromGTestEnv("catch_exceptions", false),
15310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "True iff " GTEST_NAME_
15320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    " should catch exceptions and treat them as test failures.");
15330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
15340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DEFINE_string_(
15350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    color,
15360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal::StringFromGTestEnv("color", "auto"),
15370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "Whether to use colors in the output.  Valid values: yes, no, "
15380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "and auto.  'auto' means to use colors if the output is "
15390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "being sent to a terminal and the TERM environment variable "
15400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "is set to xterm, xterm-color, xterm-256color, linux or cygwin.");
15410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
15420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DEFINE_string_(
15430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    filter,
15440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal::StringFromGTestEnv("filter", kUniversalFilter),
15450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "A colon-separated list of glob (not regex) patterns "
15460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "for filtering the tests to run, optionally followed by a "
15470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "'-' and a : separated list of negative patterns (tests to "
15480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "exclude).  A test is run if it matches one of the positive "
15490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "patterns and does not match any of the negative patterns.");
15500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
15510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DEFINE_bool_(list_tests, false,
15520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   "List all tests without running them.");
15530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
15540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DEFINE_string_(
15550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    output,
15560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal::StringFromGTestEnv("output", ""),
15570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "A format (currently must be \"xml\"), optionally followed "
15580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "by a colon and an output file name or directory. A directory "
15590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "is indicated by a trailing pathname separator. "
15600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "Examples: \"xml:filename.xml\", \"xml::directoryname/\". "
15610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "If a directory is specified, output files will be created "
15620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "within that directory, with file-names based on the test "
15630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "executable's name and, if necessary, made unique by adding "
15640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "digits.");
15650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
15660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DEFINE_bool_(
15670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    print_time,
15680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal::BoolFromGTestEnv("print_time", true),
15690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "True iff " GTEST_NAME_
15700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    " should display elapsed time in text output.");
15710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
15720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DEFINE_int32_(
15730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    random_seed,
15740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal::Int32FromGTestEnv("random_seed", 0),
15750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "Random number seed to use when shuffling test orders.  Must be in range "
15760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "[1, 99999], or 0 to use a seed based on the current time.");
15770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
15780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DEFINE_int32_(
15790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    repeat,
15800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal::Int32FromGTestEnv("repeat", 1),
15810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "How many times to repeat each test.  Specify a negative number "
15820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "for repeating forever.  Useful for shaking out flaky tests.");
15830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
15840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DEFINE_bool_(
15850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    show_internal_stack_frames, false,
15860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "True iff " GTEST_NAME_ " should include internal stack frames when "
15870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "printing test failure stack traces.");
15880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
15890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DEFINE_bool_(
15900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    shuffle,
15910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal::BoolFromGTestEnv("shuffle", false),
15920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "True iff " GTEST_NAME_
15930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    " should randomize tests' order on every run.");
15940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
15950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DEFINE_int32_(
15960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    stack_trace_depth,
15970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
15980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "The maximum number of stack frames to print when an "
15990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "assertion fails.  The valid range is 0 through 100, inclusive.");
16000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
16010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DEFINE_bool_(
16020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    throw_on_failure,
16030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal::BoolFromGTestEnv("throw_on_failure", false),
16040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "When this flag is specified, a failed assertion will throw an exception "
16050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "if exceptions are enabled or exit the program with a non-zero code "
16060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "otherwise.");
16070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
16080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
16090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
16100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Generates a random number from [0, range), using a Linear
16110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Congruential Generator (LCG).  Crashes if 'range' is 0 or greater
16120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// than kMaxRange.
16130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonUInt32 Random::Generate(UInt32 range) {
16140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // These constants are the same as are used in glibc's rand(3).
16150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  state_ = (1103515245U*state_ + 12345U) % kMaxRange;
16160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
16170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_CHECK_(range > 0)
16180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "Cannot generate a number in the range [0, 0).";
16190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_CHECK_(range <= kMaxRange)
16200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "Generation of a number in [0, " << range << ") was requested, "
16210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "but this can only generate numbers in [0, " << kMaxRange << ").";
16220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
16230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Converting via modulus introduces a bit of downward bias, but
16240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // it's simple, and a linear congruential generator isn't too good
16250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // to begin with.
16260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return state_ % range;
16270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
16280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
16290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// GTestIsInitialized() returns true iff the user has initialized
16300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Google Test.  Useful for catching the user mistake of not initializing
16310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Google Test before calling RUN_ALL_TESTS().
16320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
16330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A user must call testing::InitGoogleTest() to initialize Google
16340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Test.  g_init_gtest_count is set to the number of times
16350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// InitGoogleTest() has been called.  We don't protect this variable
16360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// under a mutex as it is only accessed in the main thread.
16370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint g_init_gtest_count = 0;
16380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic bool GTestIsInitialized() { return g_init_gtest_count != 0; }
16390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
16400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Iterates over a vector of TestCases, keeping a running sum of the
16410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// results of calling a given int-returning method on each.
16420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the sum.
16430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic int SumOverTestCaseList(const std::vector<TestCase*>& case_list,
16440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                               int (TestCase::*method)() const) {
16450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int sum = 0;
16460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (size_t i = 0; i < case_list.size(); i++) {
16470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    sum += (case_list[i]->*method)();
16480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
16490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return sum;
16500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
16510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
16520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff the test case passed.
16530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic bool TestCasePassed(const TestCase* test_case) {
16540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return test_case->should_run() && test_case->Passed();
16550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
16560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
16570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff the test case failed.
16580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic bool TestCaseFailed(const TestCase* test_case) {
16590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return test_case->should_run() && test_case->Failed();
16600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
16610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
16620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff test_case contains at least one test that should
16630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// run.
16640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic bool ShouldRunTestCase(const TestCase* test_case) {
16650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return test_case->should_run();
16660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
16670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
16680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// AssertHelper constructor.
16690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertHelper::AssertHelper(TestPartResult::Type type,
16700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                           const char* file,
16710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                           int line,
16720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                           const char* message)
16730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    : data_(new AssertHelperData(type, file, line, message)) {
16740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
16750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
16760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertHelper::~AssertHelper() {
16770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  delete data_;
16780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
16790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
16800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Message assignment, for assertion streaming support.
16810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid AssertHelper::operator=(const Message& message) const {
16820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  UnitTest::GetInstance()->
16830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    AddTestPartResult(data_->type, data_->file, data_->line,
16840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      AppendUserMessage(data_->message, message),
16850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      UnitTest::GetInstance()->impl()
16860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      ->CurrentOsStackTraceExceptTop(1)
16870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      // Skips the stack frame for this function itself.
16880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      );  // NOLINT
16890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
16900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
16910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Mutex for linked pointers.
16920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
16930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
16940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Application pathname gotten in InitGoogleTest.
16950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString g_executable_path;
16960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
16970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the current application's name, removing directory path if that
16980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// is present.
16990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonFilePath GetCurrentExecutableName() {
17000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  FilePath result;
17010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
17020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
17030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  result.Set(FilePath(g_executable_path).RemoveExtension("exe"));
17040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
17050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  result.Set(FilePath(g_executable_path));
17060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
17070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
17080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return result.RemoveDirectoryName();
17090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
17100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
17110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Functions for processing the gtest_output flag.
17120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
17130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the output format, or "" for normal printed output.
17140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString UnitTestOptions::GetOutputFormat() {
17150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
17160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (gtest_output_flag == NULL) return String("");
17170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
17180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const colon = strchr(gtest_output_flag, ':');
17190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return (colon == NULL) ?
17200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      String(gtest_output_flag) :
17210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      String(gtest_output_flag, colon - gtest_output_flag);
17220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
17230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
17240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the name of the requested output file, or the default if none
17250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// was explicitly specified.
17260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString UnitTestOptions::GetAbsolutePathToOutputFile() {
17270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
17280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (gtest_output_flag == NULL)
17290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return String("");
17300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
17310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const colon = strchr(gtest_output_flag, ':');
17320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (colon == NULL)
17330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return String(internal::FilePath::ConcatPaths(
17340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson               internal::FilePath(
17350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   UnitTest::GetInstance()->original_working_dir()),
17360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson               internal::FilePath(kDefaultOutputFile)).ToString() );
17370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
17380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::FilePath output_name(colon + 1);
17390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!output_name.IsAbsolutePath())
17400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // TODO(wan@google.com): on Windows \some\path is not an absolute
17410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // path (as its meaning depends on the current drive), yet the
17420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // following logic for turning it into an absolute path is wrong.
17430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Fix it.
17440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    output_name = internal::FilePath::ConcatPaths(
17450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        internal::FilePath(UnitTest::GetInstance()->original_working_dir()),
17460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        internal::FilePath(colon + 1));
17470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
17480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!output_name.IsDirectory())
17490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return output_name.ToString();
17500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
17510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::FilePath result(internal::FilePath::GenerateUniqueFileName(
17520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      output_name, internal::GetCurrentExecutableName(),
17530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      GetOutputFormat().c_str()));
17540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return result.ToString();
17550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
17560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
17570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff the wildcard pattern matches the string.  The
17580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// first ':' or '\0' character in pattern marks the end of it.
17590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
17600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This recursive algorithm isn't very efficient, but is clear and
17610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// works well enough for matching test names, which are short.
17620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool UnitTestOptions::PatternMatchesString(const char *pattern,
17630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                           const char *str) {
17640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  switch (*pattern) {
17650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case '\0':
17660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case ':':  // Either ':' or '\0' marks the end of the pattern.
17670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return *str == '\0';
17680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case '?':  // Matches any single character.
17690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return *str != '\0' && PatternMatchesString(pattern + 1, str + 1);
17700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case '*':  // Matches any string (possibly empty) of characters.
17710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return (*str != '\0' && PatternMatchesString(pattern, str + 1)) ||
17720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          PatternMatchesString(pattern + 1, str);
17730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    default:  // Non-special character.  Matches itself.
17740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return *pattern == *str &&
17750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          PatternMatchesString(pattern + 1, str + 1);
17760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
17770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
17780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
17790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool UnitTestOptions::MatchesFilter(const String& name, const char* filter) {
17800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char *cur_pattern = filter;
17810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (;;) {
17820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (PatternMatchesString(cur_pattern, name.c_str())) {
17830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return true;
17840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
17850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
17860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Finds the next pattern in the filter.
17870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    cur_pattern = strchr(cur_pattern, ':');
17880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
17890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Returns if no more pattern can be found.
17900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (cur_pattern == NULL) {
17910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return false;
17920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
17930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
17940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Skips the pattern separater (the ':' character).
17950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    cur_pattern++;
17960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
17970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
17980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
17990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TODO(keithray): move String function implementations to gtest-string.cc.
18000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
18010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff the user-specified filter matches the test case
18020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// name and the test name.
18030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool UnitTestOptions::FilterMatchesTest(const String &test_case_name,
18040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                        const String &test_name) {
18050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String& full_name = String::Format("%s.%s",
18060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                           test_case_name.c_str(),
18070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                           test_name.c_str());
18080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
18090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Split --gtest_filter at '-', if there is one, to separate into
18100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // positive filter and negative filter portions
18110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const p = GTEST_FLAG(filter).c_str();
18120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const dash = strchr(p, '-');
18130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  String positive;
18140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  String negative;
18150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (dash == NULL) {
18160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    positive = GTEST_FLAG(filter).c_str();  // Whole string is a positive filter
18170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    negative = String("");
18180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
18190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    positive = String(p, dash - p);  // Everything up to the dash
18200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    negative = String(dash+1);       // Everything after the dash
18210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (positive.empty()) {
18220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // Treat '-test1' as the same as '*-test1'
18230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      positive = kUniversalFilter;
18240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
18250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
18260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
18270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // A filter is a colon-separated list of patterns.  It matches a
18280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // test if any pattern in it matches the test.
18290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return (MatchesFilter(full_name, positive.c_str()) &&
18300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          !MatchesFilter(full_name, negative.c_str()));
18310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
18320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
18330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
18340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
18350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
18360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This function is useful as an __except condition.
18370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
18380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Google Test should handle an exception if:
18390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //   1. the user wants it to, AND
18400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //   2. this is not a breakpoint exception.
18410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return (GTEST_FLAG(catch_exceptions) &&
18420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          exception_code != EXCEPTION_BREAKPOINT) ?
18430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      EXCEPTION_EXECUTE_HANDLER :
18440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      EXCEPTION_CONTINUE_SEARCH;
18450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
18460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
18470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
18480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
18490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
18500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The c'tor sets this object as the test part result reporter used by
18510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Google Test.  The 'result' parameter specifies where to report the
18520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// results. Intercepts only failures from the current thread.
18530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
18540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    TestPartResultArray* result)
18550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),
18560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      result_(result) {
18570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Init();
18580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
18590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
18600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The c'tor sets this object as the test part result reporter used by
18610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Google Test.  The 'result' parameter specifies where to report the
18620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// results.
18630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
18640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    InterceptMode intercept_mode, TestPartResultArray* result)
18650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    : intercept_mode_(intercept_mode),
18660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      result_(result) {
18670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Init();
18680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
18690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
18700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid ScopedFakeTestPartResultReporter::Init() {
18710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
18720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
18730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    old_reporter_ = impl->GetGlobalTestPartResultReporter();
18740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    impl->SetGlobalTestPartResultReporter(this);
18750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
18760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();
18770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    impl->SetTestPartResultReporterForCurrentThread(this);
18780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
18790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
18800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
18810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The d'tor restores the test part result reporter used by Google Test
18820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// before.
18830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {
18840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
18850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
18860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    impl->SetGlobalTestPartResultReporter(old_reporter_);
18870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
18880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    impl->SetTestPartResultReporterForCurrentThread(old_reporter_);
18890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
18900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
18910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
18920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Increments the test part result count and remembers the result.
18930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This method is from the TestPartResultReporterInterface interface.
18940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid ScopedFakeTestPartResultReporter::ReportTestPartResult(
18950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const TestPartResult& result) {
18960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  result_->Append(result);
18970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
18980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
18990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
19000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
19010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the type ID of ::testing::Test.  We should always call this
19020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// instead of GetTypeId< ::testing::Test>() to get the type ID of
19030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// testing::Test.  This is to work around a suspected linker bug when
19040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// using Google Test as a framework on Mac OS X.  The bug causes
19050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// GetTypeId< ::testing::Test>() to return different values depending
19060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// on whether the call is from the Google Test framework itself or
19070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// from user test code.  GetTestTypeId() is guaranteed to always
19080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// return the same value, as it always calls GetTypeId<>() from the
19090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// gtest.cc, which is within the Google Test framework.
19100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTypeId GetTestTypeId() {
19110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return GetTypeId<Test>();
19120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
19130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
19140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The value of GetTestTypeId() as seen from within the Google Test
19150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// library.  This is solely for testing GetTestTypeId().
19160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonextern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();
19170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
19180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This predicate-formatter checks that 'results' contains a test part
19190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// failure of the given type and that the failure message contains the
19200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// given substring.
19210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult HasOneFailure(const char* /* results_expr */,
19220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                              const char* /* type_expr */,
19230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                              const char* /* substr_expr */,
19240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                              const TestPartResultArray& results,
19250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                              TestPartResult::Type type,
19260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                              const char* substr) {
19270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String expected(type == TestPartResult::kFatalFailure ?
19280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                        "1 fatal failure" :
19290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                        "1 non-fatal failure");
19300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message msg;
19310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (results.size() != 1) {
19320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    msg << "Expected: " << expected << "\n"
19330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << "  Actual: " << results.size() << " failures";
19340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    for (int i = 0; i < results.size(); i++) {
19350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      msg << "\n" << results.GetTestPartResult(i);
19360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
19370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionFailure(msg);
19380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
19390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
19400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const TestPartResult& r = results.GetTestPartResult(0);
19410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (r.type() != type) {
19420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    msg << "Expected: " << expected << "\n"
19430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << "  Actual:\n"
19440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << r;
19450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionFailure(msg);
19460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
19470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
19480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (strstr(r.message(), substr) == NULL) {
19490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    msg << "Expected: " << expected << " containing \""
19500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << substr << "\"\n"
19510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << "  Actual:\n"
19520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << r;
19530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionFailure(msg);
19540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
19550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
19560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return AssertionSuccess();
19570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
19580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
19590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The constructor of SingleFailureChecker remembers where to look up
19600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// test part results, what type of failure we expect, and what
19610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// substring the failure message should contain.
19620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonSingleFailureChecker:: SingleFailureChecker(
19630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const TestPartResultArray* results,
19640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    TestPartResult::Type type,
19650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* substr)
19660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    : results_(results),
19670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      type_(type),
19680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      substr_(substr) {}
19690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
19700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The destructor of SingleFailureChecker verifies that the given
19710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TestPartResultArray contains exactly one failure that has the given
19720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// type and contains the given substring.  If that's not the case, a
19730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// non-fatal failure will be generated.
19740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonSingleFailureChecker::~SingleFailureChecker() {
19750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_.c_str());
19760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
19770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
19780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonDefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(
19790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
19800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
19810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid DefaultGlobalTestPartResultReporter::ReportTestPartResult(
19820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const TestPartResult& result) {
19830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  unit_test_->current_test_result()->AddTestPartResult(result);
19840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  unit_test_->listeners()->repeater()->OnTestPartResult(result);
19850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
19860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
19870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonDefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(
19880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
19890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
19900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid DefaultPerThreadTestPartResultReporter::ReportTestPartResult(
19910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const TestPartResult& result) {
19920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);
19930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
19940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
19950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the global test part result reporter.
19960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestPartResultReporterInterface*
19970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonUnitTestImpl::GetGlobalTestPartResultReporter() {
19980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
19990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return global_test_part_result_repoter_;
20000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
20010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
20020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Sets the global test part result reporter.
20030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid UnitTestImpl::SetGlobalTestPartResultReporter(
20040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    TestPartResultReporterInterface* reporter) {
20050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
20060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  global_test_part_result_repoter_ = reporter;
20070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
20080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
20090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the test part result reporter for the current thread.
20100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestPartResultReporterInterface*
20110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonUnitTestImpl::GetTestPartResultReporterForCurrentThread() {
20120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return per_thread_test_part_result_reporter_.get();
20130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
20140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
20150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Sets the test part result reporter for the current thread.
20160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid UnitTestImpl::SetTestPartResultReporterForCurrentThread(
20170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    TestPartResultReporterInterface* reporter) {
20180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  per_thread_test_part_result_reporter_.set(reporter);
20190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
20200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
20210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of successful test cases.
20220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTestImpl::successful_test_case_count() const {
20230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return CountIf(test_cases_, TestCasePassed);
20240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
20250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
20260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of failed test cases.
20270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTestImpl::failed_test_case_count() const {
20280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return CountIf(test_cases_, TestCaseFailed);
20290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
20300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
20310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of all test cases.
20320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTestImpl::total_test_case_count() const {
20330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return static_cast<int>(test_cases_.size());
20340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
20350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
20360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of all test cases that contain at least one test
20370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// that should run.
20380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTestImpl::test_case_to_run_count() const {
20390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return CountIf(test_cases_, ShouldRunTestCase);
20400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
20410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
20420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of successful tests.
20430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTestImpl::successful_test_count() const {
20440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);
20450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
20460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
20470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of failed tests.
20480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTestImpl::failed_test_count() const {
20490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);
20500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
20510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
20520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of disabled tests.
20530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTestImpl::disabled_test_count() const {
20540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);
20550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
20560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
20570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of all tests.
20580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTestImpl::total_test_count() const {
20590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);
20600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
20610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
20620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of tests that should run.
20630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTestImpl::test_to_run_count() const {
20640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);
20650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
20660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
20670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the current OS stack trace as a String.
20680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
20690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The maximum number of stack frames to be included is specified by
20700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the gtest_stack_trace_depth flag.  The skip_count parameter
20710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// specifies the number of top frames to be skipped, which doesn't
20720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// count against the number of frames to be included.
20730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
20740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// For example, if Foo() calls Bar(), which in turn calls
20750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
20760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
20770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
20780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  (void)skip_count;
20790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return String("");
20800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
20810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
20820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the current time in milliseconds.
20830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTimeInMillis GetTimeInMillis() {
20840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)
20850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Difference between 1970-01-01 and 1601-01-01 in milliseconds.
20860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // http://analogous.blogspot.com/2005/04/epoch.html
20870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const TimeInMillis kJavaEpochToWinFileTimeDelta =
20880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    static_cast<TimeInMillis>(116444736UL) * 100000UL;
20890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const DWORD kTenthMicrosInMilliSecond = 10000;
20900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
20910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  SYSTEMTIME now_systime;
20920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  FILETIME now_filetime;
20930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ULARGE_INTEGER now_int64;
20940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // TODO(kenton@google.com): Shouldn't this just use
20950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //   GetSystemTimeAsFileTime()?
20960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GetSystemTime(&now_systime);
20970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (SystemTimeToFileTime(&now_systime, &now_filetime)) {
20980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    now_int64.LowPart = now_filetime.dwLowDateTime;
20990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    now_int64.HighPart = now_filetime.dwHighDateTime;
21000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -
21010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      kJavaEpochToWinFileTimeDelta;
21020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return now_int64.QuadPart;
21030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
21040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return 0;
21050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_
21060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  __timeb64 now;
21070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#ifdef _MSC_VER
21080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
21090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // (deprecated function) there.
21100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // TODO(kenton@google.com): Use GetTickCount()?  Or use
21110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //   SystemTimeToFileTime()
21120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#pragma warning(push)          // Saves the current warning state.
21130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#pragma warning(disable:4996)  // Temporarily disables warning 4996.
21140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  _ftime64(&now);
21150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#pragma warning(pop)           // Restores the warning state.
21160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
21170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  _ftime64(&now);
21180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // _MSC_VER
21190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;
21200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#elif GTEST_HAS_GETTIMEOFDAY_
21210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  struct timeval now;
21220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  gettimeofday(&now, NULL);
21230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;
21240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
21250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#error "Don't know how to get the current time on your system."
21260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif
21270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
21280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
21290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Utilities
21300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
21310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// class String
21320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
21330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the input enclosed in double quotes if it's not NULL;
21340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// otherwise returns "(null)".  For example, "\"Hello\"" is returned
21350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// for input "Hello".
21360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
21370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This is useful for printing a C string in the syntax of a literal.
21380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
21390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Known issue: escape sequences are not handled yet.
21400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString String::ShowCStringQuoted(const char* c_str) {
21410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return c_str ? String::Format("\"%s\"", c_str) : String("(null)");
21420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
21430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
21440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Copies at most length characters from str into a newly-allocated
21450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// piece of memory of size length+1.  The memory is allocated with new[].
21460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A terminating null byte is written to the memory, and a pointer to it
21470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// is returned.  If str is NULL, NULL is returned.
21480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic char* CloneString(const char* str, size_t length) {
21490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (str == NULL) {
21500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return NULL;
21510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
21520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    char* const clone = new char[length + 1];
21530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    posix::StrNCpy(clone, str, length);
21540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    clone[length] = '\0';
21550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return clone;
21560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
21570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
21580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
21590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Clones a 0-terminated C string, allocating memory using new.  The
21600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// caller is responsible for deleting[] the return value.  Returns the
21610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// cloned string, or NULL if the input is NULL.
21620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char * String::CloneCString(const char* c_str) {
21630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return (c_str == NULL) ?
21640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                    NULL : CloneString(c_str, strlen(c_str));
21650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
21660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
21670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS_MOBILE
21680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Creates a UTF-16 wide string from the given ANSI string, allocating
21690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// memory using new. The caller is responsible for deleting the return
21700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// value using delete[]. Returns the wide string, or NULL if the
21710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// input is NULL.
21720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonLPCWSTR String::AnsiToUtf16(const char* ansi) {
21730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!ansi) return NULL;
21740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int length = strlen(ansi);
21750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int unicode_length =
21760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      MultiByteToWideChar(CP_ACP, 0, ansi, length,
21770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                          NULL, 0);
21780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  WCHAR* unicode = new WCHAR[unicode_length + 1];
21790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  MultiByteToWideChar(CP_ACP, 0, ansi, length,
21800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      unicode, unicode_length);
21810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  unicode[unicode_length] = 0;
21820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return unicode;
21830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
21840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
21850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Creates an ANSI string from the given wide string, allocating
21860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// memory using new. The caller is responsible for deleting the return
21870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// value using delete[]. Returns the ANSI string, or NULL if the
21880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// input is NULL.
21890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char* String::Utf16ToAnsi(LPCWSTR utf16_str)  {
21900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!utf16_str) return NULL;
21910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int ansi_length =
21920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
21930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                          NULL, 0, NULL, NULL);
21940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char* ansi = new char[ansi_length + 1];
21950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
21960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      ansi, ansi_length, NULL, NULL);
21970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ansi[ansi_length] = 0;
21980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return ansi;
21990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
22000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
22010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS_MOBILE
22020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
22030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Compares two C strings.  Returns true iff they have the same content.
22040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
22050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Unlike strcmp(), this function can handle NULL argument(s).  A NULL
22060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// C string is considered different to any non-NULL C string,
22070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// including the empty string.
22080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool String::CStringEquals(const char * lhs, const char * rhs) {
22090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if ( lhs == NULL ) return rhs == NULL;
22100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
22110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if ( rhs == NULL ) return false;
22120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
22130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return strcmp(lhs, rhs) == 0;
22140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
22150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
22160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
22170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
22180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Converts an array of wide chars to a narrow string using the UTF-8
22190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// encoding, and streams the result to the given Message object.
22200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,
22210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                     Message* msg) {
22220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // TODO(wan): consider allowing a testing::String object to
22230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // contain '\0'.  This will make it behave more like std::string,
22240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // and will allow ToUtf8String() to return the correct encoding
22250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // for '\0' s.t. we can get rid of the conditional here (and in
22260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // several other places).
22270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (size_t i = 0; i != length; ) {  // NOLINT
22280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (wstr[i] != L'\0') {
22290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));
22300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      while (i != length && wstr[i] != L'\0')
22310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        i++;
22320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } else {
22330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      *msg << '\0';
22340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      i++;
22350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
22360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
22370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
22380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
22390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
22400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
22410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
22420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
22430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_STD_WSTRING
22440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Converts the given wide string to a narrow string using the UTF-8
22450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// encoding, and streams the result to this Message object.
22460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonMessage& Message::operator <<(const ::std::wstring& wstr) {
22470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
22480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return *this;
22490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
22500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_STD_WSTRING
22510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
22520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_GLOBAL_WSTRING
22530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Converts the given wide string to a narrow string using the UTF-8
22540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// encoding, and streams the result to this Message object.
22550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonMessage& Message::operator <<(const ::wstring& wstr) {
22560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
22570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return *this;
22580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
22590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_GLOBAL_WSTRING
22600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
22610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
22620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
22630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Formats a value to be used in a failure message.
22640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
22650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// For a char value, we print it as a C++ char literal and as an
22660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// unsigned integer (both in decimal and in hexadecimal).
22670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString FormatForFailureMessage(char ch) {
22680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const unsigned int ch_as_uint = ch;
22690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // A String object cannot contain '\0', so we print "\\0" when ch is
22700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // '\0'.
22710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return String::Format("'%s' (%u, 0x%X)",
22720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                        ch ? String::Format("%c", ch).c_str() : "\\0",
22730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                        ch_as_uint, ch_as_uint);
22740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
22750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
22760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// For a wchar_t value, we print it as a C++ wchar_t literal and as an
22770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// unsigned integer (both in decimal and in hexidecimal).
22780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString FormatForFailureMessage(wchar_t wchar) {
22790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The C++ standard doesn't specify the exact size of the wchar_t
22800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // type.  It just says that it shall have the same size as another
22810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // integral type, called its underlying type.
22820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //
22830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Therefore, in order to print a wchar_t value in the numeric form,
22840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // we first convert it to the largest integral type (UInt64) and
22850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // then print the converted value.
22860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //
22870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // We use streaming to print the value as "%llu" doesn't work
22880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // correctly with MSVC 7.1.
22890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const UInt64 wchar_as_uint64 = wchar;
22900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message msg;
22910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // A String object cannot contain '\0', so we print "\\0" when wchar is
22920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // L'\0'.
22930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char buffer[32];  // CodePointToUtf8 requires a buffer that big.
22940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  msg << "L'"
22950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << (wchar ? CodePointToUtf8(static_cast<UInt32>(wchar), buffer) : "\\0")
22960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "' (" << wchar_as_uint64 << ", 0x" << ::std::setbase(16)
22970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << wchar_as_uint64 << ")";
22980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return msg.GetString();
22990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
23000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
23010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
23020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
23030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// AssertionResult constructors.
23040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Used in EXPECT_TRUE/FALSE(assertion_result).
23050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult::AssertionResult(const AssertionResult& other)
23060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    : success_(other.success_),
23070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      message_(other.message_.get() != NULL ?
23080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson               new internal::String(*other.message_) :
23090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson               static_cast<internal::String*>(NULL)) {
23100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
23110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
23120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
23130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult AssertionResult::operator!() const {
23140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  AssertionResult negation(!success_);
23150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (message_.get() != NULL)
23160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    negation << *message_;
23170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return negation;
23180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
23190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
23200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Makes a successful assertion result.
23210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult AssertionSuccess() {
23220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return AssertionResult(true);
23230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
23240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
23250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Makes a failed assertion result.
23260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult AssertionFailure() {
23270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return AssertionResult(false);
23280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
23290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
23300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Makes a failed assertion result with the given failure message.
23310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Deprecated; use AssertionFailure() << message.
23320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult AssertionFailure(const Message& message) {
23330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return AssertionFailure() << message;
23340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
23350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
23360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
23370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
23380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Constructs and returns the message for an equality assertion
23390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
23400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
23410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The first four parameters are the expressions used in the assertion
23420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
23430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// where foo is 5 and bar is 6, we have:
23440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
23450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   expected_expression: "foo"
23460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   actual_expression:   "bar"
23470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   expected_value:      "5"
23480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   actual_value:        "6"
23490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
23500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The ignoring_case parameter is true iff the assertion is a
23510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
23520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// be inserted into the message.
23530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult EqFailure(const char* expected_expression,
23540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                          const char* actual_expression,
23550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                          const String& expected_value,
23560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                          const String& actual_value,
23570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                          bool ignoring_case) {
23580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message msg;
23590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  msg << "Value of: " << actual_expression;
23600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (actual_value != actual_expression) {
23610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    msg << "\n  Actual: " << actual_value;
23620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
23630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
23640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  msg << "\nExpected: " << expected_expression;
23650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (ignoring_case) {
23660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    msg << " (ignoring case)";
23670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
23680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (expected_value != expected_expression) {
23690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    msg << "\nWhich is: " << expected_value;
23700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
23710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
23720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return AssertionFailure(msg);
23730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
23740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
23750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
23760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString GetBoolAssertionFailureMessage(const AssertionResult& assertion_result,
23770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                      const char* expression_text,
23780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                      const char* actual_predicate_value,
23790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                      const char* expected_predicate_value) {
23800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* actual_message = assertion_result.message();
23810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message msg;
23820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  msg << "Value of: " << expression_text
23830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "\n  Actual: " << actual_predicate_value;
23840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (actual_message[0] != '\0')
23850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    msg << " (" << actual_message << ")";
23860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  msg << "\nExpected: " << expected_predicate_value;
23870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return msg.GetString();
23880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
23890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
23900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Helper function for implementing ASSERT_NEAR.
23910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult DoubleNearPredFormat(const char* expr1,
23920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                     const char* expr2,
23930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                     const char* abs_error_expr,
23940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                     double val1,
23950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                     double val2,
23960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                     double abs_error) {
23970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const double diff = fabs(val1 - val2);
23980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (diff <= abs_error) return AssertionSuccess();
23990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
24000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // TODO(wan): do not print the value of an expression if it's
24010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // already a literal.
24020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message msg;
24030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  msg << "The difference between " << expr1 << " and " << expr2
24040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n"
24050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << expr1 << " evaluates to " << val1 << ",\n"
24060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << expr2 << " evaluates to " << val2 << ", and\n"
24070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << abs_error_expr << " evaluates to " << abs_error << ".";
24080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return AssertionFailure(msg);
24090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
24100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
24110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
24120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Helper template for implementing FloatLE() and DoubleLE().
24130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsontemplate <typename RawType>
24140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult FloatingPointLE(const char* expr1,
24150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                const char* expr2,
24160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                RawType val1,
24170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                RawType val2) {
24180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns success if val1 is less than val2,
24190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (val1 < val2) {
24200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionSuccess();
24210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
24220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
24230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // or if val1 is almost equal to val2.
24240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const FloatingPoint<RawType> lhs(val1), rhs(val2);
24250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (lhs.AlmostEquals(rhs)) {
24260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionSuccess();
24270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
24280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
24290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Note that the above two checks will both fail if either val1 or
24300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // val2 is NaN, as the IEEE floating-point standard requires that
24310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // any predicate involving a NaN must return false.
24320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
24330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  StrStream val1_ss;
24340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
24350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << val1;
24360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
24370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  StrStream val2_ss;
24380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
24390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << val2;
24400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
24410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message msg;
24420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  msg << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n"
24430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "  Actual: " << StrStreamToString(&val1_ss) << " vs "
24440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << StrStreamToString(&val2_ss);
24450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
24460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return AssertionFailure(msg);
24470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
24480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
24490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
24500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
24510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Asserts that val1 is less than, or almost equal to, val2.  Fails
24520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// otherwise.  In particular, it fails if either val1 or val2 is NaN.
24530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult FloatLE(const char* expr1, const char* expr2,
24540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                        float val1, float val2) {
24550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);
24560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
24570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
24580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Asserts that val1 is less than, or almost equal to, val2.  Fails
24590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// otherwise.  In particular, it fails if either val1 or val2 is NaN.
24600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult DoubleLE(const char* expr1, const char* expr2,
24610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                         double val1, double val2) {
24620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);
24630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
24640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
24650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
24660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
24670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The helper function for {ASSERT|EXPECT}_EQ with int or enum
24680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// arguments.
24690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult CmpHelperEQ(const char* expected_expression,
24700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                            const char* actual_expression,
24710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                            BiggestInt expected,
24720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                            BiggestInt actual) {
24730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (expected == actual) {
24740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionSuccess();
24750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
24760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
24770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return EqFailure(expected_expression,
24780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   actual_expression,
24790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   FormatForComparisonFailureMessage(expected, actual),
24800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   FormatForComparisonFailureMessage(actual, expected),
24810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   false);
24820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
24830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
24840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A macro for implementing the helper functions needed to implement
24850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// ASSERT_?? and EXPECT_?? with integer or enum arguments.  It is here
24860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// just to avoid copy-and-paste of similar code.
24870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
24880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
24890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                   BiggestInt val1, BiggestInt val2) {\
24900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (val1 op val2) {\
24910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionSuccess();\
24920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {\
24930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    Message msg;\
24940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    msg << "Expected: (" << expr1 << ") " #op " (" << expr2\
24950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
24960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
24970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionFailure(msg);\
24980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }\
24990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
25000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
25010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Implements the helper function for {ASSERT|EXPECT}_NE with int or
25020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// enum arguments.
25030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_IMPL_CMP_HELPER_(NE, !=)
25040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Implements the helper function for {ASSERT|EXPECT}_LE with int or
25050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// enum arguments.
25060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_IMPL_CMP_HELPER_(LE, <=)
25070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Implements the helper function for {ASSERT|EXPECT}_LT with int or
25080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// enum arguments.
25090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_IMPL_CMP_HELPER_(LT, < )
25100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Implements the helper function for {ASSERT|EXPECT}_GE with int or
25110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// enum arguments.
25120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_IMPL_CMP_HELPER_(GE, >=)
25130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Implements the helper function for {ASSERT|EXPECT}_GT with int or
25140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// enum arguments.
25150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_IMPL_CMP_HELPER_(GT, > )
25160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
25170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#undef GTEST_IMPL_CMP_HELPER_
25180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
25190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The helper function for {ASSERT|EXPECT}_STREQ.
25200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult CmpHelperSTREQ(const char* expected_expression,
25210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                               const char* actual_expression,
25220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                               const char* expected,
25230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                               const char* actual) {
25240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (String::CStringEquals(expected, actual)) {
25250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionSuccess();
25260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
25270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
25280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return EqFailure(expected_expression,
25290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   actual_expression,
25300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   String::ShowCStringQuoted(expected),
25310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   String::ShowCStringQuoted(actual),
25320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   false);
25330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
25340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
25350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
25360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
25370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                   const char* actual_expression,
25380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                   const char* expected,
25390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                   const char* actual) {
25400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (String::CaseInsensitiveCStringEquals(expected, actual)) {
25410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionSuccess();
25420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
25430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
25440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return EqFailure(expected_expression,
25450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   actual_expression,
25460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   String::ShowCStringQuoted(expected),
25470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   String::ShowCStringQuoted(actual),
25480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   true);
25490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
25500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
25510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The helper function for {ASSERT|EXPECT}_STRNE.
25520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult CmpHelperSTRNE(const char* s1_expression,
25530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                               const char* s2_expression,
25540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                               const char* s1,
25550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                               const char* s2) {
25560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!String::CStringEquals(s1, s2)) {
25570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionSuccess();
25580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
25590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    Message msg;
25600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    msg << "Expected: (" << s1_expression << ") != ("
25610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << s2_expression << "), actual: \""
25620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << s1 << "\" vs \"" << s2 << "\"";
25630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionFailure(msg);
25640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
25650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
25660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
25670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The helper function for {ASSERT|EXPECT}_STRCASENE.
25680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult CmpHelperSTRCASENE(const char* s1_expression,
25690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                   const char* s2_expression,
25700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                   const char* s1,
25710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                   const char* s2) {
25720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!String::CaseInsensitiveCStringEquals(s1, s2)) {
25730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionSuccess();
25740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
25750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    Message msg;
25760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    msg << "Expected: (" << s1_expression << ") != ("
25770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << s2_expression << ") (ignoring case), actual: \""
25780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << s1 << "\" vs \"" << s2 << "\"";
25790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionFailure(msg);
25800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
25810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
25820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
25830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
25840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
25850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace {
25860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
25870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Helper functions for implementing IsSubString() and IsNotSubstring().
25880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
25890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This group of overloaded functions return true iff needle is a
25900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// substring of haystack.  NULL is considered a substring of itself
25910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// only.
25920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
25930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool IsSubstringPred(const char* needle, const char* haystack) {
25940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (needle == NULL || haystack == NULL)
25950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return needle == haystack;
25960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
25970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return strstr(haystack, needle) != NULL;
25980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
25990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {
26010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (needle == NULL || haystack == NULL)
26020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return needle == haystack;
26030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return wcsstr(haystack, needle) != NULL;
26050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
26060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// StringType here can be either ::std::string or ::std::wstring.
26080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsontemplate <typename StringType>
26090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool IsSubstringPred(const StringType& needle,
26100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                     const StringType& haystack) {
26110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return haystack.find(needle) != StringType::npos;
26120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
26130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This function implements either IsSubstring() or IsNotSubstring(),
26150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// depending on the value of the expected_to_be_substring parameter.
26160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// StringType here can be const char*, const wchar_t*, ::std::string,
26170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// or ::std::wstring.
26180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsontemplate <typename StringType>
26190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult IsSubstringImpl(
26200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    bool expected_to_be_substring,
26210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* needle_expr, const char* haystack_expr,
26220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const StringType& needle, const StringType& haystack) {
26230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (IsSubstringPred(needle, haystack) == expected_to_be_substring)
26240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionSuccess();
26250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const bool is_wide_string = sizeof(needle[0]) > 1;
26270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
26280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return AssertionFailure(
26290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      Message()
26300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "Value of: " << needle_expr << "\n"
26310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "  Actual: " << begin_string_quote << needle << "\"\n"
26320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "Expected: " << (expected_to_be_substring ? "" : "not ")
26330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "a substring of " << haystack_expr << "\n"
26340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "Which is: " << begin_string_quote << haystack << "\"");
26350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
26360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace
26380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// IsSubstring() and IsNotSubstring() check whether needle is a
26400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// substring of haystack (NULL is considered a substring of itself
26410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// only), and return an appropriate error message when they fail.
26420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult IsSubstring(
26440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* needle_expr, const char* haystack_expr,
26450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* needle, const char* haystack) {
26460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
26470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
26480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult IsSubstring(
26500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* needle_expr, const char* haystack_expr,
26510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const wchar_t* needle, const wchar_t* haystack) {
26520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
26530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
26540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult IsNotSubstring(
26560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* needle_expr, const char* haystack_expr,
26570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* needle, const char* haystack) {
26580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
26590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
26600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult IsNotSubstring(
26620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* needle_expr, const char* haystack_expr,
26630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const wchar_t* needle, const wchar_t* haystack) {
26640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
26650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
26660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult IsSubstring(
26680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* needle_expr, const char* haystack_expr,
26690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const ::std::string& needle, const ::std::string& haystack) {
26700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
26710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
26720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult IsNotSubstring(
26740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* needle_expr, const char* haystack_expr,
26750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const ::std::string& needle, const ::std::string& haystack) {
26760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
26770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
26780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_STD_WSTRING
26800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult IsSubstring(
26810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* needle_expr, const char* haystack_expr,
26820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const ::std::wstring& needle, const ::std::wstring& haystack) {
26830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
26840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
26850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult IsNotSubstring(
26870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* needle_expr, const char* haystack_expr,
26880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const ::std::wstring& needle, const ::std::wstring& haystack) {
26890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
26900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
26910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_STD_WSTRING
26920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
26940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
26960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace {
26980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
26990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Helper function for IsHRESULT{SuccessFailure} predicates
27000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult HRESULTFailureHelper(const char* expr,
27010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                     const char* expected,
27020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                     long hr) {  // NOLINT
27030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS_MOBILE
27040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Windows CE doesn't support FormatMessage.
27050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char error_text[] = "";
27060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
27070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Looks up the human-readable system message for the HRESULT code
27080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // and since we're not passing any params to FormatMessage, we don't
27090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // want inserts expanded.
27100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
27110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                       FORMAT_MESSAGE_IGNORE_INSERTS;
27120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const DWORD kBufSize = 4096;  // String::Format can't exceed this length.
27130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the system's human readable message string for this HRESULT.
27140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char error_text[kBufSize] = { '\0' };
27150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  DWORD message_length = ::FormatMessageA(kFlags,
27160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                          0,  // no source, we're asking system
27170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                          hr,  // the error
27180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                          0,  // no line width restrictions
27190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                          error_text,  // output buffer
27200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                          kBufSize,  // buf size
27210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                          NULL);  // no arguments for inserts
27220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Trims tailing white space (FormatMessage leaves a trailing cr-lf)
27230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (; message_length && isspace(error_text[message_length - 1]);
27240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          --message_length) {
27250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    error_text[message_length - 1] = '\0';
27260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
27270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS_MOBILE
27280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
27290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String error_hex(String::Format("0x%08X ", hr));
27300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message msg;
27310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  msg << "Expected: " << expr << " " << expected << ".\n"
27320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "  Actual: " << error_hex << error_text << "\n";
27330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
27340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return ::testing::AssertionFailure(msg);
27350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
27360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
27370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace
27380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
27390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NOLINT
27400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (SUCCEEDED(hr)) {
27410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionSuccess();
27420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
27430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return HRESULTFailureHelper(expr, "succeeds", hr);
27440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
27450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
27460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NOLINT
27470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (FAILED(hr)) {
27480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionSuccess();
27490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
27500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return HRESULTFailureHelper(expr, "fails", hr);
27510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
27520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
27530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
27540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
27550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Utility functions for encoding Unicode text (wide strings) in
27560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// UTF-8.
27570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
27580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8
27590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// like this:
27600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
27610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Code-point length   Encoding
27620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   0 -  7 bits       0xxxxxxx
27630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   8 - 11 bits       110xxxxx 10xxxxxx
27640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//  12 - 16 bits       1110xxxx 10xxxxxx 10xxxxxx
27650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//  17 - 21 bits       11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
27660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
27670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The maximum code-point a one-byte UTF-8 sequence can represent.
27680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) <<  7) - 1;
27690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
27700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The maximum code-point a two-byte UTF-8 sequence can represent.
27710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;
27720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
27730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The maximum code-point a three-byte UTF-8 sequence can represent.
27740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;
27750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
27760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The maximum code-point a four-byte UTF-8 sequence can represent.
27770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;
27780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
27790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Chops off the n lowest bits from a bit pattern.  Returns the n
27800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// lowest bits.  As a side effect, the original bit pattern will be
27810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// shifted to the right by n bits.
27820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsoninline UInt32 ChopLowBits(UInt32* bits, int n) {
27830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);
27840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  *bits >>= n;
27850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return low_bits;
27860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
27870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
27880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Converts a Unicode code point to a narrow string in UTF-8 encoding.
27890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// code_point parameter is of type UInt32 because wchar_t may not be
27900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// wide enough to contain a code point.
27910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The output buffer str must containt at least 32 characters.
27920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The function returns the address of the output buffer.
27930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// If the code_point is not a valid Unicode code point
27940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output
27950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// as '(Invalid Unicode 0xXXXXXXXX)'.
27960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonchar* CodePointToUtf8(UInt32 code_point, char* str) {
27970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (code_point <= kMaxCodePoint1) {
27980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    str[1] = '\0';
27990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    str[0] = static_cast<char>(code_point);                          // 0xxxxxxx
28000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else if (code_point <= kMaxCodePoint2) {
28010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    str[2] = '\0';
28020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
28030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    str[0] = static_cast<char>(0xC0 | code_point);                   // 110xxxxx
28040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else if (code_point <= kMaxCodePoint3) {
28050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    str[3] = '\0';
28060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
28070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
28080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    str[0] = static_cast<char>(0xE0 | code_point);                   // 1110xxxx
28090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else if (code_point <= kMaxCodePoint4) {
28100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    str[4] = '\0';
28110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
28120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
28130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
28140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    str[0] = static_cast<char>(0xF0 | code_point);                   // 11110xxx
28150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
28160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // The longest string String::Format can produce when invoked
28170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // with these parameters is 28 character long (not including
28180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // the terminating nul character). We are asking for 32 character
28190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // buffer just in case. This is also enough for strncpy to
28200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // null-terminate the destination string.
28210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    posix::StrNCpy(
28220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        str, String::Format("(Invalid Unicode 0x%X)", code_point).c_str(), 32);
28230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    str[31] = '\0';  // Makes sure no change in the format to strncpy leaves
28240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                     // the result unterminated.
28250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
28260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return str;
28270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
28280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
28290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The following two functions only make sense if the the system
28300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// uses UTF-16 for wide string encoding. All supported systems
28310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.
28320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
28330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Determines if the arguments constitute UTF-16 surrogate pair
28340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// and thus should be combined into a single Unicode code point
28350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// using CreateCodePointFromUtf16SurrogatePair.
28360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsoninline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
28370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return sizeof(wchar_t) == 2 &&
28380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;
28390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
28400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
28410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Creates a Unicode code point from UTF16 surrogate pair.
28420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsoninline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
28430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                    wchar_t second) {
28440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const UInt32 mask = (1 << 10) - 1;
28450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return (sizeof(wchar_t) == 2) ?
28460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      (((first & mask) << 10) | (second & mask)) + 0x10000 :
28470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // This function should not be called when the condition is
28480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // false, but we provide a sensible default in case it is.
28490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      static_cast<UInt32>(first);
28500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
28510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
28520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Converts a wide string to a narrow string in UTF-8 encoding.
28530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The wide string is assumed to have the following encoding:
28540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
28550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
28560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Parameter str points to a null-terminated wide string.
28570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Parameter num_chars may additionally limit the number
28580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// of wchar_t characters processed. -1 is used when the entire string
28590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// should be processed.
28600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// If the string contains code points that are not valid Unicode code points
28610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
28620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
28630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// and contains invalid UTF-16 surrogate pairs, values in those pairs
28640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// will be encoded as individual Unicode characters from Basic Normal Plane.
28650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString WideStringToUtf8(const wchar_t* str, int num_chars) {
28660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (num_chars == -1)
28670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    num_chars = static_cast<int>(wcslen(str));
28680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
28690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  StrStream stream;
28700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (int i = 0; i < num_chars; ++i) {
28710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    UInt32 unicode_code_point;
28720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
28730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (str[i] == L'\0') {
28740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      break;
28750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {
28760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],
28770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                                 str[i + 1]);
28780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      i++;
28790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } else {
28800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      unicode_code_point = static_cast<UInt32>(str[i]);
28810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
28820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
28830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    char buffer[32];  // CodePointToUtf8 requires a buffer this big.
28840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    stream << CodePointToUtf8(unicode_code_point, buffer);
28850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
28860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return StrStreamToString(&stream);
28870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
28880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
28890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Converts a wide C string to a String using the UTF-8 encoding.
28900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// NULL will be converted to "(null)".
28910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString String::ShowWideCString(const wchar_t * wide_c_str) {
28920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (wide_c_str == NULL) return String("(null)");
28930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
28940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return String(internal::WideStringToUtf8(wide_c_str, -1).c_str());
28950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
28960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
28970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Similar to ShowWideCString(), except that this function encloses
28980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the converted string in double quotes.
28990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString String::ShowWideCStringQuoted(const wchar_t* wide_c_str) {
29000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (wide_c_str == NULL) return String("(null)");
29010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
29020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return String::Format("L\"%s\"",
29030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                        String::ShowWideCString(wide_c_str).c_str());
29040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
29050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
29060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Compares two wide C strings.  Returns true iff they have the same
29070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// content.
29080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
29090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Unlike wcscmp(), this function can handle NULL argument(s).  A NULL
29100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// C string is considered different to any non-NULL C string,
29110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// including the empty string.
29120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {
29130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (lhs == NULL) return rhs == NULL;
29140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
29150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (rhs == NULL) return false;
29160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
29170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return wcscmp(lhs, rhs) == 0;
29180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
29190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
29200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Helper function for *_STREQ on wide strings.
29210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult CmpHelperSTREQ(const char* expected_expression,
29220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                               const char* actual_expression,
29230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                               const wchar_t* expected,
29240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                               const wchar_t* actual) {
29250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (String::WideCStringEquals(expected, actual)) {
29260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionSuccess();
29270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
29280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
29290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return EqFailure(expected_expression,
29300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   actual_expression,
29310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   String::ShowWideCStringQuoted(expected),
29320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   String::ShowWideCStringQuoted(actual),
29330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   false);
29340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
29350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
29360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Helper function for *_STRNE on wide strings.
29370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonAssertionResult CmpHelperSTRNE(const char* s1_expression,
29380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                               const char* s2_expression,
29390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                               const wchar_t* s1,
29400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                               const wchar_t* s2) {
29410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!String::WideCStringEquals(s1, s2)) {
29420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return AssertionSuccess();
29430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
29440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
29450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message msg;
29460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  msg << "Expected: (" << s1_expression << ") != ("
29470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << s2_expression << "), actual: "
29480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << String::ShowWideCStringQuoted(s1)
29490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << " vs " << String::ShowWideCStringQuoted(s2);
29500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return AssertionFailure(msg);
29510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
29520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
29530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Compares two C strings, ignoring case.  Returns true iff they have
29540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the same content.
29550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
29560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Unlike strcasecmp(), this function can handle NULL argument(s).  A
29570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// NULL C string is considered different to any non-NULL C string,
29580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// including the empty string.
29590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {
29600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (lhs == NULL)
29610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return rhs == NULL;
29620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (rhs == NULL)
29630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return false;
29640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return posix::StrCaseCmp(lhs, rhs) == 0;
29650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
29660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
29670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Compares two wide C strings, ignoring case.  Returns true iff they
29680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // have the same content.
29690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //
29700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Unlike wcscasecmp(), this function can handle NULL argument(s).
29710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // A NULL C string is considered different to any non-NULL wide C string,
29720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // including the empty string.
29730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // NB: The implementations on different platforms slightly differ.
29740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
29750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // environment variable. On GNU platform this method uses wcscasecmp
29760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // which compares according to LC_CTYPE category of the current locale.
29770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
29780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // current locale.
29790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
29800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                              const wchar_t* rhs) {
29810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if ( lhs == NULL ) return rhs == NULL;
29820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
29830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if ( rhs == NULL ) return false;
29840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
29850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
29860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return _wcsicmp(lhs, rhs) == 0;
29870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#elif GTEST_OS_LINUX
29880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return wcscasecmp(lhs, rhs) == 0;
29890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
29900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Mac OS X and Cygwin don't define wcscasecmp.  Other unknown OSes
29910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // may not define it either.
29920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  wint_t left, right;
29930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  do {
29940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    left = towlower(*lhs++);
29950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    right = towlower(*rhs++);
29960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } while (left && left == right);
29970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return left == right;
29980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // OS selector
29990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
30000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
30010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Compares this with another String.
30020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0
30030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// if this is greater than rhs.
30040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint String::Compare(const String & rhs) const {
30050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const lhs_c_str = c_str();
30060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const rhs_c_str = rhs.c_str();
30070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
30080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (lhs_c_str == NULL) {
30090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return rhs_c_str == NULL ? 0 : -1;  // NULL < anything except NULL
30100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else if (rhs_c_str == NULL) {
30110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return 1;
30120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
30130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
30140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const size_t shorter_str_len =
30150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      length() <= rhs.length() ? length() : rhs.length();
30160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (size_t i = 0; i != shorter_str_len; i++) {
30170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (lhs_c_str[i] < rhs_c_str[i]) {
30180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return -1;
30190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } else if (lhs_c_str[i] > rhs_c_str[i]) {
30200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return 1;
30210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
30220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
30230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return (length() < rhs.length()) ? -1 :
30240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      (length() > rhs.length()) ? 1 : 0;
30250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
30260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
30270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff this String ends with the given suffix.  *Any*
30280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// String is considered to end with a NULL or empty suffix.
30290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool String::EndsWith(const char* suffix) const {
30300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (suffix == NULL || CStringEquals(suffix, "")) return true;
30310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
30320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (c_str() == NULL) return false;
30330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
30340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const size_t this_len = strlen(c_str());
30350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const size_t suffix_len = strlen(suffix);
30360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return (this_len >= suffix_len) &&
30370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         CStringEquals(c_str() + this_len - suffix_len, suffix);
30380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
30390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
30400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff this String ends with the given suffix, ignoring case.
30410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Any String is considered to end with a NULL or empty suffix.
30420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool String::EndsWithCaseInsensitive(const char* suffix) const {
30430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (suffix == NULL || CStringEquals(suffix, "")) return true;
30440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
30450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (c_str() == NULL) return false;
30460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
30470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const size_t this_len = strlen(c_str());
30480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const size_t suffix_len = strlen(suffix);
30490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return (this_len >= suffix_len) &&
30500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         CaseInsensitiveCStringEquals(c_str() + this_len - suffix_len, suffix);
30510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
30520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
30530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Formats a list of arguments to a String, using the same format
30540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// spec string as for printf.
30550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
30560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// We do not use the StringPrintf class as it is not universally
30570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// available.
30580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
30590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The result is limited to 4096 characters (including the tailing 0).
30600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// If 4096 characters are not enough to format the input, or if
30610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// there's an error, "<formatting error or buffer exceeded>" is
30620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// returned.
30630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString String::Format(const char * format, ...) {
30640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  va_list args;
30650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  va_start(args, format);
30660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
30670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char buffer[4096];
30680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int kBufferSize = sizeof(buffer)/sizeof(buffer[0]);
30690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
30700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // MSVC 8 deprecates vsnprintf(), so we want to suppress warning
30710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // 4996 (deprecated function) there.
30720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#ifdef _MSC_VER  // We are using MSVC.
30730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#pragma warning(push)          // Saves the current warning state.
30740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#pragma warning(disable:4996)  // Temporarily disables warning 4996.
30750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int size = vsnprintf(buffer, kBufferSize, format, args);
30760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#pragma warning(pop)           // Restores the warning state.
30770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else  // We are not using MSVC.
30780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int size = vsnprintf(buffer, kBufferSize, format, args);
30790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // _MSC_VER
30800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  va_end(args);
30810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
30820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // vsnprintf()'s behavior is not portable.  When the buffer is not
30830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // big enough, it returns a negative value in MSVC, and returns the
30840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // needed buffer size on Linux.  When there is an output error, it
30850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // always returns a negative value.  For simplicity, we lump the two
30860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // error cases together.
30870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (size < 0 || size >= kBufferSize) {
30880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return String("<formatting error or buffer exceeded>");
30890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
30900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return String(buffer, size);
30910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
30920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
30930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
30940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Converts the buffer in a StrStream to a String, converting NUL
30950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// bytes to "\\0" along the way.
30960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString StrStreamToString(StrStream* ss) {
30970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const ::std::string& str = ss->str();
30980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const start = str.c_str();
30990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const end = start + str.length();
31000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
31010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // We need to use a helper StrStream to do this transformation
31020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // because String doesn't support push_back().
31030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  StrStream helper;
31040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (const char* ch = start; ch != end; ++ch) {
31050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (*ch == '\0') {
31060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      helper << "\\0";  // Replaces NUL with "\\0";
31070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } else {
31080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      helper.put(*ch);
31090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
31100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
31110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
31120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return String(helper.str().c_str());
31130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
31140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
31150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Appends the user-supplied message to the Google-Test-generated message.
31160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString AppendUserMessage(const String& gtest_msg,
31170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                         const Message& user_msg) {
31180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Appends the user message if it's non-empty.
31190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String user_msg_string = user_msg.GetString();
31200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (user_msg_string.empty()) {
31210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return gtest_msg;
31220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
31230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
31240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message msg;
31250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  msg << gtest_msg << "\n" << user_msg_string;
31260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
31270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return msg.GetString();
31280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
31290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
31300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
31310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
31320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// class TestResult
31330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
31340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Creates an empty TestResult.
31350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestResult::TestResult()
31360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    : death_test_count_(0),
31370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      elapsed_time_(0) {
31380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
31390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
31400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// D'tor.
31410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestResult::~TestResult() {
31420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
31430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
31440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the i-th test part result among all the results. i can
31450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// range from 0 to total_part_count() - 1. If i is not in that range,
31460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// aborts the program.
31470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst TestPartResult& TestResult::GetTestPartResult(int i) const {
31480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (i < 0 || i >= total_part_count())
31490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal::posix::Abort();
31500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return test_part_results_.at(i);
31510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
31520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
31530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the i-th test property. i can range from 0 to
31540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// test_property_count() - 1. If i is not in that range, aborts the
31550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// program.
31560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst TestProperty& TestResult::GetTestProperty(int i) const {
31570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (i < 0 || i >= test_property_count())
31580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal::posix::Abort();
31590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return test_properties_.at(i);
31600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
31610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
31620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Clears the test part results.
31630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestResult::ClearTestPartResults() {
31640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  test_part_results_.clear();
31650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
31660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
31670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Adds a test part result to the list.
31680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestResult::AddTestPartResult(const TestPartResult& test_part_result) {
31690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  test_part_results_.push_back(test_part_result);
31700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
31710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
31720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Adds a test property to the list. If a property with the same key as the
31730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// supplied property is already represented, the value of this test_property
31740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// replaces the old value for that key.
31750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestResult::RecordProperty(const TestProperty& test_property) {
31760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!ValidateTestProperty(test_property)) {
31770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return;
31780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
31790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::MutexLock lock(&test_properites_mutex_);
31800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const std::vector<TestProperty>::iterator property_with_matching_key =
31810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      std::find_if(test_properties_.begin(), test_properties_.end(),
31820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   internal::TestPropertyKeyIs(test_property.key()));
31830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (property_with_matching_key == test_properties_.end()) {
31840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    test_properties_.push_back(test_property);
31850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return;
31860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
31870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  property_with_matching_key->SetValue(test_property.value());
31880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
31890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
31900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Adds a failure if the key is a reserved attribute of Google Test
31910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// testcase tags.  Returns true if the property is valid.
31920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool TestResult::ValidateTestProperty(const TestProperty& test_property) {
31930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::String key(test_property.key());
31940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (key == "name" || key == "status" || key == "time" || key == "classname") {
31950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ADD_FAILURE()
31960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << "Reserved key used in RecordProperty(): "
31970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << key
31980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << " ('name', 'status', 'time', and 'classname' are reserved by "
31990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << GTEST_NAME_ << ")";
32000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return false;
32010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
32020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return true;
32030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
32040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
32050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Clears the object.
32060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestResult::Clear() {
32070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  test_part_results_.clear();
32080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  test_properties_.clear();
32090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  death_test_count_ = 0;
32100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  elapsed_time_ = 0;
32110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
32120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
32130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff the test failed.
32140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool TestResult::Failed() const {
32150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (int i = 0; i < total_part_count(); ++i) {
32160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (GetTestPartResult(i).failed())
32170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return true;
32180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
32190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return false;
32200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
32210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
32220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff the test part fatally failed.
32230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic bool TestPartFatallyFailed(const TestPartResult& result) {
32240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return result.fatally_failed();
32250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
32260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
32270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff the test fatally failed.
32280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool TestResult::HasFatalFailure() const {
32290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return CountIf(test_part_results_, TestPartFatallyFailed) > 0;
32300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
32310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
32320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff the test part non-fatally failed.
32330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic bool TestPartNonfatallyFailed(const TestPartResult& result) {
32340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return result.nonfatally_failed();
32350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
32360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
32370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff the test has a non-fatal failure.
32380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool TestResult::HasNonfatalFailure() const {
32390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;
32400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
32410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
32420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of all test parts.  This is the sum of the number
32430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// of successful test parts and the number of failed test parts.
32440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint TestResult::total_part_count() const {
32450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return static_cast<int>(test_part_results_.size());
32460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
32470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
32480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the number of the test properties.
32490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint TestResult::test_property_count() const {
32500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return static_cast<int>(test_properties_.size());
32510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
32520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
32530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// class Test
32540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
32550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Creates a Test object.
32560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
32570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The c'tor saves the values of all Google Test flags.
32580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTest::Test()
32590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    : gtest_flag_saver_(new internal::GTestFlagSaver) {
32600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
32610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
32620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The d'tor restores the values of all Google Test flags.
32630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTest::~Test() {
32640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  delete gtest_flag_saver_;
32650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
32660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
32670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Sets up the test fixture.
32680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
32690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A sub-class may override this.
32700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid Test::SetUp() {
32710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
32720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
32730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Tears down the test fixture.
32740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
32750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A sub-class may override this.
32760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid Test::TearDown() {
32770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
32780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
32790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Allows user supplied key value pairs to be recorded for later output.
32800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid Test::RecordProperty(const char* key, const char* value) {
32810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  UnitTest::GetInstance()->RecordPropertyForCurrentTest(key, value);
32820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
32830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
32840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Allows user supplied key value pairs to be recorded for later output.
32850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid Test::RecordProperty(const char* key, int value) {
32860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message value_message;
32870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  value_message << value;
32880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  RecordProperty(key, value_message.GetString().c_str());
32890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
32900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
32910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
32920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
32930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid ReportFailureInUnknownLocation(TestPartResult::Type result_type,
32940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                    const String& message) {
32950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // This function is a friend of UnitTest and as such has access to
32960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // AddTestPartResult.
32970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  UnitTest::GetInstance()->AddTestPartResult(
32980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      result_type,
32990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      NULL,  // No info about the source file where the exception occurred.
33000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      -1,    // We have no info on which line caused the exception.
33010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      message,
33020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      String());  // No stack trace, either.
33030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
33040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
33050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
33060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
33070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
33080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// We are on Windows.
33090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
33100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Adds an "exception thrown" fatal failure to the current test.
33110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic void AddExceptionThrownFailure(DWORD exception_code,
33120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                      const char* location) {
33130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message message;
33140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  message << "Exception thrown with code 0x" << std::setbase(16) <<
33150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    exception_code << std::setbase(10) << " in " << location << ".";
33160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
33170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,
33180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                           message.GetString());
33190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
33200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
33210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
33220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
33230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Google Test requires all tests in the same test case to use the same test
33240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// fixture class.  This function checks if the current test has the
33250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// same fixture class as the first test in the current test case.  If
33260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// yes, it returns true; otherwise it generates a Google Test failure and
33270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// returns false.
33280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool Test::HasSameFixtureClass() {
33290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
33300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const TestCase* const test_case = impl->current_test_case();
33310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
33320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Info about the first test in the current test case.
33330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const internal::TestInfoImpl* const first_test_info =
33340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      test_case->test_info_list()[0]->impl();
33350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const internal::TypeId first_fixture_id = first_test_info->fixture_class_id();
33360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const first_test_name = first_test_info->name();
33370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
33380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Info about the current test.
33390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const internal::TestInfoImpl* const this_test_info =
33400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      impl->current_test_info()->impl();
33410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const internal::TypeId this_fixture_id = this_test_info->fixture_class_id();
33420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const this_test_name = this_test_info->name();
33430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
33440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (this_fixture_id != first_fixture_id) {
33450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Is the first test defined using TEST?
33460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();
33470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Is this test defined using TEST?
33480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();
33490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
33500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (first_is_TEST || this_is_TEST) {
33510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // The user mixed TEST and TEST_F in this test case - we'll tell
33520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // him/her how to fix it.
33530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
33540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // Gets the name of the TEST and the name of the TEST_F.  Note
33550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // that first_is_TEST and this_is_TEST cannot both be true, as
33560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // the fixture IDs are different for the two tests.
33570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      const char* const TEST_name =
33580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          first_is_TEST ? first_test_name : this_test_name;
33590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      const char* const TEST_F_name =
33600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          first_is_TEST ? this_test_name : first_test_name;
33610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
33620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ADD_FAILURE()
33630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "All tests in the same test case must use the same test fixture\n"
33640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "class, so mixing TEST_F and TEST in the same test case is\n"
33650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "illegal.  In test case " << this_test_info->test_case_name()
33660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << ",\n"
33670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "test " << TEST_F_name << " is defined using TEST_F but\n"
33680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "test " << TEST_name << " is defined using TEST.  You probably\n"
33690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "want to change the TEST to TEST_F or move it to another test\n"
33700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "case.";
33710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } else {
33720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // The user defined two fixture classes with the same name in
33730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // two namespaces - we'll tell him/her how to fix it.
33740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ADD_FAILURE()
33750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "All tests in the same test case must use the same test fixture\n"
33760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "class.  However, in test case "
33770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << this_test_info->test_case_name() << ",\n"
33780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "you defined test " << first_test_name
33790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << " and test " << this_test_name << "\n"
33800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "using two different test fixture classes.  This can happen if\n"
33810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "the two classes are from different namespaces or translation\n"
33820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "units and have the same name.  You should probably rename one\n"
33830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "of the classes to put the tests into different test cases.";
33840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
33850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return false;
33860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
33870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
33880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return true;
33890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
33900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
33910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Runs the test and updates the test result.
33920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid Test::Run() {
33930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!HasSameFixtureClass()) return;
33940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
33950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
33960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_SEH
33970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Catch SEH-style exceptions.
33980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl->os_stack_trace_getter()->UponLeavingGTest();
33990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  __try {
34000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    SetUp();
34010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } __except(internal::UnitTestOptions::GTestShouldProcessSEH(
34020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      GetExceptionCode())) {
34030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    AddExceptionThrownFailure(GetExceptionCode(), "SetUp()");
34040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
34050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
34060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // We will run the test only if SetUp() had no fatal failure.
34070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!HasFatalFailure()) {
34080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    impl->os_stack_trace_getter()->UponLeavingGTest();
34090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    __try {
34100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      TestBody();
34110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } __except(internal::UnitTestOptions::GTestShouldProcessSEH(
34120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        GetExceptionCode())) {
34130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      AddExceptionThrownFailure(GetExceptionCode(), "the test body");
34140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
34150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
34160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
34170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // However, we want to clean up as much as possible.  Hence we will
34180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // always call TearDown(), even if SetUp() or the test body has
34190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // failed.
34200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl->os_stack_trace_getter()->UponLeavingGTest();
34210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  __try {
34220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    TearDown();
34230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } __except(internal::UnitTestOptions::GTestShouldProcessSEH(
34240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      GetExceptionCode())) {
34250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    AddExceptionThrownFailure(GetExceptionCode(), "TearDown()");
34260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
34270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
34280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else  // We are on a compiler or platform that doesn't support SEH.
34290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl->os_stack_trace_getter()->UponLeavingGTest();
34300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  SetUp();
34310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
34320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // We will run the test only if SetUp() was successful.
34330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!HasFatalFailure()) {
34340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    impl->os_stack_trace_getter()->UponLeavingGTest();
34350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    TestBody();
34360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
34370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
34380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // However, we want to clean up as much as possible.  Hence we will
34390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // always call TearDown(), even if SetUp() or the test body has
34400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // failed.
34410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl->os_stack_trace_getter()->UponLeavingGTest();
34420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TearDown();
34430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_SEH
34440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
34450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
34460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
34470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff the current test has a fatal failure.
34480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool Test::HasFatalFailure() {
34490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();
34500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
34510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
34520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff the current test has a non-fatal failure.
34530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool Test::HasNonfatalFailure() {
34540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return internal::GetUnitTestImpl()->current_test_result()->
34550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      HasNonfatalFailure();
34560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
34570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
34580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// class TestInfo
34590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
34600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Constructs a TestInfo object. It assumes ownership of the test factory
34610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// object via impl_.
34620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestInfo::TestInfo(const char* a_test_case_name,
34630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   const char* a_name,
34640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   const char* a_test_case_comment,
34650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   const char* a_comment,
34660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   internal::TypeId fixture_class_id,
34670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   internal::TestFactoryBase* factory) {
34680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl_ = new internal::TestInfoImpl(this, a_test_case_name, a_name,
34690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                     a_test_case_comment, a_comment,
34700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                     fixture_class_id, factory);
34710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
34720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
34730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Destructs a TestInfo object.
34740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestInfo::~TestInfo() {
34750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  delete impl_;
34760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
34770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
34780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
34790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
34800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Creates a new TestInfo object and registers it with Google Test;
34810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// returns the created object.
34820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
34830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Arguments:
34840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
34850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   test_case_name:   name of the test case
34860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   name:             name of the test
34870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   test_case_comment: a comment on the test case that will be included in
34880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//                      the test output
34890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   comment:          a comment on the test that will be included in the
34900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//                     test output
34910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   fixture_class_id: ID of the test fixture class
34920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   set_up_tc:        pointer to the function that sets up the test case
34930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   tear_down_tc:     pointer to the function that tears down the test case
34940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   factory:          pointer to the factory that creates a test object.
34950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//                     The newly created TestInfo instance will assume
34960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//                     ownership of the factory object.
34970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestInfo* MakeAndRegisterTestInfo(
34980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* test_case_name, const char* name,
34990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* test_case_comment, const char* comment,
35000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    TypeId fixture_class_id,
35010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    SetUpTestCaseFunc set_up_tc,
35020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    TearDownTestCaseFunc tear_down_tc,
35030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    TestFactoryBase* factory) {
35040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestInfo* const test_info =
35050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      new TestInfo(test_case_name, name, test_case_comment, comment,
35060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   fixture_class_id, factory);
35070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);
35080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return test_info;
35090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
35100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
35110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_PARAM_TEST
35120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid ReportInvalidTestCaseType(const char* test_case_name,
35130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                               const char* file, int line) {
35140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message errors;
35150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  errors
35160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "Attempted redefinition of test case " << test_case_name << ".\n"
35170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "All tests in the same test case must use the same test fixture\n"
35180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "class.  However, in test case " << test_case_name << ", you tried\n"
35190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "to define a test using a fixture class different from the one\n"
35200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "used earlier. This can happen if the two fixture classes are\n"
35210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "from different namespaces and have the same name. You should\n"
35220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "probably rename one of the classes to put the tests into different\n"
35230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "test cases.";
35240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
35250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
35260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          errors.GetString().c_str());
35270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
35280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_PARAM_TEST
35290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
35300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
35310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
35320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the test case name.
35330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char* TestInfo::test_case_name() const {
35340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl_->test_case_name();
35350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
35360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
35370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the test name.
35380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char* TestInfo::name() const {
35390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl_->name();
35400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
35410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
35420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the test case comment.
35430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char* TestInfo::test_case_comment() const {
35440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl_->test_case_comment();
35450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
35460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
35470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the test comment.
35480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char* TestInfo::comment() const {
35490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl_->comment();
35500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
35510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
35520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true if this test should run.
35530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool TestInfo::should_run() const { return impl_->should_run(); }
35540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
35550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true if this test matches the user-specified filter.
35560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool TestInfo::matches_filter() const { return impl_->matches_filter(); }
35570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
35580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the result of the test.
35590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst TestResult* TestInfo::result() const { return impl_->result(); }
35600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
35610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Increments the number of death tests encountered in this test so
35620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// far.
35630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint TestInfo::increment_death_test_count() {
35640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl_->result()->increment_death_test_count();
35650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
35660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
35670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace {
35680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
35690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A predicate that checks the test name of a TestInfo against a known
35700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// value.
35710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
35720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This is used for implementation of the TestCase class only.  We put
35730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// it in the anonymous namespace to prevent polluting the outer
35740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// namespace.
35750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
35760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TestNameIs is copyable.
35770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass TestNameIs {
35780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
35790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Constructor.
35800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //
35810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // TestNameIs has NO default constructor.
35820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  explicit TestNameIs(const char* name)
35830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      : name_(name) {}
35840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
35850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns true iff the test name of test_info matches name_.
35860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool operator()(const TestInfo * test_info) const {
35870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return test_info && internal::String(test_info->name()).Compare(name_) == 0;
35880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
35890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
35900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
35910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::String name_;
35920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
35930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
35940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace
35950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
35960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
35970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
35980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This method expands all parameterized tests registered with macros TEST_P
35990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.
36000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This will be done just once during the program runtime.
36010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid UnitTestImpl::RegisterParameterizedTests() {
36020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_PARAM_TEST
36030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!parameterized_tests_registered_) {
36040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    parameterized_test_registry_.RegisterTests();
36050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    parameterized_tests_registered_ = true;
36060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
36070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif
36080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
36090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Creates the test object, runs it, records its result, and then
36110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// deletes it.
36120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestInfoImpl::Run() {
36130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!should_run_) return;
36140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Tells UnitTest where to store test result.
36160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  UnitTestImpl* const impl = internal::GetUnitTestImpl();
36170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl->set_current_test_info(parent_);
36180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
36200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Notifies the unit test event listeners that a test is about to start.
36220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  repeater->OnTestStart(*parent_);
36230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const TimeInMillis start = GetTimeInMillis();
36250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl->os_stack_trace_getter()->UponLeavingGTest();
36270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_SEH
36280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Catch SEH-style exceptions.
36290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Test* test = NULL;
36300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  __try {
36320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Creates the test object.
36330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    test = factory_->CreateTest();
36340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } __except(internal::UnitTestOptions::GTestShouldProcessSEH(
36350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      GetExceptionCode())) {
36360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    AddExceptionThrownFailure(GetExceptionCode(),
36370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                              "the test fixture's constructor");
36380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return;
36390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
36400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else  // We are on a compiler or platform that doesn't support SEH.
36410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // TODO(wan): If test->Run() throws, test won't be deleted.  This is
36430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // not a problem now as we don't use exceptions.  If we were to
36440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // enable exceptions, we should revise the following to be
36450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // exception-safe.
36460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Creates the test object.
36480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Test* test = factory_->CreateTest();
36490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_SEH
36500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Runs the test only if the constructor of the test fixture didn't
36520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // generate a fatal failure.
36530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!Test::HasFatalFailure()) {
36540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    test->Run();
36550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
36560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Deletes the test object.
36580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl->os_stack_trace_getter()->UponLeavingGTest();
36590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  delete test;
36600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  test = NULL;
36610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  result_.set_elapsed_time(GetTimeInMillis() - start);
36630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Notifies the unit test event listener that a test has just finished.
36650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  repeater->OnTestEnd(*parent_);
36660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Tells UnitTest to stop associating assertion results to this
36680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // test.
36690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl->set_current_test_info(NULL);
36700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
36710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
36730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// class TestCase
36750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of successful tests in this test case.
36770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint TestCase::successful_test_count() const {
36780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return CountIf(test_info_list_, TestPassed);
36790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
36800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of failed tests in this test case.
36820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint TestCase::failed_test_count() const {
36830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return CountIf(test_info_list_, TestFailed);
36840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
36850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint TestCase::disabled_test_count() const {
36870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return CountIf(test_info_list_, TestDisabled);
36880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
36890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Get the number of tests in this test case that should run.
36910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint TestCase::test_to_run_count() const {
36920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return CountIf(test_info_list_, ShouldRunTest);
36930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
36940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
36950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of all tests.
36960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint TestCase::total_test_count() const {
36970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return static_cast<int>(test_info_list_.size());
36980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
36990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
37000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Creates a TestCase with the given name.
37010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
37020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Arguments:
37030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
37040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   name:         name of the test case
37050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   set_up_tc:    pointer to the function that sets up the test case
37060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   tear_down_tc: pointer to the function that tears down the test case
37070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestCase::TestCase(const char* a_name, const char* a_comment,
37080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   Test::SetUpTestCaseFunc set_up_tc,
37090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   Test::TearDownTestCaseFunc tear_down_tc)
37100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    : name_(a_name),
37110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      comment_(a_comment),
37120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      set_up_tc_(set_up_tc),
37130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      tear_down_tc_(tear_down_tc),
37140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      should_run_(false),
37150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      elapsed_time_(0) {
37160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
37170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
37180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Destructor of TestCase.
37190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestCase::~TestCase() {
37200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Deletes every Test in the collection.
37210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ForEach(test_info_list_, internal::Delete<TestInfo>);
37220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
37230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
37240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the i-th test among all the tests. i can range from 0 to
37250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// total_test_count() - 1. If i is not in that range, returns NULL.
37260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst TestInfo* TestCase::GetTestInfo(int i) const {
37270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int index = GetElementOr(test_indices_, i, -1);
37280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return index < 0 ? NULL : test_info_list_[index];
37290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
37300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
37310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the i-th test among all the tests. i can range from 0 to
37320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// total_test_count() - 1. If i is not in that range, returns NULL.
37330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestInfo* TestCase::GetMutableTestInfo(int i) {
37340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int index = GetElementOr(test_indices_, i, -1);
37350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return index < 0 ? NULL : test_info_list_[index];
37360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
37370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
37380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Adds a test to this test case.  Will delete the test upon
37390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// destruction of the TestCase object.
37400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestCase::AddTestInfo(TestInfo * test_info) {
37410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  test_info_list_.push_back(test_info);
37420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  test_indices_.push_back(static_cast<int>(test_indices_.size()));
37430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
37440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
37450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Runs every test in this TestCase.
37460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestCase::Run() {
37470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!should_run_) return;
37480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
37490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
37500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl->set_current_test_case(this);
37510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
37520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
37530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
37540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  repeater->OnTestCaseStart(*this);
37550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl->os_stack_trace_getter()->UponLeavingGTest();
37560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  set_up_tc_();
37570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
37580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const internal::TimeInMillis start = internal::GetTimeInMillis();
37590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (int i = 0; i < total_test_count(); i++) {
37600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GetMutableTestInfo(i)->impl()->Run();
37610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
37620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  elapsed_time_ = internal::GetTimeInMillis() - start;
37630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
37640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl->os_stack_trace_getter()->UponLeavingGTest();
37650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  tear_down_tc_();
37660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  repeater->OnTestCaseEnd(*this);
37670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl->set_current_test_case(NULL);
37680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
37690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
37700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Clears the results of all tests in this test case.
37710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestCase::ClearResult() {
37720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ForEach(test_info_list_, internal::TestInfoImpl::ClearTestResult);
37730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
37740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
37750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff test passed.
37760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool TestCase::TestPassed(const TestInfo * test_info) {
37770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const internal::TestInfoImpl* const impl = test_info->impl();
37780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl->should_run() && impl->result()->Passed();
37790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
37800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
37810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff test failed.
37820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool TestCase::TestFailed(const TestInfo * test_info) {
37830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const internal::TestInfoImpl* const impl = test_info->impl();
37840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl->should_run() && impl->result()->Failed();
37850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
37860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
37870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff test is disabled.
37880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool TestCase::TestDisabled(const TestInfo * test_info) {
37890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return test_info->impl()->is_disabled();
37900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
37910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
37920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true if the given test should run.
37930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool TestCase::ShouldRunTest(const TestInfo *test_info) {
37940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return test_info->impl()->should_run();
37950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
37960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
37970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Shuffles the tests in this test case.
37980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestCase::ShuffleTests(internal::Random* random) {
37990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Shuffle(random, &test_indices_);
38000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
38010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
38020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Restores the test order to before the first shuffle.
38030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestCase::UnshuffleTests() {
38040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (size_t i = 0; i < test_indices_.size(); i++) {
38050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    test_indices_[i] = static_cast<int>(i);
38060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
38070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
38080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
38090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Formats a countable noun.  Depending on its quantity, either the
38100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// singular form or the plural form is used. e.g.
38110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
38120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// FormatCountableNoun(1, "formula", "formuli") returns "1 formula".
38130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// FormatCountableNoun(5, "book", "books") returns "5 books".
38140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic internal::String FormatCountableNoun(int count,
38150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                            const char * singular_form,
38160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                            const char * plural_form) {
38170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return internal::String::Format("%d %s", count,
38180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                  count == 1 ? singular_form : plural_form);
38190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
38200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
38210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Formats the count of tests.
38220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic internal::String FormatTestCount(int test_count) {
38230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return FormatCountableNoun(test_count, "test", "tests");
38240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
38250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
38260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Formats the count of test cases.
38270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic internal::String FormatTestCaseCount(int test_case_count) {
38280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return FormatCountableNoun(test_case_count, "test case", "test cases");
38290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
38300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
38310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Converts a TestPartResult::Type enum to human-friendly string
38320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// representation.  Both kNonFatalFailure and kFatalFailure are translated
38330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// to "Failure", as the user usually doesn't care about the difference
38340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// between the two when viewing the test result.
38350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic const char * TestPartResultTypeToString(TestPartResult::Type type) {
38360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  switch (type) {
38370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case TestPartResult::kSuccess:
38380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return "Success";
38390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
38400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case TestPartResult::kNonFatalFailure:
38410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case TestPartResult::kFatalFailure:
38420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#ifdef _MSC_VER
38430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return "error: ";
38440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
38450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return "Failure\n";
38460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif
38470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
38480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
38490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return "Unknown result type";
38500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
38510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
38520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Prints a TestPartResult to a String.
38530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic internal::String PrintTestPartResultToString(
38540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const TestPartResult& test_part_result) {
38550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return (Message()
38560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << internal::FormatFileLocation(test_part_result.file_name(),
38570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                          test_part_result.line_number())
38580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << " " << TestPartResultTypeToString(test_part_result.type())
38590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << test_part_result.message()).GetString();
38600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
38610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
38620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Prints a TestPartResult.
38630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic void PrintTestPartResult(const TestPartResult& test_part_result) {
38640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const internal::String& result =
38650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      PrintTestPartResultToString(test_part_result);
38660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  printf("%s\n", result.c_str());
38670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fflush(stdout);
38680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // If the test program runs in Visual Studio or a debugger, the
38690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // following statements add the test part result message to the Output
38700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // window such that the user can double-click on it to jump to the
38710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // corresponding source code location; otherwise they do nothing.
38720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
38730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // We don't call OutputDebugString*() on Windows Mobile, as printing
38740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // to stdout is done by OutputDebugString() there already - we don't
38750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // want the same message printed twice.
38760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ::OutputDebugStringA(result.c_str());
38770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ::OutputDebugStringA("\n");
38780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif
38790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
38800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
38810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// class PrettyUnitTestResultPrinter
38820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
38830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
38840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
38850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonenum GTestColor {
38860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  COLOR_DEFAULT,
38870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  COLOR_RED,
38880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  COLOR_GREEN,
38890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  COLOR_YELLOW
38900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
38910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
38920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
38930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
38940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the character attribute for the given color.
38950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonWORD GetColorAttribute(GTestColor color) {
38960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  switch (color) {
38970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case COLOR_RED:    return FOREGROUND_RED;
38980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case COLOR_GREEN:  return FOREGROUND_GREEN;
38990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;
39000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    default:           return 0;
39010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
39020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
39030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
39040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
39050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
39060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the ANSI color code for the given color.  COLOR_DEFAULT is
39070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// an invalid input.
39080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char* GetAnsiColorCode(GTestColor color) {
39090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  switch (color) {
39100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case COLOR_RED:     return "1";
39110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case COLOR_GREEN:   return "2";
39120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case COLOR_YELLOW:  return "3";
39130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    default:            return NULL;
39140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  };
39150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
39160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
39170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
39180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
39190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff Google Test should use colors in the output.
39200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool ShouldUseColor(bool stdout_is_tty) {
39210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const gtest_color = GTEST_FLAG(color).c_str();
39220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
39230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) {
39240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
39250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // On Windows the TERM variable is usually not set, but the
39260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // console there does support colors.
39270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return stdout_is_tty;
39280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
39290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // On non-Windows platforms, we rely on the TERM variable.
39300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* const term = posix::GetEnv("TERM");
39310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const bool term_supports_color =
39320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        String::CStringEquals(term, "xterm") ||
39330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        String::CStringEquals(term, "xterm-color") ||
39340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        String::CStringEquals(term, "xterm-256color") ||
39350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        String::CStringEquals(term, "linux") ||
39360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        String::CStringEquals(term, "cygwin");
39370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return stdout_is_tty && term_supports_color;
39380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
39390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
39400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
39410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return String::CaseInsensitiveCStringEquals(gtest_color, "yes") ||
39420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      String::CaseInsensitiveCStringEquals(gtest_color, "true") ||
39430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      String::CaseInsensitiveCStringEquals(gtest_color, "t") ||
39440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      String::CStringEquals(gtest_color, "1");
39450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // We take "yes", "true", "t", and "1" as meaning "yes".  If the
39460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // value is neither one of these nor "auto", we treat it as "no" to
39470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // be conservative.
39480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
39490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
39500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Helpers for printing colored strings to stdout. Note that on Windows, we
39510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// cannot simply emit special characters and have the terminal change colors.
39520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This routine must actually emit the characters rather than return a string
39530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// that would be colored when printed, as can be done on Linux.
39540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid ColoredPrintf(GTestColor color, const char* fmt, ...) {
39550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  va_list args;
39560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  va_start(args, fmt);
39570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
39580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
39590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const bool use_color = false;
39600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
39610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static const bool in_color_mode =
39620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);
39630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const bool use_color = in_color_mode && (color != COLOR_DEFAULT);
39640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
39650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The '!= 0' comparison is necessary to satisfy MSVC 7.1.
39660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
39670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!use_color) {
39680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    vprintf(fmt, args);
39690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    va_end(args);
39700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return;
39710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
39720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
39730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
39740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
39750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
39760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the current text color.
39770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  CONSOLE_SCREEN_BUFFER_INFO buffer_info;
39780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);
39790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const WORD old_color_attrs = buffer_info.wAttributes;
39800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
39810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // We need to flush the stream buffers into the console before each
39820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // SetConsoleTextAttribute call lest it affect the text that is already
39830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // printed but has not yet reached the console.
39840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fflush(stdout);
39850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  SetConsoleTextAttribute(stdout_handle,
39860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                          GetColorAttribute(color) | FOREGROUND_INTENSITY);
39870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  vprintf(fmt, args);
39880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
39890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fflush(stdout);
39900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Restores the text color.
39910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  SetConsoleTextAttribute(stdout_handle, old_color_attrs);
39920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
39930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  printf("\033[0;3%sm", GetAnsiColorCode(color));
39940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  vprintf(fmt, args);
39950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  printf("\033[m");  // Resets the terminal to default.
39960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
39970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  va_end(args);
39980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
39990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
40000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This class implements the TestEventListener interface.
40010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
40020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Class PrettyUnitTestResultPrinter is copyable.
40030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass PrettyUnitTestResultPrinter : public TestEventListener {
40040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
40050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  PrettyUnitTestResultPrinter() {}
40060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static void PrintTestName(const char * test_case, const char * test) {
40070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    printf("%s.%s", test_case, test);
40080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
40090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
40100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The following methods override what's in the TestEventListener class.
40110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
40120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
40130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
40140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
40150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestCaseStart(const TestCase& test_case);
40160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestStart(const TestInfo& test_info);
40170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestPartResult(const TestPartResult& result);
40180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestEnd(const TestInfo& test_info);
40190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestCaseEnd(const TestCase& test_case);
40200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
40210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
40220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
40230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
40240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
40250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
40260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static void PrintFailedTests(const UnitTest& unit_test);
40270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
40280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::String test_case_name_;
40290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
40300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
40310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Fired before each iteration of tests starts.
40320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid PrettyUnitTestResultPrinter::OnTestIterationStart(
40330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const UnitTest& unit_test, int iteration) {
40340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (GTEST_FLAG(repeat) != 1)
40350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1);
40360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
40370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const filter = GTEST_FLAG(filter).c_str();
40380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
40390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Prints the filter if it's not *.  This reminds the user that some
40400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // tests may be skipped.
40410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!internal::String::CStringEquals(filter, kUniversalFilter)) {
40420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ColoredPrintf(COLOR_YELLOW,
40430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                  "Note: %s filter = %s\n", GTEST_NAME_, filter);
40440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
40450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
40460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {
40470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ColoredPrintf(COLOR_YELLOW,
40480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                  "Note: This is test shard %s of %s.\n",
40490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                  internal::posix::GetEnv(kTestShardIndex),
40500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                  internal::posix::GetEnv(kTestTotalShards));
40510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
40520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
40530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (GTEST_FLAG(shuffle)) {
40540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ColoredPrintf(COLOR_YELLOW,
40550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                  "Note: Randomizing tests' orders with a seed of %d .\n",
40560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                  unit_test.random_seed());
40570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
40580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
40590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ColoredPrintf(COLOR_GREEN,  "[==========] ");
40600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  printf("Running %s from %s.\n",
40610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         FormatTestCount(unit_test.test_to_run_count()).c_str(),
40620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
40630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fflush(stdout);
40640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
40650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
40660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
40670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const UnitTest& /*unit_test*/) {
40680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ColoredPrintf(COLOR_GREEN,  "[----------] ");
40690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  printf("Global test environment set-up.\n");
40700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fflush(stdout);
40710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
40720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
40730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
40740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  test_case_name_ = test_case.name();
40750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const internal::String counts =
40760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
40770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ColoredPrintf(COLOR_GREEN, "[----------] ");
40780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  printf("%s from %s", counts.c_str(), test_case_name_.c_str());
40790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (test_case.comment()[0] == '\0') {
40800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    printf("\n");
40810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
40820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    printf(", where %s\n", test_case.comment());
40830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
40840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fflush(stdout);
40850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
40860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
40870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
40880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ColoredPrintf(COLOR_GREEN,  "[ RUN      ] ");
40890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  PrintTestName(test_case_name_.c_str(), test_info.name());
40900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (test_info.comment()[0] == '\0') {
40910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    printf("\n");
40920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
40930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    printf(", where %s\n", test_info.comment());
40940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
40950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fflush(stdout);
40960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
40970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
40980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Called after an assertion failure.
40990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid PrettyUnitTestResultPrinter::OnTestPartResult(
41000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const TestPartResult& result) {
41010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // If the test part succeeded, we don't need to do anything.
41020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (result.type() == TestPartResult::kSuccess)
41030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return;
41040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
41050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Print failure message from the assertion (e.g. expected this and got that).
41060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  PrintTestPartResult(result);
41070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fflush(stdout);
41080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
41090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
41100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
41110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (test_info.result()->Passed()) {
41120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ColoredPrintf(COLOR_GREEN, "[       OK ] ");
41130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
41140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
41150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
41160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  PrintTestName(test_case_name_.c_str(), test_info.name());
41170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (GTEST_FLAG(print_time)) {
41180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    printf(" (%s ms)\n", internal::StreamableToString(
41190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson           test_info.result()->elapsed_time()).c_str());
41200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
41210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    printf("\n");
41220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
41230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fflush(stdout);
41240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
41250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
41260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
41270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!GTEST_FLAG(print_time)) return;
41280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
41290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  test_case_name_ = test_case.name();
41300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const internal::String counts =
41310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
41320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ColoredPrintf(COLOR_GREEN, "[----------] ");
41330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  printf("%s from %s (%s ms total)\n\n",
41340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         counts.c_str(), test_case_name_.c_str(),
41350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         internal::StreamableToString(test_case.elapsed_time()).c_str());
41360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fflush(stdout);
41370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
41380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
41390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(
41400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const UnitTest& /*unit_test*/) {
41410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ColoredPrintf(COLOR_GREEN,  "[----------] ");
41420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  printf("Global test environment tear-down\n");
41430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fflush(stdout);
41440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
41450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
41460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Internal helper for printing the list of failed tests.
41470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {
41480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int failed_test_count = unit_test.failed_test_count();
41490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (failed_test_count == 0) {
41500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return;
41510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
41520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
41530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
41540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const TestCase& test_case = *unit_test.GetTestCase(i);
41550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {
41560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      continue;
41570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
41580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    for (int j = 0; j < test_case.total_test_count(); ++j) {
41590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      const TestInfo& test_info = *test_case.GetTestInfo(j);
41600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if (!test_info.should_run() || test_info.result()->Passed()) {
41610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        continue;
41620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      }
41630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
41640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      printf("%s.%s", test_case.name(), test_info.name());
41650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if (test_case.comment()[0] != '\0' ||
41660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          test_info.comment()[0] != '\0') {
41670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        printf(", where %s", test_case.comment());
41680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        if (test_case.comment()[0] != '\0' &&
41690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            test_info.comment()[0] != '\0') {
41700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          printf(" and ");
41710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        }
41720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      }
41730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      printf("%s\n", test_info.comment());
41740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
41750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
41760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
41770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
41780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
41790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                      int /*iteration*/) {
41800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ColoredPrintf(COLOR_GREEN,  "[==========] ");
41810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  printf("%s from %s ran.",
41820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         FormatTestCount(unit_test.test_to_run_count()).c_str(),
41830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
41840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (GTEST_FLAG(print_time)) {
41850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    printf(" (%s ms total)",
41860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson           internal::StreamableToString(unit_test.elapsed_time()).c_str());
41870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
41880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  printf("\n");
41890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ColoredPrintf(COLOR_GREEN,  "[  PASSED  ] ");
41900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());
41910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
41920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int num_failures = unit_test.failed_test_count();
41930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!unit_test.Passed()) {
41940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const int failed_test_count = unit_test.failed_test_count();
41950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ColoredPrintf(COLOR_RED,  "[  FAILED  ] ");
41960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
41970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    PrintFailedTests(unit_test);
41980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    printf("\n%2d FAILED %s\n", num_failures,
41990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                        num_failures == 1 ? "TEST" : "TESTS");
42000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
42010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
42020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int num_disabled = unit_test.disabled_test_count();
42030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
42040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (!num_failures) {
42050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      printf("\n");  // Add a spacer if no FAILURE banner is displayed.
42060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
42070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ColoredPrintf(COLOR_YELLOW,
42080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                  "  YOU HAVE %d DISABLED %s\n\n",
42090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                  num_disabled,
42100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                  num_disabled == 1 ? "TEST" : "TESTS");
42110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
42120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Ensure that Google Test output is printed before, e.g., heapchecker output.
42130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fflush(stdout);
42140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
42150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
42160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// End PrettyUnitTestResultPrinter
42170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
42180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// class TestEventRepeater
42190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
42200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This class forwards events to other event listeners.
42210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass TestEventRepeater : public TestEventListener {
42220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
42230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestEventRepeater() : forwarding_enabled_(true) {}
42240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual ~TestEventRepeater();
42250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void Append(TestEventListener *listener);
42260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestEventListener* Release(TestEventListener* listener);
42270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
42280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Controls whether events will be forwarded to listeners_. Set to false
42290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // in death test child processes.
42300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool forwarding_enabled() const { return forwarding_enabled_; }
42310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }
42320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
42330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestProgramStart(const UnitTest& unit_test);
42340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
42350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
42360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);
42370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestCaseStart(const TestCase& test_case);
42380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestStart(const TestInfo& test_info);
42390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestPartResult(const TestPartResult& result);
42400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestEnd(const TestInfo& test_info);
42410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestCaseEnd(const TestCase& test_case);
42420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
42430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);
42440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
42450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestProgramEnd(const UnitTest& unit_test);
42460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
42470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
42480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Controls whether events will be forwarded to listeners_. Set to false
42490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // in death test child processes.
42500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool forwarding_enabled_;
42510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The list of listeners that receive events.
42520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  std::vector<TestEventListener*> listeners_;
42530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
42540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);
42550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
42560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
42570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestEventRepeater::~TestEventRepeater() {
42580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ForEach(listeners_, Delete<TestEventListener>);
42590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
42600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
42610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestEventRepeater::Append(TestEventListener *listener) {
42620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  listeners_.push_back(listener);
42630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
42640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
42650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TODO(vladl@google.com): Factor the search functionality into Vector::Find.
42660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestEventListener* TestEventRepeater::Release(TestEventListener *listener) {
42670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (size_t i = 0; i < listeners_.size(); ++i) {
42680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (listeners_[i] == listener) {
42690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      listeners_.erase(listeners_.begin() + i);
42700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return listener;
42710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
42720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
42730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
42740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return NULL;
42750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
42760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
42770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Since most methods are very similar, use macros to reduce boilerplate.
42780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This defines a member that forwards the call to all listeners.
42790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_REPEATER_METHOD_(Name, Type) \
42800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestEventRepeater::Name(const Type& parameter) { \
42810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (forwarding_enabled_) { \
42820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    for (size_t i = 0; i < listeners_.size(); i++) { \
42830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      listeners_[i]->Name(parameter); \
42840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } \
42850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } \
42860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
42870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This defines a member that forwards the call to all listeners in reverse
42880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// order.
42890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \
42900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestEventRepeater::Name(const Type& parameter) { \
42910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (forwarding_enabled_) { \
42920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \
42930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      listeners_[i]->Name(parameter); \
42940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } \
42950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } \
42960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
42970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
42980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)
42990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)
43000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)
43010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_REPEATER_METHOD_(OnTestStart, TestInfo)
43020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)
43030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)
43040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)
43050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)
43060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)
43070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)
43080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)
43090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#undef GTEST_REPEATER_METHOD_
43110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#undef GTEST_REVERSE_REPEATER_METHOD_
43120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,
43140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                             int iteration) {
43150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (forwarding_enabled_) {
43160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    for (size_t i = 0; i < listeners_.size(); i++) {
43170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      listeners_[i]->OnTestIterationStart(unit_test, iteration);
43180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
43190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
43200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
43210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,
43230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                           int iteration) {
43240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (forwarding_enabled_) {
43250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {
43260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      listeners_[i]->OnTestIterationEnd(unit_test, iteration);
43270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
43280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
43290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
43300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// End TestEventRepeater
43320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This class generates an XML output file.
43340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass XmlUnitTestResultPrinter : public EmptyTestEventListener {
43350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
43360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  explicit XmlUnitTestResultPrinter(const char* output_file);
43370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
43390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
43410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Is c a whitespace character that is normalized to a space character
43420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // when it appears in an XML attribute value?
43430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static bool IsNormalizableWhitespace(char c) {
43440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return c == 0x9 || c == 0xA || c == 0xD;
43450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
43460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // May c appear in a well-formed XML document?
43480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static bool IsValidXmlCharacter(char c) {
43490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return IsNormalizableWhitespace(c) || c >= 0x20;
43500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
43510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns an XML-escaped copy of the input string str.  If
43530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // is_attribute is true, the text is meant to appear as an attribute
43540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // value, and normalizable whitespace is preserved by replacing it
43550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // with character references.
43560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static String EscapeXml(const char* str, bool is_attribute);
43570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the given string with all characters invalid in XML removed.
43590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static String RemoveInvalidXmlCharacters(const char* str);
43600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Convenience wrapper around EscapeXml when str is an attribute value.
43620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static String EscapeXmlAttribute(const char* str) {
43630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return EscapeXml(str, true);
43640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
43650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Convenience wrapper around EscapeXml when str is not an attribute value.
43670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static String EscapeXmlText(const char* str) { return EscapeXml(str, false); }
43680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
43700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static void OutputXmlCDataSection(::std::ostream* stream, const char* data);
43710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Streams an XML representation of a TestInfo object.
43730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static void OutputXmlTestInfo(::std::ostream* stream,
43740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                const char* test_case_name,
43750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                const TestInfo& test_info);
43760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Prints an XML representation of a TestCase object
43780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static void PrintXmlTestCase(FILE* out, const TestCase& test_case);
43790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Prints an XML summary of unit_test to output stream out.
43810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static void PrintXmlUnitTest(FILE* out, const UnitTest& unit_test);
43820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Produces a string representing the test properties in a result as space
43840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // delimited XML attributes based on the property key="value" pairs.
43850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // When the String is not empty, it includes a space at the beginning,
43860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // to delimit this attribute from prior attributes.
43870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static String TestPropertiesAsXmlAttributes(const TestResult& result);
43880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The output file.
43900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String output_file_;
43910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);
43930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
43940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
43950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Creates a new XmlUnitTestResultPrinter.
43960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonXmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)
43970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    : output_file_(output_file) {
43980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (output_file_.c_str() == NULL || output_file_.empty()) {
43990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fprintf(stderr, "XML output file may not be null\n");
44000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fflush(stderr);
44010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    exit(EXIT_FAILURE);
44020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
44030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
44040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
44050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Called after the unit test ends.
44060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
44070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                  int /*iteration*/) {
44080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  FILE* xmlout = NULL;
44090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  FilePath output_file(output_file_);
44100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  FilePath output_dir(output_file.RemoveFileName());
44110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
44120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (output_dir.CreateDirectoriesRecursively()) {
44130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    xmlout = posix::FOpen(output_file_.c_str(), "w");
44140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
44150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (xmlout == NULL) {
44160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // TODO(wan): report the reason of the failure.
44170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    //
44180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // We don't do it for now as:
44190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    //
44200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    //   1. There is no urgent need for it.
44210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    //   2. It's a bit involved to make the errno variable thread-safe on
44220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    //      all three operating systems (Linux, Windows, and Mac OS).
44230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    //   3. To interpret the meaning of errno in a thread-safe way,
44240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    //      we need the strerror_r() function, which is not available on
44250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    //      Windows.
44260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fprintf(stderr,
44270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            "Unable to open file \"%s\"\n",
44280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            output_file_.c_str());
44290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fflush(stderr);
44300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    exit(EXIT_FAILURE);
44310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
44320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  PrintXmlUnitTest(xmlout, unit_test);
44330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fclose(xmlout);
44340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
44350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
44360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns an XML-escaped copy of the input string str.  If is_attribute
44370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// is true, the text is meant to appear as an attribute value, and
44380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// normalizable whitespace is preserved by replacing it with character
44390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// references.
44400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
44410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Invalid XML characters in str, if any, are stripped from the output.
44420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// It is expected that most, if not all, of the text processed by this
44430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// module will consist of ordinary English text.
44440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// If this module is ever modified to produce version 1.1 XML output,
44450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// most invalid characters can be retained using character references.
44460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TODO(wan): It might be nice to have a minimally invasive, human-readable
44470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// escaping scheme for invalid characters, rather than dropping them.
44480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString XmlUnitTestResultPrinter::EscapeXml(const char* str, bool is_attribute) {
44490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message m;
44500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
44510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (str != NULL) {
44520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    for (const char* src = str; *src; ++src) {
44530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      switch (*src) {
44540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        case '<':
44550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          m << "&lt;";
44560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          break;
44570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        case '>':
44580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          m << "&gt;";
44590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          break;
44600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        case '&':
44610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          m << "&amp;";
44620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          break;
44630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        case '\'':
44640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          if (is_attribute)
44650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            m << "&apos;";
44660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          else
44670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            m << '\'';
44680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          break;
44690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        case '"':
44700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          if (is_attribute)
44710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            m << "&quot;";
44720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          else
44730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            m << '"';
44740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          break;
44750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        default:
44760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          if (IsValidXmlCharacter(*src)) {
44770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            if (is_attribute && IsNormalizableWhitespace(*src))
44780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson              m << String::Format("&#x%02X;", unsigned(*src));
44790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            else
44800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson              m << *src;
44810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          }
44820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          break;
44830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      }
44840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
44850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
44860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
44870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return m.GetString();
44880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
44890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
44900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the given string with all characters invalid in XML removed.
44910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Currently invalid characters are dropped from the string. An
44920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// alternative is to replace them with certain characters such as . or ?.
44930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(const char* str) {
44940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char* const output = new char[strlen(str) + 1];
44950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char* appender = output;
44960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (char ch = *str; ch != '\0'; ch = *++str)
44970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (IsValidXmlCharacter(ch))
44980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      *appender++ = ch;
44990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  *appender = '\0';
45000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
45010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  String ret_value(output);
45020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  delete[] output;
45030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return ret_value;
45040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
45050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
45060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The following routines generate an XML representation of a UnitTest
45070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// object.
45080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
45090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This is how Google Test concepts map to the DTD:
45100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
45110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// <testsuites name="AllTests">        <-- corresponds to a UnitTest object
45120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   <testsuite name="testcase-name">  <-- corresponds to a TestCase object
45130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     <testcase name="test-name">     <-- corresponds to a TestInfo object
45140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//       <failure message="...">...</failure>
45150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//       <failure message="...">...</failure>
45160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//       <failure message="...">...</failure>
45170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//                                     <-- individual assertion failures
45180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     </testcase>
45190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   </testsuite>
45200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// </testsuites>
45210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
45220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Formats the given time in milliseconds as seconds.
45230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstd::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
45240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ::std::stringstream ss;
45250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ss << ms/1000.0;
45260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return ss.str();
45270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
45280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
45290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
45300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
45310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                     const char* data) {
45320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* segment = data;
45330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  *stream << "<![CDATA[";
45340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (;;) {
45350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* const next_segment = strstr(segment, "]]>");
45360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (next_segment != NULL) {
45370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      stream->write(
45380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          segment, static_cast<std::streamsize>(next_segment - segment));
45390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      *stream << "]]>]]&gt;<![CDATA[";
45400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      segment = next_segment + strlen("]]>");
45410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } else {
45420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      *stream << segment;
45430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      break;
45440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
45450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
45460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  *stream << "]]>";
45470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
45480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
45490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Prints an XML representation of a TestInfo object.
45500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TODO(wan): There is also value in printing properties with the plain printer.
45510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
45520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                 const char* test_case_name,
45530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                 const TestInfo& test_info) {
45540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const TestResult& result = *test_info.result();
45550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  *stream << "    <testcase name=\""
45560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << EscapeXmlAttribute(test_info.name()).c_str()
45570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "\" status=\""
45580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << (test_info.should_run() ? "run" : "notrun")
45590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "\" time=\""
45600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << FormatTimeInMillisAsSeconds(result.elapsed_time())
45610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "\" classname=\"" << EscapeXmlAttribute(test_case_name).c_str()
45620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "\"" << TestPropertiesAsXmlAttributes(result).c_str();
45630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
45640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int failures = 0;
45650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (int i = 0; i < result.total_part_count(); ++i) {
45660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const TestPartResult& part = result.GetTestPartResult(i);
45670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (part.failed()) {
45680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if (++failures == 1)
45690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        *stream << ">\n";
45700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      *stream << "      <failure message=\""
45710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson              << EscapeXmlAttribute(part.summary()).c_str()
45720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson              << "\" type=\"\">";
45730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      const String message = RemoveInvalidXmlCharacters(String::Format(
45740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          "%s:%d\n%s",
45750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          part.file_name(), part.line_number(),
45760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          part.message()).c_str());
45770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      OutputXmlCDataSection(stream, message.c_str());
45780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      *stream << "</failure>\n";
45790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
45800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
45810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
45820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (failures == 0)
45830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    *stream << " />\n";
45840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  else
45850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    *stream << "    </testcase>\n";
45860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
45870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
45880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Prints an XML representation of a TestCase object
45890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid XmlUnitTestResultPrinter::PrintXmlTestCase(FILE* out,
45900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                const TestCase& test_case) {
45910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fprintf(out,
45920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          "  <testsuite name=\"%s\" tests=\"%d\" failures=\"%d\" "
45930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          "disabled=\"%d\" ",
45940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          EscapeXmlAttribute(test_case.name()).c_str(),
45950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          test_case.total_test_count(),
45960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          test_case.failed_test_count(),
45970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          test_case.disabled_test_count());
45980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fprintf(out,
45990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          "errors=\"0\" time=\"%s\">\n",
46000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          FormatTimeInMillisAsSeconds(test_case.elapsed_time()).c_str());
46010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (int i = 0; i < test_case.total_test_count(); ++i) {
46020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    StrStream stream;
46030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    OutputXmlTestInfo(&stream, test_case.name(), *test_case.GetTestInfo(i));
46040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fprintf(out, "%s", StrStreamToString(&stream).c_str());
46050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
46060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fprintf(out, "  </testsuite>\n");
46070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
46080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
46090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Prints an XML summary of unit_test to output stream out.
46100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid XmlUnitTestResultPrinter::PrintXmlUnitTest(FILE* out,
46110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                const UnitTest& unit_test) {
46120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
46130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fprintf(out,
46140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          "<testsuites tests=\"%d\" failures=\"%d\" disabled=\"%d\" "
46150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          "errors=\"0\" time=\"%s\" ",
46160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          unit_test.total_test_count(),
46170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          unit_test.failed_test_count(),
46180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          unit_test.disabled_test_count(),
46190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          FormatTimeInMillisAsSeconds(unit_test.elapsed_time()).c_str());
46200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (GTEST_FLAG(shuffle)) {
46210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fprintf(out, "random_seed=\"%d\" ", unit_test.random_seed());
46220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
46230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fprintf(out, "name=\"AllTests\">\n");
46240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (int i = 0; i < unit_test.total_test_case_count(); ++i)
46250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    PrintXmlTestCase(out, *unit_test.GetTestCase(i));
46260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fprintf(out, "</testsuites>\n");
46270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
46280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
46290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Produces a string representing the test properties in a result as space
46300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// delimited XML attributes based on the property key="value" pairs.
46310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
46320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const TestResult& result) {
46330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message attributes;
46340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (int i = 0; i < result.test_property_count(); ++i) {
46350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const TestProperty& property = result.GetTestProperty(i);
46360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    attributes << " " << property.key() << "="
46370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << "\"" << EscapeXmlAttribute(property.value()) << "\"";
46380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
46390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return attributes.GetString();
46400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
46410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
46420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// End XmlUnitTestResultPrinter
46430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
46440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Class ScopedTrace
46450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
46460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Pushes the given source file location and message onto a per-thread
46470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// trace stack maintained by Google Test.
46480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// L < UnitTest::mutex_
46490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonScopedTrace::ScopedTrace(const char* file, int line, const Message& message) {
46500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TraceInfo trace;
46510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  trace.file = file;
46520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  trace.line = line;
46530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  trace.message = message.GetString();
46540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
46550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  UnitTest::GetInstance()->PushGTestTrace(trace);
46560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
46570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
46580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Pops the info pushed by the c'tor.
46590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// L < UnitTest::mutex_
46600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonScopedTrace::~ScopedTrace() {
46610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  UnitTest::GetInstance()->PopGTestTrace();
46620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
46630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
46640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
46650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// class OsStackTraceGetter
46660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
46670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the current OS stack trace as a String.  Parameters:
46680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
46690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   max_depth  - the maximum number of stack frames to be included
46700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//                in the trace.
46710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   skip_count - the number of top frames to be skipped; doesn't count
46720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//                against max_depth.
46730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
46740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// L < mutex_
46750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// We use "L < mutex_" to denote that the function may acquire mutex_.
46760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString OsStackTraceGetter::CurrentStackTrace(int, int) {
46770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return String("");
46780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
46790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
46800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// L < mutex_
46810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid OsStackTraceGetter::UponLeavingGTest() {
46820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
46830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
46840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char* const
46850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonOsStackTraceGetter::kElidedFramesMarker =
46860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "... " GTEST_NAME_ " internal frames ...";
46870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
46880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
46890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
46900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// class TestEventListeners
46910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
46920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestEventListeners::TestEventListeners()
46930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    : repeater_(new internal::TestEventRepeater()),
46940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      default_result_printer_(NULL),
46950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      default_xml_generator_(NULL) {
46960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
46970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
46980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestEventListeners::~TestEventListeners() { delete repeater_; }
46990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
47000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the standard listener responsible for the default console
47010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// output.  Can be removed from the listeners list to shut down default
47020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// console output.  Note that removing this object from the listener list
47030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// with Release transfers its ownership to the user.
47040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestEventListeners::Append(TestEventListener* listener) {
47050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  repeater_->Append(listener);
47060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
47070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
47080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Removes the given event listener from the list and returns it.  It then
47090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// becomes the caller's responsibility to delete the listener. Returns
47100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// NULL if the listener is not found in the list.
47110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestEventListener* TestEventListeners::Release(TestEventListener* listener) {
47120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (listener == default_result_printer_)
47130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    default_result_printer_ = NULL;
47140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  else if (listener == default_xml_generator_)
47150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    default_xml_generator_ = NULL;
47160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return repeater_->Release(listener);
47170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
47180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
47190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns repeater that broadcasts the TestEventListener events to all
47200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// subscribers.
47210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestEventListener* TestEventListeners::repeater() { return repeater_; }
47220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
47230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Sets the default_result_printer attribute to the provided listener.
47240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The listener is also added to the listener list and previous
47250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// default_result_printer is removed from it and deleted. The listener can
47260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// also be NULL in which case it will not be added to the list. Does
47270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// nothing if the previous and the current listener objects are the same.
47280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {
47290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (default_result_printer_ != listener) {
47300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // It is an error to pass this method a listener that is already in the
47310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // list.
47320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    delete Release(default_result_printer_);
47330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    default_result_printer_ = listener;
47340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (listener != NULL)
47350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      Append(listener);
47360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
47370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
47380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
47390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Sets the default_xml_generator attribute to the provided listener.  The
47400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// listener is also added to the listener list and previous
47410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// default_xml_generator is removed from it and deleted. The listener can
47420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// also be NULL in which case it will not be added to the list. Does
47430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// nothing if the previous and the current listener objects are the same.
47440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {
47450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (default_xml_generator_ != listener) {
47460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // It is an error to pass this method a listener that is already in the
47470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // list.
47480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    delete Release(default_xml_generator_);
47490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    default_xml_generator_ = listener;
47500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (listener != NULL)
47510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      Append(listener);
47520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
47530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
47540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
47550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Controls whether events will be forwarded by the repeater to the
47560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// listeners in the list.
47570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool TestEventListeners::EventForwardingEnabled() const {
47580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return repeater_->forwarding_enabled();
47590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
47600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
47610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestEventListeners::SuppressEventForwarding() {
47620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  repeater_->set_forwarding_enabled(false);
47630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
47640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
47650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// class UnitTest
47660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
47670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the singleton UnitTest object.  The first time this method is
47680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// called, a UnitTest object is constructed and returned.  Consecutive
47690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// calls will return the same object.
47700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
47710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// We don't protect this under mutex_ as a user is not supposed to
47720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// call this before main() starts, from which point on the return
47730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// value will never change.
47740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonUnitTest * UnitTest::GetInstance() {
47750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // When compiled with MSVC 7.1 in optimized mode, destroying the
47760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // UnitTest object upon exiting the program messes up the exit code,
47770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // causing successful tests to appear failed.  We have to use a
47780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // different implementation in this case to bypass the compiler bug.
47790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // This implementation makes the compiler happy, at the cost of
47800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // leaking the UnitTest object.
47810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
47820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // CodeGear C++Builder insists on a public destructor for the
47830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // default implementation.  Use this implementation to keep good OO
47840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // design with private destructor.
47850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
47860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
47870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static UnitTest* const instance = new UnitTest;
47880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return instance;
47890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
47900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static UnitTest instance;
47910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return &instance;
47920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
47930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
47940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
47950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of successful test cases.
47960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTest::successful_test_case_count() const {
47970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl()->successful_test_case_count();
47980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
47990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
48000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of failed test cases.
48010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTest::failed_test_case_count() const {
48020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl()->failed_test_case_count();
48030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
48040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
48050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of all test cases.
48060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTest::total_test_case_count() const {
48070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl()->total_test_case_count();
48080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
48090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
48100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of all test cases that contain at least one test
48110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// that should run.
48120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTest::test_case_to_run_count() const {
48130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl()->test_case_to_run_count();
48140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
48150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
48160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of successful tests.
48170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTest::successful_test_count() const {
48180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl()->successful_test_count();
48190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
48200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
48210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of failed tests.
48220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTest::failed_test_count() const { return impl()->failed_test_count(); }
48230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
48240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of disabled tests.
48250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTest::disabled_test_count() const {
48260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl()->disabled_test_count();
48270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
48280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
48290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of all tests.
48300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTest::total_test_count() const { return impl()->total_test_count(); }
48310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
48320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the number of tests that should run.
48330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
48340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
48350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the elapsed time, in milliseconds.
48360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsoninternal::TimeInMillis UnitTest::elapsed_time() const {
48370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl()->elapsed_time();
48380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
48390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
48400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff the unit test passed (i.e. all test cases passed).
48410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool UnitTest::Passed() const { return impl()->Passed(); }
48420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
48430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff the unit test failed (i.e. some test case failed
48440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// or something outside of all tests failed).
48450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool UnitTest::Failed() const { return impl()->Failed(); }
48460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
48470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the i-th test case among all the test cases. i can range from 0 to
48480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// total_test_case_count() - 1. If i is not in that range, returns NULL.
48490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst TestCase* UnitTest::GetTestCase(int i) const {
48500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl()->GetTestCase(i);
48510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
48520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
48530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the i-th test case among all the test cases. i can range from 0 to
48540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// total_test_case_count() - 1. If i is not in that range, returns NULL.
48550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestCase* UnitTest::GetMutableTestCase(int i) {
48560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl()->GetMutableTestCase(i);
48570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
48580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
48590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the list of event listeners that can be used to track events
48600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// inside Google Test.
48610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestEventListeners& UnitTest::listeners() {
48620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return *impl()->listeners();
48630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
48640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
48650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Registers and returns a global test environment.  When a test
48660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// program is run, all global test environments will be set-up in the
48670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// order they were registered.  After all tests in the program have
48680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// finished, all global test environments will be torn-down in the
48690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// *reverse* order they were registered.
48700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
48710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The UnitTest object takes ownership of the given environment.
48720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
48730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// We don't protect this under mutex_, as we only support calling it
48740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// from the main thread.
48750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonEnvironment* UnitTest::AddEnvironment(Environment* env) {
48760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (env == NULL) {
48770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return NULL;
48780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
48790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
48800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl_->environments().push_back(env);
48810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return env;
48820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
48830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
48840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_EXCEPTIONS
48850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A failed Google Test assertion will throw an exception of this type
48860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// when exceptions are enabled.  We derive it from std::runtime_error,
48870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// which is for errors presumably detectable only at run time.  Since
48880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// std::runtime_error inherits from std::exception, many testing
48890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// frameworks know how to extract and print the message inside it.
48900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass GoogleTestFailureException : public ::std::runtime_error {
48910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
48920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  explicit GoogleTestFailureException(const TestPartResult& failure)
48930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}
48940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
48950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif
48960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
48970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Adds a TestPartResult to the current TestResult object.  All Google Test
48980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
48990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// this to report their results.  The user code should use the
49000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// assertion macros instead of calling this directly.
49010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// L < mutex_
49020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid UnitTest::AddTestPartResult(TestPartResult::Type result_type,
49030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                 const char* file_name,
49040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                 int line_number,
49050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                 const internal::String& message,
49060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                 const internal::String& os_stack_trace) {
49070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message msg;
49080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  msg << message;
49090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
49100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::MutexLock lock(&mutex_);
49110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (impl_->gtest_trace_stack().size() > 0) {
49120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    msg << "\n" << GTEST_NAME_ << " trace:";
49130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
49140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    for (int i = static_cast<int>(impl_->gtest_trace_stack().size());
49150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         i > 0; --i) {
49160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];
49170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)
49180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << " " << trace.message;
49190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
49200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
49210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
49220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {
49230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    msg << internal::kStackTraceMarker << os_stack_trace;
49240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
49250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
49260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const TestPartResult result =
49270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    TestPartResult(result_type, file_name, line_number,
49280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   msg.GetString().c_str());
49290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl_->GetTestPartResultReporterForCurrentThread()->
49300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ReportTestPartResult(result);
49310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
49320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (result_type != TestPartResult::kSuccess) {
49330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // gtest_break_on_failure takes precedence over
49340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // gtest_throw_on_failure.  This allows a user to set the latter
49350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // in the code (perhaps in order to use Google Test assertions
49360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // with another testing framework) and specify the former on the
49370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // command line for debugging.
49380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (GTEST_FLAG(break_on_failure)) {
49390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
49400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // Using DebugBreak on Windows allows gtest to still break into a debugger
49410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // when a failure happens and both the --gtest_break_on_failure and
49420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // the --gtest_catch_exceptions flags are specified.
49430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      DebugBreak();
49440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
49450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      *static_cast<int*>(NULL) = 1;
49460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
49470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } else if (GTEST_FLAG(throw_on_failure)) {
49480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_EXCEPTIONS
49490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      throw GoogleTestFailureException(result);
49500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
49510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // We cannot call abort() as it generates a pop-up in debug mode
49520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // that cannot be suppressed in VC 7.1 or below.
49530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      exit(1);
49540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif
49550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
49560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
49570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
49580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
49590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Creates and adds a property to the current TestResult. If a property matching
49600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the supplied value already exists, updates its value instead.
49610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid UnitTest::RecordPropertyForCurrentTest(const char* key,
49620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                            const char* value) {
49630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const TestProperty test_property(key, value);
49640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl_->current_test_result()->RecordProperty(test_property);
49650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
49660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
49670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Runs all tests in this UnitTest object and prints the result.
49680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns 0 if successful, or 1 otherwise.
49690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
49700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// We don't protect this under mutex_, as we only support calling it
49710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// from the main thread.
49720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTest::Run() {
49730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_SEH
49740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Catch SEH-style exceptions.
49750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
49760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const bool in_death_test_child_process =
49770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      internal::GTEST_FLAG(internal_run_death_test).length() > 0;
49780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
49790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Either the user wants Google Test to catch exceptions thrown by the
49800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // tests or this is executing in the context of death test child
49810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // process. In either case the user does not want to see pop-up dialogs
49820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // about crashes - they are expected..
49830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (GTEST_FLAG(catch_exceptions) || in_death_test_child_process) {
49840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if !GTEST_OS_WINDOWS_MOBILE
49850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // SetErrorMode doesn't exist on CE.
49860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
49870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
49880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // !GTEST_OS_WINDOWS_MOBILE
49890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
49900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE
49910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Death test children can be terminated with _abort().  On Windows,
49920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // _abort() can show a dialog with a warning message.  This forces the
49930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // abort message to go to stderr instead.
49940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    _set_error_mode(_OUT_TO_STDERR);
49950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif
49960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
49970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
49980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // In the debug version, Visual Studio pops up a separate dialog
49990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // offering a choice to debug the aborted program. We need to suppress
50000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement
50010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // executed. Google Test will notify the user of any unexpected
50020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // failure via stderr.
50030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    //
50040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.
50050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Users of prior VC versions shall suffer the agony and pain of
50060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // clicking through the countless debug dialogs.
50070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // TODO(vladl@google.com): find a way to suppress the abort dialog() in the
50080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // debug mode when compiled with VC 7.1 or lower.
50090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (!GTEST_FLAG(break_on_failure))
50100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      _set_abort_behavior(
50110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          0x0,                                    // Clear the following flags:
50120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          _WRITE_ABORT_MSG | _CALL_REPORTFAULT);  // pop-up window, core dump.
50130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif
50140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
50150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
50160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  __try {
50170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return impl_->RunAllTests();
50180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } __except(internal::UnitTestOptions::GTestShouldProcessSEH(
50190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      GetExceptionCode())) {
50200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    printf("Exception thrown with code 0x%x.\nFAIL\n", GetExceptionCode());
50210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fflush(stdout);
50220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return 1;
50230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
50240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
50250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else  // We are on a compiler or platform that doesn't support SEH.
50260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
50270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl_->RunAllTests();
50280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_SEH
50290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
50300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
50310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the working directory when the first TEST() or TEST_F() was
50320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// executed.
50330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char* UnitTest::original_working_dir() const {
50340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl_->original_working_dir_.c_str();
50350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
50360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
50370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the TestCase object for the test that's currently running,
50380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// or NULL if no test is running.
50390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// L < mutex_
50400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst TestCase* UnitTest::current_test_case() const {
50410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::MutexLock lock(&mutex_);
50420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl_->current_test_case();
50430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
50440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
50450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the TestInfo object for the test that's currently running,
50460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// or NULL if no test is running.
50470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// L < mutex_
50480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst TestInfo* UnitTest::current_test_info() const {
50490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::MutexLock lock(&mutex_);
50500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl_->current_test_info();
50510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
50520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
50530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the random seed used at the start of the current test run.
50540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTest::random_seed() const { return impl_->random_seed(); }
50550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
50560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_PARAM_TEST
50570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns ParameterizedTestCaseRegistry object used to keep track of
50580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// value-parameterized tests and instantiate and register them.
50590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// L < mutex_
50600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsoninternal::ParameterizedTestCaseRegistry&
50610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    UnitTest::parameterized_test_registry() {
50620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return impl_->parameterized_test_registry();
50630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
50640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_PARAM_TEST
50650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
50660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Creates an empty UnitTest.
50670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonUnitTest::UnitTest() {
50680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl_ = new internal::UnitTestImpl(this);
50690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
50700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
50710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Destructor of UnitTest.
50720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonUnitTest::~UnitTest() {
50730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  delete impl_;
50740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
50750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
50760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
50770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Google Test trace stack.
50780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// L < mutex_
50790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid UnitTest::PushGTestTrace(const internal::TraceInfo& trace) {
50800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::MutexLock lock(&mutex_);
50810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl_->gtest_trace_stack().push_back(trace);
50820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
50830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
50840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Pops a trace from the per-thread Google Test trace stack.
50850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// L < mutex_
50860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid UnitTest::PopGTestTrace() {
50870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::MutexLock lock(&mutex_);
50880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  impl_->gtest_trace_stack().pop_back();
50890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
50900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
50910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
50920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
50930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonUnitTestImpl::UnitTestImpl(UnitTest* parent)
50940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    : parent_(parent),
50950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#ifdef _MSC_VER
50960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#pragma warning(push)                    // Saves the current warning state.
50970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#pragma warning(disable:4355)            // Temporarily disables warning 4355
50980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                         // (using this in initializer).
50990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      default_global_test_part_result_reporter_(this),
51000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      default_per_thread_test_part_result_reporter_(this),
51010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#pragma warning(pop)                     // Restores the warning state again.
51020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
51030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      default_global_test_part_result_reporter_(this),
51040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      default_per_thread_test_part_result_reporter_(this),
51050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // _MSC_VER
51060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      global_test_part_result_repoter_(
51070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          &default_global_test_part_result_reporter_),
51080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      per_thread_test_part_result_reporter_(
51090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          &default_per_thread_test_part_result_reporter_),
51100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_PARAM_TEST
51110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      parameterized_test_registry_(),
51120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      parameterized_tests_registered_(false),
51130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_PARAM_TEST
51140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      last_death_test_case_(-1),
51150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      current_test_case_(NULL),
51160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      current_test_info_(NULL),
51170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ad_hoc_test_result_(),
51180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      os_stack_trace_getter_(NULL),
51190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      post_flag_parse_init_performed_(false),
51200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      random_seed_(0),  // Will be overridden by the flag before first use.
51210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      random_(0),  // Will be reseeded before first use.
51220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_DEATH_TEST
51230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      elapsed_time_(0),
51240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      internal_run_death_test_flag_(NULL),
51250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      death_test_factory_(new DefaultDeathTestFactory) {
51260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
51270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      elapsed_time_(0) {
51280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_DEATH_TEST
51290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);
51300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
51310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
51320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonUnitTestImpl::~UnitTestImpl() {
51330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Deletes every TestCase.
51340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ForEach(test_cases_, internal::Delete<TestCase>);
51350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
51360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Deletes every Environment.
51370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ForEach(environments_, internal::Delete<Environment>);
51380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
51390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  delete os_stack_trace_getter_;
51400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
51410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
51420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_DEATH_TEST
51430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Disables event forwarding if the control is currently in a death test
51440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// subprocess. Must not be called before InitGoogleTest.
51450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid UnitTestImpl::SuppressTestEventsIfInSubprocess() {
51460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (internal_run_death_test_flag_.get() != NULL)
51470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    listeners()->SuppressEventForwarding();
51480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
51490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_DEATH_TEST
51500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
51510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Initializes event listeners performing XML output as specified by
51520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// UnitTestOptions. Must not be called before InitGoogleTest.
51530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid UnitTestImpl::ConfigureXmlOutput() {
51540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String& output_format = UnitTestOptions::GetOutputFormat();
51550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (output_format == "xml") {
51560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(
51570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
51580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else if (output_format != "") {
51590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    printf("WARNING: unrecognized output format \"%s\" ignored.\n",
51600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson           output_format.c_str());
51610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fflush(stdout);
51620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
51630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
51640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
51650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Performs initialization dependent upon flag values obtained in
51660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
51670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
51680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// this function is also called from RunAllTests.  Since this function can be
51690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// called more than once, it has to be idempotent.
51700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid UnitTestImpl::PostFlagParsingInit() {
51710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Ensures that this function does not execute more than once.
51720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!post_flag_parse_init_performed_) {
51730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    post_flag_parse_init_performed_ = true;
51740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
51750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_DEATH_TEST
51760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    InitDeathTestSubprocessControlInfo();
51770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    SuppressTestEventsIfInSubprocess();
51780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_DEATH_TEST
51790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
51800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Registers parameterized tests. This makes parameterized tests
51810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // available to the UnitTest reflection API without running
51820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // RUN_ALL_TESTS.
51830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    RegisterParameterizedTests();
51840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
51850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Configures listeners for XML output. This makes it possible for users
51860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // to shut down the default XML output before invoking RUN_ALL_TESTS.
51870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ConfigureXmlOutput();
51880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
51890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
51900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
51910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A predicate that checks the name of a TestCase against a known
51920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// value.
51930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
51940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This is used for implementation of the UnitTest class only.  We put
51950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// it in the anonymous namespace to prevent polluting the outer
51960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// namespace.
51970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
51980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TestCaseNameIs is copyable.
51990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass TestCaseNameIs {
52000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
52010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Constructor.
52020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  explicit TestCaseNameIs(const String& name)
52030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      : name_(name) {}
52040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
52050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns true iff the name of test_case matches name_.
52060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool operator()(const TestCase* test_case) const {
52070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;
52080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
52090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
52100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
52110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  String name_;
52120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
52130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
52140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Finds and returns a TestCase with the given name.  If one doesn't
52150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// exist, creates one and returns it.  It's the CALLER'S
52160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// RESPONSIBILITY to ensure that this function is only called WHEN THE
52170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TESTS ARE NOT SHUFFLED.
52180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
52190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Arguments:
52200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
52210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   test_case_name: name of the test case
52220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   set_up_tc:      pointer to the function that sets up the test case
52230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   tear_down_tc:   pointer to the function that tears down the test case
52240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestCase* UnitTestImpl::GetTestCase(const char* test_case_name,
52250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                    const char* comment,
52260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                    Test::SetUpTestCaseFunc set_up_tc,
52270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                    Test::TearDownTestCaseFunc tear_down_tc) {
52280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Can we find a TestCase with the given name?
52290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const std::vector<TestCase*>::const_iterator test_case =
52300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      std::find_if(test_cases_.begin(), test_cases_.end(),
52310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   TestCaseNameIs(test_case_name));
52320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
52330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (test_case != test_cases_.end())
52340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return *test_case;
52350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
52360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // No.  Let's create one.
52370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestCase* const new_test_case =
52380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      new TestCase(test_case_name, comment, set_up_tc, tear_down_tc);
52390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
52400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Is this a death test case?
52410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (internal::UnitTestOptions::MatchesFilter(String(test_case_name),
52420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                               kDeathTestCaseFilter)) {
52430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Yes.  Inserts the test case after the last death test case
52440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // defined so far.  This only works when the test cases haven't
52450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // been shuffled.  Otherwise we may end up running a death test
52460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // after a non-death test.
52470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ++last_death_test_case_;
52480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    test_cases_.insert(test_cases_.begin() + last_death_test_case_,
52490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                       new_test_case);
52500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
52510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // No.  Appends to the end of the list.
52520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    test_cases_.push_back(new_test_case);
52530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
52540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
52550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));
52560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return new_test_case;
52570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
52580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
52590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Helpers for setting up / tearing down the given environment.  They
52600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// are for use in the ForEach() function.
52610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic void SetUpEnvironment(Environment* env) { env->SetUp(); }
52620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic void TearDownEnvironment(Environment* env) { env->TearDown(); }
52630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
52640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Runs all tests in this UnitTest object, prints the result, and
52650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// returns 0 if all tests are successful, or 1 otherwise.  If any
52660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// exception is thrown during a test on Windows, this test is
52670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// considered to be failed, but the rest of the tests will still be
52680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// run.  (We disable exceptions on Linux and Mac OS X, so the issue
52690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// doesn't apply there.)
52700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// When parameterized tests are enabled, it expands and registers
52710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// parameterized tests first in RegisterParameterizedTests().
52720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// All other functions called from RunAllTests() may safely assume that
52730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// parameterized tests are ready to be counted and run.
52740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTestImpl::RunAllTests() {
52750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Makes sure InitGoogleTest() was called.
52760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!GTestIsInitialized()) {
52770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    printf("%s",
52780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson           "\nThis test program did NOT call ::testing::InitGoogleTest "
52790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson           "before calling RUN_ALL_TESTS().  Please fix it.\n");
52800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return 1;
52810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
52820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
52830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Do not run any test if the --help flag was specified.
52840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (g_help_flag)
52850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return 0;
52860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
52870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Repeats the call to the post-flag parsing initialization in case the
52880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // user didn't call InitGoogleTest.
52890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  PostFlagParsingInit();
52900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
52910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Even if sharding is not on, test runners may want to use the
52920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding
52930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // protocol.
52940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::WriteToShardStatusFileIfNeeded();
52950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
52960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // True iff we are in a subprocess for running a thread-safe-style
52970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // death test.
52980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool in_subprocess_for_death_test = false;
52990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_DEATH_TEST
53010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);
53020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_DEATH_TEST
53030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,
53050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                        in_subprocess_for_death_test);
53060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Compares the full test names with the filter to decide which
53080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // tests to run.
53090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const bool has_tests_to_run = FilterTests(should_shard
53100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                              ? HONOR_SHARDING_PROTOCOL
53110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                              : IGNORE_SHARDING_PROTOCOL) > 0;
53120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Lists the tests and exits if the --gtest_list_tests flag was specified.
53140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (GTEST_FLAG(list_tests)) {
53150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // This must be called *after* FilterTests() has been called.
53160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ListTestsMatchingFilter();
53170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return 0;
53180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
53190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  random_seed_ = GTEST_FLAG(shuffle) ?
53210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;
53220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // True iff at least one test has failed.
53240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool failed = false;
53250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestEventListener* repeater = listeners()->repeater();
53270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  repeater->OnTestProgramStart(*parent_);
53290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // How many times to repeat the tests?  We don't want to repeat them
53310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // when we are inside the subprocess of a death test.
53320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);
53330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Repeats forever if the repeat count is negative.
53340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const bool forever = repeat < 0;
53350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (int i = 0; forever || i != repeat; i++) {
53360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ClearResult();
53370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const TimeInMillis start = GetTimeInMillis();
53390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Shuffles test cases and tests if requested.
53410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (has_tests_to_run && GTEST_FLAG(shuffle)) {
53420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      random()->Reseed(random_seed_);
53430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // This should be done before calling OnTestIterationStart(),
53440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // such that a test event listener can see the actual test order
53450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // in the event.
53460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ShuffleTests();
53470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
53480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Tells the unit test event listeners that the tests are about to start.
53500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    repeater->OnTestIterationStart(*parent_, i);
53510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Runs each test case if there is at least one test to run.
53530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (has_tests_to_run) {
53540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // Sets up all environments beforehand.
53550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      repeater->OnEnvironmentsSetUpStart(*parent_);
53560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ForEach(environments_, SetUpEnvironment);
53570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      repeater->OnEnvironmentsSetUpEnd(*parent_);
53580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // Runs the tests only if there was no fatal failure during global
53600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // set-up.
53610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if (!Test::HasFatalFailure()) {
53620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        for (int test_index = 0; test_index < total_test_case_count();
53630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson             test_index++) {
53640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          GetMutableTestCase(test_index)->Run();
53650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        }
53660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      }
53670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // Tears down all environments in reverse order afterwards.
53690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      repeater->OnEnvironmentsTearDownStart(*parent_);
53700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      std::for_each(environments_.rbegin(), environments_.rend(),
53710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                    TearDownEnvironment);
53720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      repeater->OnEnvironmentsTearDownEnd(*parent_);
53730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
53740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    elapsed_time_ = GetTimeInMillis() - start;
53760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Tells the unit test event listener that the tests have just finished.
53780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    repeater->OnTestIterationEnd(*parent_, i);
53790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Gets the result and clears it.
53810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (!Passed()) {
53820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      failed = true;
53830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
53840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Restores the original test order after the iteration.  This
53860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // allows the user to quickly repro a failure that happens in the
53870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // N-th iteration without repeating the first (N - 1) iterations.
53880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in
53890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // case the user somehow changes the value of the flag somewhere
53900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // (it's always safe to unshuffle the tests).
53910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    UnshuffleTests();
53920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (GTEST_FLAG(shuffle)) {
53940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // Picks a new random seed for each iteration.
53950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      random_seed_ = GetNextRandomSeed(random_seed_);
53960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
53970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
53980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
53990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  repeater->OnTestProgramEnd(*parent_);
54000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
54010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns 0 if all tests passed, or 1 other wise.
54020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return failed ? 1 : 0;
54030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
54040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
54050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
54060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// if the variable is present. If a file already exists at this location, this
54070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// function will write over it. If the variable is present, but the file cannot
54080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// be created, prints an error and exits.
54090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid WriteToShardStatusFileIfNeeded() {
54100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);
54110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (test_shard_file != NULL) {
54120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    FILE* const file = posix::FOpen(test_shard_file, "w");
54130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (file == NULL) {
54140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ColoredPrintf(COLOR_RED,
54150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                    "Could not write to the test shard status file \"%s\" "
54160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                    "specified by the %s environment variable.\n",
54170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                    test_shard_file, kTestShardStatusFile);
54180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      fflush(stdout);
54190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      exit(EXIT_FAILURE);
54200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
54210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fclose(file);
54220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
54230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
54240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
54250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Checks whether sharding is enabled by examining the relevant
54260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// environment variable values. If the variables are present,
54270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// but inconsistent (i.e., shard_index >= total_shards), prints
54280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// an error and exits. If in_subprocess_for_death_test, sharding is
54290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// disabled because it must only be applied to the original test
54300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// process. Otherwise, we could filter out death tests we intended to execute.
54310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool ShouldShard(const char* total_shards_env,
54320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                 const char* shard_index_env,
54330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                 bool in_subprocess_for_death_test) {
54340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (in_subprocess_for_death_test) {
54350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return false;
54360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
54370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
54380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);
54390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);
54400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
54410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (total_shards == -1 && shard_index == -1) {
54420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return false;
54430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else if (total_shards == -1 && shard_index != -1) {
54440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const Message msg = Message()
54450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "Invalid environment variables: you have "
54460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << kTestShardIndex << " = " << shard_index
54470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << ", but have left " << kTestTotalShards << " unset.\n";
54480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
54490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fflush(stdout);
54500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    exit(EXIT_FAILURE);
54510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else if (total_shards != -1 && shard_index == -1) {
54520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const Message msg = Message()
54530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "Invalid environment variables: you have "
54540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << kTestTotalShards << " = " << total_shards
54550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << ", but have left " << kTestShardIndex << " unset.\n";
54560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
54570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fflush(stdout);
54580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    exit(EXIT_FAILURE);
54590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else if (shard_index < 0 || shard_index >= total_shards) {
54600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const Message msg = Message()
54610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "Invalid environment variables: we require 0 <= "
54620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << kTestShardIndex << " < " << kTestTotalShards
54630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << ", but you have " << kTestShardIndex << "=" << shard_index
54640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << ", " << kTestTotalShards << "=" << total_shards << ".\n";
54650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
54660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fflush(stdout);
54670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    exit(EXIT_FAILURE);
54680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
54690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
54700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return total_shards > 1;
54710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
54720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
54730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Parses the environment variable var as an Int32. If it is unset,
54740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// returns default_val. If it is not an Int32, prints an error
54750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// and aborts.
54760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonInt32 Int32FromEnvOrDie(const char* const var, Int32 default_val) {
54770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* str_val = posix::GetEnv(var);
54780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (str_val == NULL) {
54790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return default_val;
54800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
54810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
54820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Int32 result;
54830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!ParseInt32(Message() << "The value of environment variable " << var,
54840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                  str_val, &result)) {
54850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    exit(EXIT_FAILURE);
54860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
54870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return result;
54880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
54890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
54900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Given the total number of shards, the shard index, and the test id,
54910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// returns true iff the test should be run on this shard. The test id is
54920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// some arbitrary but unique non-negative integer assigned to each test
54930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// method. Assumes that 0 <= shard_index < total_shards.
54940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
54950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return (test_id % total_shards) == shard_index;
54960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
54970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
54980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Compares the name of each test with the user-specified filter to
54990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// decide whether the test should be run, then records the result in
55000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// each TestCase and TestInfo object.
55010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// If shard_tests == true, further filters tests based on sharding
55020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// variables in the environment - see
55030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide.
55040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the number of tests that should run.
55050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
55060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
55070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      Int32FromEnvOrDie(kTestTotalShards, -1) : -1;
55080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
55090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      Int32FromEnvOrDie(kTestShardIndex, -1) : -1;
55100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
55110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // num_runnable_tests are the number of tests that will
55120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // run across all shards (i.e., match filter and are not disabled).
55130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // num_selected_tests are the number of tests to be run on
55140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // this shard.
55150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int num_runnable_tests = 0;
55160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int num_selected_tests = 0;
55170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (size_t i = 0; i < test_cases_.size(); i++) {
55180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    TestCase* const test_case = test_cases_[i];
55190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const String &test_case_name = test_case->name();
55200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    test_case->set_should_run(false);
55210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
55220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
55230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      TestInfo* const test_info = test_case->test_info_list()[j];
55240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      const String test_name(test_info->name());
55250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // A test is disabled if test case name or test name matches
55260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // kDisableTestFilter.
55270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      const bool is_disabled =
55280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          internal::UnitTestOptions::MatchesFilter(test_case_name,
55290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                   kDisableTestFilter) ||
55300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          internal::UnitTestOptions::MatchesFilter(test_name,
55310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                   kDisableTestFilter);
55320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      test_info->impl()->set_is_disabled(is_disabled);
55330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
55340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      const bool matches_filter =
55350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          internal::UnitTestOptions::FilterMatchesTest(test_case_name,
55360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                       test_name);
55370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      test_info->impl()->set_matches_filter(matches_filter);
55380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
55390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      const bool is_runnable =
55400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&
55410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          matches_filter;
55420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
55430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      const bool is_selected = is_runnable &&
55440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          (shard_tests == IGNORE_SHARDING_PROTOCOL ||
55450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson           ShouldRunTestOnShard(total_shards, shard_index,
55460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                num_runnable_tests));
55470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
55480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      num_runnable_tests += is_runnable;
55490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      num_selected_tests += is_selected;
55500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
55510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      test_info->impl()->set_should_run(is_selected);
55520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      test_case->set_should_run(test_case->should_run() || is_selected);
55530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
55540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
55550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return num_selected_tests;
55560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
55570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
55580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Prints the names of the tests matching the user-specified filter flag.
55590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid UnitTestImpl::ListTestsMatchingFilter() {
55600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (size_t i = 0; i < test_cases_.size(); i++) {
55610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const TestCase* const test_case = test_cases_[i];
55620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    bool printed_test_case_name = false;
55630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
55640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
55650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      const TestInfo* const test_info =
55660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          test_case->test_info_list()[j];
55670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if (test_info->matches_filter()) {
55680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        if (!printed_test_case_name) {
55690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          printed_test_case_name = true;
55700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          printf("%s.\n", test_case->name());
55710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        }
55720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        printf("  %s\n", test_info->name());
55730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      }
55740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
55750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
55760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fflush(stdout);
55770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
55780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
55790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Sets the OS stack trace getter.
55800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
55810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Does nothing if the input and the current OS stack trace getter are
55820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the same; otherwise, deletes the old getter and makes the input the
55830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// current getter.
55840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid UnitTestImpl::set_os_stack_trace_getter(
55850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    OsStackTraceGetterInterface* getter) {
55860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (os_stack_trace_getter_ != getter) {
55870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    delete os_stack_trace_getter_;
55880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    os_stack_trace_getter_ = getter;
55890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
55900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
55910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
55920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the current OS stack trace getter if it is not NULL;
55930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// otherwise, creates an OsStackTraceGetter, makes it the current
55940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// getter, and returns it.
55950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonOsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
55960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (os_stack_trace_getter_ == NULL) {
55970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    os_stack_trace_getter_ = new OsStackTraceGetter;
55980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
55990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
56000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return os_stack_trace_getter_;
56010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
56020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
56030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the TestResult for the test that's currently running, or
56040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the TestResult for the ad hoc test if no test is running.
56050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestResult* UnitTestImpl::current_test_result() {
56060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return current_test_info_ ?
56070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    current_test_info_->impl()->result() : &ad_hoc_test_result_;
56080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
56090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
56100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Shuffles all test cases, and the tests within each test case,
56110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// making sure that death tests are still run first.
56120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid UnitTestImpl::ShuffleTests() {
56130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Shuffles the death test cases.
56140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);
56150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
56160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Shuffles the non-death test cases.
56170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ShuffleRange(random(), last_death_test_case_ + 1,
56180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson               static_cast<int>(test_cases_.size()), &test_case_indices_);
56190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
56200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Shuffles the tests inside each test case.
56210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (size_t i = 0; i < test_cases_.size(); i++) {
56220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    test_cases_[i]->ShuffleTests(random());
56230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
56240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
56250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
56260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Restores the test cases and tests to their order before the first shuffle.
56270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid UnitTestImpl::UnshuffleTests() {
56280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (size_t i = 0; i < test_cases_.size(); i++) {
56290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Unshuffles the tests in each test case.
56300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    test_cases_[i]->UnshuffleTests();
56310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Resets the index of each test case.
56320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    test_case_indices_[i] = static_cast<int>(i);
56330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
56340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
56350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
56360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TestInfoImpl constructor. The new instance assumes ownership of the test
56370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// factory object.
56380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestInfoImpl::TestInfoImpl(TestInfo* parent,
56390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                           const char* a_test_case_name,
56400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                           const char* a_name,
56410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                           const char* a_test_case_comment,
56420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                           const char* a_comment,
56430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                           TypeId a_fixture_class_id,
56440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                           internal::TestFactoryBase* factory) :
56450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    parent_(parent),
56460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    test_case_name_(String(a_test_case_name)),
56470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    name_(String(a_name)),
56480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    test_case_comment_(String(a_test_case_comment)),
56490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    comment_(String(a_comment)),
56500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fixture_class_id_(a_fixture_class_id),
56510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    should_run_(false),
56520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    is_disabled_(false),
56530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    matches_filter_(false),
56540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    factory_(factory) {
56550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
56560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
56570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TestInfoImpl destructor.
56580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonTestInfoImpl::~TestInfoImpl() {
56590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  delete factory_;
56600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
56610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
56620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the current OS stack trace as a String.
56630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
56640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The maximum number of stack frames to be included is specified by
56650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the gtest_stack_trace_depth flag.  The skip_count parameter
56660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// specifies the number of top frames to be skipped, which doesn't
56670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// count against the number of frames to be included.
56680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
56690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// For example, if Foo() calls Bar(), which in turn calls
56700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
56710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
56720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
56730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                       int skip_count) {
56740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // We pass skip_count + 1 to skip this wrapper function in addition
56750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // to what the user really wants to skip.
56760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);
56770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
56780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
56790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Used by the GTEST_HIDE_UNREACHABLE_CODE_ macro to suppress unreachable
56800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// code warnings.
56810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace {
56820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass ClassUniqueToAlwaysTrue {};
56830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
56840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
56850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool IsTrue(bool condition) { return condition; }
56860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
56870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool AlwaysTrue() {
56880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_EXCEPTIONS
56890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // This condition is always false so AlwaysTrue() never actually throws,
56900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // but it makes the compiler think that it may throw.
56910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (IsTrue(false))
56920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    throw ClassUniqueToAlwaysTrue();
56930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_EXCEPTIONS
56940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return true;
56950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
56960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
56970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// If *pstr starts with the given prefix, modifies *pstr to be right
56980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// past the prefix and returns true; otherwise leaves *pstr unchanged
56990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// and returns false.  None of pstr, *pstr, and prefix can be NULL.
57000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool SkipPrefix(const char* prefix, const char** pstr) {
57010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const size_t prefix_len = strlen(prefix);
57020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (strncmp(*pstr, prefix, prefix_len) == 0) {
57030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    *pstr += prefix_len;
57040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return true;
57050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
57060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return false;
57070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
57080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
57090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Parses a string as a command line flag.  The string should have
57100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the format "--flag=value".  When def_optional is true, the "=value"
57110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// part can be omitted.
57120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
57130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the value of the flag, or NULL if the parsing failed.
57140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char* ParseFlagValue(const char* str,
57150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                           const char* flag,
57160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                           bool def_optional) {
57170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // str and flag must not be NULL.
57180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (str == NULL || flag == NULL) return NULL;
57190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
57200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The flag must start with "--" followed by GTEST_FLAG_PREFIX_.
57210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String flag_str = String::Format("--%s%s", GTEST_FLAG_PREFIX_, flag);
57220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const size_t flag_len = flag_str.length();
57230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;
57240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
57250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Skips the flag name.
57260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* flag_end = str + flag_len;
57270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
57280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // When def_optional is true, it's OK to not have a "=value" part.
57290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (def_optional && (flag_end[0] == '\0')) {
57300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return flag_end;
57310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
57320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
57330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // If def_optional is true and there are more characters after the
57340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // flag name, or if def_optional is false, there must be a '=' after
57350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // the flag name.
57360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (flag_end[0] != '=') return NULL;
57370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
57380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the string after "=".
57390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return flag_end + 1;
57400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
57410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
57420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Parses a string for a bool flag, in the form of either
57430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// "--flag=value" or "--flag".
57440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
57450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// In the former case, the value is taken as true as long as it does
57460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// not start with '0', 'f', or 'F'.
57470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
57480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// In the latter case, the value is taken as true.
57490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
57500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// On success, stores the value of the flag in *value, and returns
57510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// true.  On failure, returns false without changing *value.
57520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool ParseBoolFlag(const char* str, const char* flag, bool* value) {
57530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the value of the flag as a string.
57540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const value_str = ParseFlagValue(str, flag, true);
57550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
57560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Aborts if the parsing failed.
57570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (value_str == NULL) return false;
57580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
57590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Converts the string value to a bool.
57600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');
57610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return true;
57620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
57630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
57640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Parses a string for an Int32 flag, in the form of
57650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// "--flag=value".
57660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
57670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// On success, stores the value of the flag in *value, and returns
57680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// true.  On failure, returns false without changing *value.
57690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
57700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the value of the flag as a string.
57710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const value_str = ParseFlagValue(str, flag, false);
57720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
57730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Aborts if the parsing failed.
57740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (value_str == NULL) return false;
57750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
57760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Sets *value to the value of the flag.
57770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return ParseInt32(Message() << "The value of flag --" << flag,
57780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                    value_str, value);
57790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
57800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
57810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Parses a string for a string flag, in the form of
57820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// "--flag=value".
57830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
57840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// On success, stores the value of the flag in *value, and returns
57850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// true.  On failure, returns false without changing *value.
57860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool ParseStringFlag(const char* str, const char* flag, String* value) {
57870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Gets the value of the flag as a string.
57880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const value_str = ParseFlagValue(str, flag, false);
57890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
57900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Aborts if the parsing failed.
57910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (value_str == NULL) return false;
57920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
57930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Sets *value to the value of the flag.
57940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  *value = value_str;
57950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return true;
57960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
57970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
57980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Determines whether a string has a prefix that Google Test uses for its
57990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.
58000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// If Google Test detects that a command line flag has its prefix but is not
58010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// recognized, it will print its help message. Flags starting with
58020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test
58030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// internal flags and do not trigger the help message.
58040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic bool HasGoogleTestFlagPrefix(const char* str) {
58050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return (SkipPrefix("--", &str) ||
58060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          SkipPrefix("-", &str) ||
58070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          SkipPrefix("/", &str)) &&
58080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) &&
58090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||
58100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));
58110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
58120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
58130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Prints a string containing code-encoded text.  The following escape
58140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// sequences can be used in the string to control the text color:
58150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
58160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   @@    prints a single '@' character.
58170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   @R    changes the color to red.
58180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   @G    changes the color to green.
58190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   @Y    changes the color to yellow.
58200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   @D    changes to the default terminal text color.
58210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
58220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TODO(wan@google.com): Write tests for this once we add stdout
58230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// capturing to Google Test.
58240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic void PrintColorEncoded(const char* str) {
58250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTestColor color = COLOR_DEFAULT;  // The current color.
58260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
58270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Conceptually, we split the string into segments divided by escape
58280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // sequences.  Then we print one segment at a time.  At the end of
58290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // each iteration, the str pointer advances to the beginning of the
58300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // next segment.
58310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (;;) {
58320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* p = strchr(str, '@');
58330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (p == NULL) {
58340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ColoredPrintf(color, "%s", str);
58350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return;
58360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
58370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
58380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ColoredPrintf(color, "%s", String(str, p - str).c_str());
58390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
58400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char ch = p[1];
58410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    str = p + 2;
58420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (ch == '@') {
58430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ColoredPrintf(color, "@");
58440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } else if (ch == 'D') {
58450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      color = COLOR_DEFAULT;
58460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } else if (ch == 'R') {
58470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      color = COLOR_RED;
58480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } else if (ch == 'G') {
58490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      color = COLOR_GREEN;
58500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } else if (ch == 'Y') {
58510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      color = COLOR_YELLOW;
58520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } else {
58530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      --str;
58540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
58550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
58560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
58570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
58580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic const char kColorEncodedHelpMessage[] =
58590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"This program contains tests written using " GTEST_NAME_ ". You can use the\n"
58600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"following command line flags to control its behavior:\n"
58610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"\n"
58620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"Test Selection:\n"
58630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"  @G--" GTEST_FLAG_PREFIX_ "list_tests@D\n"
58640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"      List the names of all tests instead of running them. The name of\n"
58650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"      TEST(Foo, Bar) is \"Foo.Bar\".\n"
58660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"  @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS"
58670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "[@G-@YNEGATIVE_PATTERNS]@D\n"
58680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"      Run only the tests whose name matches one of the positive patterns but\n"
58690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"      none of the negative patterns. '?' matches any single character; '*'\n"
58700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"      matches any substring; ':' separates two patterns.\n"
58710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"  @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests@D\n"
58720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"      Run all disabled tests too.\n"
58730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"\n"
58740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"Test Execution:\n"
58750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"  @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n"
58760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"      Run the tests repeatedly; use a negative count to repeat forever.\n"
58770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"  @G--" GTEST_FLAG_PREFIX_ "shuffle@D\n"
58780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"      Randomize tests' orders on every iteration.\n"
58790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"  @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n"
58800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"      Random number seed to use for shuffling test orders (between 1 and\n"
58810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"      99999, or 0 to use a seed based on the current time).\n"
58820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"\n"
58830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"Test Output:\n"
58840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"  @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\n"
58850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"      Enable/disable colored output. The default is @Gauto@D.\n"
58860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"  -@G-" GTEST_FLAG_PREFIX_ "print_time=0@D\n"
58870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"      Don't print the elapsed time of each test.\n"
58880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"  @G--" GTEST_FLAG_PREFIX_ "output=xml@Y[@G:@YDIRECTORY_PATH@G"
58890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n"
58900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"      Generate an XML report in the given directory or with the given file\n"
58910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"      name. @YFILE_PATH@D defaults to @Gtest_details.xml@D.\n"
58920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"\n"
58930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"Assertion Behavior:\n"
58940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
58950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"  @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\n"
58960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"      Set the default death test style.\n"
58970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
58980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"  @G--" GTEST_FLAG_PREFIX_ "break_on_failure@D\n"
58990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"      Turn assertion failures into debugger break-points.\n"
59000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"  @G--" GTEST_FLAG_PREFIX_ "throw_on_failure@D\n"
59010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"      Turn assertion failures into C++ exceptions.\n"
59020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
59030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"  @G--" GTEST_FLAG_PREFIX_ "catch_exceptions@D\n"
59040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"      Suppress pop-ups caused by exceptions.\n"
59050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
59060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"\n"
59070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests@D, you can alternatively set "
59080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "the corresponding\n"
59090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"environment variable of a flag (all letters in upper-case). For example, to\n"
59100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_
59110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "color=no@D or set\n"
59120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR@D environment variable to @Gno@D.\n"
59130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"\n"
59140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"For more information, please read the " GTEST_NAME_ " documentation at\n"
59150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n"
59160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"(not one in your own code or tests), please report it to\n"
59170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"@G<" GTEST_DEV_EMAIL_ ">@D.\n";
59180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
59190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Parses the command line for Google Test flags, without initializing
59200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// other parts of Google Test.  The type parameter CharType can be
59210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// instantiated to either char or wchar_t.
59220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsontemplate <typename CharType>
59230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
59240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (int i = 1; i < *argc; i++) {
59250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const String arg_string = StreamableToString(argv[i]);
59260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* const arg = arg_string.c_str();
59270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
59280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    using internal::ParseBoolFlag;
59290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    using internal::ParseInt32Flag;
59300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    using internal::ParseStringFlag;
59310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
59320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Do we see a Google Test flag?
59330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,
59340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      &GTEST_FLAG(also_run_disabled_tests)) ||
59350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ParseBoolFlag(arg, kBreakOnFailureFlag,
59360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      &GTEST_FLAG(break_on_failure)) ||
59370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ParseBoolFlag(arg, kCatchExceptionsFlag,
59380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      &GTEST_FLAG(catch_exceptions)) ||
59390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ParseStringFlag(arg, kColorFlag, &GTEST_FLAG(color)) ||
59400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ParseStringFlag(arg, kDeathTestStyleFlag,
59410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                        &GTEST_FLAG(death_test_style)) ||
59420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ParseBoolFlag(arg, kDeathTestUseFork,
59430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      &GTEST_FLAG(death_test_use_fork)) ||
59440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ParseStringFlag(arg, kFilterFlag, &GTEST_FLAG(filter)) ||
59450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ParseStringFlag(arg, kInternalRunDeathTestFlag,
59460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                        &GTEST_FLAG(internal_run_death_test)) ||
59470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ParseBoolFlag(arg, kListTestsFlag, &GTEST_FLAG(list_tests)) ||
59480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ParseStringFlag(arg, kOutputFlag, &GTEST_FLAG(output)) ||
59490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ParseBoolFlag(arg, kPrintTimeFlag, &GTEST_FLAG(print_time)) ||
59500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ParseInt32Flag(arg, kRandomSeedFlag, &GTEST_FLAG(random_seed)) ||
59510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ParseInt32Flag(arg, kRepeatFlag, &GTEST_FLAG(repeat)) ||
59520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ParseBoolFlag(arg, kShuffleFlag, &GTEST_FLAG(shuffle)) ||
59530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ParseInt32Flag(arg, kStackTraceDepthFlag,
59540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                       &GTEST_FLAG(stack_trace_depth)) ||
59550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ParseBoolFlag(arg, kThrowOnFailureFlag, &GTEST_FLAG(throw_on_failure))
59560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ) {
59570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // Yes.  Shift the remainder of the argv list left by one.  Note
59580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // that argv has (*argc + 1) elements, the last one always being
59590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // NULL.  The following loop moves the trailing NULL element as
59600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // well.
59610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      for (int j = i; j != *argc; j++) {
59620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        argv[j] = argv[j + 1];
59630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      }
59640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
59650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // Decrements the argument count.
59660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      (*argc)--;
59670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
59680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // We also need to decrement the iterator as we just removed
59690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // an element.
59700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      i--;
59710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } else if (arg_string == "--help" || arg_string == "-h" ||
59720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson               arg_string == "-?" || arg_string == "/?" ||
59730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson               HasGoogleTestFlagPrefix(arg)) {
59740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // Both help flag and unrecognized Google Test flags (excluding
59750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // internal ones) trigger help display.
59760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      g_help_flag = true;
59770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
59780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
59790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
59800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (g_help_flag) {
59810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // We print the help here instead of in RUN_ALL_TESTS(), as the
59820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // latter may not be called at all if the user is using Google
59830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Test with another testing framework.
59840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    PrintColorEncoded(kColorEncodedHelpMessage);
59850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
59860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
59870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
59880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Parses the command line for Google Test flags, without initializing
59890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// other parts of Google Test.
59900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid ParseGoogleTestFlagsOnly(int* argc, char** argv) {
59910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ParseGoogleTestFlagsOnlyImpl(argc, argv);
59920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
59930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
59940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ParseGoogleTestFlagsOnlyImpl(argc, argv);
59950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
59960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
59970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The internal implementation of InitGoogleTest().
59980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
59990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The type parameter CharType can be instantiated to either char or
60000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// wchar_t.
60010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsontemplate <typename CharType>
60020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid InitGoogleTestImpl(int* argc, CharType** argv) {
60030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  g_init_gtest_count++;
60040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
60050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // We don't want to run the initialization code twice.
60060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (g_init_gtest_count != 1) return;
60070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
60080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (*argc <= 0) return;
60090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
60100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::g_executable_path = internal::StreamableToString(argv[0]);
60110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
60120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_DEATH_TEST
60130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  g_argvs.clear();
60140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (int i = 0; i != *argc; i++) {
60150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    g_argvs.push_back(StreamableToString(argv[i]));
60160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
60170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_DEATH_TEST
60180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
60190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ParseGoogleTestFlagsOnly(argc, argv);
60200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GetUnitTestImpl()->PostFlagParsingInit();
60210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
60220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
60230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
60240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
60250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Initializes Google Test.  This must be called before calling
60260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// RUN_ALL_TESTS().  In particular, it parses a command line for the
60270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// flags that Google Test recognizes.  Whenever a Google Test flag is
60280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// seen, it is removed from argv, and *argc is decremented.
60290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
60300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// No value is returned.  Instead, the Google Test flag variables are
60310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// updated.
60320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
60330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Calling the function for the second time has no user-visible effect.
60340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid InitGoogleTest(int* argc, char** argv) {
60350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::InitGoogleTestImpl(argc, argv);
60360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
60370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
60380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This overloaded version can be used in Windows programs compiled in
60390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// UNICODE mode.
60400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid InitGoogleTest(int* argc, wchar_t** argv) {
60410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  internal::InitGoogleTestImpl(argc, argv);
60420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
60430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
60440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace testing
60450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Copyright 2005, Google Inc.
60460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// All rights reserved.
60470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
60480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Redistribution and use in source and binary forms, with or without
60490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// modification, are permitted provided that the following conditions are
60500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// met:
60510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
60520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Redistributions of source code must retain the above copyright
60530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// notice, this list of conditions and the following disclaimer.
60540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Redistributions in binary form must reproduce the above
60550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// copyright notice, this list of conditions and the following disclaimer
60560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// in the documentation and/or other materials provided with the
60570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// distribution.
60580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Neither the name of Google Inc. nor the names of its
60590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// contributors may be used to endorse or promote products derived from
60600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// this software without specific prior written permission.
60610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
60620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
60630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
60640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
60650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
60660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
60670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
60680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
60690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
60700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
60710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
60720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
60730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
60740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Author: wan@google.com (Zhanyong Wan), vladl@google.com (Vlad Losev)
60750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
60760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This file implements death tests.
60770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
60780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
60790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_DEATH_TEST
60800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
60810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_MAC
60820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <crt_externs.h>
60830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_MAC
60840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
60850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <errno.h>
60860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <fcntl.h>
60870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <limits.h>
60880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <stdarg.h>
60890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
60900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
60910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <windows.h>
60920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
60930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <sys/mman.h>
60940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <sys/wait.h>
60950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
60960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
60970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_DEATH_TEST
60980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
60990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
61000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Indicates that this translation unit is part of Google Test's
61010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// implementation.  It must come before gtest-internal-inl.h is
61020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// included, or there will be a compiler error.  This trick is to
61030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// prevent a user from accidentally including gtest-internal-inl.h in
61040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// his code.
61050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_IMPLEMENTATION_ 1
61060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#undef GTEST_IMPLEMENTATION_
61070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
61080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace testing {
61090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
61100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Constants.
61110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
61120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The default death test style.
61130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic const char kDefaultDeathTestStyle[] = "fast";
61140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
61150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DEFINE_string_(
61160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    death_test_style,
61170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
61180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "Indicates how to run a death test in a forked child process: "
61190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "\"threadsafe\" (child process re-executes the test binary "
61200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "from the beginning, running only the specific death test) or "
61210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "\"fast\" (child process runs the death test immediately "
61220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "after forking).");
61230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
61240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DEFINE_bool_(
61250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    death_test_use_fork,
61260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal::BoolFromGTestEnv("death_test_use_fork", false),
61270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "Instructs to use fork()/_exit() instead of clone() in death tests. "
61280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "Ignored and always uses fork() on POSIX systems where clone() is not "
61290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "implemented. Useful when running under valgrind or similar tools if "
61300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "those do not support clone(). Valgrind 3.3.1 will just fail if "
61310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "it sees an unsupported combination of clone() flags. "
61320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "It is not recommended to use this flag w/o valgrind though it will "
61330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "work in 99% of the cases. Once valgrind is fixed, this flag will "
61340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "most likely be removed.");
61350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
61360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
61370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DEFINE_string_(
61380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal_run_death_test, "",
61390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "Indicates the file, line number, temporal index of "
61400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "the single death test to run, and a file descriptor to "
61410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "which a success code may be sent, all separated by "
61420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "colons.  This flag is specified if and only if the current "
61430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "process is a sub-process launched for running a thread-safe "
61440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "death test.  FOR INTERNAL USE ONLY.");
61450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
61460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
61470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_DEATH_TEST
61480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
61490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// ExitedWithCode constructor.
61500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
61510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
61520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
61530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// ExitedWithCode function-call operator.
61540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool ExitedWithCode::operator()(int exit_status) const {
61550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
61560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return exit_status == exit_code_;
61570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
61580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
61590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
61600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
61610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
61620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if !GTEST_OS_WINDOWS
61630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// KilledBySignal constructor.
61640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonKilledBySignal::KilledBySignal(int signum) : signum_(signum) {
61650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
61660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
61670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// KilledBySignal function-call operator.
61680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool KilledBySignal::operator()(int exit_status) const {
61690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
61700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
61710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // !GTEST_OS_WINDOWS
61720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
61730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
61740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
61750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Utilities needed for death tests.
61760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
61770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Generates a textual description of a given exit code, in the format
61780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// specified by wait(2).
61790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic String ExitSummary(int exit_code) {
61800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message m;
61810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
61820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  m << "Exited with exit status " << exit_code;
61830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
61840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (WIFEXITED(exit_code)) {
61850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    m << "Exited with exit status " << WEXITSTATUS(exit_code);
61860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else if (WIFSIGNALED(exit_code)) {
61870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    m << "Terminated by signal " << WTERMSIG(exit_code);
61880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
61890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#ifdef WCOREDUMP
61900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (WCOREDUMP(exit_code)) {
61910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    m << " (core dumped)";
61920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
61930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif
61940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
61950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return m.GetString();
61960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
61970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
61980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true if exit_status describes a process that was terminated
61990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// by a signal, or exited normally with a nonzero exit code.
62000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool ExitedUnsuccessfully(int exit_status) {
62010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return !ExitedWithCode(0)(exit_status);
62020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
62030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
62040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if !GTEST_OS_WINDOWS
62050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Generates a textual failure message when a death test finds more than
62060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// one thread running, or cannot determine the number of threads, prior
62070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// to executing the given statement.  It is the responsibility of the
62080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// caller not to pass a thread_count of 1.
62090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic String DeathTestThreadWarning(size_t thread_count) {
62100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message msg;
62110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  msg << "Death tests use fork(), which is unsafe particularly"
62120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
62130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (thread_count == 0)
62140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    msg << "couldn't detect the number of threads.";
62150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  else
62160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    msg << "detected " << thread_count << " threads.";
62170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return msg.GetString();
62180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
62190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // !GTEST_OS_WINDOWS
62200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
62210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Flag characters for reporting a death test that did not die.
62220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic const char kDeathTestLived = 'L';
62230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic const char kDeathTestReturned = 'R';
62240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic const char kDeathTestInternalError = 'I';
62250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
62260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// An enumeration describing all of the possible ways that a death test
62270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// can conclude.  DIED means that the process died while executing the
62280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// test code; LIVED means that process lived beyond the end of the test
62290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// code; and RETURNED means that the test statement attempted a "return,"
62300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// which is not allowed.  IN_PROGRESS means the test has not yet
62310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// concluded.
62320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonenum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED };
62330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
62340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Routine for aborting the program which is safe to call from an
62350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// exec-style death test child process, in which case the error
62360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// message is propagated back to the parent process.  Otherwise, the
62370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// message is simply printed to stderr.  In either case, the program
62380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// then exits with status 1.
62390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid DeathTestAbort(const String& message) {
62400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // On a POSIX system, this function may be called from a threadsafe-style
62410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // death test child process, which operates on a very small stack.  Use
62420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // the heap for any additional non-minuscule memory requirements.
62430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const InternalRunDeathTestFlag* const flag =
62440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      GetUnitTestImpl()->internal_run_death_test_flag();
62450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (flag != NULL) {
62460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    FILE* parent = posix::FDOpen(flag->write_fd(), "w");
62470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fputc(kDeathTestInternalError, parent);
62480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fprintf(parent, "%s", message.c_str());
62490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fflush(parent);
62500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    _exit(1);
62510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
62520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fprintf(stderr, "%s", message.c_str());
62530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fflush(stderr);
62540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    abort();
62550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
62560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
62570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
62580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A replacement for CHECK that calls DeathTestAbort if the assertion
62590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// fails.
62600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_DEATH_TEST_CHECK_(expression) \
62610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  do { \
62620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (!::testing::internal::IsTrue(expression)) { \
62630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      DeathTestAbort(::testing::internal::String::Format( \
62640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          "CHECK failed: File %s, line %d: %s", \
62650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          __FILE__, __LINE__, #expression)); \
62660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } \
62670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } while (::testing::internal::AlwaysFalse())
62680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
62690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for
62700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// evaluating any system call that fulfills two conditions: it must return
62710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// -1 on failure, and set errno to EINTR when it is interrupted and
62720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// should be tried again.  The macro expands to a loop that repeatedly
62730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// evaluates the expression as long as it evaluates to -1 and sets
62740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// errno to EINTR.  If the expression evaluates to -1 but errno is
62750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// something other than EINTR, DeathTestAbort is called.
62760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
62770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  do { \
62780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    int gtest_retval; \
62790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    do { \
62800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      gtest_retval = (expression); \
62810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } while (gtest_retval == -1 && errno == EINTR); \
62820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (gtest_retval == -1) { \
62830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      DeathTestAbort(::testing::internal::String::Format( \
62840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          "CHECK failed: File %s, line %d: %s != -1", \
62850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          __FILE__, __LINE__, #expression)); \
62860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } \
62870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } while (::testing::internal::AlwaysFalse())
62880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
62890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the message describing the last system error in errno.
62900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString GetLastErrnoDescription() {
62910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return String(errno == 0 ? "" : posix::StrError(errno));
62920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
62930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
62940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This is called from a death test parent process to read a failure
62950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// message from the death test child process and log it with the FATAL
62960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// severity. On Windows, the message is read from a pipe handle. On other
62970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// platforms, it is read from a file descriptor.
62980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic void FailFromInternalError(int fd) {
62990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message error;
63000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char buffer[256];
63010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int num_read;
63020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
63030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  do {
63040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    while ((num_read = posix::Read(fd, buffer, 255)) > 0) {
63050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      buffer[num_read] = '\0';
63060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      error << buffer;
63070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
63080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } while (num_read == -1 && errno == EINTR);
63090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
63100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (num_read == 0) {
63110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_LOG_(FATAL) << error.GetString();
63120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
63130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const int last_error = errno;
63140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_LOG_(FATAL) << "Error while reading death test internal: "
63150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      << GetLastErrnoDescription() << " [" << last_error << "]";
63160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
63170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
63180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
63190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Death test constructor.  Increments the running death test count
63200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// for the current test.
63210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonDeathTest::DeathTest() {
63220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TestInfo* const info = GetUnitTestImpl()->current_test_info();
63230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (info == NULL) {
63240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    DeathTestAbort("Cannot run a death test outside of a TEST or "
63250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   "TEST_F construct");
63260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
63270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
63280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
63290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Creates and returns a death test by dispatching to the current
63300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// death test factory.
63310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool DeathTest::Create(const char* statement, const RE* regex,
63320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                       const char* file, int line, DeathTest** test) {
63330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return GetUnitTestImpl()->death_test_factory()->Create(
63340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      statement, regex, file, line, test);
63350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
63360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
63370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char* DeathTest::LastMessage() {
63380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return last_death_test_message_.c_str();
63390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
63400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
63410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid DeathTest::set_last_death_test_message(const String& message) {
63420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  last_death_test_message_ = message;
63430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
63440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
63450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString DeathTest::last_death_test_message_;
63460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
63470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Provides cross platform implementation for some death functionality.
63480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass DeathTestImpl : public DeathTest {
63490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson protected:
63500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  DeathTestImpl(const char* a_statement, const RE* a_regex)
63510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      : statement_(a_statement),
63520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        regex_(a_regex),
63530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        spawned_(false),
63540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        status_(-1),
63550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        outcome_(IN_PROGRESS),
63560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        read_fd_(-1),
63570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        write_fd_(-1) {}
63580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
63590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // read_fd_ is expected to be closed and cleared by a derived class.
63600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
63610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
63620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void Abort(AbortReason reason);
63630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual bool Passed(bool status_ok);
63640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
63650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* statement() const { return statement_; }
63660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const RE* regex() const { return regex_; }
63670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool spawned() const { return spawned_; }
63680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
63690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int status() const { return status_; }
63700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void set_status(int a_status) { status_ = a_status; }
63710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  DeathTestOutcome outcome() const { return outcome_; }
63720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
63730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int read_fd() const { return read_fd_; }
63740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void set_read_fd(int fd) { read_fd_ = fd; }
63750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int write_fd() const { return write_fd_; }
63760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void set_write_fd(int fd) { write_fd_ = fd; }
63770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
63780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Called in the parent process only. Reads the result code of the death
63790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // test child process via a pipe, interprets it to set the outcome_
63800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // member, and closes read_fd_.  Outputs diagnostics and terminates in
63810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // case of unexpected codes.
63820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void ReadAndInterpretStatusByte();
63830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
63840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
63850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The textual content of the code this object is testing.  This class
63860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // doesn't own this string and should not attempt to delete it.
63870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const statement_;
63880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The regular expression which test output must match.  DeathTestImpl
63890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // doesn't own this object and should not attempt to delete it.
63900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const RE* const regex_;
63910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // True if the death test child process has been successfully spawned.
63920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool spawned_;
63930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The exit status of the child process.
63940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int status_;
63950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // How the death test concluded.
63960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  DeathTestOutcome outcome_;
63970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Descriptor to the read end of the pipe to the child process.  It is
63980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // always -1 in the child process.  The child keeps its write end of the
63990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // pipe in write_fd_.
64000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int read_fd_;
64010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Descriptor to the child's write end of the pipe to the parent process.
64020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // It is always -1 in the parent process.  The parent keeps its end of the
64030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // pipe in read_fd_.
64040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int write_fd_;
64050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
64060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
64070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Called in the parent process only. Reads the result code of the death
64080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// test child process via a pipe, interprets it to set the outcome_
64090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// member, and closes read_fd_.  Outputs diagnostics and terminates in
64100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// case of unexpected codes.
64110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid DeathTestImpl::ReadAndInterpretStatusByte() {
64120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char flag;
64130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int bytes_read;
64140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
64150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The read() here blocks until data is available (signifying the
64160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // failure of the death test) or until the pipe is closed (signifying
64170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // its success), so it's okay to call this in the parent before
64180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // the child process has exited.
64190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  do {
64200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    bytes_read = posix::Read(read_fd(), &flag, 1);
64210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } while (bytes_read == -1 && errno == EINTR);
64220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
64230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (bytes_read == 0) {
64240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    set_outcome(DIED);
64250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else if (bytes_read == 1) {
64260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    switch (flag) {
64270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      case kDeathTestReturned:
64280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        set_outcome(RETURNED);
64290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        break;
64300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      case kDeathTestLived:
64310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        set_outcome(LIVED);
64320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        break;
64330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      case kDeathTestInternalError:
64340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        FailFromInternalError(read_fd());  // Does not return.
64350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        break;
64360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      default:
64370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        GTEST_LOG_(FATAL) << "Death test child process reported "
64380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                          << "unexpected status byte ("
64390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                          << static_cast<unsigned int>(flag) << ")";
64400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
64410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
64420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_LOG_(FATAL) << "Read from death test child process failed: "
64430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      << GetLastErrnoDescription();
64440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
64450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));
64460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  set_read_fd(-1);
64470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
64480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
64490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Signals that the death test code which should have exited, didn't.
64500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Should be called only in a death test child process.
64510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Writes a status byte to the child's status file descriptor, then
64520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// calls _exit(1).
64530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid DeathTestImpl::Abort(AbortReason reason) {
64540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The parent process considers the death test to be a failure if
64550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // it finds any data in our pipe.  So, here we write a single flag byte
64560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // to the pipe, then exit.
64570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char status_ch =
64580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      reason == TEST_DID_NOT_DIE ? kDeathTestLived : kDeathTestReturned;
64590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));
64600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(write_fd()));
64610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  _exit(1);  // Exits w/o any normal exit hooks (we were supposed to crash)
64620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
64630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
64640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Assesses the success or failure of a death test, using both private
64650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// members which have previously been set, and one argument:
64660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
64670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Private data members:
64680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   outcome:  An enumeration describing how the death test
64690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//             concluded: DIED, LIVED, or RETURNED.  The death test fails
64700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//             in the latter two cases.
64710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   status:   The exit status of the child process. On *nix, it is in the
64720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//             in the format specified by wait(2). On Windows, this is the
64730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//             value supplied to the ExitProcess() API or a numeric code
64740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//             of the exception that terminated the program.
64750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   regex:    A regular expression object to be applied to
64760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//             the test's captured standard error output; the death test
64770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//             fails if it does not match.
64780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
64790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Argument:
64800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//   status_ok: true if exit_status is acceptable in the context of
64810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//              this particular death test, which fails if it is false
64820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
64830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff all of the above conditions are met.  Otherwise, the
64840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// first failing condition, in the order given above, is the one that is
64850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// reported. Also sets the last death test message string.
64860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool DeathTestImpl::Passed(bool status_ok) {
64870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!spawned())
64880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return false;
64890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
64900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String error_message = GetCapturedStderr();
64910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
64920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool success = false;
64930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message buffer;
64940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
64950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  buffer << "Death test: " << statement() << "\n";
64960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  switch (outcome()) {
64970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case LIVED:
64980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      buffer << "    Result: failed to die.\n"
64990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson             << " Error msg: " << error_message;
65000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      break;
65010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case RETURNED:
65020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      buffer << "    Result: illegal return in test statement.\n"
65030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson             << " Error msg: " << error_message;
65040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      break;
65050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case DIED:
65060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if (status_ok) {
65070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        const bool matched = RE::PartialMatch(error_message.c_str(), *regex());
65080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        if (matched) {
65090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          success = true;
65100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        } else {
65110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          buffer << "    Result: died but not with expected error.\n"
65120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                 << "  Expected: " << regex()->pattern() << "\n"
65130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                 << "Actual msg: " << error_message;
65140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        }
65150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      } else {
65160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        buffer << "    Result: died but not with expected exit code:\n"
65170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson               << "            " << ExitSummary(status()) << "\n";
65180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      }
65190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      break;
65200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case IN_PROGRESS:
65210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    default:
65220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      GTEST_LOG_(FATAL)
65230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << "DeathTest::Passed somehow called before conclusion of test";
65240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
65250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
65260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  DeathTest::set_last_death_test_message(buffer.GetString());
65270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return success;
65280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
65290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
65300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
65310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// WindowsDeathTest implements death tests on Windows. Due to the
65320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// specifics of starting new processes on Windows, death tests there are
65330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// always threadsafe, and Google Test considers the
65340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// --gtest_death_test_style=fast setting to be equivalent to
65350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// --gtest_death_test_style=threadsafe there.
65360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
65370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A few implementation notes:  Like the Linux version, the Windows
65380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// implementation uses pipes for child-to-parent communication. But due to
65390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the specifics of pipes on Windows, some extra steps are required:
65400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
65410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// 1. The parent creates a communication pipe and stores handles to both
65420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//    ends of it.
65430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// 2. The parent starts the child and provides it with the information
65440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//    necessary to acquire the handle to the write end of the pipe.
65450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// 3. The child acquires the write end of the pipe and signals the parent
65460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//    using a Windows event.
65470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// 4. Now the parent can release the write end of the pipe on its side. If
65480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//    this is done before step 3, the object's reference count goes down to
65490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//    0 and it is destroyed, preventing the child from acquiring it. The
65500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//    parent now has to release it, or read operations on the read end of
65510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//    the pipe will not return when the child terminates.
65520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// 5. The parent reads child's output through the pipe (outcome code and
65530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//    any possible error messages) from the pipe, and its stderr and then
65540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//    determines whether to fail the test.
65550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
65560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Note: to distinguish Win32 API calls from the local method and function
65570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// calls, the former are explicitly resolved in the global namespace.
65580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
65590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass WindowsDeathTest : public DeathTestImpl {
65600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
65610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  WindowsDeathTest(const char* statement,
65620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   const RE* regex,
65630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   const char* file,
65640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   int line)
65650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      : DeathTestImpl(statement, regex), file_(file), line_(line) {}
65660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
65670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // All of these virtual functions are inherited from DeathTest.
65680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual int Wait();
65690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual TestRole AssumeRole();
65700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
65710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
65720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The name of the file in which the death test is located.
65730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const file_;
65740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The line number on which the death test is located.
65750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int line_;
65760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Handle to the write end of the pipe to the child process.
65770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  AutoHandle write_handle_;
65780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Child process handle.
65790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  AutoHandle child_handle_;
65800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Event the child process uses to signal the parent that it has
65810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // acquired the handle to the write end of the pipe. After seeing this
65820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // event the parent can release its own handles to make sure its
65830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // ReadFile() calls return when the child terminates.
65840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  AutoHandle event_handle_;
65850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
65860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
65870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Waits for the child in a death test to exit, returning its exit
65880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// status, or 0 if no child process exists.  As a side effect, sets the
65890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// outcome data member.
65900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint WindowsDeathTest::Wait() {
65910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!spawned())
65920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return 0;
65930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
65940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Wait until the child either signals that it has acquired the write end
65950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // of the pipe or it dies.
65960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };
65970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  switch (::WaitForMultipleObjects(2,
65980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                   wait_handles,
65990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                   FALSE,  // Waits for any of the handles.
66000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                   INFINITE)) {
66010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case WAIT_OBJECT_0:
66020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    case WAIT_OBJECT_0 + 1:
66030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      break;
66040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    default:
66050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      GTEST_DEATH_TEST_CHECK_(false);  // Should not get here.
66060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
66070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
66080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The child has acquired the write end of the pipe or exited.
66090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // We release the handle on our side and continue.
66100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  write_handle_.Reset();
66110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  event_handle_.Reset();
66120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
66130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ReadAndInterpretStatusByte();
66140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
66150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Waits for the child process to exit if it haven't already. This
66160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // returns immediately if the child has already exited, regardless of
66170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // whether previous calls to WaitForMultipleObjects synchronized on this
66180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // handle or not.
66190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DEATH_TEST_CHECK_(
66200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),
66210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                             INFINITE));
66220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  DWORD status;
66230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DEATH_TEST_CHECK_(::GetExitCodeProcess(child_handle_.Get(), &status)
66240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                          != FALSE);
66250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  child_handle_.Reset();
66260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  set_status(static_cast<int>(status));
66270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return this->status();
66280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
66290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
66300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The AssumeRole process for a Windows death test.  It creates a child
66310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// process with the same executable as the current process to run the
66320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// death test.  The child process is given the --gtest_filter and
66330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// --gtest_internal_run_death_test flags such that it knows to run the
66340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// current death test only.
66350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonDeathTest::TestRole WindowsDeathTest::AssumeRole() {
66360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const UnitTestImpl* const impl = GetUnitTestImpl();
66370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const InternalRunDeathTestFlag* const flag =
66380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      impl->internal_run_death_test_flag();
66390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const TestInfo* const info = impl->current_test_info();
66400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int death_test_index = info->result()->death_test_count();
66410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
66420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (flag != NULL) {
66430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // ParseInternalRunDeathTestFlag() has performed all the necessary
66440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // processing.
66450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    set_write_fd(flag->write_fd());
66460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return EXECUTE_TEST;
66470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
66480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
66490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // WindowsDeathTest uses an anonymous pipe to communicate results of
66500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // a death test.
66510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  SECURITY_ATTRIBUTES handles_are_inheritable = {
66520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
66530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  HANDLE read_handle, write_handle;
66540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DEATH_TEST_CHECK_(
66550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,
66560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                   0)  // Default buffer size.
66570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      != FALSE);
66580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),
66590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                O_RDONLY));
66600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  write_handle_.Reset(write_handle);
66610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  event_handle_.Reset(::CreateEvent(
66620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      &handles_are_inheritable,
66630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      TRUE,    // The event will automatically reset to non-signaled state.
66640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      FALSE,   // The initial state is non-signalled.
66650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      NULL));  // The even is unnamed.
66660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);
66670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String filter_flag = String::Format("--%s%s=%s.%s",
66680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                            GTEST_FLAG_PREFIX_, kFilterFlag,
66690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                            info->test_case_name(),
66700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                            info->name());
66710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String internal_flag = String::Format(
66720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    "--%s%s=%s|%d|%d|%u|%Iu|%Iu",
66730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      GTEST_FLAG_PREFIX_,
66740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      kInternalRunDeathTestFlag,
66750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      file_, line_,
66760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      death_test_index,
66770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      static_cast<unsigned int>(::GetCurrentProcessId()),
66780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // size_t has the same with as pointers on both 32-bit and 64-bit
66790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // Windows platforms.
66800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.
66810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      reinterpret_cast<size_t>(write_handle),
66820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      reinterpret_cast<size_t>(event_handle_.Get()));
66830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
66840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char executable_path[_MAX_PATH + 1];  // NOLINT
66850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DEATH_TEST_CHECK_(
66860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,
66870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                            executable_path,
66880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                            _MAX_PATH));
66890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
66900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  String command_line = String::Format("%s %s \"%s\"",
66910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                       ::GetCommandLineA(),
66920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                       filter_flag.c_str(),
66930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                       internal_flag.c_str());
66940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
66950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  DeathTest::set_last_death_test_message("");
66960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
66970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  CaptureStderr();
66980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Flush the log buffers since the log streams are shared with the child.
66990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  FlushInfoLog();
67000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
67010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The child process will share the standard handles with the parent.
67020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  STARTUPINFOA startup_info;
67030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  memset(&startup_info, 0, sizeof(STARTUPINFO));
67040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  startup_info.dwFlags = STARTF_USESTDHANDLES;
67050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
67060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
67070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
67080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
67090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  PROCESS_INFORMATION process_info;
67100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DEATH_TEST_CHECK_(::CreateProcessA(
67110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      executable_path,
67120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      const_cast<char*>(command_line.c_str()),
67130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      NULL,   // Retuned process handle is not inheritable.
67140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      NULL,   // Retuned thread handle is not inheritable.
67150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      TRUE,   // Child inherits all inheritable handles (for write_handle_).
67160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      0x0,    // Default creation flags.
67170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      NULL,   // Inherit the parent's environment.
67180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      UnitTest::GetInstance()->original_working_dir(),
67190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      &startup_info,
67200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      &process_info) != FALSE);
67210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  child_handle_.Reset(process_info.hProcess);
67220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ::CloseHandle(process_info.hThread);
67230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  set_spawned(true);
67240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return OVERSEE_TEST;
67250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
67260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else  // We are not on Windows.
67270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
67280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// ForkingDeathTest provides implementations for most of the abstract
67290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// methods of the DeathTest interface.  Only the AssumeRole method is
67300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// left undefined.
67310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass ForkingDeathTest : public DeathTestImpl {
67320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
67330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ForkingDeathTest(const char* statement, const RE* regex);
67340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
67350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // All of these virtual functions are inherited from DeathTest.
67360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual int Wait();
67370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
67380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson protected:
67390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
67400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
67410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
67420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // PID of child process during death test; 0 in the child process itself.
67430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  pid_t child_pid_;
67440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
67450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
67460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Constructs a ForkingDeathTest.
67470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)
67480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    : DeathTestImpl(a_statement, a_regex),
67490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      child_pid_(-1) {}
67500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
67510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Waits for the child in a death test to exit, returning its exit
67520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// status, or 0 if no child process exists.  As a side effect, sets the
67530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// outcome data member.
67540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint ForkingDeathTest::Wait() {
67550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!spawned())
67560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return 0;
67570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
67580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ReadAndInterpretStatusByte();
67590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
67600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int status_value;
67610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
67620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  set_status(status_value);
67630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return status_value;
67640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
67650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
67660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A concrete death test class that forks, then immediately runs the test
67670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// in the child process.
67680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass NoExecDeathTest : public ForkingDeathTest {
67690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
67700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  NoExecDeathTest(const char* a_statement, const RE* a_regex) :
67710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ForkingDeathTest(a_statement, a_regex) { }
67720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual TestRole AssumeRole();
67730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
67740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
67750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The AssumeRole process for a fork-and-run death test.  It implements a
67760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// straightforward fork, with a simple pipe to transmit the status byte.
67770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonDeathTest::TestRole NoExecDeathTest::AssumeRole() {
67780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const size_t thread_count = GetThreadCount();
67790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (thread_count != 1) {
67800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
67810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
67820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
67830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int pipe_fd[2];
67840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
67850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
67860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  DeathTest::set_last_death_test_message("");
67870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  CaptureStderr();
67880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // When we fork the process below, the log file buffers are copied, but the
67890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // file descriptors are shared.  We flush all log files here so that closing
67900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // the file descriptors in the child process doesn't throw off the
67910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // synchronization between descriptors and buffers in the parent process.
67920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // This is as close to the fork as possible to avoid a race condition in case
67930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // there are multiple threads running before the death test, and another
67940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // thread writes to the log file.
67950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  FlushInfoLog();
67960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
67970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const pid_t child_pid = fork();
67980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
67990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  set_child_pid(child_pid);
68000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (child_pid == 0) {
68010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
68020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    set_write_fd(pipe_fd[1]);
68030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Redirects all logging to stderr in the child process to prevent
68040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // concurrent writes to the log files.  We capture stderr in the parent
68050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // process and append the child process' output to a log.
68060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    LogToStderr();
68070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // Event forwarding to the listeners of event listener API mush be shut
68080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // down in death test subprocesses.
68090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GetUnitTestImpl()->listeners()->SuppressEventForwarding();
68100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return EXECUTE_TEST;
68110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
68120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
68130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    set_read_fd(pipe_fd[0]);
68140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    set_spawned(true);
68150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return OVERSEE_TEST;
68160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
68170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
68180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
68190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A concrete death test class that forks and re-executes the main
68200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// program from the beginning, with command-line flags set that cause
68210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// only this specific death test to be run.
68220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass ExecDeathTest : public ForkingDeathTest {
68230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
68240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ExecDeathTest(const char* a_statement, const RE* a_regex,
68250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                const char* file, int line) :
68260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
68270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  virtual TestRole AssumeRole();
68280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
68290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The name of the file in which the death test is located.
68300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const file_;
68310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The line number on which the death test is located.
68320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int line_;
68330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
68340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
68350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Utility class for accumulating command-line arguments.
68360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass Arguments {
68370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
68380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Arguments() {
68390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    args_.push_back(NULL);
68400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
68410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
68420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ~Arguments() {
68430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
68440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         ++i) {
68450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      free(*i);
68460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
68470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
68480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void AddArgument(const char* argument) {
68490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    args_.insert(args_.end() - 1, posix::StrDup(argument));
68500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
68510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
68520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  template <typename Str>
68530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  void AddArguments(const ::std::vector<Str>& arguments) {
68540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
68550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         i != arguments.end();
68560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         ++i) {
68570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
68580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
68590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
68600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char* const* Argv() {
68610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return &args_[0];
68620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
68630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
68640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  std::vector<char*> args_;
68650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
68660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
68670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A struct that encompasses the arguments to the child process of a
68680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// threadsafe-style death test process.
68690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstruct ExecDeathTestArgs {
68700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char* const* argv;  // Command-line arguments for the child's call to exec
68710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int close_fd;       // File descriptor to close; the read end of a pipe
68720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
68730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
68740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_MAC
68750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsoninline char** GetEnviron() {
68760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // When Google Test is built as a framework on MacOS X, the environ variable
68770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // is unavailable. Apple's documentation (man environ) recommends using
68780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // _NSGetEnviron() instead.
68790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return *_NSGetEnviron();
68800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
68810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
68820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Some POSIX platforms expect you to declare environ. extern "C" makes
68830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// it reside in the global namespace.
68840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonextern "C" char** environ;
68850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsoninline char** GetEnviron() { return environ; }
68860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_MAC
68870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
68880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The main function for a threadsafe-style death test child process.
68890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This function is called in a clone()-ed process and thus must avoid
68900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// any potentially unsafe operations like malloc or libc functions.
68910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic int ExecDeathTestChildMain(void* child_arg) {
68920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
68930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
68940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
68950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // We need to execute the test program in the same environment where
68960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // it was originally invoked.  Therefore we change to the original
68970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // working directory first.
68980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const original_dir =
68990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      UnitTest::GetInstance()->original_working_dir();
69000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // We can safely call chdir() as it's a direct system call.
69010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (chdir(original_dir) != 0) {
69020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    DeathTestAbort(String::Format("chdir(\"%s\") failed: %s",
69030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                  original_dir,
69040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                  GetLastErrnoDescription().c_str()));
69050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return EXIT_FAILURE;
69060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
69070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
69080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // We can safely call execve() as it's a direct system call.  We
69090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // cannot use execvp() as it's a libc function and thus potentially
69100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // unsafe.  Since execve() doesn't search the PATH, the user must
69110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // invoke the test program via a valid path that contains at least
69120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // one path separator.
69130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  execve(args->argv[0], args->argv, GetEnviron());
69140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  DeathTestAbort(String::Format("execve(%s, ...) in %s failed: %s",
69150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                args->argv[0],
69160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                original_dir,
69170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                GetLastErrnoDescription().c_str()));
69180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return EXIT_FAILURE;
69190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
69200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
69210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Two utility routines that together determine the direction the stack
69220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// grows.
69230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This could be accomplished more elegantly by a single recursive
69240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// function, but we want to guard against the unlikely possibility of
69250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// a smart compiler optimizing the recursion away.
69260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool StackLowerThanAddress(const void* ptr) {
69270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int dummy;
69280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return &dummy < ptr;
69290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
69300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
69310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool StackGrowsDown() {
69320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int dummy;
69330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return StackLowerThanAddress(&dummy);
69340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
69350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
69360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A threadsafe implementation of fork(2) for threadsafe-style death tests
69370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// that uses clone(2).  It dies with an error message if anything goes
69380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// wrong.
69390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic pid_t ExecDeathTestFork(char* const* argv, int close_fd) {
69400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ExecDeathTestArgs args = { argv, close_fd };
69410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  pid_t child_pid = -1;
69420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
69430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_CLONE
69440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const bool use_fork = GTEST_FLAG(death_test_use_fork);
69450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
69460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!use_fork) {
69470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    static const bool stack_grows_down = StackGrowsDown();
69480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const size_t stack_size = getpagesize();
69490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
69500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
69510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                             MAP_ANON | MAP_PRIVATE, -1, 0);
69520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
69530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    void* const stack_top =
69540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        static_cast<char*>(stack) + (stack_grows_down ? stack_size : 0);
69550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
69560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
69570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
69580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
69590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
69600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
69610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const bool use_fork = true;
69620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_CLONE
69630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
69640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (use_fork && (child_pid = fork()) == 0) {
69650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ExecDeathTestChildMain(&args);
69660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      _exit(0);
69670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
69680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
69690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
69700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return child_pid;
69710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
69720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
69730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The AssumeRole process for a fork-and-exec death test.  It re-executes the
69740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// main program from the beginning, setting the --gtest_filter
69750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// and --gtest_internal_run_death_test flags to cause only the current
69760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// death test to be re-run.
69770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonDeathTest::TestRole ExecDeathTest::AssumeRole() {
69780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const UnitTestImpl* const impl = GetUnitTestImpl();
69790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const InternalRunDeathTestFlag* const flag =
69800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      impl->internal_run_death_test_flag();
69810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const TestInfo* const info = impl->current_test_info();
69820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int death_test_index = info->result()->death_test_count();
69830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
69840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (flag != NULL) {
69850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    set_write_fd(flag->write_fd());
69860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return EXECUTE_TEST;
69870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
69880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
69890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int pipe_fd[2];
69900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
69910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Clear the close-on-exec flag on the write end of the pipe, lest
69920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // it be closed when the child process does an exec:
69930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
69940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
69950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String filter_flag =
69960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      String::Format("--%s%s=%s.%s",
69970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                     GTEST_FLAG_PREFIX_, kFilterFlag,
69980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                     info->test_case_name(), info->name());
69990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String internal_flag =
70000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      String::Format("--%s%s=%s|%d|%d|%d",
70010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                     GTEST_FLAG_PREFIX_, kInternalRunDeathTestFlag,
70020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                     file_, line_, death_test_index, pipe_fd[1]);
70030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Arguments args;
70040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  args.AddArguments(GetArgvs());
70050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  args.AddArgument(filter_flag.c_str());
70060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  args.AddArgument(internal_flag.c_str());
70070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
70080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  DeathTest::set_last_death_test_message("");
70090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
70100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  CaptureStderr();
70110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // See the comment in NoExecDeathTest::AssumeRole for why the next line
70120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // is necessary.
70130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  FlushInfoLog();
70140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
70150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const pid_t child_pid = ExecDeathTestFork(args.Argv(), pipe_fd[0]);
70160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
70170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  set_child_pid(child_pid);
70180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  set_read_fd(pipe_fd[0]);
70190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  set_spawned(true);
70200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return OVERSEE_TEST;
70210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
70220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
70230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // !GTEST_OS_WINDOWS
70240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
70250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Creates a concrete DeathTest-derived class that depends on the
70260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// --gtest_death_test_style flag, and sets the pointer pointed to
70270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// by the "test" argument to its address.  If the test should be
70280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// skipped, sets that pointer to NULL.  Returns true, unless the
70290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// flag is set to an invalid value.
70300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
70310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                     const char* file, int line,
70320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                     DeathTest** test) {
70330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  UnitTestImpl* const impl = GetUnitTestImpl();
70340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const InternalRunDeathTestFlag* const flag =
70350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      impl->internal_run_death_test_flag();
70360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int death_test_index = impl->current_test_info()
70370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ->increment_death_test_count();
70380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
70390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (flag != NULL) {
70400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (death_test_index > flag->index()) {
70410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      DeathTest::set_last_death_test_message(String::Format(
70420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          "Death test count (%d) somehow exceeded expected maximum (%d)",
70430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          death_test_index, flag->index()));
70440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return false;
70450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
70460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
70470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (!(flag->file() == file && flag->line() == line &&
70480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          flag->index() == death_test_index)) {
70490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      *test = NULL;
70500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return true;
70510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
70520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
70530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
70540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
70550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (GTEST_FLAG(death_test_style) == "threadsafe" ||
70560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      GTEST_FLAG(death_test_style) == "fast") {
70570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    *test = new WindowsDeathTest(statement, regex, file, line);
70580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
70590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
70600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (GTEST_FLAG(death_test_style) == "threadsafe") {
70610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    *test = new ExecDeathTest(statement, regex, file, line);
70620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else if (GTEST_FLAG(death_test_style) == "fast") {
70630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    *test = new NoExecDeathTest(statement, regex);
70640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
70650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
70660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  else {  // NOLINT - this is more readable than unbalanced brackets inside #if.
70670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    DeathTest::set_last_death_test_message(String::Format(
70680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        "Unknown death test style \"%s\" encountered",
70690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        GTEST_FLAG(death_test_style).c_str()));
70700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return false;
70710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
70720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
70730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return true;
70740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
70750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
70760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Splits a given string on a given delimiter, populating a given
70770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// vector with the fields.  GTEST_HAS_DEATH_TEST implies that we have
70780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// ::std::string, so we can use it here.
70790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic void SplitString(const ::std::string& str, char delimiter,
70800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                        ::std::vector< ::std::string>* dest) {
70810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ::std::vector< ::std::string> parsed;
70820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ::std::string::size_type pos = 0;
70830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  while (::testing::internal::AlwaysTrue()) {
70840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const ::std::string::size_type colon = str.find(delimiter, pos);
70850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (colon == ::std::string::npos) {
70860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      parsed.push_back(str.substr(pos));
70870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      break;
70880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } else {
70890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      parsed.push_back(str.substr(pos, colon - pos));
70900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      pos = colon + 1;
70910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
70920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
70930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  dest->swap(parsed);
70940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
70950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
70960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
70970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Recreates the pipe and event handles from the provided parameters,
70980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// signals the event, and returns a file descriptor wrapped around the pipe
70990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// handle. This function is called in the child process only.
71000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint GetStatusFileDescriptor(unsigned int parent_process_id,
71010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                            size_t write_handle_as_size_t,
71020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                            size_t event_handle_as_size_t) {
71030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
71040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                   FALSE,  // Non-inheritable.
71050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                   parent_process_id));
71060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
71070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    DeathTestAbort(String::Format("Unable to open parent process %u",
71080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                  parent_process_id));
71090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
71100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
71110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // TODO(vladl@google.com): Replace the following check with a
71120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // compile-time assertion when available.
71130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
71140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
71150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const HANDLE write_handle =
71160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      reinterpret_cast<HANDLE>(write_handle_as_size_t);
71170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  HANDLE dup_write_handle;
71180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
71190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The newly initialized handle is accessible only in in the parent
71200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // process. To obtain one accessible within the child, we need to use
71210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // DuplicateHandle.
71220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
71230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                         ::GetCurrentProcess(), &dup_write_handle,
71240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                         0x0,    // Requested privileges ignored since
71250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                 // DUPLICATE_SAME_ACCESS is used.
71260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                         FALSE,  // Request non-inheritable handler.
71270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                         DUPLICATE_SAME_ACCESS)) {
71280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    DeathTestAbort(String::Format(
71290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        "Unable to duplicate the pipe handle %Iu from the parent process %u",
71300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        write_handle_as_size_t, parent_process_id));
71310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
71320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
71330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
71340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  HANDLE dup_event_handle;
71350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
71360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
71370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                         ::GetCurrentProcess(), &dup_event_handle,
71380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                         0x0,
71390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                         FALSE,
71400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                         DUPLICATE_SAME_ACCESS)) {
71410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    DeathTestAbort(String::Format(
71420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        "Unable to duplicate the event handle %Iu from the parent process %u",
71430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        event_handle_as_size_t, parent_process_id));
71440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
71450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
71460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int write_fd =
71470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
71480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (write_fd == -1) {
71490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    DeathTestAbort(String::Format(
71500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        "Unable to convert pipe handle %Iu to a file descriptor",
71510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        write_handle_as_size_t));
71520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
71530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
71540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Signals the parent that the write end of the pipe has been acquired
71550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // so the parent can release its own write end.
71560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ::SetEvent(dup_event_handle);
71570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
71580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return write_fd;
71590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
71600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
71610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
71620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns a newly created InternalRunDeathTestFlag object with fields
71630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// initialized from the GTEST_FLAG(internal_run_death_test) flag if
71640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the flag is specified; otherwise returns NULL.
71650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonInternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
71660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
71670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
71680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
71690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // can use it here.
71700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int line = -1;
71710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int index = -1;
71720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ::std::vector< ::std::string> fields;
71730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);
71740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int write_fd = -1;
71750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
71760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
71770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  unsigned int parent_process_id = 0;
71780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  size_t write_handle_as_size_t = 0;
71790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  size_t event_handle_as_size_t = 0;
71800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
71810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (fields.size() != 6
71820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      || !ParseNaturalNumber(fields[1], &line)
71830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      || !ParseNaturalNumber(fields[2], &index)
71840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      || !ParseNaturalNumber(fields[3], &parent_process_id)
71850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
71860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
71870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    DeathTestAbort(String::Format(
71880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        "Bad --gtest_internal_run_death_test flag: %s",
71890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        GTEST_FLAG(internal_run_death_test).c_str()));
71900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
71910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  write_fd = GetStatusFileDescriptor(parent_process_id,
71920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                     write_handle_as_size_t,
71930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                     event_handle_as_size_t);
71940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
71950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (fields.size() != 4
71960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      || !ParseNaturalNumber(fields[1], &line)
71970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      || !ParseNaturalNumber(fields[2], &index)
71980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      || !ParseNaturalNumber(fields[3], &write_fd)) {
71990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    DeathTestAbort(String::Format(
72000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        "Bad --gtest_internal_run_death_test flag: %s",
72010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        GTEST_FLAG(internal_run_death_test).c_str()));
72020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
72030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
72040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
72050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
72060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
72070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
72080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
72090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_DEATH_TEST
72100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
72110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace testing
72120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Copyright 2008, Google Inc.
72130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// All rights reserved.
72140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
72150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Redistribution and use in source and binary forms, with or without
72160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// modification, are permitted provided that the following conditions are
72170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// met:
72180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
72190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Redistributions of source code must retain the above copyright
72200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// notice, this list of conditions and the following disclaimer.
72210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Redistributions in binary form must reproduce the above
72220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// copyright notice, this list of conditions and the following disclaimer
72230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// in the documentation and/or other materials provided with the
72240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// distribution.
72250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Neither the name of Google Inc. nor the names of its
72260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// contributors may be used to endorse or promote products derived from
72270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// this software without specific prior written permission.
72280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
72290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
72300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
72310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
72320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
72330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
72340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
72350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
72360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
72370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
72380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
72390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
72400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
72410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Authors: keith.ray@gmail.com (Keith Ray)
72420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
72430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
72440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <stdlib.h>
72450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
72460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS_MOBILE
72470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <windows.h>
72480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#elif GTEST_OS_WINDOWS
72490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <direct.h>
72500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <io.h>
72510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#elif GTEST_OS_SYMBIAN
72520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Symbian OpenC has PATH_MAX in sys/syslimits.h
72530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <sys/syslimits.h>
72540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
72550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <limits.h>
72560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <climits>  // Some Linux distributions define PATH_MAX here.
72570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS_MOBILE
72580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
72590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
72600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_PATH_MAX_ _MAX_PATH
72610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#elif defined(PATH_MAX)
72620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_PATH_MAX_ PATH_MAX
72630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#elif defined(_XOPEN_PATH_MAX)
72640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_PATH_MAX_ _XOPEN_PATH_MAX
72650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
72660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_PATH_MAX_ _POSIX_PATH_MAX
72670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
72680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
72690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
72700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace testing {
72710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
72720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
72730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
72740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// On Windows, '\\' is the standard path separator, but many tools and the
72750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Windows API also accept '/' as an alternate path separator. Unless otherwise
72760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// noted, a file path can contain either kind of path separators, or a mixture
72770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// of them.
72780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kPathSeparator = '\\';
72790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kAlternatePathSeparator = '/';
72800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kPathSeparatorString[] = "\\";
72810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kAlternatePathSeparatorString[] = "/";
72820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS_MOBILE
72830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Windows CE doesn't have a current directory. You should not use
72840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the current directory in tests on Windows CE, but this at least
72850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// provides a reasonable fallback.
72860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kCurrentDirectoryString[] = "\\";
72870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Windows CE doesn't define INVALID_FILE_ATTRIBUTES
72880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst DWORD kInvalidFileAttributes = 0xffffffff;
72890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
72900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kCurrentDirectoryString[] = ".\\";
72910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS_MOBILE
72920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
72930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kPathSeparator = '/';
72940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kPathSeparatorString[] = "/";
72950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char kCurrentDirectoryString[] = "./";
72960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
72970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
72980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns whether the given character is a valid path separator.
72990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic bool IsPathSeparator(char c) {
73000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_ALT_PATH_SEP_
73010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return (c == kPathSeparator) || (c == kAlternatePathSeparator);
73020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
73030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return c == kPathSeparator;
73040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif
73050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
73060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
73070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the current working directory, or "" if unsuccessful.
73080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonFilePath FilePath::GetCurrentDir() {
73090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS_MOBILE
73100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Windows CE doesn't have a current directory, so we just return
73110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // something reasonable.
73120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return FilePath(kCurrentDirectoryString);
73130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#elif GTEST_OS_WINDOWS
73140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
73150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
73160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
73170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
73180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
73190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS_MOBILE
73200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
73210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
73220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns a copy of the FilePath with the case-insensitive extension removed.
73230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
73240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// FilePath("dir/file"). If a case-insensitive extension is not
73250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// found, returns a copy of the original FilePath.
73260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonFilePath FilePath::RemoveExtension(const char* extension) const {
73270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  String dot_extension(String::Format(".%s", extension));
73280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (pathname_.EndsWithCaseInsensitive(dot_extension.c_str())) {
73290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return FilePath(String(pathname_.c_str(), pathname_.length() - 4));
73300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
73310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return *this;
73320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
73330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
73340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns a pointer to the last occurence of a valid path separator in
73350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the FilePath. On Windows, for example, both '/' and '\' are valid path
73360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// separators. Returns NULL if no path separator was found.
73370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char* FilePath::FindLastPathSeparator() const {
73380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const last_sep = strrchr(c_str(), kPathSeparator);
73390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_ALT_PATH_SEP_
73400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);
73410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Comparing two pointers of which only one is NULL is undefined.
73420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (last_alt_sep != NULL &&
73430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      (last_sep == NULL || last_alt_sep > last_sep)) {
73440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return last_alt_sep;
73450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
73460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif
73470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return last_sep;
73480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
73490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
73500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns a copy of the FilePath with the directory part removed.
73510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Example: FilePath("path/to/file").RemoveDirectoryName() returns
73520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// FilePath("file"). If there is no directory part ("just_a_file"), it returns
73530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the FilePath unmodified. If there is no file part ("just_a_dir/") it
73540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// returns an empty FilePath ("").
73550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// On Windows platform, '\' is the path separator, otherwise it is '/'.
73560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonFilePath FilePath::RemoveDirectoryName() const {
73570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const last_sep = FindLastPathSeparator();
73580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return last_sep ? FilePath(String(last_sep + 1)) : *this;
73590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
73600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
73610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// RemoveFileName returns the directory path with the filename removed.
73620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
73630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
73640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
73650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
73660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// On Windows platform, '\' is the path separator, otherwise it is '/'.
73670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonFilePath FilePath::RemoveFileName() const {
73680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const last_sep = FindLastPathSeparator();
73690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  String dir;
73700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (last_sep) {
73710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    dir = String(c_str(), last_sep + 1 - c_str());
73720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
73730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    dir = kCurrentDirectoryString;
73740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
73750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return FilePath(dir);
73760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
73770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
73780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Helper functions for naming files in a directory for xml output.
73790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
73800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Given directory = "dir", base_name = "test", number = 0,
73810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// extension = "xml", returns "dir/test.xml". If number is greater
73820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// than zero (e.g., 12), returns "dir/test_12.xml".
73830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// On Windows platform, uses \ as the separator rather than /.
73840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonFilePath FilePath::MakeFileName(const FilePath& directory,
73850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                const FilePath& base_name,
73860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                int number,
73870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                const char* extension) {
73880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  String file;
73890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (number == 0) {
73900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    file = String::Format("%s.%s", base_name.c_str(), extension);
73910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
73920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    file = String::Format("%s_%d.%s", base_name.c_str(), number, extension);
73930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
73940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return ConcatPaths(directory, FilePath(file));
73950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
73960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
73970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml".
73980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// On Windows, uses \ as the separator rather than /.
73990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonFilePath FilePath::ConcatPaths(const FilePath& directory,
74000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                               const FilePath& relative_path) {
74010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (directory.IsEmpty())
74020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return relative_path;
74030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const FilePath dir(directory.RemoveTrailingPathSeparator());
74040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return FilePath(String::Format("%s%c%s", dir.c_str(), kPathSeparator,
74050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                 relative_path.c_str()));
74060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
74070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
74080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true if pathname describes something findable in the file-system,
74090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// either a file, directory, or whatever.
74100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool FilePath::FileOrDirectoryExists() const {
74110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS_MOBILE
74120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());
74130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const DWORD attributes = GetFileAttributes(unicode);
74140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  delete [] unicode;
74150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return attributes != kInvalidFileAttributes;
74160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
74170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  posix::StatStruct file_stat;
74180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return posix::Stat(pathname_.c_str(), &file_stat) == 0;
74190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS_MOBILE
74200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
74210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
74220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true if pathname describes a directory in the file-system
74230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// that exists.
74240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool FilePath::DirectoryExists() const {
74250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool result = false;
74260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
74270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Don't strip off trailing separator if path is a root directory on
74280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Windows (like "C:\\").
74290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const FilePath& path(IsRootDirectory() ? *this :
74300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                           RemoveTrailingPathSeparator());
74310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
74320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const FilePath& path(*this);
74330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif
74340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
74350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS_MOBILE
74360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  LPCWSTR unicode = String::AnsiToUtf16(path.c_str());
74370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const DWORD attributes = GetFileAttributes(unicode);
74380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  delete [] unicode;
74390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if ((attributes != kInvalidFileAttributes) &&
74400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      (attributes & FILE_ATTRIBUTE_DIRECTORY)) {
74410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    result = true;
74420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
74430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
74440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  posix::StatStruct file_stat;
74450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  result = posix::Stat(path.c_str(), &file_stat) == 0 &&
74460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      posix::IsDir(file_stat);
74470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS_MOBILE
74480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
74490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return result;
74500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
74510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
74520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true if pathname describes a root directory. (Windows has one
74530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// root directory per disk drive.)
74540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool FilePath::IsRootDirectory() const {
74550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
74560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // TODO(wan@google.com): on Windows a network share like
74570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // \\server\share can be a root directory, although it cannot be the
74580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // current directory.  Handle this properly.
74590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return pathname_.length() == 3 && IsAbsolutePath();
74600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
74610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);
74620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif
74630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
74640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
74650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true if pathname describes an absolute path.
74660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool FilePath::IsAbsolutePath() const {
74670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const name = pathname_.c_str();
74680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
74690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return pathname_.length() >= 3 &&
74700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson     ((name[0] >= 'a' && name[0] <= 'z') ||
74710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      (name[0] >= 'A' && name[0] <= 'Z')) &&
74720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson     name[1] == ':' &&
74730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson     IsPathSeparator(name[2]);
74740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
74750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return IsPathSeparator(name[0]);
74760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif
74770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
74780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
74790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns a pathname for a file that does not currently exist. The pathname
74800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// will be directory/base_name.extension or
74810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// directory/base_name_<number>.extension if directory/base_name.extension
74820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// already exists. The number will be incremented until a pathname is found
74830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// that does not already exist.
74840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
74850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// There could be a race condition if two or more processes are calling this
74860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// function at the same time -- they could both pick the same filename.
74870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonFilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
74880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                          const FilePath& base_name,
74890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                          const char* extension) {
74900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  FilePath full_pathname;
74910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int number = 0;
74920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  do {
74930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    full_pathname.Set(MakeFileName(directory, base_name, number++, extension));
74940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } while (full_pathname.FileOrDirectoryExists());
74950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return full_pathname;
74960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
74970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
74980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true if FilePath ends with a path separator, which indicates that
74990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// it is intended to represent a directory. Returns false otherwise.
75000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// This does NOT check that a directory (or file) actually exists.
75010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool FilePath::IsDirectory() const {
75020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return !pathname_.empty() &&
75030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);
75040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
75050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
75060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Create directories so that path exists. Returns true if successful or if
75070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the directories already exist; returns false if unable to create directories
75080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// for any reason.
75090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool FilePath::CreateDirectoriesRecursively() const {
75100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!this->IsDirectory()) {
75110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return false;
75120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
75130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
75140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (pathname_.length() == 0 || this->DirectoryExists()) {
75150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return true;
75160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
75170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
75180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());
75190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return parent.CreateDirectoriesRecursively() && this->CreateFolder();
75200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
75210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
75220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Create the directory so that path exists. Returns true if successful or
75230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// if the directory already exists; returns false if unable to create the
75240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// directory for any reason, including if the parent directory does not
75250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// exist. Not named "CreateDirectory" because that's a macro on Windows.
75260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool FilePath::CreateFolder() const {
75270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS_MOBILE
75280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  FilePath removed_sep(this->RemoveTrailingPathSeparator());
75290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());
75300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int result = CreateDirectory(unicode, NULL) ? 0 : -1;
75310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  delete [] unicode;
75320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#elif GTEST_OS_WINDOWS
75330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int result = _mkdir(pathname_.c_str());
75340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
75350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int result = mkdir(pathname_.c_str(), 0777);
75360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS_MOBILE
75370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
75380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (result == -1) {
75390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return this->DirectoryExists();  // An error is OK if the directory exists.
75400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
75410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return true;  // No error.
75420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
75430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
75440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// If input name has a trailing separator character, remove it and return the
75450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// name, otherwise return the name string unmodified.
75460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// On Windows platform, uses \ as the separator, other platforms use /.
75470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonFilePath FilePath::RemoveTrailingPathSeparator() const {
75480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return IsDirectory()
75490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ? FilePath(String(pathname_.c_str(), pathname_.length() - 1))
75500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      : *this;
75510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
75520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
75530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Removes any redundant separators that might be in the pathname.
75540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
75550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// redundancies that might be in a pathname involving "." or "..".
75560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// TODO(wan@google.com): handle Windows network shares (e.g. \\server\share).
75570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid FilePath::Normalize() {
75580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (pathname_.c_str() == NULL) {
75590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    pathname_ = "";
75600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return;
75610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
75620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* src = pathname_.c_str();
75630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char* const dest = new char[pathname_.length() + 1];
75640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char* dest_ptr = dest;
75650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  memset(dest_ptr, 0, pathname_.length() + 1);
75660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
75670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  while (*src != '\0') {
75680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    *dest_ptr = *src;
75690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (!IsPathSeparator(*src)) {
75700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      src++;
75710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } else {
75720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_ALT_PATH_SEP_
75730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if (*dest_ptr == kAlternatePathSeparator) {
75740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        *dest_ptr = kPathSeparator;
75750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      }
75760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif
75770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      while (IsPathSeparator(*src))
75780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        src++;
75790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
75800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    dest_ptr++;
75810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
75820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  *dest_ptr = '\0';
75830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  pathname_ = dest;
75840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  delete[] dest;
75850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
75860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
75870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
75880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace testing
75890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Copyright 2008, Google Inc.
75900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// All rights reserved.
75910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
75920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Redistribution and use in source and binary forms, with or without
75930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// modification, are permitted provided that the following conditions are
75940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// met:
75950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
75960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Redistributions of source code must retain the above copyright
75970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// notice, this list of conditions and the following disclaimer.
75980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Redistributions in binary form must reproduce the above
75990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// copyright notice, this list of conditions and the following disclaimer
76000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// in the documentation and/or other materials provided with the
76010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// distribution.
76020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Neither the name of Google Inc. nor the names of its
76030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// contributors may be used to endorse or promote products derived from
76040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// this software without specific prior written permission.
76050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
76060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
76070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
76080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
76090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
76100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
76110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
76120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
76130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
76140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
76150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
76160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
76170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
76180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Author: wan@google.com (Zhanyong Wan)
76190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
76200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
76210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <limits.h>
76220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <stdlib.h>
76230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <stdio.h>
76240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
76250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS_MOBILE
76260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <windows.h>  // For TerminateProcess()
76270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#elif GTEST_OS_WINDOWS
76280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <io.h>
76290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <sys/stat.h>
76300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
76310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <unistd.h>
76320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS_MOBILE
76330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
76340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_MAC
76350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <mach/mach_init.h>
76360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <mach/task.h>
76370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#include <mach/vm_map.h>
76380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_MAC
76390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
76400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
76410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Indicates that this translation unit is part of Google Test's
76420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// implementation.  It must come before gtest-internal-inl.h is
76430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// included, or there will be a compiler error.  This trick is to
76440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// prevent a user from accidentally including gtest-internal-inl.h in
76450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// his code.
76460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_IMPLEMENTATION_ 1
76470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#undef GTEST_IMPLEMENTATION_
76480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
76490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace testing {
76500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
76510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
76520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if defined(_MSC_VER) || defined(__BORLANDC__)
76530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// MSVC and C++Builder do not provide a definition of STDERR_FILENO.
76540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst int kStdOutFileno = 1;
76550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst int kStdErrFileno = 2;
76560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
76570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst int kStdOutFileno = STDOUT_FILENO;
76580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst int kStdErrFileno = STDERR_FILENO;
76590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // _MSC_VER
76600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
76610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_MAC
76620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
76630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the number of threads running in the process, or 0 to indicate that
76640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// we cannot detect it.
76650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonsize_t GetThreadCount() {
76660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const task_t task = mach_task_self();
76670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  mach_msg_type_number_t thread_count;
76680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  thread_act_array_t thread_list;
76690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const kern_return_t status = task_threads(task, &thread_list, &thread_count);
76700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (status == KERN_SUCCESS) {
76710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // task_threads allocates resources in thread_list and we need to free them
76720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // to avoid leaks.
76730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    vm_deallocate(task,
76740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                  reinterpret_cast<vm_address_t>(thread_list),
76750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                  sizeof(thread_t) * thread_count);
76760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return static_cast<size_t>(thread_count);
76770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
76780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return 0;
76790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
76800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
76810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
76820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
76830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
76840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonsize_t GetThreadCount() {
76850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // There's no portable way to detect the number of threads, so we just
76860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // return 0 to indicate that we cannot detect it.
76870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return 0;
76880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
76890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
76900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_MAC
76910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
76920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_USES_POSIX_RE
76930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
76940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Implements RE.  Currently only needed for death tests.
76950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
76960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonRE::~RE() {
76970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (is_valid_) {
76980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // regfree'ing an invalid regex might crash because the content
76990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // of the regex is undefined. Since the regex's are essentially
77000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // the same, one cannot be valid (or invalid) without the other
77010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // being so too.
77020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    regfree(&partial_regex_);
77030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    regfree(&full_regex_);
77040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
77050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  free(const_cast<char*>(pattern_));
77060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
77070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
77080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff regular expression re matches the entire str.
77090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool RE::FullMatch(const char* str, const RE& re) {
77100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!re.is_valid_) return false;
77110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
77120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  regmatch_t match;
77130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return regexec(&re.full_regex_, str, 1, &match, 0) == 0;
77140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
77150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
77160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff regular expression re matches a substring of str
77170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// (including str itself).
77180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool RE::PartialMatch(const char* str, const RE& re) {
77190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!re.is_valid_) return false;
77200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
77210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  regmatch_t match;
77220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;
77230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
77240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
77250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Initializes an RE from its string representation.
77260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid RE::Init(const char* regex) {
77270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  pattern_ = posix::StrDup(regex);
77280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
77290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Reserves enough bytes to hold the regular expression used for a
77300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // full match.
77310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const size_t full_regex_len = strlen(regex) + 10;
77320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char* const full_pattern = new char[full_regex_len];
77330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
77340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  snprintf(full_pattern, full_regex_len, "^(%s)$", regex);
77350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;
77360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // We want to call regcomp(&partial_regex_, ...) even if the
77370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // previous expression returns false.  Otherwise partial_regex_ may
77380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // not be properly initialized can may cause trouble when it's
77390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // freed.
77400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  //
77410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Some implementation of POSIX regex (e.g. on at least some
77420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // versions of Cygwin) doesn't accept the empty string as a valid
77430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // regex.  We change it to an equivalent form "()" to be safe.
77440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (is_valid_) {
77450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* const partial_regex = (*regex == '\0') ? "()" : regex;
77460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;
77470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
77480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  EXPECT_TRUE(is_valid_)
77490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "Regular expression \"" << regex
77500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << "\" is not a valid POSIX Extended regular expression.";
77510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
77520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  delete[] full_pattern;
77530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
77540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
77550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#elif GTEST_USES_SIMPLE_RE
77560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
77570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff ch appears anywhere in str (excluding the
77580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// terminating '\0' character).
77590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool IsInSet(char ch, const char* str) {
77600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return ch != '\0' && strchr(str, ch) != NULL;
77610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
77620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
77630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff ch belongs to the given classification.  Unlike
77640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// similar functions in <ctype.h>, these aren't affected by the
77650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// current locale.
77660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool IsDigit(char ch) { return '0' <= ch && ch <= '9'; }
77670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool IsPunct(char ch) {
77680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~");
77690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
77700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
77710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool IsWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
77720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool IsWordChar(char ch) {
77730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||
77740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ('0' <= ch && ch <= '9') || ch == '_';
77750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
77760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
77770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff "\\c" is a supported escape sequence.
77780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool IsValidEscape(char c) {
77790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return (IsPunct(c) || IsInSet(c, "dDfnrsStvwW"));
77800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
77810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
77820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff the given atom (specified by escaped and pattern)
77830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// matches ch.  The result is undefined if the atom is invalid.
77840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
77850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (escaped) {  // "\\p" where p is pattern_char.
77860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    switch (pattern_char) {
77870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      case 'd': return IsDigit(ch);
77880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      case 'D': return !IsDigit(ch);
77890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      case 'f': return ch == '\f';
77900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      case 'n': return ch == '\n';
77910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      case 'r': return ch == '\r';
77920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      case 's': return IsWhiteSpace(ch);
77930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      case 'S': return !IsWhiteSpace(ch);
77940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      case 't': return ch == '\t';
77950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      case 'v': return ch == '\v';
77960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      case 'w': return IsWordChar(ch);
77970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      case 'W': return !IsWordChar(ch);
77980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
77990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return IsPunct(pattern_char) && pattern_char == ch;
78000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
78010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
78020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return (pattern_char == '.' && ch != '\n') || pattern_char == ch;
78030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
78040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
78050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Helper function used by ValidateRegex() to format error messages.
78060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString FormatRegexSyntaxError(const char* regex, int index) {
78070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return (Message() << "Syntax error at index " << index
78080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          << " in simple regular expression \"" << regex << "\": ").GetString();
78090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
78100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
78110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Generates non-fatal failures and returns false if regex is invalid;
78120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// otherwise returns true.
78130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool ValidateRegex(const char* regex) {
78140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (regex == NULL) {
78150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // TODO(wan@google.com): fix the source file location in the
78160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // assertion failures to match where the regex is used in user
78170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // code.
78180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ADD_FAILURE() << "NULL is not a valid simple regular expression.";
78190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return false;
78200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
78210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
78220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool is_valid = true;
78230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
78240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // True iff ?, *, or + can follow the previous atom.
78250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  bool prev_repeatable = false;
78260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (int i = 0; regex[i]; i++) {
78270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (regex[i] == '\\') {  // An escape sequence
78280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      i++;
78290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if (regex[i] == '\0') {
78300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
78310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      << "'\\' cannot appear at the end.";
78320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        return false;
78330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      }
78340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
78350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if (!IsValidEscape(regex[i])) {
78360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
78370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      << "invalid escape sequence \"\\" << regex[i] << "\".";
78380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        is_valid = false;
78390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      }
78400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      prev_repeatable = true;
78410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } else {  // Not an escape sequence.
78420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      const char ch = regex[i];
78430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
78440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if (ch == '^' && i > 0) {
78450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
78460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      << "'^' can only appear at the beginning.";
78470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        is_valid = false;
78480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      } else if (ch == '$' && regex[i + 1] != '\0') {
78490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
78500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      << "'$' can only appear at the end.";
78510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        is_valid = false;
78520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      } else if (IsInSet(ch, "()[]{}|")) {
78530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
78540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      << "'" << ch << "' is unsupported.";
78550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        is_valid = false;
78560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      } else if (IsRepeat(ch) && !prev_repeatable) {
78570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
78580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      << "'" << ch << "' can only follow a repeatable token.";
78590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        is_valid = false;
78600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      }
78610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
78620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      prev_repeatable = !IsInSet(ch, "^$?*+");
78630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
78640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
78650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
78660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return is_valid;
78670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
78680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
78690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Matches a repeated regex atom followed by a valid simple regular
78700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// expression.  The regex atom is defined as c if escaped is false,
78710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// or \c otherwise.  repeat is the repetition meta character (?, *,
78720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// or +).  The behavior is undefined if str contains too many
78730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// characters to be indexable by size_t, in which case the test will
78740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// probably time out anyway.  We are fine with this limitation as
78750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// std::string has it too.
78760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool MatchRepetitionAndRegexAtHead(
78770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    bool escaped, char c, char repeat, const char* regex,
78780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* str) {
78790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const size_t min_count = (repeat == '+') ? 1 : 0;
78800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const size_t max_count = (repeat == '?') ? 1 :
78810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      static_cast<size_t>(-1) - 1;
78820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // We cannot call numeric_limits::max() as it conflicts with the
78830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // max() macro on Windows.
78840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
78850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (size_t i = 0; i <= max_count; ++i) {
78860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // We know that the atom matches each of the first i characters in str.
78870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (i >= min_count && MatchRegexAtHead(regex, str + i)) {
78880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // We have enough matches at the head, and the tail matches too.
78890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // Since we only care about *whether* the pattern matches str
78900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // (as opposed to *how* it matches), there is no need to find a
78910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // greedy match.
78920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return true;
78930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
78940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i]))
78950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return false;
78960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
78970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return false;
78980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
78990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
79000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff regex matches a prefix of str.  regex must be a
79010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// valid simple regular expression and not start with "^", or the
79020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// result is undefined.
79030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool MatchRegexAtHead(const char* regex, const char* str) {
79040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (*regex == '\0')  // An empty regex matches a prefix of anything.
79050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return true;
79060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
79070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // "$" only matches the end of a string.  Note that regex being
79080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // valid guarantees that there's nothing after "$" in it.
79090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (*regex == '$')
79100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return *str == '\0';
79110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
79120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Is the first thing in regex an escape sequence?
79130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const bool escaped = *regex == '\\';
79140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (escaped)
79150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ++regex;
79160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (IsRepeat(regex[1])) {
79170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so
79180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // here's an indirect recursion.  It terminates as the regex gets
79190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // shorter in each recursion.
79200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return MatchRepetitionAndRegexAtHead(
79210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        escaped, regex[0], regex[1], regex + 2, str);
79220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } else {
79230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // regex isn't empty, isn't "$", and doesn't start with a
79240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // repetition.  We match the first atom of regex with the first
79250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // character of str and recurse.
79260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) &&
79270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        MatchRegexAtHead(regex + 1, str + 1);
79280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
79290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
79300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
79310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff regex matches any substring of str.  regex must be
79320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// a valid simple regular expression, or the result is undefined.
79330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
79340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The algorithm is recursive, but the recursion depth doesn't exceed
79350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the regex length, so we won't need to worry about running out of
79360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// stack space normally.  In rare cases the time complexity can be
79370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// exponential with respect to the regex length + the string length,
79380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// but usually it's must faster (often close to linear).
79390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool MatchRegexAnywhere(const char* regex, const char* str) {
79400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (regex == NULL || str == NULL)
79410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return false;
79420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
79430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (*regex == '^')
79440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return MatchRegexAtHead(regex + 1, str);
79450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
79460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // A successful match can be anywhere in str.
79470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  do {
79480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (MatchRegexAtHead(regex, str))
79490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return true;
79500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } while (*str++ != '\0');
79510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return false;
79520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
79530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
79540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Implements the RE class.
79550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
79560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonRE::~RE() {
79570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  free(const_cast<char*>(pattern_));
79580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  free(const_cast<char*>(full_pattern_));
79590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
79600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
79610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff regular expression re matches the entire str.
79620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool RE::FullMatch(const char* str, const RE& re) {
79630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);
79640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
79650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
79660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns true iff regular expression re matches a substring of str
79670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// (including str itself).
79680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool RE::PartialMatch(const char* str, const RE& re) {
79690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);
79700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
79710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
79720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Initializes an RE from its string representation.
79730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid RE::Init(const char* regex) {
79740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  pattern_ = full_pattern_ = NULL;
79750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (regex != NULL) {
79760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    pattern_ = posix::StrDup(regex);
79770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
79780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
79790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  is_valid_ = ValidateRegex(regex);
79800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!is_valid_) {
79810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // No need to calculate the full pattern when the regex is invalid.
79820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return;
79830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
79840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
79850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const size_t len = strlen(regex);
79860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Reserves enough bytes to hold the regular expression used for a
79870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // full match: we need space to prepend a '^', append a '$', and
79880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // terminate the string with '\0'.
79890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char* buffer = static_cast<char*>(malloc(len + 3));
79900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  full_pattern_ = buffer;
79910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
79920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (*regex != '^')
79930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    *buffer++ = '^';  // Makes sure full_pattern_ starts with '^'.
79940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
79950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // We don't use snprintf or strncpy, as they trigger a warning when
79960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // compiled with VC++ 8.0.
79970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  memcpy(buffer, regex, len);
79980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  buffer += len;
79990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
80000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (len == 0 || regex[len - 1] != '$')
80010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    *buffer++ = '$';  // Makes sure full_pattern_ ends with '$'.
80020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
80030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  *buffer = '\0';
80040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
80050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
80060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_USES_POSIX_RE
80070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
80080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
80090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)
80100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    : severity_(severity) {
80110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const marker =
80120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      severity == GTEST_INFO ?    "[  INFO ]" :
80130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      severity == GTEST_WARNING ? "[WARNING]" :
80140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      severity == GTEST_ERROR ?   "[ ERROR ]" : "[ FATAL ]";
80150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GetStream() << ::std::endl << marker << " "
80160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson              << FormatFileLocation(file, line).c_str() << ": ";
80170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
80180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
80190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
80200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTestLog::~GTestLog() {
80210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GetStream() << ::std::endl;
80220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (severity_ == GTEST_FATAL) {
80230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fflush(stderr);
80240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    posix::Abort();
80250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
80260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
80270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Disable Microsoft deprecation warnings for POSIX functions called from
80280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// this class (creat, dup, dup2, and close)
80290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#ifdef _MSC_VER
80300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#pragma warning(push)
80310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#pragma warning(disable: 4996)
80320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // _MSC_VER
80330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
80340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_STREAM_REDIRECTION_
80350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
80360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Object that captures an output stream (stdout/stderr).
80370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass CapturedStream {
80380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson public:
80390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // The ctor redirects the stream to a temporary file.
80400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
80410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS
80420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    char temp_dir_path[MAX_PATH + 1] = { '\0' };  // NOLINT
80430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    char temp_file_path[MAX_PATH + 1] = { '\0' };  // NOLINT
80440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
80450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);
80460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const UINT success = ::GetTempFileNameA(temp_dir_path,
80470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                            "gtest_redir",
80480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                            0,  // Generate unique file name.
80490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                            temp_file_path);
80500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_CHECK_(success != 0)
80510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << "Unable to create a temporary file in " << temp_dir_path;
80520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);
80530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file "
80540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                    << temp_file_path;
80550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    filename_ = temp_file_path;
80560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#else
80570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // There's no guarantee that a test has write access to the
80580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // current directory, so we create the temporary file in the /tmp
80590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // directory instead.
80600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    char name_template[] = "/tmp/captured_stream.XXXXXX";
80610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const int captured_fd = mkstemp(name_template);
80620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    filename_ = name_template;
80630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS
80640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fflush(NULL);
80650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    dup2(captured_fd, fd_);
80660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    close(captured_fd);
80670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
80680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
80690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ~CapturedStream() {
80700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    remove(filename_.c_str());
80710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
80720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
80730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  String GetCapturedString() {
80740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (uncaptured_fd_ != -1) {
80750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // Restores the original stream.
80760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      fflush(NULL);
80770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      dup2(uncaptured_fd_, fd_);
80780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      close(uncaptured_fd_);
80790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      uncaptured_fd_ = -1;
80800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
80810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
80820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    FILE* const file = posix::FOpen(filename_.c_str(), "r");
80830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const String content = ReadEntireFile(file);
80840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    posix::FClose(file);
80850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return content;
80860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
80870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
80880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson private:
80890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Reads the entire content of a file as a String.
80900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static String ReadEntireFile(FILE* file);
80910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
80920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Returns the size (in bytes) of a file.
80930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  static size_t GetFileSize(FILE* file);
80940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
80950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const int fd_;  // A stream to capture.
80960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  int uncaptured_fd_;
80970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Name of the temporary file holding the stderr output.
80980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ::std::string filename_;
80990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);
81010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson};
81020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the size (in bytes) of a file.
81040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonsize_t CapturedStream::GetFileSize(FILE* file) {
81050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fseek(file, 0, SEEK_END);
81060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return static_cast<size_t>(ftell(file));
81070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
81080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Reads the entire content of a file as a string.
81100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString CapturedStream::ReadEntireFile(FILE* file) {
81110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const size_t file_size = GetFileSize(file);
81120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char* const buffer = new char[file_size];
81130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  size_t bytes_last_read = 0;  // # of bytes read in the last fread()
81150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  size_t bytes_read = 0;       // # of bytes read so far
81160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  fseek(file, 0, SEEK_SET);
81180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Keeps reading the file until we cannot read further or the
81200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // pre-determined file size is reached.
81210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  do {
81220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
81230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    bytes_read += bytes_last_read;
81240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  } while (bytes_last_read > 0 && bytes_read < file_size);
81250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String content(buffer, bytes_read);
81270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  delete[] buffer;
81280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return content;
81300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
81310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#ifdef _MSC_VER
81330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#pragma warning(pop)
81340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // _MSC_VER
81350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic CapturedStream* g_captured_stderr = NULL;
81370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic CapturedStream* g_captured_stdout = NULL;
81380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Starts capturing an output stream (stdout/stderr).
81400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid CaptureStream(int fd, const char* stream_name, CapturedStream** stream) {
81410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (*stream != NULL) {
81420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    GTEST_LOG_(FATAL) << "Only one " << stream_name
81430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                      << " capturer can exist at a time.";
81440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
81450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  *stream = new CapturedStream(fd);
81460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
81470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Stops capturing the output stream and returns the captured string.
81490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString GetCapturedStream(CapturedStream** captured_stream) {
81500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String content = (*captured_stream)->GetCapturedString();
81510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  delete *captured_stream;
81530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  *captured_stream = NULL;
81540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return content;
81560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
81570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Starts capturing stdout.
81590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid CaptureStdout() {
81600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout);
81610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
81620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Starts capturing stderr.
81640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid CaptureStderr() {
81650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr);
81660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
81670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Stops capturing stdout and returns the captured string.
81690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString GetCapturedStdout() { return GetCapturedStream(&g_captured_stdout); }
81700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Stops capturing stderr and returns the captured string.
81720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonString GetCapturedStderr() { return GetCapturedStream(&g_captured_stderr); }
81730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_STREAM_REDIRECTION_
81750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_DEATH_TEST
81770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A copy of all command line arguments.  Set by InitGoogleTest().
81790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson::std::vector<String> g_argvs;
81800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the command line as a vector of strings.
81820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst ::std::vector<String>& GetArgvs() { return g_argvs; }
81830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_DEATH_TEST
81850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_OS_WINDOWS_MOBILE
81870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace posix {
81880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid Abort() {
81890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  DebugBreak();
81900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  TerminateProcess(GetCurrentProcess(), 1);
81910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
81920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace posix
81930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_OS_WINDOWS_MOBILE
81940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
81950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the name of the environment variable corresponding to the
81960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// given flag.  For example, FlagToEnvVar("foo") will return
81970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// "GTEST_FOO" in the open-source version.
81980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic String FlagToEnvVar(const char* flag) {
81990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String full_flag =
82000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();
82010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
82020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message env_var;
82030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (size_t i = 0; i != full_flag.length(); i++) {
82040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    env_var << static_cast<char>(toupper(full_flag.c_str()[i]));
82050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
82060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
82070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return env_var.GetString();
82080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
82090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
82100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Parses 'str' for a 32-bit signed integer.  If successful, writes
82110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the result to *value and returns true; otherwise leaves *value
82120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// unchanged and returns false.
82130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool ParseInt32(const Message& src_text, const char* str, Int32* value) {
82140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Parses the environment variable as a decimal integer.
82150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  char* end = NULL;
82160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const long long_value = strtol(str, &end, 10);  // NOLINT
82170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
82180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Has strtol() consumed all characters in the string?
82190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (*end != '\0') {
82200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // No - an invalid character was encountered.
82210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    Message msg;
82220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    msg << "WARNING: " << src_text
82230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << " is expected to be a 32-bit integer, but actually"
82240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << " has value \"" << str << "\".\n";
82250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    printf("%s", msg.GetString().c_str());
82260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fflush(stdout);
82270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return false;
82280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
82290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
82300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Is the parsed value in the range of an Int32?
82310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const Int32 result = static_cast<Int32>(long_value);
82320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (long_value == LONG_MAX || long_value == LONG_MIN ||
82330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // The parsed value overflows as a long.  (strtol() returns
82340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // LONG_MAX or LONG_MIN when the input overflows.)
82350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      result != long_value
82360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      // The parsed value overflows as an Int32.
82370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      ) {
82380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    Message msg;
82390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    msg << "WARNING: " << src_text
82400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << " is expected to be a 32-bit integer, but actually"
82410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        << " has value " << str << ", which overflows.\n";
82420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    printf("%s", msg.GetString().c_str());
82430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fflush(stdout);
82440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return false;
82450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
82460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
82470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  *value = result;
82480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return true;
82490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
82500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
82510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Reads and returns the Boolean environment variable corresponding to
82520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the given flag; if it's not set, returns default_value.
82530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
82540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The value is considered true iff it's not "0".
82550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonbool BoolFromGTestEnv(const char* flag, bool default_value) {
82560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String env_var = FlagToEnvVar(flag);
82570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const string_value = posix::GetEnv(env_var.c_str());
82580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return string_value == NULL ?
82590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      default_value : strcmp(string_value, "0") != 0;
82600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
82610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
82620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Reads and returns a 32-bit integer stored in the environment
82630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// variable corresponding to the given flag; if it isn't set or
82640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// doesn't represent a valid 32-bit integer, returns default_value.
82650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonInt32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
82660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String env_var = FlagToEnvVar(flag);
82670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const string_value = posix::GetEnv(env_var.c_str());
82680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (string_value == NULL) {
82690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    // The environment variable is not set.
82700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return default_value;
82710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
82720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
82730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Int32 result = default_value;
82740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (!ParseInt32(Message() << "Environment variable " << env_var,
82750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                  string_value, &result)) {
82760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    printf("The default value %s is used.\n",
82770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson           (Message() << default_value).GetString().c_str());
82780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fflush(stdout);
82790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return default_value;
82800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
82810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
82820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return result;
82830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
82840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
82850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Reads and returns the string environment variable corresponding to
82860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// the given flag; if it's not set, returns default_value.
82870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char* StringFromGTestEnv(const char* flag, const char* default_value) {
82880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String env_var = FlagToEnvVar(flag);
82890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const value = posix::GetEnv(env_var.c_str());
82900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return value == NULL ? default_value : value;
82910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
82920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
82930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
82940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace testing
82950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Copyright 2008, Google Inc.
82960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// All rights reserved.
82970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
82980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Redistribution and use in source and binary forms, with or without
82990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// modification, are permitted provided that the following conditions are
83000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// met:
83010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
83020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Redistributions of source code must retain the above copyright
83030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// notice, this list of conditions and the following disclaimer.
83040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Redistributions in binary form must reproduce the above
83050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// copyright notice, this list of conditions and the following disclaimer
83060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// in the documentation and/or other materials provided with the
83070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// distribution.
83080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Neither the name of Google Inc. nor the names of its
83090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// contributors may be used to endorse or promote products derived from
83100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// this software without specific prior written permission.
83110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
83120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
83130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
83140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
83150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
83160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
83170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
83180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
83190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
83200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
83210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
83220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
83230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
83240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Author: mheule@google.com (Markus Heule)
83250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
83260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// The Google C++ Testing Framework (Google Test)
83270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
83280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
83290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Indicates that this translation unit is part of Google Test's
83300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// implementation.  It must come before gtest-internal-inl.h is
83310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// included, or there will be a compiler error.  This trick is to
83320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// prevent a user from accidentally including gtest-internal-inl.h in
83330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// his code.
83340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#define GTEST_IMPLEMENTATION_ 1
83350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#undef GTEST_IMPLEMENTATION_
83360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
83370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace testing {
83380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
83390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonusing internal::GetUnitTestImpl;
83400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
83410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Gets the summary of the failure message by omitting the stack trace
83420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// in it.
83430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsoninternal::String TestPartResult::ExtractSummary(const char* message) {
83440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const char* const stack_trace = strstr(message, internal::kStackTraceMarker);
83450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return stack_trace == NULL ? internal::String(message) :
83460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      internal::String(message, stack_trace - message);
83470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
83480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
83490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Prints a TestPartResult object.
83500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstd::ostream& operator<<(std::ostream& os, const TestPartResult& result) {
83510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return os
83520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << result.file_name() << ":" << result.line_number() << ": "
83530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << (result.type() == TestPartResult::kSuccess ? "Success" :
83540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          result.type() == TestPartResult::kFatalFailure ? "Fatal failure" :
83550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          "Non-fatal failure") << ":\n"
83560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      << result.message() << std::endl;
83570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
83580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
83590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Appends a TestPartResult to the array.
83600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid TestPartResultArray::Append(const TestPartResult& result) {
83610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  array_.push_back(result);
83620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
83630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
83640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the TestPartResult at the given index (0-based).
83650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {
83660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (index < 0 || index >= size()) {
83670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    printf("\nInvalid index (%d) into TestPartResultArray.\n", index);
83680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    internal::posix::Abort();
83690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
83700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
83710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return array_[index];
83720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
83730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
83740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Returns the number of TestPartResult objects in the array.
83750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonint TestPartResultArray::size() const {
83760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return static_cast<int>(array_.size());
83770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
83780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
83790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
83800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
83810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonHasNewFatalFailureHelper::HasNewFatalFailureHelper()
83820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    : has_new_fatal_failure_(false),
83830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      original_reporter_(GetUnitTestImpl()->
83840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                         GetTestPartResultReporterForCurrentThread()) {
83850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);
83860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
83870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
83880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonHasNewFatalFailureHelper::~HasNewFatalFailureHelper() {
83890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(
83900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      original_reporter_);
83910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
83920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
83930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonvoid HasNewFatalFailureHelper::ReportTestPartResult(
83940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const TestPartResult& result) {
83950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (result.fatally_failed())
83960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    has_new_fatal_failure_ = true;
83970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  original_reporter_->ReportTestPartResult(result);
83980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
83990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
84000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
84010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
84020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace testing
84030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Copyright 2008 Google Inc.
84040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// All Rights Reserved.
84050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
84060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Redistribution and use in source and binary forms, with or without
84070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// modification, are permitted provided that the following conditions are
84080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// met:
84090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
84100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Redistributions of source code must retain the above copyright
84110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// notice, this list of conditions and the following disclaimer.
84120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Redistributions in binary form must reproduce the above
84130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// copyright notice, this list of conditions and the following disclaimer
84140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// in the documentation and/or other materials provided with the
84150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// distribution.
84160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//     * Neither the name of Google Inc. nor the names of its
84170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// contributors may be used to endorse or promote products derived from
84180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// this software without specific prior written permission.
84190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
84200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
84210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
84220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
84230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
84240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
84250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
84260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
84270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
84280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
84290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
84300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
84310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson//
84320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Author: wan@google.com (Zhanyong Wan)
84330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
84340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
84350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace testing {
84360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonnamespace internal {
84370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
84380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#if GTEST_HAS_TYPED_TEST_P
84390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
84400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Skips to the first non-space char in str. Returns an empty string if str
84410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// contains only whitespace characters.
84420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonstatic const char* SkipSpaces(const char* str) {
84430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  while (isspace(*str))
84440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    str++;
84450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return str;
84460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
84470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
84480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// Verifies that registered_tests match the test names in
84490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// defined_test_names_; returns registered_tests if successful, or
84500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson// aborts the program otherwise.
84510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonconst char* TypedTestCasePState::VerifyRegisteredTestNames(
84520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const char* file, int line, const char* registered_tests) {
84530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  typedef ::std::set<const char*>::const_iterator DefinedTestIter;
84540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  registered_ = true;
84550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
84560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // Skip initial whitespace in registered_tests since some
84570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  // preprocessors prefix stringizied literals with whitespace.
84580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  registered_tests = SkipSpaces(registered_tests);
84590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
84600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  Message errors;
84610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  ::std::set<String> tests;
84620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (const char* names = registered_tests; names != NULL;
84630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson       names = SkipComma(names)) {
84640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    const String name = GetPrefixUntilComma(names);
84650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (tests.count(name) != 0) {
84660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      errors << "Test " << name << " is listed more than once.\n";
84670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      continue;
84680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
84690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
84700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    bool found = false;
84710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    for (DefinedTestIter it = defined_test_names_.begin();
84720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         it != defined_test_names_.end();
84730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         ++it) {
84740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if (name == *it) {
84750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        found = true;
84760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        break;
84770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      }
84780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
84790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
84800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (found) {
84810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      tests.insert(name);
84820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    } else {
84830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      errors << "No test named " << name
84840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson             << " can be found in this test case.\n";
84850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
84860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
84870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
84880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  for (DefinedTestIter it = defined_test_names_.begin();
84890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson       it != defined_test_names_.end();
84900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson       ++it) {
84910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if (tests.count(*it) == 0) {
84920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      errors << "You forgot to list test " << *it << ".\n";
84930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    }
84940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
84950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
84960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  const String& errors_str = errors.GetString();
84970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if (errors_str != "") {
84980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
84990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            errors_str.c_str());
85000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    fflush(stderr);
85010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    posix::Abort();
85020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  }
85030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
85040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  return registered_tests;
85050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}
85060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
85070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#endif  // GTEST_HAS_TYPED_TEST_P
85080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
85090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace internal
85100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson}  // namespace testing
8511