gtest-all.cc revision 5ae7ac49f08a179e4f054d99fcfc9dce78d26e58
11b362b15af34006e6a11974088a46d42b903418eJohann// Copyright 2008, Google Inc.
21b362b15af34006e6a11974088a46d42b903418eJohann// All rights reserved.
31b362b15af34006e6a11974088a46d42b903418eJohann//
41b362b15af34006e6a11974088a46d42b903418eJohann// Redistribution and use in source and binary forms, with or without
51b362b15af34006e6a11974088a46d42b903418eJohann// modification, are permitted provided that the following conditions are
61b362b15af34006e6a11974088a46d42b903418eJohann// met:
71b362b15af34006e6a11974088a46d42b903418eJohann//
81b362b15af34006e6a11974088a46d42b903418eJohann//     * Redistributions of source code must retain the above copyright
91b362b15af34006e6a11974088a46d42b903418eJohann// notice, this list of conditions and the following disclaimer.
101b362b15af34006e6a11974088a46d42b903418eJohann//     * Redistributions in binary form must reproduce the above
111b362b15af34006e6a11974088a46d42b903418eJohann// copyright notice, this list of conditions and the following disclaimer
121b362b15af34006e6a11974088a46d42b903418eJohann// in the documentation and/or other materials provided with the
131b362b15af34006e6a11974088a46d42b903418eJohann// distribution.
141b362b15af34006e6a11974088a46d42b903418eJohann//     * Neither the name of Google Inc. nor the names of its
151b362b15af34006e6a11974088a46d42b903418eJohann// contributors may be used to endorse or promote products derived from
161b362b15af34006e6a11974088a46d42b903418eJohann// this software without specific prior written permission.
171b362b15af34006e6a11974088a46d42b903418eJohann//
181b362b15af34006e6a11974088a46d42b903418eJohann// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
191b362b15af34006e6a11974088a46d42b903418eJohann// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
201b362b15af34006e6a11974088a46d42b903418eJohann// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
211b362b15af34006e6a11974088a46d42b903418eJohann// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
221b362b15af34006e6a11974088a46d42b903418eJohann// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
231b362b15af34006e6a11974088a46d42b903418eJohann// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
241b362b15af34006e6a11974088a46d42b903418eJohann// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
251b362b15af34006e6a11974088a46d42b903418eJohann// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
261b362b15af34006e6a11974088a46d42b903418eJohann// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
271b362b15af34006e6a11974088a46d42b903418eJohann// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
281b362b15af34006e6a11974088a46d42b903418eJohann// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
291b362b15af34006e6a11974088a46d42b903418eJohann//
301b362b15af34006e6a11974088a46d42b903418eJohann// Author: mheule@google.com (Markus Heule)
311b362b15af34006e6a11974088a46d42b903418eJohann//
321b362b15af34006e6a11974088a46d42b903418eJohann// Google C++ Testing Framework (Google Test)
331b362b15af34006e6a11974088a46d42b903418eJohann//
341b362b15af34006e6a11974088a46d42b903418eJohann// Sometimes it's desirable to build Google Test by compiling a single file.
351b362b15af34006e6a11974088a46d42b903418eJohann// This file serves this purpose.
361b362b15af34006e6a11974088a46d42b903418eJohann
371b362b15af34006e6a11974088a46d42b903418eJohann// This line ensures that gtest.h can be compiled on its own, even
381b362b15af34006e6a11974088a46d42b903418eJohann// when it's fused.
391b362b15af34006e6a11974088a46d42b903418eJohann#include "gtest/gtest.h"
401b362b15af34006e6a11974088a46d42b903418eJohann
411b362b15af34006e6a11974088a46d42b903418eJohann// The following lines pull in the real gtest *.cc files.
425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2005, Google Inc.
435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: wan@google.com (Zhanyong Wan)
725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The Google C++ Testing Framework (Google Test)
745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2007, Google Inc.
765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
1045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: wan@google.com (Zhanyong Wan)
1055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
1065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Utilities for testing Google Test itself and code that uses Google Test
1075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (e.g. frameworks built on top of Google Test).
1085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
1105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
1115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
1145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This helper class can be used to mock out Google Test failure reporting
1165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// so that we can test Google Test or code that builds on Google Test.
1175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
1185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// An object of this class appends a TestPartResult object to the
1195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TestPartResultArray object given in the constructor whenever a Google Test
1205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// failure is reported. It can either intercept only failures that are
1215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// generated in the same thread that created this object or it can intercept
1225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// all generated failures. The scope of this mock object can be controlled with
1235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the second argument to the two arguments constructor.
1245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ ScopedFakeTestPartResultReporter
1255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : public TestPartResultReporterInterface {
1265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
1275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The two possible mocking modes of this object.
1285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  enum InterceptMode {
1295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.
1305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    INTERCEPT_ALL_THREADS           // Intercepts all failures.
1315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };
1325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The c'tor sets this object as the test part result reporter used
1345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // by Google Test.  The 'result' parameter specifies where to report the
1355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // results. This reporter will only catch failures generated in the current
1365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // thread. DEPRECATED
1375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
1385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Same as above, but you can choose the interception scope of this object.
1405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
1415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                   TestPartResultArray* result);
1425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The d'tor restores the previous test part result reporter.
1445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~ScopedFakeTestPartResultReporter();
1455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Appends the TestPartResult object to the TestPartResultArray
1475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // received in the constructor.
1485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
1495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This method is from the TestPartResultReporterInterface
1505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // interface.
1515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void ReportTestPartResult(const TestPartResult& result);
1525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
1535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void Init();
1545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const InterceptMode intercept_mode_;
1565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestPartResultReporterInterface* old_reporter_;
1575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestPartResultArray* const result_;
1585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
1605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
1615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
1635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A helper class for implementing EXPECT_FATAL_FAILURE() and
1655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given
1665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TestPartResultArray contains exactly one failure that has the given
1675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// type and contains the given substring.  If that's not the case, a
1685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// non-fatal failure will be generated.
1695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ SingleFailureChecker {
1705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
1715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The constructor remembers the arguments.
1725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  SingleFailureChecker(const TestPartResultArray* results,
1735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                       TestPartResult::Type type,
1745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                       const string& substr);
1755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~SingleFailureChecker();
1765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
1775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestPartResultArray* const results_;
1785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestPartResult::Type type_;
1795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const string substr_;
1805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
1825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
1835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
1855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
1875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A set of macros for testing Google Test assertions or code that's expected
1895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to generate Google Test fatal failures.  It verifies that the given
1905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// statement will cause exactly one fatal Google Test failure with 'substr'
1915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// being part of the failure message.
1925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
1935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
1945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// affects and considers failures generated in the current thread and
1955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
1965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
1975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The verification of the assertion is done correctly even when the statement
1985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// throws an exception or aborts the current function.
1995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Known restrictions:
2015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   - 'statement' cannot reference local non-static variables or
2025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     non-static members of the current object.
2035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   - 'statement' cannot return a value.
2045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   - You cannot stream a failure message to this macro.
2055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Note that even though the implementations of the following two
2075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// macros are much alike, we cannot refactor them to use a common
2085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// helper macro, due to some peculiarity in how the preprocessor
2095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// works.  The AcceptsMacroThatExpandsToUnprotectedComma test in
2105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// gtest_unittest.cc will fail to compile if we do that.
2115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define EXPECT_FATAL_FAILURE(statement, substr) \
2125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  do { \
2135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    class GTestExpectFatalFailureHelper {\
2145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang     public:\
2155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      static void Execute() { statement; }\
2165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    };\
2175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::TestPartResultArray gtest_failures;\
2185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::internal::SingleFailureChecker gtest_checker(\
2195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
2205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    {\
2215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
2225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          ::testing::ScopedFakeTestPartResultReporter:: \
2235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
2245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTestExpectFatalFailureHelper::Execute();\
2255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }\
2265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } while (::testing::internal::AlwaysFalse())
2275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
2285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
2295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  do { \
2305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    class GTestExpectFatalFailureHelper {\
2315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang     public:\
2325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      static void Execute() { statement; }\
2335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    };\
2345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::TestPartResultArray gtest_failures;\
2355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::internal::SingleFailureChecker gtest_checker(\
2365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
2375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    {\
2385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
2395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          ::testing::ScopedFakeTestPartResultReporter:: \
2405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          INTERCEPT_ALL_THREADS, &gtest_failures);\
2415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTestExpectFatalFailureHelper::Execute();\
2425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }\
2435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } while (::testing::internal::AlwaysFalse())
2445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
2455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A macro for testing Google Test assertions or code that's expected to
2465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// generate Google Test non-fatal failures.  It asserts that the given
2475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// statement will cause exactly one non-fatal Google Test failure with 'substr'
2485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// being part of the failure message.
2495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
2515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// affects and considers failures generated in the current thread and
2525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
2535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 'statement' is allowed to reference local variables and members of
2555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the current object.
2565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The verification of the assertion is done correctly even when the statement
2585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// throws an exception or aborts the current function.
2595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Known restrictions:
2615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   - You cannot stream a failure message to this macro.
2625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Note that even though the implementations of the following two
2645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// macros are much alike, we cannot refactor them to use a common
2655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// helper macro, due to some peculiarity in how the preprocessor
2665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// works.  If we do that, the code won't compile when the user gives
2675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
2685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// expands to code containing an unprotected comma.  The
2695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
2705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// catches that.
2715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
2725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// For the same reason, we have to write
2735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   if (::testing::internal::AlwaysTrue()) { statement; }
2745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// instead of
2755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
2765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to avoid an MSVC warning on unreachable code.
2775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define EXPECT_NONFATAL_FAILURE(statement, substr) \
2785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  do {\
2795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::TestPartResultArray gtest_failures;\
2805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::internal::SingleFailureChecker gtest_checker(\
2815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
2825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        (substr));\
2835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    {\
2845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
2855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          ::testing::ScopedFakeTestPartResultReporter:: \
2865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
2875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (::testing::internal::AlwaysTrue()) { statement; }\
2885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }\
2895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } while (::testing::internal::AlwaysFalse())
2905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
2915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
2925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  do {\
2935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::TestPartResultArray gtest_failures;\
2945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::testing::internal::SingleFailureChecker gtest_checker(\
2955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
2965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        (substr));\
2975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    {\
2985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
2995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \
3005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          &gtest_failures);\
3015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (::testing::internal::AlwaysTrue()) { statement; }\
3025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }\
3035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } while (::testing::internal::AlwaysFalse())
3045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
3065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <ctype.h>
3085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <math.h>
3095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stdarg.h>
3105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stdio.h>
3115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stdlib.h>
3125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <time.h>
3135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <wchar.h>
3145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <wctype.h>
3155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <algorithm>
3175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <iomanip>
3185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <limits>
3195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <ostream>  // NOLINT
3205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <sstream>
3215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <vector>
3225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_LINUX
3245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TODO(kenton@google.com): Use autoconf to detect availability of
3265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// gettimeofday().
3275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_HAS_GETTIMEOFDAY_ 1
3285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <fcntl.h>  // NOLINT
3305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <limits.h>  // NOLINT
3315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <sched.h>  // NOLINT
3325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Declares vsnprintf().  This header is not available on Windows.
3335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <strings.h>  // NOLINT
3345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <sys/mman.h>  // NOLINT
3355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <sys/time.h>  // NOLINT
3365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <unistd.h>  // NOLINT
3375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <string>
3385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif GTEST_OS_SYMBIAN
3405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_HAS_GETTIMEOFDAY_ 1
3415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <sys/time.h>  // NOLINT
3425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif GTEST_OS_ZOS
3445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_HAS_GETTIMEOFDAY_ 1
3455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <sys/time.h>  // NOLINT
3465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// On z/OS we additionally need strings.h for strcasecmp.
3485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <strings.h>  // NOLINT
3495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif GTEST_OS_WINDOWS_MOBILE  // We are on Windows CE.
3515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <windows.h>  // NOLINT
3535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif GTEST_OS_WINDOWS  // We are on Windows proper.
3555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <io.h>  // NOLINT
3575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <sys/timeb.h>  // NOLINT
3585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <sys/types.h>  // NOLINT
3595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <sys/stat.h>  // NOLINT
3605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_WINDOWS_MINGW
3625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// MinGW has gettimeofday() but not _ftime64().
3635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TODO(kenton@google.com): Use autoconf to detect availability of
3645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   gettimeofday().
3655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TODO(kenton@google.com): There are other ways to get the time on
3665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   Windows, like GetTickCount() or GetSystemTimeAsFileTime().  MinGW
3675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   supports these.  consider using them instead.
3685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  define GTEST_HAS_GETTIMEOFDAY_ 1
3695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  include <sys/time.h>  // NOLINT
3705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_OS_WINDOWS_MINGW
3715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// cpplint thinks that the header is already included, so we want to
3735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// silence it.
3745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <windows.h>  // NOLINT
3755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
3775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Assume other platforms have gettimeofday().
3795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TODO(kenton@google.com): Use autoconf to detect availability of
3805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   gettimeofday().
3815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_HAS_GETTIMEOFDAY_ 1
3825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// cpplint thinks that the header is already included, so we want to
3845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// silence it.
3855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <sys/time.h>  // NOLINT
3865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <unistd.h>  // NOLINT
3875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_LINUX
3895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_EXCEPTIONS
3915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <stdexcept>
3925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
3935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_CAN_STREAM_RESULTS_
3955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <arpa/inet.h>  // NOLINT
3965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <netdb.h>  // NOLINT
3975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
3985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
3995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Indicates that this translation unit is part of Google Test's
4005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// implementation.  It must come before gtest-internal-inl.h is
4015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// included, or there will be a compiler error.  This trick is to
4025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// prevent a user from accidentally including gtest-internal-inl.h in
4035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// his code.
4045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_IMPLEMENTATION_ 1
4055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2005, Google Inc.
4065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
4075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
4085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
4095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
4105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
4115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
4125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
4135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
4145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
4155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
4165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
4175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
4185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
4195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
4205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
4215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
4225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
4245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
4255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
4265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
4275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
4295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
4305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
4315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
4325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Utility functions and classes used by the Google C++ testing framework.
4355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
4365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: wan@google.com (Zhanyong Wan)
4375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
4385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This file contains purely Google Test's internal implementation.  Please
4395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DO NOT #INCLUDE IT IN A USER PROGRAM.
4405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
4425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_SRC_GTEST_INTERNAL_INL_H_
4435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is
4455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// part of Google Test's implementation; otherwise it's undefined.
4465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if !GTEST_IMPLEMENTATION_
4475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A user is trying to include this from his code - just say no.
4485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# error "gtest-internal-inl.h is part of Google Test's internal implementation."
4495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# error "It must not be included except by Google Test itself."
4505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_IMPLEMENTATION_
4515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef _WIN32_WCE
4535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <errno.h>
4545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // !_WIN32_WCE
4555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stddef.h>
4565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stdlib.h>  // For strtoll/_strtoul64/malloc/free.
4575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <string.h>  // For memmove.
4585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <algorithm>
4605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <string>
4615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <vector>
4625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_CAN_STREAM_RESULTS_
4655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <arpa/inet.h>  // NOLINT
4665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <netdb.h>  // NOLINT
4675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
4685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS
4705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <windows.h>  // NOLINT
4715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS
4725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
4755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Declares the flags.
4775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
4785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We don't want the users to modify this flag in the code, but want
4795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google Test's own unit tests to be able to access it. Therefore we
4805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// declare it here as opposed to in gtest.h.
4815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DECLARE_bool_(death_test_use_fork);
4825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
4845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The value of GetTestTypeId() as seen from within the Google Test
4865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// library.  This is solely for testing GetTestTypeId().
4875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;
4885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
4895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Names of the flags (needed for parsing Google Test flags).
4905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests";
4915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kBreakOnFailureFlag[] = "break_on_failure";
4925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kCatchExceptionsFlag[] = "catch_exceptions";
4935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kColorFlag[] = "color";
4945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kFilterFlag[] = "filter";
4955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kListTestsFlag[] = "list_tests";
4965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kOutputFlag[] = "output";
4975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kPrintTimeFlag[] = "print_time";
4985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kRandomSeedFlag[] = "random_seed";
4995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kRepeatFlag[] = "repeat";
5005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kShuffleFlag[] = "shuffle";
5015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kStackTraceDepthFlag[] = "stack_trace_depth";
5025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kStreamResultToFlag[] = "stream_result_to";
5035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kThrowOnFailureFlag[] = "throw_on_failure";
5045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A valid random seed must be in [1, kMaxRandomSeed].
5065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst int kMaxRandomSeed = 99999;
5075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// g_help_flag is true iff the --help flag or an equivalent form is
5095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// specified on the command line.
5105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ extern bool g_help_flag;
5115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the current time in milliseconds.
5135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ TimeInMillis GetTimeInMillis();
5145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff Google Test should use colors in the output.
5165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
5175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Formats the given time in milliseconds as seconds.
5195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
5205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Converts the given time in milliseconds to a date string in the ISO 8601
5225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// format, without the timezone information.  N.B.: due to the use the
5235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// non-reentrant localtime() function, this function is not thread safe.  Do
5245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// not use it in any code that can be called from multiple threads.
5255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms);
5265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Parses a string for an Int32 flag, in the form of "--flag=value".
5285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
5295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// On success, stores the value of the flag in *value, and returns
5305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// true.  On failure, returns false without changing *value.
5315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool ParseInt32Flag(
5325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* str, const char* flag, Int32* value);
5335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns a random seed in range [1, kMaxRandomSeed] based on the
5355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// given --gtest_random_seed flag value.
5365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int GetRandomSeedFromFlag(Int32 random_seed_flag) {
5375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const unsigned int raw_seed = (random_seed_flag == 0) ?
5385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      static_cast<unsigned int>(GetTimeInMillis()) :
5395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      static_cast<unsigned int>(random_seed_flag);
5405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Normalizes the actual seed to range [1, kMaxRandomSeed] such that
5425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // it's easy to type.
5435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int normalized_seed =
5445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      static_cast<int>((raw_seed - 1U) %
5455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                       static_cast<unsigned int>(kMaxRandomSeed)) + 1;
5465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return normalized_seed;
5475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
5485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the first valid random seed after 'seed'.  The behavior is
5505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// undefined if 'seed' is invalid.  The seed after kMaxRandomSeed is
5515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// considered to be 1.
5525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int GetNextRandomSeed(int seed) {
5535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)
5545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "Invalid random seed " << seed << " - must be in [1, "
5555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << kMaxRandomSeed << "].";
5565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int next_seed = seed + 1;
5575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return (next_seed > kMaxRandomSeed) ? 1 : next_seed;
5585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
5595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This class saves the values of all Google Test flags in its c'tor, and
5615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// restores them in its d'tor.
5625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTestFlagSaver {
5635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
5645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The c'tor.
5655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTestFlagSaver() {
5665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);
5675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    break_on_failure_ = GTEST_FLAG(break_on_failure);
5685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    catch_exceptions_ = GTEST_FLAG(catch_exceptions);
5695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    color_ = GTEST_FLAG(color);
5705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    death_test_style_ = GTEST_FLAG(death_test_style);
5715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);
5725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    filter_ = GTEST_FLAG(filter);
5735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);
5745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    list_tests_ = GTEST_FLAG(list_tests);
5755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    output_ = GTEST_FLAG(output);
5765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    print_time_ = GTEST_FLAG(print_time);
5775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    random_seed_ = GTEST_FLAG(random_seed);
5785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    repeat_ = GTEST_FLAG(repeat);
5795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    shuffle_ = GTEST_FLAG(shuffle);
5805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);
5815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    stream_result_to_ = GTEST_FLAG(stream_result_to);
5825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    throw_on_failure_ = GTEST_FLAG(throw_on_failure);
5835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
5845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The d'tor is not virtual.  DO NOT INHERIT FROM THIS CLASS.
5865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~GTestFlagSaver() {
5875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;
5885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_FLAG(break_on_failure) = break_on_failure_;
5895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_FLAG(catch_exceptions) = catch_exceptions_;
5905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_FLAG(color) = color_;
5915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_FLAG(death_test_style) = death_test_style_;
5925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;
5935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_FLAG(filter) = filter_;
5945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;
5955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_FLAG(list_tests) = list_tests_;
5965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_FLAG(output) = output_;
5975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_FLAG(print_time) = print_time_;
5985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_FLAG(random_seed) = random_seed_;
5995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_FLAG(repeat) = repeat_;
6005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_FLAG(shuffle) = shuffle_;
6015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;
6025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_FLAG(stream_result_to) = stream_result_to_;
6035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_FLAG(throw_on_failure) = throw_on_failure_;
6045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
6055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
6075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Fields for saving the original values of flags.
6085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool also_run_disabled_tests_;
6095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool break_on_failure_;
6105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool catch_exceptions_;
6115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string color_;
6125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string death_test_style_;
6135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool death_test_use_fork_;
6145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string filter_;
6155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string internal_run_death_test_;
6165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool list_tests_;
6175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string output_;
6185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool print_time_;
6195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::Int32 random_seed_;
6205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::Int32 repeat_;
6215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool shuffle_;
6225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::Int32 stack_trace_depth_;
6235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string stream_result_to_;
6245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool throw_on_failure_;
6255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang} GTEST_ATTRIBUTE_UNUSED_;
6265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Converts a Unicode code point to a narrow string in UTF-8 encoding.
6285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// code_point parameter is of type UInt32 because wchar_t may not be
6295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// wide enough to contain a code point.
6305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// If the code_point is not a valid Unicode code point
6315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
6325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to "(Invalid Unicode 0xXXXXXXXX)".
6335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ std::string CodePointToUtf8(UInt32 code_point);
6345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Converts a wide string to a narrow string in UTF-8 encoding.
6365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The wide string is assumed to have the following encoding:
6375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
6385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
6395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Parameter str points to a null-terminated wide string.
6405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Parameter num_chars may additionally limit the number
6415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// of wchar_t characters processed. -1 is used when the entire string
6425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// should be processed.
6435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// If the string contains code points that are not valid Unicode code points
6445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
6455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
6465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and contains invalid UTF-16 surrogate pairs, values in those pairs
6475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// will be encoded as individual Unicode characters from Basic Normal Plane.
6485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars);
6495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
6515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// if the variable is present. If a file already exists at this location, this
6525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// function will write over it. If the variable is present, but the file cannot
6535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// be created, prints an error and exits.
6545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid WriteToShardStatusFileIfNeeded();
6555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Checks whether sharding is enabled by examining the relevant
6575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// environment variable values. If the variables are present,
6585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// but inconsistent (e.g., shard_index >= total_shards), prints
6595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// an error and exits. If in_subprocess_for_death_test, sharding is
6605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// disabled because it must only be applied to the original test
6615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// process. Otherwise, we could filter out death tests we intended to execute.
6625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool ShouldShard(const char* total_shards_str,
6635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            const char* shard_index_str,
6645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            bool in_subprocess_for_death_test);
6655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Parses the environment variable var as an Int32. If it is unset,
6675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// returns default_val. If it is not an Int32, prints an error and
6685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and aborts.
6695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);
6705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Given the total number of shards, the shard index, and the test id,
6725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// returns true iff the test should be run on this shard. The test id is
6735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// some arbitrary but unique non-negative integer assigned to each test
6745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// method. Assumes that 0 <= shard_index < total_shards.
6755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool ShouldRunTestOnShard(
6765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int total_shards, int shard_index, int test_id);
6775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// STL container utilities.
6795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the number of elements in the given container that satisfy
6815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the given predicate.
6825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class Container, typename Predicate>
6835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline int CountIf(const Container& c, Predicate predicate) {
6845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Implemented as an explicit loop since std::count_if() in libCstd on
6855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Solaris has a non-standard signature.
6865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int count = 0;
6875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {
6885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (predicate(*it))
6895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ++count;
6905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
6915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return count;
6925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
6935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
6945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Applies a function/functor to each element in the container.
6955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class Container, typename Functor>
6965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid ForEach(const Container& c, Functor functor) {
6975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::for_each(c.begin(), c.end(), functor);
6985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
6995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the i-th element of the vector, or default_value if i is not
7015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in range [0, v.size()).
7025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename E>
7035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline E GetElementOr(const std::vector<E>& v, int i, E default_value) {
7045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];
7055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
7065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Performs an in-place shuffle of a range of the vector's elements.
7085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 'begin' and 'end' are element indices as an STL-style range;
7095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// i.e. [begin, end) are shuffled, where 'end' == size() means to
7105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// shuffle to the end of the vector.
7115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename E>
7125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid ShuffleRange(internal::Random* random, int begin, int end,
7135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  std::vector<E>* v) {
7145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int size = static_cast<int>(v->size());
7155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_CHECK_(0 <= begin && begin <= size)
7165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "Invalid shuffle range start " << begin << ": must be in range [0, "
7175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << size << "].";
7185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_CHECK_(begin <= end && end <= size)
7195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "Invalid shuffle range finish " << end << ": must be in range ["
7205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << begin << ", " << size << "].";
7215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Fisher-Yates shuffle, from
7235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
7245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (int range_width = end - begin; range_width >= 2; range_width--) {
7255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int last_in_range = begin + range_width - 1;
7265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int selected = begin + random->Generate(range_width);
7275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    std::swap((*v)[selected], (*v)[last_in_range]);
7285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
7295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
7305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Performs an in-place shuffle of the vector's elements.
7325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename E>
7335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline void Shuffle(internal::Random* random, std::vector<E>* v) {
7345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ShuffleRange(random, 0, static_cast<int>(v->size()), v);
7355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
7365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A function for deleting an object.  Handy for being used as a
7385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// functor.
7395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename T>
7405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void Delete(T* x) {
7415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  delete x;
7425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
7435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A predicate that checks the key of a TestProperty against a known key.
7455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
7465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TestPropertyKeyIs is copyable.
7475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TestPropertyKeyIs {
7485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
7495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Constructor.
7505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
7515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // TestPropertyKeyIs has NO default constructor.
7525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}
7535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true iff the test name of test property matches on key_.
7555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool operator()(const TestProperty& test_property) const {
7565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return test_property.key() == key_;
7575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
7585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
7605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string key_;
7615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
7625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Class UnitTestOptions.
7645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
7655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This class contains functions for processing options the user
7665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// specifies when running the tests.  It has only static members.
7675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
7685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// In most cases, the user can specify an option using either an
7695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// environment variable or a command line flag.  E.g. you can set the
7705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// test filter using either GTEST_FILTER or --gtest_filter.  If both
7715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the variable and the flag are present, the latter overrides the
7725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// former.
7735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ UnitTestOptions {
7745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
7755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Functions for processing the gtest_output flag.
7765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the output format, or "" for normal printed output.
7785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static std::string GetOutputFormat();
7795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the absolute path of the requested output file, or the
7815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // default (test_detail.xml in the original working directory) if
7825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // none was explicitly specified.
7835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static std::string GetAbsolutePathToOutputFile();
7845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Functions for processing the gtest_filter flag.
7865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true iff the wildcard pattern matches the string.  The
7885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // first ':' or '\0' character in pattern marks the end of it.
7895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
7905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This recursive algorithm isn't very efficient, but is clear and
7915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // works well enough for matching test names, which are short.
7925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool PatternMatchesString(const char *pattern, const char *str);
7935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true iff the user-specified filter matches the test case
7955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // name and the test name.
7965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool FilterMatchesTest(const std::string &test_case_name,
7975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                const std::string &test_name);
7985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
7995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS
8005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Function for supporting the gtest_catch_exception flag.
8015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
8035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
8045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This function is useful as an __except condition.
8055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static int GTestShouldProcessSEH(DWORD exception_code);
8065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS
8075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true if "name" matches the ':' separated list of glob-style
8095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // filters in "filter".
8105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool MatchesFilter(const std::string& name, const char* filter);
8115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
8125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the current application's name, removing directory path if that
8145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// is present.  Used by UnitTestOptions::GetOutputFile.
8155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ FilePath GetCurrentExecutableName();
8165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The role interface for getting the OS stack trace as a string.
8185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass OsStackTraceGetterInterface {
8195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
8205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OsStackTraceGetterInterface() {}
8215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~OsStackTraceGetterInterface() {}
8225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the current OS stack trace as an std::string.  Parameters:
8245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
8255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   max_depth  - the maximum number of stack frames to be included
8265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //                in the trace.
8275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   skip_count - the number of top frames to be skipped; doesn't count
8285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //                against max_depth.
8295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual string CurrentStackTrace(int max_depth, int skip_count) = 0;
8305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // UponLeavingGTest() should be called immediately before Google Test calls
8325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // user code. It saves some information about the current stack that
8335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // CurrentStackTrace() will use to find and hide Google Test stack frames.
8345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void UponLeavingGTest() = 0;
8355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
8375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);
8385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
8395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A working implementation of the OsStackTraceGetterInterface interface.
8415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass OsStackTraceGetter : public OsStackTraceGetterInterface {
8425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
8435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OsStackTraceGetter() : caller_frame_(NULL) {}
8445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual string CurrentStackTrace(int max_depth, int skip_count)
8465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_LOCK_EXCLUDED_(mutex_);
8475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_);
8495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This string is inserted in place of stack frames that are part of
8515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Google Test's implementation.
8525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const char* const kElidedFramesMarker;
8535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
8555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Mutex mutex_;  // protects all internal state
8565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We save the stack frame below the frame that calls user code.
8585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We do this because the address of the frame immediately below
8595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the user code changes between the call to UponLeavingGTest()
8605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // and any calls to CurrentStackTrace() from within the user code.
8615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void* caller_frame_;
8625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);
8645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
8655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Information about a Google Test trace point.
8675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct TraceInfo {
8685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* file;
8695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int line;
8705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string message;
8715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
8725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This is the default global test part result reporter used in UnitTestImpl.
8745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This class should only be used by UnitTestImpl.
8755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass DefaultGlobalTestPartResultReporter
8765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  : public TestPartResultReporterInterface {
8775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
8785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);
8795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Implements the TestPartResultReporterInterface. Reports the test part
8805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // result in the current test.
8815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void ReportTestPartResult(const TestPartResult& result);
8825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
8845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  UnitTestImpl* const unit_test_;
8855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);
8875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
8885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This is the default per thread test part result reporter used in
8905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// UnitTestImpl. This class should only be used by UnitTestImpl.
8915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass DefaultPerThreadTestPartResultReporter
8925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : public TestPartResultReporterInterface {
8935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
8945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);
8955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Implements the TestPartResultReporterInterface. The implementation just
8965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // delegates to the current global test part result reporter of *unit_test_.
8975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void ReportTestPartResult(const TestPartResult& result);
8985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
8995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
9005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  UnitTestImpl* const unit_test_;
9015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);
9035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
9045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The private implementation of the UnitTest class.  We don't protect
9065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the methods under a mutex, as this class is not accessible by a
9075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// user and the UnitTest class that delegates work to this class does
9085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// proper locking.
9095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass GTEST_API_ UnitTestImpl {
9105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
9115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit UnitTestImpl(UnitTest* parent);
9125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~UnitTestImpl();
9135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // There are two different ways to register your own TestPartResultReporter.
9155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // You can register your own repoter to listen either only for test results
9165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // from the current thread or for results from all threads.
9175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // By default, each per-thread test result repoter just passes a new
9185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // TestPartResult to the global test result reporter, which registers the
9195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // test part result for the currently running test.
9205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the global test part result reporter.
9225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
9235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Sets the global test part result reporter.
9255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void SetGlobalTestPartResultReporter(
9265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      TestPartResultReporterInterface* reporter);
9275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the test part result reporter for the current thread.
9295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
9305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Sets the test part result reporter for the current thread.
9325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void SetTestPartResultReporterForCurrentThread(
9335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      TestPartResultReporterInterface* reporter);
9345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the number of successful test cases.
9365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int successful_test_case_count() const;
9375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the number of failed test cases.
9395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int failed_test_case_count() const;
9405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the number of all test cases.
9425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int total_test_case_count() const;
9435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the number of all test cases that contain at least one test
9455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // that should run.
9465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int test_case_to_run_count() const;
9475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the number of successful tests.
9495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int successful_test_count() const;
9505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the number of failed tests.
9525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int failed_test_count() const;
9535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the number of disabled tests that will be reported in the XML report.
9555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int reportable_disabled_test_count() const;
9565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the number of disabled tests.
9585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int disabled_test_count() const;
9595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the number of tests to be printed in the XML report.
9615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int reportable_test_count() const;
9625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the number of all tests.
9645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int total_test_count() const;
9655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the number of tests that should run.
9675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int test_to_run_count() const;
9685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the time of the test program start, in ms from the start of the
9705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // UNIX epoch.
9715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TimeInMillis start_timestamp() const { return start_timestamp_; }
9725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the elapsed time, in milliseconds.
9745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TimeInMillis elapsed_time() const { return elapsed_time_; }
9755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true iff the unit test passed (i.e. all test cases passed).
9775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool Passed() const { return !Failed(); }
9785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true iff the unit test failed (i.e. some test case failed
9805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // or something outside of all tests failed).
9815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool Failed() const {
9825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();
9835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
9845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the i-th test case among all the test cases. i can range from 0 to
9865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // total_test_case_count() - 1. If i is not in that range, returns NULL.
9875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestCase* GetTestCase(int i) const {
9885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int index = GetElementOr(test_case_indices_, i, -1);
9895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return index < 0 ? NULL : test_cases_[i];
9905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
9915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the i-th test case among all the test cases. i can range from 0 to
9935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // total_test_case_count() - 1. If i is not in that range, returns NULL.
9945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestCase* GetMutableTestCase(int i) {
9955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int index = GetElementOr(test_case_indices_, i, -1);
9965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return index < 0 ? NULL : test_cases_[index];
9975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
9985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
9995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Provides access to the event listener list.
10005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestEventListeners* listeners() { return &listeners_; }
10015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the TestResult for the test that's currently running, or
10035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the TestResult for the ad hoc test if no test is running.
10045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestResult* current_test_result();
10055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the TestResult for the ad hoc test.
10075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }
10085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Sets the OS stack trace getter.
10105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
10115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Does nothing if the input and the current OS stack trace getter
10125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // are the same; otherwise, deletes the old getter and makes the
10135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // input the current getter.
10145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);
10155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the current OS stack trace getter if it is not NULL;
10175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // otherwise, creates an OsStackTraceGetter, makes it the current
10185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // getter, and returns it.
10195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OsStackTraceGetterInterface* os_stack_trace_getter();
10205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the current OS stack trace as an std::string.
10225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
10235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The maximum number of stack frames to be included is specified by
10245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the gtest_stack_trace_depth flag.  The skip_count parameter
10255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // specifies the number of top frames to be skipped, which doesn't
10265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // count against the number of frames to be included.
10275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
10285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // For example, if Foo() calls Bar(), which in turn calls
10295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
10305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
10315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;
10325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Finds and returns a TestCase with the given name.  If one doesn't
10345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // exist, creates one and returns it.
10355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
10365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Arguments:
10375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
10385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   test_case_name: name of the test case
10395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   type_param:     the name of the test's type parameter, or NULL if
10405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //                   this is not a typed or a type-parameterized test.
10415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   set_up_tc:      pointer to the function that sets up the test case
10425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   tear_down_tc:   pointer to the function that tears down the test case
10435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestCase* GetTestCase(const char* test_case_name,
10445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        const char* type_param,
10455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        Test::SetUpTestCaseFunc set_up_tc,
10465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        Test::TearDownTestCaseFunc tear_down_tc);
10475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Adds a TestInfo to the unit test.
10495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
10505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Arguments:
10515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
10525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   set_up_tc:    pointer to the function that sets up the test case
10535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   tear_down_tc: pointer to the function that tears down the test case
10545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   test_info:    the TestInfo object
10555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,
10565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   Test::TearDownTestCaseFunc tear_down_tc,
10575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   TestInfo* test_info) {
10585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // In order to support thread-safe death tests, we need to
10595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // remember the original working directory when the test program
10605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // was first invoked.  We cannot do this in RUN_ALL_TESTS(), as
10615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // the user may have changed the current directory before calling
10625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // RUN_ALL_TESTS().  Therefore we capture the current directory in
10635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // AddTestInfo(), which is called to register a TEST or TEST_F
10645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // before main() is reached.
10655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (original_working_dir_.IsEmpty()) {
10665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      original_working_dir_.Set(FilePath::GetCurrentDir());
10675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_CHECK_(!original_working_dir_.IsEmpty())
10685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "Failed to get the current working directory.";
10695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
10705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GetTestCase(test_info->test_case_name(),
10725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                test_info->type_param(),
10735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                set_up_tc,
10745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                tear_down_tc)->AddTestInfo(test_info);
10755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
10765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_PARAM_TEST
10785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns ParameterizedTestCaseRegistry object used to keep track of
10795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // value-parameterized tests and instantiate and register them.
10805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {
10815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return parameterized_test_registry_;
10825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
10835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_PARAM_TEST
10845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Sets the TestCase object for the test that's currently running.
10865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void set_current_test_case(TestCase* a_current_test_case) {
10875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    current_test_case_ = a_current_test_case;
10885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
10895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Sets the TestInfo object for the test that's currently running.  If
10915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // current_test_info is NULL, the assertion results will be stored in
10925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // ad_hoc_test_result_.
10935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void set_current_test_info(TestInfo* a_current_test_info) {
10945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    current_test_info_ = a_current_test_info;
10955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
10965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
10975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Registers all parameterized tests defined using TEST_P and
10985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter
10995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // combination. This method can be called more then once; it has guards
11005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // protecting from registering the tests more then once.  If
11015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // value-parameterized tests are disabled, RegisterParameterizedTests is
11025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // present but does nothing.
11035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void RegisterParameterizedTests();
11045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Runs all tests in this UnitTest object, prints the result, and
11065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // returns true if all tests are successful.  If any exception is
11075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // thrown during a test, this test is considered to be failed, but
11085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the rest of the tests will still be run.
11095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool RunAllTests();
11105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Clears the results of all tests, except the ad hoc tests.
11125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void ClearNonAdHocTestResult() {
11135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ForEach(test_cases_, TestCase::ClearTestCaseResult);
11145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
11155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Clears the results of ad-hoc test assertions.
11175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void ClearAdHocTestResult() {
11185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ad_hoc_test_result_.Clear();
11195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
11205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Adds a TestProperty to the current TestResult object when invoked in a
11225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // context of a test or a test case, or to the global property set. If the
11235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // result already contains a property with the same key, the value will be
11245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // updated.
11255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void RecordProperty(const TestProperty& test_property);
11265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  enum ReactionToSharding {
11285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    HONOR_SHARDING_PROTOCOL,
11295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    IGNORE_SHARDING_PROTOCOL
11305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };
11315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Matches the full name of each test against the user-specified
11335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // filter to decide whether the test should run, then records the
11345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // result in each TestCase and TestInfo object.
11355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests
11365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // based on sharding variables in the environment.
11375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the number of tests that should run.
11385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int FilterTests(ReactionToSharding shard_tests);
11395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Prints the names of the tests matching the user-specified filter flag.
11415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void ListTestsMatchingFilter();
11425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestCase* current_test_case() const { return current_test_case_; }
11445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestInfo* current_test_info() { return current_test_info_; }
11455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestInfo* current_test_info() const { return current_test_info_; }
11465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the vector of environments that need to be set-up/torn-down
11485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // before/after the tests are run.
11495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::vector<Environment*>& environments() { return environments_; }
11505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Getters for the per-thread Google Test trace stack.
11525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::vector<TraceInfo>& gtest_trace_stack() {
11535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *(gtest_trace_stack_.pointer());
11545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
11555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::vector<TraceInfo>& gtest_trace_stack() const {
11565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return gtest_trace_stack_.get();
11575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
11585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_DEATH_TEST
11605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void InitDeathTestSubprocessControlInfo() {
11615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
11625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
11635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns a pointer to the parsed --gtest_internal_run_death_test
11645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // flag, or NULL if that flag was not specified.
11655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This information is useful only in a death test child process.
11665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Must not be called before a call to InitGoogleTest.
11675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const InternalRunDeathTestFlag* internal_run_death_test_flag() const {
11685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return internal_run_death_test_flag_.get();
11695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
11705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns a pointer to the current death test factory.
11725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::DeathTestFactory* death_test_factory() {
11735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return death_test_factory_.get();
11745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
11755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void SuppressTestEventsIfInSubprocess();
11775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  friend class ReplaceDeathTestFactory;
11795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_DEATH_TEST
11805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Initializes the event listener performing XML output as specified by
11825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // UnitTestOptions. Must not be called before InitGoogleTest.
11835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void ConfigureXmlOutput();
11845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_CAN_STREAM_RESULTS_
11865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Initializes the event listener for streaming test results to a socket.
11875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Must not be called before InitGoogleTest.
11885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void ConfigureStreamingOutput();
11895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
11905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Performs initialization dependent upon flag values obtained in
11925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
11935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
11945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // this function is also called from RunAllTests.  Since this function can be
11955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // called more than once, it has to be idempotent.
11965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void PostFlagParsingInit();
11975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
11985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the random seed used at the start of the current test iteration.
11995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int random_seed() const { return random_seed_; }
12005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the random number generator.
12025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::Random* random() { return &random_; }
12035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Shuffles all test cases, and the tests within each test case,
12055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // making sure that death tests are still run first.
12065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void ShuffleTests();
12075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Restores the test cases and tests to their order before the first shuffle.
12095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void UnshuffleTests();
12105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the value of GTEST_FLAG(catch_exceptions) at the moment
12125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // UnitTest::Run() starts.
12135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool catch_exceptions() const { return catch_exceptions_; }
12145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
12165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  friend class ::testing::UnitTest;
12175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Used by UnitTest::Run() to capture the state of
12195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // GTEST_FLAG(catch_exceptions) at the moment it starts.
12205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void set_catch_exceptions(bool value) { catch_exceptions_ = value; }
12215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The UnitTest object that owns this implementation object.
12235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  UnitTest* const parent_;
12245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The working directory when the first TEST() or TEST_F() was
12265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // executed.
12275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::FilePath original_working_dir_;
12285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The default test part result reporters.
12305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;
12315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  DefaultPerThreadTestPartResultReporter
12325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      default_per_thread_test_part_result_reporter_;
12335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Points to (but doesn't own) the global test part result reporter.
12355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestPartResultReporterInterface* global_test_part_result_repoter_;
12365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Protects read and write access to global_test_part_result_reporter_.
12385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::Mutex global_test_part_result_reporter_mutex_;
12395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Points to (but doesn't own) the per-thread test part result reporter.
12415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::ThreadLocal<TestPartResultReporterInterface*>
12425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      per_thread_test_part_result_reporter_;
12435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The vector of environments that need to be set-up/torn-down
12455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // before/after the tests are run.
12465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::vector<Environment*> environments_;
12475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The vector of TestCases in their original order.  It owns the
12495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // elements in the vector.
12505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::vector<TestCase*> test_cases_;
12515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Provides a level of indirection for the test case list to allow
12535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // easy shuffling and restoring the test case order.  The i-th
12545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // element of this vector is the index of the i-th test case in the
12555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // shuffled order.
12565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::vector<int> test_case_indices_;
12575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_PARAM_TEST
12595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // ParameterizedTestRegistry object used to register value-parameterized
12605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // tests.
12615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::ParameterizedTestCaseRegistry parameterized_test_registry_;
12625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Indicates whether RegisterParameterizedTests() has been called already.
12645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool parameterized_tests_registered_;
12655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_PARAM_TEST
12665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Index of the last death test case registered.  Initially -1.
12685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int last_death_test_case_;
12695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This points to the TestCase for the currently running test.  It
12715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // changes as Google Test goes through one test case after another.
12725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // When no test is running, this is set to NULL and Google Test
12735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // stores assertion results in ad_hoc_test_result_.  Initially NULL.
12745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestCase* current_test_case_;
12755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This points to the TestInfo for the currently running test.  It
12775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // changes as Google Test goes through one test after another.  When
12785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // no test is running, this is set to NULL and Google Test stores
12795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // assertion results in ad_hoc_test_result_.  Initially NULL.
12805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestInfo* current_test_info_;
12815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Normally, a user only writes assertions inside a TEST or TEST_F,
12835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // or inside a function called by a TEST or TEST_F.  Since Google
12845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Test keeps track of which test is current running, it can
12855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // associate such an assertion with the test it belongs to.
12865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
12875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // If an assertion is encountered when no TEST or TEST_F is running,
12885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Google Test attributes the assertion result to an imaginary "ad hoc"
12895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // test, and records the result in ad_hoc_test_result_.
12905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestResult ad_hoc_test_result_;
12915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The list of event listeners that can be used to track events inside
12935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Google Test.
12945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestEventListeners listeners_;
12955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
12965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The OS stack trace getter.  Will be deleted when the UnitTest
12975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // object is destructed.  By default, an OsStackTraceGetter is used,
12985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // but the user can set this field to use a custom getter if that is
12995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // desired.
13005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OsStackTraceGetterInterface* os_stack_trace_getter_;
13015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // True iff PostFlagParsingInit() has been called.
13035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool post_flag_parse_init_performed_;
13045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The random number seed used at the beginning of the test run.
13065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int random_seed_;
13075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Our random number generator.
13095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::Random random_;
13105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The time of the test program start, in ms from the start of the
13125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // UNIX epoch.
13135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TimeInMillis start_timestamp_;
13145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // How long the test took to run, in milliseconds.
13165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TimeInMillis elapsed_time_;
13175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_DEATH_TEST
13195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The decomposed components of the gtest_internal_run_death_test flag,
13205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // parsed when RUN_ALL_TESTS is called.
13215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
13225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;
13235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_DEATH_TEST
13245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // A per-thread stack of traces created by the SCOPED_TRACE() macro.
13265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;
13275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests()
13295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // starts.
13305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool catch_exceptions_;
13315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);
13335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class UnitTestImpl
13345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Convenience function for accessing the global UnitTest
13365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// implementation object.
13375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline UnitTestImpl* GetUnitTestImpl() {
13385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return UnitTest::GetInstance()->impl();
13395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
13405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_USES_SIMPLE_RE
13425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Internal helper functions for implementing the simple regular
13445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// expression matcher.
13455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool IsInSet(char ch, const char* str);
13465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool IsAsciiDigit(char ch);
13475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool IsAsciiPunct(char ch);
13485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool IsRepeat(char ch);
13495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool IsAsciiWhiteSpace(char ch);
13505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool IsAsciiWordChar(char ch);
13515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool IsValidEscape(char ch);
13525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);
13535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool ValidateRegex(const char* regex);
13545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);
13555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool MatchRepetitionAndRegexAtHead(
13565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bool escaped, char ch, char repeat, const char* regex, const char* str);
13575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);
13585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_USES_SIMPLE_RE
13605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Parses the command line for Google Test flags, without initializing
13625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// other parts of Google Test.
13635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);
13645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
13655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_DEATH_TEST
13675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the message describing the last system error, regardless of the
13695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// platform.
13705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ std::string GetLastErrnoDescription();
13715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_WINDOWS
13735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Provides leak-safe Windows kernel handle ownership.
13745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass AutoHandle {
13755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
13765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  AutoHandle() : handle_(INVALID_HANDLE_VALUE) {}
13775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit AutoHandle(HANDLE handle) : handle_(handle) {}
13785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~AutoHandle() { Reset(); }
13805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  HANDLE Get() const { return handle_; }
13825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void Reset() { Reset(INVALID_HANDLE_VALUE); }
13835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void Reset(HANDLE handle) {
13845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (handle != handle_) {
13855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (handle_ != INVALID_HANDLE_VALUE)
13865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ::CloseHandle(handle_);
13875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      handle_ = handle;
13885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
13895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
13905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
13925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  HANDLE handle_;
13935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
13955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
13965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_OS_WINDOWS
13975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
13985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Attempts to parse a string into a positive integer pointed to by the
13995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// number parameter.  Returns true if that is possible.
14005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use
14015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// it here.
14025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename Integer>
14035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool ParseNaturalNumber(const ::std::string& str, Integer* number) {
14045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Fail fast if the given string does not begin with a digit;
14055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // this bypasses strtoXXX's "optional leading whitespace and plus
14065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // or minus sign" semantics, which are undesirable here.
14075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (str.empty() || !IsDigit(str[0])) {
14085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return false;
14095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
14105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  errno = 0;
14115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char* end;
14135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // BiggestConvertible is the largest integer type that system-provided
14145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // string-to-number conversion routines can return.
14155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_WINDOWS && !defined(__GNUC__)
14175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // MSVC and C++ Builder define __int64 instead of the standard long long.
14195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef unsigned __int64 BiggestConvertible;
14205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);
14215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
14235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef unsigned long long BiggestConvertible;  // NOLINT
14255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
14265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_OS_WINDOWS && !defined(__GNUC__)
14285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const bool parse_success = *end == '\0' && errno == 0;
14305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // TODO(vladl@google.com): Convert this to compile time assertion when it is
14325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // available.
14335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
14345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Integer result = static_cast<Integer>(parsed);
14365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {
14375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *number = result;
14385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return true;
14395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
14405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return false;
14415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
14425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_DEATH_TEST
14435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TestResult contains some private methods that should be hidden from
14455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google Test user but are required for testing. This class allow our tests
14465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to access them.
14475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
14485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This class is supplied only for the purpose of testing Google Test's own
14495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// constructs. Do not use it in user tests, either directly or indirectly.
14505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TestResultAccessor {
14515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
14525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void RecordProperty(TestResult* test_result,
14535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                             const std::string& xml_element,
14545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                             const TestProperty& property) {
14555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    test_result->RecordProperty(xml_element, property);
14565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
14575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void ClearTestPartResults(TestResult* test_result) {
14595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    test_result->ClearTestPartResults();
14605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
14615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const std::vector<testing::TestPartResult>& test_part_results(
14635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const TestResult& test_result) {
14645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return test_result.test_part_results();
14655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
14665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
14675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_CAN_STREAM_RESULTS_
14695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Streams test results to the given port on the given host machine.
14715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass StreamingListener : public EmptyTestEventListener {
14725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
14735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Abstract base class for writing strings to a socket.
14745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class AbstractSocketWriter {
14755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   public:
14765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ~AbstractSocketWriter() {}
14775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Sends a string to the socket.
14795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual void Send(const string& message) = 0;
14805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Closes the socket.
14825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual void CloseConnection() {}
14835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Sends a string and a newline to the socket.
14855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void SendLn(const string& message) {
14865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      Send(message + "\n");
14875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
14885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };
14895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Concrete class for actually writing strings to a socket.
14915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  class SocketWriter : public AbstractSocketWriter {
14925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   public:
14935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    SocketWriter(const string& host, const string& port)
14945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        : sockfd_(-1), host_name_(host), port_num_(port) {
14955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      MakeConnection();
14965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
14975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
14985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual ~SocketWriter() {
14995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (sockfd_ != -1)
15005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        CloseConnection();
15015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
15025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Sends a string to the socket.
15045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    virtual void Send(const string& message) {
15055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_CHECK_(sockfd_ != -1)
15065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "Send() can be called only when there is a connection.";
15075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const int len = static_cast<int>(message.length());
15095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (write(sockfd_, message.c_str(), len) != len) {
15105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        GTEST_LOG_(WARNING)
15115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            << "stream_result_to: failed to stream to "
15125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            << host_name_ << ":" << port_num_;
15135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
15145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
15155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang   private:
15175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Creates a client socket and connects to the server.
15185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void MakeConnection();
15195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Closes the socket.
15215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void CloseConnection() {
15225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_CHECK_(sockfd_ != -1)
15235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "CloseConnection() can be called only when there is a connection.";
15245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      close(sockfd_);
15265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      sockfd_ = -1;
15275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
15285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int sockfd_;  // socket file descriptor
15305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const string host_name_;
15315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const string port_num_;
15325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter);
15345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };  // class SocketWriter
15355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Escapes '=', '&', '%', and '\n' characters in str as "%xx".
15375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static string UrlEncode(const char* str);
15385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  StreamingListener(const string& host, const string& port)
15405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : socket_writer_(new SocketWriter(host, port)) { Start(); }
15415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit StreamingListener(AbstractSocketWriter* socket_writer)
15435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : socket_writer_(socket_writer) { Start(); }
15445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void OnTestProgramStart(const UnitTest& /* unit_test */) {
15465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    SendLn("event=TestProgramStart");
15475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
15485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void OnTestProgramEnd(const UnitTest& unit_test) {
15505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Note that Google Test current only report elapsed time for each
15515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // test iteration, not for the entire test program.
15525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed()));
15535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Notify the streaming server to stop.
15555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    socket_writer_->CloseConnection();
15565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
15575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {
15595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    SendLn("event=TestIterationStart&iteration=" +
15605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           StreamableToString(iteration));
15615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
15625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {
15645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    SendLn("event=TestIterationEnd&passed=" +
15655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           FormatBool(unit_test.Passed()) + "&elapsed_time=" +
15665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           StreamableToString(unit_test.elapsed_time()) + "ms");
15675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
15685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void OnTestCaseStart(const TestCase& test_case) {
15705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    SendLn(std::string("event=TestCaseStart&name=") + test_case.name());
15715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
15725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void OnTestCaseEnd(const TestCase& test_case) {
15745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed())
15755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           + "&elapsed_time=" + StreamableToString(test_case.elapsed_time())
15765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           + "ms");
15775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
15785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void OnTestStart(const TestInfo& test_info) {
15805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    SendLn(std::string("event=TestStart&name=") + test_info.name());
15815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
15825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void OnTestEnd(const TestInfo& test_info) {
15845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    SendLn("event=TestEnd&passed=" +
15855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           FormatBool((test_info.result())->Passed()) +
15865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           "&elapsed_time=" +
15875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           StreamableToString((test_info.result())->elapsed_time()) + "ms");
15885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
15895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void OnTestPartResult(const TestPartResult& test_part_result) {
15915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* file_name = test_part_result.file_name();
15925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (file_name == NULL)
15935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      file_name = "";
15945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    SendLn("event=TestPartResult&file=" + UrlEncode(file_name) +
15955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           "&line=" + StreamableToString(test_part_result.line_number()) +
15965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           "&message=" + UrlEncode(test_part_result.message()));
15975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
15985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
15995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
16005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Sends the given message and a newline to the socket.
16015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void SendLn(const string& message) { socket_writer_->SendLn(message); }
16025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Called at the start of streaming to notify the receiver what
16045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // protocol we are using.
16055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void Start() { SendLn("gtest_streaming_protocol_version=1.0"); }
16065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  string FormatBool(bool value) { return value ? "1" : "0"; }
16085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const scoped_ptr<AbstractSocketWriter> socket_writer_;
16105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);
16125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};  // class StreamingListener
16135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_CAN_STREAM_RESULTS_
16155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
16175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
16185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_SRC_GTEST_INTERNAL_INL_H_
16205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_IMPLEMENTATION_
16215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS
16235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define vsnprintf _vsnprintf
16245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS
16255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
16275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangusing internal::CountIf;
16295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangusing internal::ForEach;
16305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangusing internal::GetElementOr;
16315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangusing internal::Shuffle;
16325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Constants.
16345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A test whose test case name or test name matches this filter is
16365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// disabled and not run.
16375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*";
16385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A test case whose name matches this filter is considered a death
16405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// test case and will be run before test cases whose name doesn't
16415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// match this filter.
16425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*";
16435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A test filter that matches everything.
16455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char kUniversalFilter[] = "*";
16465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The default output file for XML output.
16485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char kDefaultOutputFile[] = "test_detail.xml";
16495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The environment variable name for the test shard index.
16515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char kTestShardIndex[] = "GTEST_SHARD_INDEX";
16525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The environment variable name for the total number of test shards.
16535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS";
16545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The environment variable name for the test shard status file.
16555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE";
16565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
16585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The text used in failure messages to indicate the start of the
16605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// stack trace.
16615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kStackTraceMarker[] = "\nStack trace:\n";
16625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// g_help_flag is true iff the --help flag or an equivalent form is
16645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// specified on the command line.
16655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool g_help_flag = false;
16665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
16685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char* GetDefaultFilter() {
16705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return kUniversalFilter;
16715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
16725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DEFINE_bool_(
16745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    also_run_disabled_tests,
16755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::BoolFromGTestEnv("also_run_disabled_tests", false),
16765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "Run disabled tests too, in addition to the tests normally being run.");
16775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DEFINE_bool_(
16795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    break_on_failure,
16805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::BoolFromGTestEnv("break_on_failure", false),
16815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "True iff a failed assertion should be a debugger break-point.");
16825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DEFINE_bool_(
16845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    catch_exceptions,
16855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::BoolFromGTestEnv("catch_exceptions", true),
16865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "True iff " GTEST_NAME_
16875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    " should catch exceptions and treat them as test failures.");
16885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DEFINE_string_(
16905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    color,
16915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::StringFromGTestEnv("color", "auto"),
16925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "Whether to use colors in the output.  Valid values: yes, no, "
16935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "and auto.  'auto' means to use colors if the output is "
16945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "being sent to a terminal and the TERM environment variable "
16955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "is set to a terminal type that supports colors.");
16965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
16975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DEFINE_string_(
16985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    filter,
16995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::StringFromGTestEnv("filter", GetDefaultFilter()),
17005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "A colon-separated list of glob (not regex) patterns "
17015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "for filtering the tests to run, optionally followed by a "
17025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "'-' and a : separated list of negative patterns (tests to "
17035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "exclude).  A test is run if it matches one of the positive "
17045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "patterns and does not match any of the negative patterns.");
17055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DEFINE_bool_(list_tests, false,
17075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   "List all tests without running them.");
17085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DEFINE_string_(
17105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    output,
17115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::StringFromGTestEnv("output", ""),
17125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "A format (currently must be \"xml\"), optionally followed "
17135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "by a colon and an output file name or directory. A directory "
17145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "is indicated by a trailing pathname separator. "
17155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "Examples: \"xml:filename.xml\", \"xml::directoryname/\". "
17165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "If a directory is specified, output files will be created "
17175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "within that directory, with file-names based on the test "
17185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "executable's name and, if necessary, made unique by adding "
17195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "digits.");
17205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DEFINE_bool_(
17225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    print_time,
17235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::BoolFromGTestEnv("print_time", true),
17245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "True iff " GTEST_NAME_
17255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    " should display elapsed time in text output.");
17265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DEFINE_int32_(
17285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    random_seed,
17295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::Int32FromGTestEnv("random_seed", 0),
17305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "Random number seed to use when shuffling test orders.  Must be in range "
17315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "[1, 99999], or 0 to use a seed based on the current time.");
17325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DEFINE_int32_(
17345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    repeat,
17355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::Int32FromGTestEnv("repeat", 1),
17365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "How many times to repeat each test.  Specify a negative number "
17375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "for repeating forever.  Useful for shaking out flaky tests.");
17385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DEFINE_bool_(
17405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    show_internal_stack_frames, false,
17415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "True iff " GTEST_NAME_ " should include internal stack frames when "
17425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "printing test failure stack traces.");
17435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DEFINE_bool_(
17455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    shuffle,
17465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::BoolFromGTestEnv("shuffle", false),
17475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "True iff " GTEST_NAME_
17485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    " should randomize tests' order on every run.");
17495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DEFINE_int32_(
17515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    stack_trace_depth,
17525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
17535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "The maximum number of stack frames to print when an "
17545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "assertion fails.  The valid range is 0 through 100, inclusive.");
17555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DEFINE_string_(
17575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    stream_result_to,
17585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::StringFromGTestEnv("stream_result_to", ""),
17595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "This flag specifies the host name and the port number on which to stream "
17605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "test results. Example: \"localhost:555\". The flag is effective only on "
17615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "Linux.");
17625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DEFINE_bool_(
17645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    throw_on_failure,
17655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::BoolFromGTestEnv("throw_on_failure", false),
17665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "When this flag is specified, a failed assertion will throw an exception "
17675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "if exceptions are enabled or exit the program with a non-zero code "
17685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "otherwise.");
17695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
17715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Generates a random number from [0, range), using a Linear
17735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Congruential Generator (LCG).  Crashes if 'range' is 0 or greater
17745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// than kMaxRange.
17755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangUInt32 Random::Generate(UInt32 range) {
17765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // These constants are the same as are used in glibc's rand(3).
17775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  state_ = (1103515245U*state_ + 12345U) % kMaxRange;
17785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_CHECK_(range > 0)
17805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "Cannot generate a number in the range [0, 0).";
17815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_CHECK_(range <= kMaxRange)
17825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "Generation of a number in [0, " << range << ") was requested, "
17835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "but this can only generate numbers in [0, " << kMaxRange << ").";
17845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Converting via modulus introduces a bit of downward bias, but
17865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // it's simple, and a linear congruential generator isn't too good
17875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // to begin with.
17885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return state_ % range;
17895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
17905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
17915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// GTestIsInitialized() returns true iff the user has initialized
17925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google Test.  Useful for catching the user mistake of not initializing
17935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google Test before calling RUN_ALL_TESTS().
17945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
17955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A user must call testing::InitGoogleTest() to initialize Google
17965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Test.  g_init_gtest_count is set to the number of times
17975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// InitGoogleTest() has been called.  We don't protect this variable
17985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// under a mutex as it is only accessed in the main thread.
17995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ int g_init_gtest_count = 0;
18005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic bool GTestIsInitialized() { return g_init_gtest_count != 0; }
18015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Iterates over a vector of TestCases, keeping a running sum of the
18035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// results of calling a given int-returning method on each.
18045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the sum.
18055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic int SumOverTestCaseList(const std::vector<TestCase*>& case_list,
18065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               int (TestCase::*method)() const) {
18075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int sum = 0;
18085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (size_t i = 0; i < case_list.size(); i++) {
18095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    sum += (case_list[i]->*method)();
18105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
18115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return sum;
18125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
18135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff the test case passed.
18155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic bool TestCasePassed(const TestCase* test_case) {
18165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return test_case->should_run() && test_case->Passed();
18175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
18185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff the test case failed.
18205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic bool TestCaseFailed(const TestCase* test_case) {
18215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return test_case->should_run() && test_case->Failed();
18225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
18235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff test_case contains at least one test that should
18255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// run.
18265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic bool ShouldRunTestCase(const TestCase* test_case) {
18275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return test_case->should_run();
18285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
18295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// AssertHelper constructor.
18315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertHelper::AssertHelper(TestPartResult::Type type,
18325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                           const char* file,
18335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                           int line,
18345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                           const char* message)
18355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : data_(new AssertHelperData(type, file, line, message)) {
18365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
18375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertHelper::~AssertHelper() {
18395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  delete data_;
18405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
18415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Message assignment, for assertion streaming support.
18435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid AssertHelper::operator=(const Message& message) const {
18445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  UnitTest::GetInstance()->
18455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    AddTestPartResult(data_->type, data_->file, data_->line,
18465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      AppendUserMessage(data_->message, message),
18475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      UnitTest::GetInstance()->impl()
18485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      ->CurrentOsStackTraceExceptTop(1)
18495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      // Skips the stack frame for this function itself.
18505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      );  // NOLINT
18515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
18525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Mutex for linked pointers.
18545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
18555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Application pathname gotten in InitGoogleTest.
18575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string g_executable_path;
18585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the current application's name, removing directory path if that
18605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// is present.
18615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangFilePath GetCurrentExecutableName() {
18625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FilePath result;
18635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS
18655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  result.Set(FilePath(g_executable_path).RemoveExtension("exe"));
18665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
18675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  result.Set(FilePath(g_executable_path));
18685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS
18695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return result.RemoveDirectoryName();
18715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
18725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Functions for processing the gtest_output flag.
18745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the output format, or "" for normal printed output.
18765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string UnitTestOptions::GetOutputFormat() {
18775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
18785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (gtest_output_flag == NULL) return std::string("");
18795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const colon = strchr(gtest_output_flag, ':');
18815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return (colon == NULL) ?
18825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      std::string(gtest_output_flag) :
18835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      std::string(gtest_output_flag, colon - gtest_output_flag);
18845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
18855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the name of the requested output file, or the default if none
18875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// was explicitly specified.
18885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string UnitTestOptions::GetAbsolutePathToOutputFile() {
18895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
18905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (gtest_output_flag == NULL)
18915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return "";
18925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
18935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const colon = strchr(gtest_output_flag, ':');
18945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (colon == NULL)
18955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return internal::FilePath::ConcatPaths(
18965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        internal::FilePath(
18975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            UnitTest::GetInstance()->original_working_dir()),
18985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        internal::FilePath(kDefaultOutputFile)).string();
18995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::FilePath output_name(colon + 1);
19015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!output_name.IsAbsolutePath())
19025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // TODO(wan@google.com): on Windows \some\path is not an absolute
19035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // path (as its meaning depends on the current drive), yet the
19045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // following logic for turning it into an absolute path is wrong.
19055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Fix it.
19065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    output_name = internal::FilePath::ConcatPaths(
19075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        internal::FilePath(UnitTest::GetInstance()->original_working_dir()),
19085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        internal::FilePath(colon + 1));
19095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!output_name.IsDirectory())
19115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return output_name.string();
19125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::FilePath result(internal::FilePath::GenerateUniqueFileName(
19145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      output_name, internal::GetCurrentExecutableName(),
19155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GetOutputFormat().c_str()));
19165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return result.string();
19175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
19185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff the wildcard pattern matches the string.  The
19205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// first ':' or '\0' character in pattern marks the end of it.
19215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
19225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This recursive algorithm isn't very efficient, but is clear and
19235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// works well enough for matching test names, which are short.
19245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool UnitTestOptions::PatternMatchesString(const char *pattern,
19255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                           const char *str) {
19265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  switch (*pattern) {
19275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case '\0':
19285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case ':':  // Either ':' or '\0' marks the end of the pattern.
19295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return *str == '\0';
19305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case '?':  // Matches any single character.
19315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return *str != '\0' && PatternMatchesString(pattern + 1, str + 1);
19325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case '*':  // Matches any string (possibly empty) of characters.
19335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return (*str != '\0' && PatternMatchesString(pattern, str + 1)) ||
19345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          PatternMatchesString(pattern + 1, str);
19355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    default:  // Non-special character.  Matches itself.
19365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return *pattern == *str &&
19375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          PatternMatchesString(pattern + 1, str + 1);
19385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
19395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
19405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool UnitTestOptions::MatchesFilter(
19425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const std::string& name, const char* filter) {
19435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char *cur_pattern = filter;
19445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (;;) {
19455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (PatternMatchesString(cur_pattern, name.c_str())) {
19465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return true;
19475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
19485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Finds the next pattern in the filter.
19505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    cur_pattern = strchr(cur_pattern, ':');
19515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Returns if no more pattern can be found.
19535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (cur_pattern == NULL) {
19545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return false;
19555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
19565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Skips the pattern separater (the ':' character).
19585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    cur_pattern++;
19595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
19605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
19615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff the user-specified filter matches the test case
19635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// name and the test name.
19645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name,
19655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                        const std::string &test_name) {
19665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string& full_name = test_case_name + "." + test_name.c_str();
19675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Split --gtest_filter at '-', if there is one, to separate into
19695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // positive filter and negative filter portions
19705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const p = GTEST_FLAG(filter).c_str();
19715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const dash = strchr(p, '-');
19725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string positive;
19735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string negative;
19745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (dash == NULL) {
19755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    positive = GTEST_FLAG(filter).c_str();  // Whole string is a positive filter
19765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    negative = "";
19775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
19785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    positive = std::string(p, dash);   // Everything up to the dash
19795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    negative = std::string(dash + 1);  // Everything after the dash
19805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (positive.empty()) {
19815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Treat '-test1' as the same as '*-test1'
19825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      positive = kUniversalFilter;
19835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
19845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
19855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // A filter is a colon-separated list of patterns.  It matches a
19875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // test if any pattern in it matches the test.
19885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return (MatchesFilter(full_name, positive.c_str()) &&
19895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          !MatchesFilter(full_name, negative.c_str()));
19905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
19915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
19925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_SEH
19935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
19945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
19955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This function is useful as an __except condition.
19965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
19975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Google Test should handle a SEH exception if:
19985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   1. the user wants it to, AND
19995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   2. this is not a breakpoint exception, AND
20005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   3. this is not a C++ exception (VC++ implements them via SEH,
20015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //      apparently).
20025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
20035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // SEH exception code for C++ exceptions.
20045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // (see http://support.microsoft.com/kb/185294 for more information).
20055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const DWORD kCxxExceptionCode = 0xe06d7363;
20065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool should_handle = true;
20085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!GTEST_FLAG(catch_exceptions))
20105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    should_handle = false;
20115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  else if (exception_code == EXCEPTION_BREAKPOINT)
20125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    should_handle = false;
20135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  else if (exception_code == kCxxExceptionCode)
20145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    should_handle = false;
20155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
20175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
20185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_SEH
20195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
20215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The c'tor sets this object as the test part result reporter used by
20235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google Test.  The 'result' parameter specifies where to report the
20245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// results. Intercepts only failures from the current thread.
20255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
20265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TestPartResultArray* result)
20275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),
20285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      result_(result) {
20295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Init();
20305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
20315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The c'tor sets this object as the test part result reporter used by
20335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google Test.  The 'result' parameter specifies where to report the
20345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// results.
20355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
20365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    InterceptMode intercept_mode, TestPartResultArray* result)
20375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : intercept_mode_(intercept_mode),
20385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      result_(result) {
20395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Init();
20405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
20415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid ScopedFakeTestPartResultReporter::Init() {
20435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
20445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
20455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    old_reporter_ = impl->GetGlobalTestPartResultReporter();
20465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    impl->SetGlobalTestPartResultReporter(this);
20475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
20485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();
20495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    impl->SetTestPartResultReporterForCurrentThread(this);
20505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
20515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
20525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The d'tor restores the test part result reporter used by Google Test
20545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// before.
20555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {
20565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
20575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
20585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    impl->SetGlobalTestPartResultReporter(old_reporter_);
20595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
20605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    impl->SetTestPartResultReporterForCurrentThread(old_reporter_);
20615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
20625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
20635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Increments the test part result count and remembers the result.
20655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This method is from the TestPartResultReporterInterface interface.
20665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid ScopedFakeTestPartResultReporter::ReportTestPartResult(
20675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const TestPartResult& result) {
20685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  result_->Append(result);
20695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
20705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
20725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the type ID of ::testing::Test.  We should always call this
20745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// instead of GetTypeId< ::testing::Test>() to get the type ID of
20755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// testing::Test.  This is to work around a suspected linker bug when
20765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// using Google Test as a framework on Mac OS X.  The bug causes
20775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// GetTypeId< ::testing::Test>() to return different values depending
20785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// on whether the call is from the Google Test framework itself or
20795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// from user test code.  GetTestTypeId() is guaranteed to always
20805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// return the same value, as it always calls GetTypeId<>() from the
20815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// gtest.cc, which is within the Google Test framework.
20825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTypeId GetTestTypeId() {
20835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return GetTypeId<Test>();
20845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
20855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The value of GetTestTypeId() as seen from within the Google Test
20875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// library.  This is solely for testing GetTestTypeId().
20885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangextern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();
20895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
20905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This predicate-formatter checks that 'results' contains a test part
20915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// failure of the given type and that the failure message contains the
20925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// given substring.
20935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult HasOneFailure(const char* /* results_expr */,
20945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                              const char* /* type_expr */,
20955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                              const char* /* substr_expr */,
20965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                              const TestPartResultArray& results,
20975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                              TestPartResult::Type type,
20985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                              const string& substr) {
20995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string expected(type == TestPartResult::kFatalFailure ?
21005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        "1 fatal failure" :
21015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        "1 non-fatal failure");
21025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message msg;
21035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (results.size() != 1) {
21045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    msg << "Expected: " << expected << "\n"
21055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        << "  Actual: " << results.size() << " failures";
21065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (int i = 0; i < results.size(); i++) {
21075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      msg << "\n" << results.GetTestPartResult(i);
21085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
21095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionFailure() << msg;
21105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
21115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestPartResult& r = results.GetTestPartResult(0);
21135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (r.type() != type) {
21145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionFailure() << "Expected: " << expected << "\n"
21155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                              << "  Actual:\n"
21165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                              << r;
21175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
21185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (strstr(r.message(), substr.c_str()) == NULL) {
21205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionFailure() << "Expected: " << expected << " containing \""
21215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                              << substr << "\"\n"
21225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                              << "  Actual:\n"
21235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                              << r;
21245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
21255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return AssertionSuccess();
21275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
21285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The constructor of SingleFailureChecker remembers where to look up
21305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// test part results, what type of failure we expect, and what
21315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// substring the failure message should contain.
21325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangSingleFailureChecker:: SingleFailureChecker(
21335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const TestPartResultArray* results,
21345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TestPartResult::Type type,
21355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const string& substr)
21365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : results_(results),
21375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      type_(type),
21385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      substr_(substr) {}
21395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The destructor of SingleFailureChecker verifies that the given
21415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TestPartResultArray contains exactly one failure that has the given
21425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// type and contains the given substring.  If that's not the case, a
21435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// non-fatal failure will be generated.
21445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangSingleFailureChecker::~SingleFailureChecker() {
21455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_);
21465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
21475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangDefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(
21495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
21505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid DefaultGlobalTestPartResultReporter::ReportTestPartResult(
21525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const TestPartResult& result) {
21535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  unit_test_->current_test_result()->AddTestPartResult(result);
21545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  unit_test_->listeners()->repeater()->OnTestPartResult(result);
21555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
21565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangDefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(
21585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
21595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid DefaultPerThreadTestPartResultReporter::ReportTestPartResult(
21615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const TestPartResult& result) {
21625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);
21635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
21645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the global test part result reporter.
21665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestPartResultReporterInterface*
21675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangUnitTestImpl::GetGlobalTestPartResultReporter() {
21685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
21695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return global_test_part_result_repoter_;
21705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
21715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Sets the global test part result reporter.
21735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UnitTestImpl::SetGlobalTestPartResultReporter(
21745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TestPartResultReporterInterface* reporter) {
21755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
21765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  global_test_part_result_repoter_ = reporter;
21775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
21785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the test part result reporter for the current thread.
21805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestPartResultReporterInterface*
21815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangUnitTestImpl::GetTestPartResultReporterForCurrentThread() {
21825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return per_thread_test_part_result_reporter_.get();
21835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
21845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Sets the test part result reporter for the current thread.
21865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UnitTestImpl::SetTestPartResultReporterForCurrentThread(
21875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TestPartResultReporterInterface* reporter) {
21885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  per_thread_test_part_result_reporter_.set(reporter);
21895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
21905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of successful test cases.
21925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTestImpl::successful_test_case_count() const {
21935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return CountIf(test_cases_, TestCasePassed);
21945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
21955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
21965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of failed test cases.
21975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTestImpl::failed_test_case_count() const {
21985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return CountIf(test_cases_, TestCaseFailed);
21995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
22005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of all test cases.
22025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTestImpl::total_test_case_count() const {
22035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return static_cast<int>(test_cases_.size());
22045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
22055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of all test cases that contain at least one test
22075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// that should run.
22085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTestImpl::test_case_to_run_count() const {
22095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return CountIf(test_cases_, ShouldRunTestCase);
22105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
22115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of successful tests.
22135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTestImpl::successful_test_count() const {
22145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);
22155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
22165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of failed tests.
22185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTestImpl::failed_test_count() const {
22195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);
22205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
22215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of disabled tests that will be reported in the XML report.
22235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTestImpl::reportable_disabled_test_count() const {
22245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return SumOverTestCaseList(test_cases_,
22255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                             &TestCase::reportable_disabled_test_count);
22265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
22275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of disabled tests.
22295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTestImpl::disabled_test_count() const {
22305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);
22315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
22325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of tests to be printed in the XML report.
22345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTestImpl::reportable_test_count() const {
22355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return SumOverTestCaseList(test_cases_, &TestCase::reportable_test_count);
22365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
22375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of all tests.
22395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTestImpl::total_test_count() const {
22405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);
22415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
22425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of tests that should run.
22445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTestImpl::test_to_run_count() const {
22455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);
22465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
22475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the current OS stack trace as an std::string.
22495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
22505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The maximum number of stack frames to be included is specified by
22515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the gtest_stack_trace_depth flag.  The skip_count parameter
22525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// specifies the number of top frames to be skipped, which doesn't
22535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// count against the number of frames to be included.
22545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
22555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// For example, if Foo() calls Bar(), which in turn calls
22565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
22575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
22585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
22595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  (void)skip_count;
22605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return "";
22615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
22625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the current time in milliseconds.
22645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTimeInMillis GetTimeInMillis() {
22655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)
22665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Difference between 1970-01-01 and 1601-01-01 in milliseconds.
22675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // http://analogous.blogspot.com/2005/04/epoch.html
22685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TimeInMillis kJavaEpochToWinFileTimeDelta =
22695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    static_cast<TimeInMillis>(116444736UL) * 100000UL;
22705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const DWORD kTenthMicrosInMilliSecond = 10000;
22715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  SYSTEMTIME now_systime;
22735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FILETIME now_filetime;
22745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ULARGE_INTEGER now_int64;
22755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // TODO(kenton@google.com): Shouldn't this just use
22765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   GetSystemTimeAsFileTime()?
22775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GetSystemTime(&now_systime);
22785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (SystemTimeToFileTime(&now_systime, &now_filetime)) {
22795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    now_int64.LowPart = now_filetime.dwLowDateTime;
22805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    now_int64.HighPart = now_filetime.dwHighDateTime;
22815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -
22825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      kJavaEpochToWinFileTimeDelta;
22835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return now_int64.QuadPart;
22845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
22855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return 0;
22865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_
22875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  __timeb64 now;
22885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# ifdef _MSC_VER
22905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
22915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
22925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // (deprecated function) there.
22935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // TODO(kenton@google.com): Use GetTickCount()?  Or use
22945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   SystemTimeToFileTime()
22955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  pragma warning(push)          // Saves the current warning state.
22965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  pragma warning(disable:4996)  // Temporarily disables warning 4996.
22975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  _ftime64(&now);
22985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  pragma warning(pop)           // Restores the warning state.
22995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
23005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  _ftime64(&now);
23025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // _MSC_VER
23045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;
23065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif GTEST_HAS_GETTIMEOFDAY_
23075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  struct timeval now;
23085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  gettimeofday(&now, NULL);
23095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;
23105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
23115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# error "Don't know how to get the current time on your system."
23125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
23135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
23145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Utilities
23165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class String.
23185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS_MOBILE
23205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Creates a UTF-16 wide string from the given ANSI string, allocating
23215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// memory using new. The caller is responsible for deleting the return
23225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// value using delete[]. Returns the wide string, or NULL if the
23235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// input is NULL.
23245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangLPCWSTR String::AnsiToUtf16(const char* ansi) {
23255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!ansi) return NULL;
23265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int length = strlen(ansi);
23275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int unicode_length =
23285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      MultiByteToWideChar(CP_ACP, 0, ansi, length,
23295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                          NULL, 0);
23305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  WCHAR* unicode = new WCHAR[unicode_length + 1];
23315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  MultiByteToWideChar(CP_ACP, 0, ansi, length,
23325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      unicode, unicode_length);
23335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  unicode[unicode_length] = 0;
23345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return unicode;
23355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
23365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Creates an ANSI string from the given wide string, allocating
23385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// memory using new. The caller is responsible for deleting the return
23395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// value using delete[]. Returns the ANSI string, or NULL if the
23405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// input is NULL.
23415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char* String::Utf16ToAnsi(LPCWSTR utf16_str)  {
23425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!utf16_str) return NULL;
23435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int ansi_length =
23445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
23455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                          NULL, 0, NULL, NULL);
23465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char* ansi = new char[ansi_length + 1];
23475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
23485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      ansi, ansi_length, NULL, NULL);
23495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ansi[ansi_length] = 0;
23505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ansi;
23515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
23525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS_MOBILE
23545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Compares two C strings.  Returns true iff they have the same content.
23565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
23575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Unlike strcmp(), this function can handle NULL argument(s).  A NULL
23585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// C string is considered different to any non-NULL C string,
23595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// including the empty string.
23605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool String::CStringEquals(const char * lhs, const char * rhs) {
23615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if ( lhs == NULL ) return rhs == NULL;
23625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if ( rhs == NULL ) return false;
23645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return strcmp(lhs, rhs) == 0;
23665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
23675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
23695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Converts an array of wide chars to a narrow string using the UTF-8
23715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// encoding, and streams the result to the given Message object.
23725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,
23735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     Message* msg) {
23745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (size_t i = 0; i != length; ) {  // NOLINT
23755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (wstr[i] != L'\0') {
23765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));
23775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      while (i != length && wstr[i] != L'\0')
23785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        i++;
23795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
23805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *msg << '\0';
23815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      i++;
23825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
23835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
23845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
23855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
23875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
23895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
23905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Constructs an empty Message.
23915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We allocate the stringstream separately because otherwise each use of
23925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
23935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// stack frame leading to huge stack frames in some cases; gcc does not reuse
23945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the stack space.
23955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangMessage::Message() : ss_(new ::std::stringstream) {
23965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // By default, we want there to be enough precision when printing
23975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // a double to a Message.
23985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
23995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
24005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// These two overloads allow streaming a wide C string to a Message
24025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// using the UTF-8 encoding.
24035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangMessage& Message::operator <<(const wchar_t* wide_c_str) {
24045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return *this << internal::String::ShowWideCString(wide_c_str);
24055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
24065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangMessage& Message::operator <<(wchar_t* wide_c_str) {
24075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return *this << internal::String::ShowWideCString(wide_c_str);
24085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
24095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_STD_WSTRING
24115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Converts the given wide string to a narrow string using the UTF-8
24125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// encoding, and streams the result to this Message object.
24135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangMessage& Message::operator <<(const ::std::wstring& wstr) {
24145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
24155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return *this;
24165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
24175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_STD_WSTRING
24185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_GLOBAL_WSTRING
24205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Converts the given wide string to a narrow string using the UTF-8
24215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// encoding, and streams the result to this Message object.
24225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangMessage& Message::operator <<(const ::wstring& wstr) {
24235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
24245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return *this;
24255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
24265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_GLOBAL_WSTRING
24275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the text streamed to this object so far as an std::string.
24295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Each '\0' character in the buffer is replaced with "\\0".
24305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string Message::GetString() const {
24315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::StringStreamToString(ss_.get());
24325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
24335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// AssertionResult constructors.
24355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Used in EXPECT_TRUE/FALSE(assertion_result).
24365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult::AssertionResult(const AssertionResult& other)
24375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : success_(other.success_),
24385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      message_(other.message_.get() != NULL ?
24395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang               new ::std::string(*other.message_) :
24405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang               static_cast< ::std::string*>(NULL)) {
24415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
24425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
24445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult AssertionResult::operator!() const {
24455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  AssertionResult negation(!success_);
24465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (message_.get() != NULL)
24475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    negation << *message_;
24485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return negation;
24495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
24505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Makes a successful assertion result.
24525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult AssertionSuccess() {
24535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return AssertionResult(true);
24545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
24555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Makes a failed assertion result.
24575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult AssertionFailure() {
24585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return AssertionResult(false);
24595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
24605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Makes a failed assertion result with the given failure message.
24625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Deprecated; use AssertionFailure() << message.
24635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult AssertionFailure(const Message& message) {
24645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return AssertionFailure() << message;
24655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
24665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
24685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Constructs and returns the message for an equality assertion
24705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
24715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
24725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The first four parameters are the expressions used in the assertion
24735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
24745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// where foo is 5 and bar is 6, we have:
24755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
24765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   expected_expression: "foo"
24775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   actual_expression:   "bar"
24785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   expected_value:      "5"
24795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   actual_value:        "6"
24805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
24815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The ignoring_case parameter is true iff the assertion is a
24825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
24835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// be inserted into the message.
24845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult EqFailure(const char* expected_expression,
24855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                          const char* actual_expression,
24865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                          const std::string& expected_value,
24875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                          const std::string& actual_value,
24885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                          bool ignoring_case) {
24895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message msg;
24905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  msg << "Value of: " << actual_expression;
24915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (actual_value != actual_expression) {
24925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    msg << "\n  Actual: " << actual_value;
24935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
24945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
24955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  msg << "\nExpected: " << expected_expression;
24965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (ignoring_case) {
24975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    msg << " (ignoring case)";
24985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
24995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (expected_value != expected_expression) {
25005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    msg << "\nWhich is: " << expected_value;
25015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
25025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return AssertionFailure() << msg;
25045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
25055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
25075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string GetBoolAssertionFailureMessage(
25085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const AssertionResult& assertion_result,
25095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* expression_text,
25105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* actual_predicate_value,
25115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* expected_predicate_value) {
25125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* actual_message = assertion_result.message();
25135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message msg;
25145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  msg << "Value of: " << expression_text
25155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "\n  Actual: " << actual_predicate_value;
25165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (actual_message[0] != '\0')
25175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    msg << " (" << actual_message << ")";
25185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  msg << "\nExpected: " << expected_predicate_value;
25195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return msg.GetString();
25205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
25215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper function for implementing ASSERT_NEAR.
25235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult DoubleNearPredFormat(const char* expr1,
25245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     const char* expr2,
25255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     const char* abs_error_expr,
25265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     double val1,
25275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     double val2,
25285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     double abs_error) {
25295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const double diff = fabs(val1 - val2);
25305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (diff <= abs_error) return AssertionSuccess();
25315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // TODO(wan): do not print the value of an expression if it's
25335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // already a literal.
25345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return AssertionFailure()
25355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "The difference between " << expr1 << " and " << expr2
25365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n"
25375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << expr1 << " evaluates to " << val1 << ",\n"
25385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << expr2 << " evaluates to " << val2 << ", and\n"
25395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << abs_error_expr << " evaluates to " << abs_error << ".";
25405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
25415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper template for implementing FloatLE() and DoubleLE().
25445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename RawType>
25455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult FloatingPointLE(const char* expr1,
25465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                const char* expr2,
25475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                RawType val1,
25485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                RawType val2) {
25495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns success if val1 is less than val2,
25505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (val1 < val2) {
25515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionSuccess();
25525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
25535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // or if val1 is almost equal to val2.
25555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const FloatingPoint<RawType> lhs(val1), rhs(val2);
25565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (lhs.AlmostEquals(rhs)) {
25575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionSuccess();
25585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
25595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Note that the above two checks will both fail if either val1 or
25615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // val2 is NaN, as the IEEE floating-point standard requires that
25625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // any predicate involving a NaN must return false.
25635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::std::stringstream val1_ss;
25655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
25665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << val1;
25675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::std::stringstream val2_ss;
25695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
25705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << val2;
25715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return AssertionFailure()
25735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n"
25745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "  Actual: " << StringStreamToString(&val1_ss) << " vs "
25755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << StringStreamToString(&val2_ss);
25765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
25775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
25795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Asserts that val1 is less than, or almost equal to, val2.  Fails
25815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// otherwise.  In particular, it fails if either val1 or val2 is NaN.
25825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult FloatLE(const char* expr1, const char* expr2,
25835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        float val1, float val2) {
25845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);
25855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
25865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Asserts that val1 is less than, or almost equal to, val2.  Fails
25885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// otherwise.  In particular, it fails if either val1 or val2 is NaN.
25895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult DoubleLE(const char* expr1, const char* expr2,
25905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                         double val1, double val2) {
25915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);
25925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
25935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
25955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
25965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The helper function for {ASSERT|EXPECT}_EQ with int or enum
25975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// arguments.
25985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult CmpHelperEQ(const char* expected_expression,
25995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            const char* actual_expression,
26005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            BiggestInt expected,
26015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            BiggestInt actual) {
26025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (expected == actual) {
26035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionSuccess();
26045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
26055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return EqFailure(expected_expression,
26075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   actual_expression,
26085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   FormatForComparisonFailureMessage(expected, actual),
26095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   FormatForComparisonFailureMessage(actual, expected),
26105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   false);
26115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
26125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A macro for implementing the helper functions needed to implement
26145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ASSERT_?? and EXPECT_?? with integer or enum arguments.  It is here
26155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// just to avoid copy-and-paste of similar code.
26165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
26175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
26185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                   BiggestInt val1, BiggestInt val2) {\
26195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (val1 op val2) {\
26205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionSuccess();\
26215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {\
26225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionFailure() \
26235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        << "Expected: (" << expr1 << ") " #op " (" << expr2\
26245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
26255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
26265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }\
26275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
26285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Implements the helper function for {ASSERT|EXPECT}_NE with int or
26305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// enum arguments.
26315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_CMP_HELPER_(NE, !=)
26325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Implements the helper function for {ASSERT|EXPECT}_LE with int or
26335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// enum arguments.
26345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_CMP_HELPER_(LE, <=)
26355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Implements the helper function for {ASSERT|EXPECT}_LT with int or
26365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// enum arguments.
26375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_CMP_HELPER_(LT, < )
26385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Implements the helper function for {ASSERT|EXPECT}_GE with int or
26395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// enum arguments.
26405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_CMP_HELPER_(GE, >=)
26415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Implements the helper function for {ASSERT|EXPECT}_GT with int or
26425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// enum arguments.
26435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_IMPL_CMP_HELPER_(GT, > )
26445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_IMPL_CMP_HELPER_
26465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The helper function for {ASSERT|EXPECT}_STREQ.
26485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult CmpHelperSTREQ(const char* expected_expression,
26495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const char* actual_expression,
26505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const char* expected,
26515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const char* actual) {
26525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (String::CStringEquals(expected, actual)) {
26535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionSuccess();
26545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
26555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return EqFailure(expected_expression,
26575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   actual_expression,
26585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   PrintToString(expected),
26595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   PrintToString(actual),
26605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   false);
26615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
26625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
26645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
26655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                   const char* actual_expression,
26665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                   const char* expected,
26675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                   const char* actual) {
26685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (String::CaseInsensitiveCStringEquals(expected, actual)) {
26695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionSuccess();
26705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
26715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return EqFailure(expected_expression,
26735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   actual_expression,
26745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   PrintToString(expected),
26755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   PrintToString(actual),
26765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   true);
26775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
26785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The helper function for {ASSERT|EXPECT}_STRNE.
26805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult CmpHelperSTRNE(const char* s1_expression,
26815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const char* s2_expression,
26825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const char* s1,
26835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const char* s2) {
26845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!String::CStringEquals(s1, s2)) {
26855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionSuccess();
26865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
26875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
26885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                              << s2_expression << "), actual: \""
26895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                              << s1 << "\" vs \"" << s2 << "\"";
26905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
26915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
26925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
26935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The helper function for {ASSERT|EXPECT}_STRCASENE.
26945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult CmpHelperSTRCASENE(const char* s1_expression,
26955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                   const char* s2_expression,
26965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                   const char* s1,
26975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                   const char* s2) {
26985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!String::CaseInsensitiveCStringEquals(s1, s2)) {
26995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionSuccess();
27005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
27015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionFailure()
27025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        << "Expected: (" << s1_expression << ") != ("
27035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        << s2_expression << ") (ignoring case), actual: \""
27045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        << s1 << "\" vs \"" << s2 << "\"";
27055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
27065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
27095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace {
27115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper functions for implementing IsSubString() and IsNotSubstring().
27135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This group of overloaded functions return true iff needle is a
27155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// substring of haystack.  NULL is considered a substring of itself
27165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// only.
27175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool IsSubstringPred(const char* needle, const char* haystack) {
27195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (needle == NULL || haystack == NULL)
27205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return needle == haystack;
27215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return strstr(haystack, needle) != NULL;
27235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {
27265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (needle == NULL || haystack == NULL)
27275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return needle == haystack;
27285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return wcsstr(haystack, needle) != NULL;
27305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// StringType here can be either ::std::string or ::std::wstring.
27335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename StringType>
27345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool IsSubstringPred(const StringType& needle,
27355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                     const StringType& haystack) {
27365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return haystack.find(needle) != StringType::npos;
27375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This function implements either IsSubstring() or IsNotSubstring(),
27405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// depending on the value of the expected_to_be_substring parameter.
27415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// StringType here can be const char*, const wchar_t*, ::std::string,
27425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// or ::std::wstring.
27435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename StringType>
27445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult IsSubstringImpl(
27455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bool expected_to_be_substring,
27465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* needle_expr, const char* haystack_expr,
27475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const StringType& needle, const StringType& haystack) {
27485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (IsSubstringPred(needle, haystack) == expected_to_be_substring)
27495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionSuccess();
27505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const bool is_wide_string = sizeof(needle[0]) > 1;
27525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
27535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return AssertionFailure()
27545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "Value of: " << needle_expr << "\n"
27555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "  Actual: " << begin_string_quote << needle << "\"\n"
27565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "Expected: " << (expected_to_be_substring ? "" : "not ")
27575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "a substring of " << haystack_expr << "\n"
27585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "Which is: " << begin_string_quote << haystack << "\"";
27595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace
27625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// IsSubstring() and IsNotSubstring() check whether needle is a
27645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// substring of haystack (NULL is considered a substring of itself
27655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// only), and return an appropriate error message when they fail.
27665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult IsSubstring(
27685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* needle_expr, const char* haystack_expr,
27695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* needle, const char* haystack) {
27705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
27715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult IsSubstring(
27745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* needle_expr, const char* haystack_expr,
27755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const wchar_t* needle, const wchar_t* haystack) {
27765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
27775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult IsNotSubstring(
27805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* needle_expr, const char* haystack_expr,
27815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* needle, const char* haystack) {
27825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
27835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult IsNotSubstring(
27865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* needle_expr, const char* haystack_expr,
27875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const wchar_t* needle, const wchar_t* haystack) {
27885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
27895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult IsSubstring(
27925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* needle_expr, const char* haystack_expr,
27935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ::std::string& needle, const ::std::string& haystack) {
27945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
27955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
27965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
27975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult IsNotSubstring(
27985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* needle_expr, const char* haystack_expr,
27995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ::std::string& needle, const ::std::string& haystack) {
28005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
28015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
28025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_STD_WSTRING
28045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult IsSubstring(
28055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* needle_expr, const char* haystack_expr,
28065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ::std::wstring& needle, const ::std::wstring& haystack) {
28075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
28085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
28095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult IsNotSubstring(
28115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* needle_expr, const char* haystack_expr,
28125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ::std::wstring& needle, const ::std::wstring& haystack) {
28135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
28145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
28155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_STD_WSTRING
28165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
28185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS
28205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace {
28225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper function for IsHRESULT{SuccessFailure} predicates
28245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult HRESULTFailureHelper(const char* expr,
28255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     const char* expected,
28265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     long hr) {  // NOLINT
28275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_WINDOWS_MOBILE
28285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Windows CE doesn't support FormatMessage.
28305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char error_text[] = "";
28315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
28335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Looks up the human-readable system message for the HRESULT code
28355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // and since we're not passing any params to FormatMessage, we don't
28365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // want inserts expanded.
28375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
28385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                       FORMAT_MESSAGE_IGNORE_INSERTS;
28395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const DWORD kBufSize = 4096;
28405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the system's human readable message string for this HRESULT.
28415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char error_text[kBufSize] = { '\0' };
28425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  DWORD message_length = ::FormatMessageA(kFlags,
28435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                          0,  // no source, we're asking system
28445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                          hr,  // the error
28455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                          0,  // no line width restrictions
28465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                          error_text,  // output buffer
28475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                          kBufSize,  // buf size
28485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                          NULL);  // no arguments for inserts
28495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Trims tailing white space (FormatMessage leaves a trailing CR-LF)
28505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (; message_length && IsSpace(error_text[message_length - 1]);
28515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          --message_length) {
28525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    error_text[message_length - 1] = '\0';
28535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
28545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_OS_WINDOWS_MOBILE
28565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string error_hex("0x" + String::FormatHexInt(hr));
28585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ::testing::AssertionFailure()
28595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "Expected: " << expr << " " << expected << ".\n"
28605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "  Actual: " << error_hex << " " << error_text << "\n";
28615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
28625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace
28645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NOLINT
28665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (SUCCEEDED(hr)) {
28675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionSuccess();
28685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
28695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return HRESULTFailureHelper(expr, "succeeds", hr);
28705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
28715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NOLINT
28735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (FAILED(hr)) {
28745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionSuccess();
28755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
28765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return HRESULTFailureHelper(expr, "fails", hr);
28775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
28785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS
28805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Utility functions for encoding Unicode text (wide strings) in
28825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// UTF-8.
28835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8
28855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// like this:
28865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
28875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Code-point length   Encoding
28885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   0 -  7 bits       0xxxxxxx
28895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   8 - 11 bits       110xxxxx 10xxxxxx
28905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//  12 - 16 bits       1110xxxx 10xxxxxx 10xxxxxx
28915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//  17 - 21 bits       11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
28925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The maximum code-point a one-byte UTF-8 sequence can represent.
28945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) <<  7) - 1;
28955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The maximum code-point a two-byte UTF-8 sequence can represent.
28975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;
28985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
28995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The maximum code-point a three-byte UTF-8 sequence can represent.
29005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;
29015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
29025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The maximum code-point a four-byte UTF-8 sequence can represent.
29035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;
29045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
29055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Chops off the n lowest bits from a bit pattern.  Returns the n
29065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// lowest bits.  As a side effect, the original bit pattern will be
29075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// shifted to the right by n bits.
29085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline UInt32 ChopLowBits(UInt32* bits, int n) {
29095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);
29105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *bits >>= n;
29115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return low_bits;
29125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
29135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
29145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Converts a Unicode code point to a narrow string in UTF-8 encoding.
29155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// code_point parameter is of type UInt32 because wchar_t may not be
29165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// wide enough to contain a code point.
29175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// If the code_point is not a valid Unicode code point
29185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
29195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to "(Invalid Unicode 0xXXXXXXXX)".
29205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string CodePointToUtf8(UInt32 code_point) {
29215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (code_point > kMaxCodePoint4) {
29225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return "(Invalid Unicode 0x" + String::FormatHexInt(code_point) + ")";
29235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
29245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
29255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char str[5];  // Big enough for the largest valid code point.
29265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (code_point <= kMaxCodePoint1) {
29275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    str[1] = '\0';
29285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    str[0] = static_cast<char>(code_point);                          // 0xxxxxxx
29295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else if (code_point <= kMaxCodePoint2) {
29305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    str[2] = '\0';
29315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
29325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    str[0] = static_cast<char>(0xC0 | code_point);                   // 110xxxxx
29335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else if (code_point <= kMaxCodePoint3) {
29345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    str[3] = '\0';
29355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
29365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
29375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    str[0] = static_cast<char>(0xE0 | code_point);                   // 1110xxxx
29385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {  // code_point <= kMaxCodePoint4
29395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    str[4] = '\0';
29405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
29415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
29425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
29435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    str[0] = static_cast<char>(0xF0 | code_point);                   // 11110xxx
29445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
29455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return str;
29465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
29475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
29485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The following two functions only make sense if the the system
29495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// uses UTF-16 for wide string encoding. All supported systems
29505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.
29515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
29525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Determines if the arguments constitute UTF-16 surrogate pair
29535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and thus should be combined into a single Unicode code point
29545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// using CreateCodePointFromUtf16SurrogatePair.
29555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
29565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return sizeof(wchar_t) == 2 &&
29575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;
29585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
29595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
29605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Creates a Unicode code point from UTF16 surrogate pair.
29615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
29625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                    wchar_t second) {
29635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const UInt32 mask = (1 << 10) - 1;
29645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return (sizeof(wchar_t) == 2) ?
29655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      (((first & mask) << 10) | (second & mask)) + 0x10000 :
29665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // This function should not be called when the condition is
29675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // false, but we provide a sensible default in case it is.
29685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      static_cast<UInt32>(first);
29695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
29705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
29715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Converts a wide string to a narrow string in UTF-8 encoding.
29725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The wide string is assumed to have the following encoding:
29735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
29745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
29755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Parameter str points to a null-terminated wide string.
29765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Parameter num_chars may additionally limit the number
29775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// of wchar_t characters processed. -1 is used when the entire string
29785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// should be processed.
29795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// If the string contains code points that are not valid Unicode code points
29805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
29815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
29825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and contains invalid UTF-16 surrogate pairs, values in those pairs
29835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// will be encoded as individual Unicode characters from Basic Normal Plane.
29845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string WideStringToUtf8(const wchar_t* str, int num_chars) {
29855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (num_chars == -1)
29865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    num_chars = static_cast<int>(wcslen(str));
29875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
29885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::std::stringstream stream;
29895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (int i = 0; i < num_chars; ++i) {
29905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    UInt32 unicode_code_point;
29915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
29925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (str[i] == L'\0') {
29935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
29945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {
29955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],
29965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                                 str[i + 1]);
29975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      i++;
29985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
29995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      unicode_code_point = static_cast<UInt32>(str[i]);
30005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
30015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    stream << CodePointToUtf8(unicode_code_point);
30035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
30045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return StringStreamToString(&stream);
30055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
30065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Converts a wide C string to an std::string using the UTF-8 encoding.
30085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// NULL will be converted to "(null)".
30095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string String::ShowWideCString(const wchar_t * wide_c_str) {
30105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (wide_c_str == NULL)  return "(null)";
30115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::WideStringToUtf8(wide_c_str, -1);
30135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
30145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Compares two wide C strings.  Returns true iff they have the same
30165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// content.
30175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
30185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Unlike wcscmp(), this function can handle NULL argument(s).  A NULL
30195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// C string is considered different to any non-NULL C string,
30205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// including the empty string.
30215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {
30225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (lhs == NULL) return rhs == NULL;
30235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (rhs == NULL) return false;
30255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return wcscmp(lhs, rhs) == 0;
30275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
30285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper function for *_STREQ on wide strings.
30305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult CmpHelperSTREQ(const char* expected_expression,
30315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const char* actual_expression,
30325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const wchar_t* expected,
30335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const wchar_t* actual) {
30345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (String::WideCStringEquals(expected, actual)) {
30355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionSuccess();
30365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
30375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return EqFailure(expected_expression,
30395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   actual_expression,
30405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   PrintToString(expected),
30415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   PrintToString(actual),
30425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   false);
30435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
30445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper function for *_STRNE on wide strings.
30465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangAssertionResult CmpHelperSTRNE(const char* s1_expression,
30475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const char* s2_expression,
30485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const wchar_t* s1,
30495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const wchar_t* s2) {
30505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!String::WideCStringEquals(s1, s2)) {
30515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return AssertionSuccess();
30525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
30535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
30555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << s2_expression << "), actual: "
30565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << PrintToString(s1)
30575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            << " vs " << PrintToString(s2);
30585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
30595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Compares two C strings, ignoring case.  Returns true iff they have
30615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the same content.
30625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
30635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Unlike strcasecmp(), this function can handle NULL argument(s).  A
30645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// NULL C string is considered different to any non-NULL C string,
30655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// including the empty string.
30665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {
30675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (lhs == NULL)
30685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return rhs == NULL;
30695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (rhs == NULL)
30705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return false;
30715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return posix::StrCaseCmp(lhs, rhs) == 0;
30725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
30735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Compares two wide C strings, ignoring case.  Returns true iff they
30755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // have the same content.
30765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
30775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Unlike wcscasecmp(), this function can handle NULL argument(s).
30785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // A NULL C string is considered different to any non-NULL wide C string,
30795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // including the empty string.
30805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // NB: The implementations on different platforms slightly differ.
30815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
30825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // environment variable. On GNU platform this method uses wcscasecmp
30835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // which compares according to LC_CTYPE category of the current locale.
30845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
30855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // current locale.
30865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
30875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                              const wchar_t* rhs) {
30885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (lhs == NULL) return rhs == NULL;
30895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (rhs == NULL) return false;
30915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
30925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS
30935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return _wcsicmp(lhs, rhs) == 0;
30945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID
30955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return wcscasecmp(lhs, rhs) == 0;
30965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
30975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Android, Mac OS X and Cygwin don't define wcscasecmp.
30985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Other unknown OSes may not define it either.
30995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  wint_t left, right;
31005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  do {
31015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    left = towlower(*lhs++);
31025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    right = towlower(*rhs++);
31035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } while (left && left == right);
31045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return left == right;
31055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // OS selector
31065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
31075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff str ends with the given suffix, ignoring case.
31095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Any string is considered to end with an empty suffix.
31105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool String::EndsWithCaseInsensitive(
31115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const std::string& str, const std::string& suffix) {
31125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const size_t str_len = str.length();
31135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const size_t suffix_len = suffix.length();
31145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return (str_len >= suffix_len) &&
31155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len,
31165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                      suffix.c_str());
31175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
31185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Formats an int value as "%02d".
31205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string String::FormatIntWidth2(int value) {
31215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::stringstream ss;
31225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ss << std::setfill('0') << std::setw(2) << value;
31235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ss.str();
31245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
31255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Formats an int value as "%X".
31275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string String::FormatHexInt(int value) {
31285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::stringstream ss;
31295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ss << std::hex << std::uppercase << value;
31305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ss.str();
31315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
31325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Formats a byte as "%02X".
31345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string String::FormatByte(unsigned char value) {
31355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::stringstream ss;
31365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase
31375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang     << static_cast<unsigned int>(value);
31385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ss.str();
31395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
31405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Converts the buffer in a stringstream to an std::string, converting NUL
31425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// bytes to "\\0" along the way.
31435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string StringStreamToString(::std::stringstream* ss) {
31445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const ::std::string& str = ss->str();
31455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const start = str.c_str();
31465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const end = start + str.length();
31475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string result;
31495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  result.reserve(2 * (end - start));
31505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (const char* ch = start; ch != end; ++ch) {
31515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (*ch == '\0') {
31525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      result += "\\0";  // Replaces NUL with "\\0";
31535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
31545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      result += *ch;
31555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
31565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
31575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return result;
31595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
31605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Appends the user-supplied message to the Google-Test-generated message.
31625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string AppendUserMessage(const std::string& gtest_msg,
31635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                              const Message& user_msg) {
31645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Appends the user message if it's non-empty.
31655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string user_msg_string = user_msg.GetString();
31665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (user_msg_string.empty()) {
31675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return gtest_msg;
31685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
31695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return gtest_msg + "\n" + user_msg_string;
31715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
31725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
31745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class TestResult
31765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Creates an empty TestResult.
31785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestResult::TestResult()
31795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : death_test_count_(0),
31805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      elapsed_time_(0) {
31815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
31825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// D'tor.
31845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestResult::~TestResult() {
31855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
31865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the i-th test part result among all the results. i can
31885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// range from 0 to total_part_count() - 1. If i is not in that range,
31895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// aborts the program.
31905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst TestPartResult& TestResult::GetTestPartResult(int i) const {
31915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (i < 0 || i >= total_part_count())
31925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::posix::Abort();
31935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return test_part_results_.at(i);
31945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
31955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
31965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the i-th test property. i can range from 0 to
31975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// test_property_count() - 1. If i is not in that range, aborts the
31985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// program.
31995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst TestProperty& TestResult::GetTestProperty(int i) const {
32005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (i < 0 || i >= test_property_count())
32015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::posix::Abort();
32025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return test_properties_.at(i);
32035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
32045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Clears the test part results.
32065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestResult::ClearTestPartResults() {
32075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  test_part_results_.clear();
32085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
32095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Adds a test part result to the list.
32115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestResult::AddTestPartResult(const TestPartResult& test_part_result) {
32125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  test_part_results_.push_back(test_part_result);
32135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
32145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Adds a test property to the list. If a property with the same key as the
32165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// supplied property is already represented, the value of this test_property
32175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// replaces the old value for that key.
32185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestResult::RecordProperty(const std::string& xml_element,
32195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                const TestProperty& test_property) {
32205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!ValidateTestProperty(xml_element, test_property)) {
32215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return;
32225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
32235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::MutexLock lock(&test_properites_mutex_);
32245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::vector<TestProperty>::iterator property_with_matching_key =
32255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      std::find_if(test_properties_.begin(), test_properties_.end(),
32265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   internal::TestPropertyKeyIs(test_property.key()));
32275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (property_with_matching_key == test_properties_.end()) {
32285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    test_properties_.push_back(test_property);
32295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return;
32305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
32315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  property_with_matching_key->SetValue(test_property.value());
32325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
32335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The list of reserved attributes used in the <testsuites> element of XML
32355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// output.
32365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char* const kReservedTestSuitesAttributes[] = {
32375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "disabled",
32385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "errors",
32395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "failures",
32405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "name",
32415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "random_seed",
32425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "tests",
32435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "time",
32445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "timestamp"
32455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
32465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The list of reserved attributes used in the <testsuite> element of XML
32485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// output.
32495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char* const kReservedTestSuiteAttributes[] = {
32505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "disabled",
32515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "errors",
32525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "failures",
32535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "name",
32545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "tests",
32555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "time"
32565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
32575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The list of reserved attributes used in the <testcase> element of XML output.
32595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char* const kReservedTestCaseAttributes[] = {
32605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "classname",
32615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "name",
32625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "status",
32635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "time",
32645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "type_param",
32655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  "value_param"
32665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
32675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <int kSize>
32695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) {
32705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return std::vector<std::string>(array, array + kSize);
32715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
32725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic std::vector<std::string> GetReservedAttributesForElement(
32745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const std::string& xml_element) {
32755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (xml_element == "testsuites") {
32765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ArrayAsVector(kReservedTestSuitesAttributes);
32775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else if (xml_element == "testsuite") {
32785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ArrayAsVector(kReservedTestSuiteAttributes);
32795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else if (xml_element == "testcase") {
32805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return ArrayAsVector(kReservedTestCaseAttributes);
32815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
32825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element;
32835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
32845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This code is unreachable but some compilers may not realizes that.
32855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return std::vector<std::string>();
32865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
32875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
32885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic std::string FormatWordList(const std::vector<std::string>& words) {
32895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message word_list;
32905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (size_t i = 0; i < words.size(); ++i) {
32915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (i > 0 && words.size() > 2) {
32925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      word_list << ", ";
32935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
32945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (i == words.size() - 1) {
32955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      word_list << "and ";
32965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
32975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    word_list << "'" << words[i] << "'";
32985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
32995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return word_list.GetString();
33005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
33015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool ValidateTestPropertyName(const std::string& property_name,
33035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                              const std::vector<std::string>& reserved_names) {
33045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (std::find(reserved_names.begin(), reserved_names.end(), property_name) !=
33055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          reserved_names.end()) {
33065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ADD_FAILURE() << "Reserved key used in RecordProperty(): " << property_name
33075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  << " (" << FormatWordList(reserved_names)
33085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  << " are reserved by " << GTEST_NAME_ << ")";
33095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return false;
33105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
33115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return true;
33125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
33135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Adds a failure if the key is a reserved attribute of the element named
33155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// xml_element.  Returns true if the property is valid.
33165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool TestResult::ValidateTestProperty(const std::string& xml_element,
33175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                      const TestProperty& test_property) {
33185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ValidateTestPropertyName(test_property.key(),
33195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                  GetReservedAttributesForElement(xml_element));
33205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
33215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Clears the object.
33235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestResult::Clear() {
33245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  test_part_results_.clear();
33255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  test_properties_.clear();
33265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  death_test_count_ = 0;
33275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  elapsed_time_ = 0;
33285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
33295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff the test failed.
33315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool TestResult::Failed() const {
33325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (int i = 0; i < total_part_count(); ++i) {
33335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (GetTestPartResult(i).failed())
33345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return true;
33355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
33365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return false;
33375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
33385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff the test part fatally failed.
33405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic bool TestPartFatallyFailed(const TestPartResult& result) {
33415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return result.fatally_failed();
33425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
33435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff the test fatally failed.
33455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool TestResult::HasFatalFailure() const {
33465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return CountIf(test_part_results_, TestPartFatallyFailed) > 0;
33475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
33485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff the test part non-fatally failed.
33505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic bool TestPartNonfatallyFailed(const TestPartResult& result) {
33515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return result.nonfatally_failed();
33525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
33535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff the test has a non-fatal failure.
33555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool TestResult::HasNonfatalFailure() const {
33565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;
33575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
33585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of all test parts.  This is the sum of the number
33605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// of successful test parts and the number of failed test parts.
33615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint TestResult::total_part_count() const {
33625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return static_cast<int>(test_part_results_.size());
33635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
33645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the number of the test properties.
33665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint TestResult::test_property_count() const {
33675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return static_cast<int>(test_properties_.size());
33685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
33695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class Test
33715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Creates a Test object.
33735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The c'tor saves the values of all Google Test flags.
33755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTest::Test()
33765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : gtest_flag_saver_(new internal::GTestFlagSaver) {
33775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
33785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The d'tor restores the values of all Google Test flags.
33805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTest::~Test() {
33815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  delete gtest_flag_saver_;
33825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
33835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Sets up the test fixture.
33855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
33865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A sub-class may override this.
33875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid Test::SetUp() {
33885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
33895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Tears down the test fixture.
33915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
33925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A sub-class may override this.
33935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid Test::TearDown() {
33945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
33955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
33965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Allows user supplied key value pairs to be recorded for later output.
33975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid Test::RecordProperty(const std::string& key, const std::string& value) {
33985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  UnitTest::GetInstance()->RecordProperty(key, value);
33995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
34005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Allows user supplied key value pairs to be recorded for later output.
34025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid Test::RecordProperty(const std::string& key, int value) {
34035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message value_message;
34045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  value_message << value;
34055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  RecordProperty(key, value_message.GetString().c_str());
34065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
34075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
34095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid ReportFailureInUnknownLocation(TestPartResult::Type result_type,
34115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                    const std::string& message) {
34125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This function is a friend of UnitTest and as such has access to
34135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // AddTestPartResult.
34145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  UnitTest::GetInstance()->AddTestPartResult(
34155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      result_type,
34165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      NULL,  // No info about the source file where the exception occurred.
34175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      -1,    // We have no info on which line caused the exception.
34185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      message,
34195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      "");   // No stack trace, either.
34205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
34215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
34235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google Test requires all tests in the same test case to use the same test
34255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// fixture class.  This function checks if the current test has the
34265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// same fixture class as the first test in the current test case.  If
34275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// yes, it returns true; otherwise it generates a Google Test failure and
34285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// returns false.
34295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool Test::HasSameFixtureClass() {
34305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
34315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestCase* const test_case = impl->current_test_case();
34325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Info about the first test in the current test case.
34345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestInfo* const first_test_info = test_case->test_info_list()[0];
34355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;
34365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const first_test_name = first_test_info->name();
34375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Info about the current test.
34395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestInfo* const this_test_info = impl->current_test_info();
34405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_;
34415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const this_test_name = this_test_info->name();
34425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (this_fixture_id != first_fixture_id) {
34445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Is the first test defined using TEST?
34455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();
34465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Is this test defined using TEST?
34475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();
34485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (first_is_TEST || this_is_TEST) {
34505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // The user mixed TEST and TEST_F in this test case - we'll tell
34515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // him/her how to fix it.
34525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Gets the name of the TEST and the name of the TEST_F.  Note
34545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // that first_is_TEST and this_is_TEST cannot both be true, as
34555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // the fixture IDs are different for the two tests.
34565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const char* const TEST_name =
34575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          first_is_TEST ? first_test_name : this_test_name;
34585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const char* const TEST_F_name =
34595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          first_is_TEST ? this_test_name : first_test_name;
34605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ADD_FAILURE()
34625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "All tests in the same test case must use the same test fixture\n"
34635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "class, so mixing TEST_F and TEST in the same test case is\n"
34645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "illegal.  In test case " << this_test_info->test_case_name()
34655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << ",\n"
34665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "test " << TEST_F_name << " is defined using TEST_F but\n"
34675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "test " << TEST_name << " is defined using TEST.  You probably\n"
34685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "want to change the TEST to TEST_F or move it to another test\n"
34695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "case.";
34705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
34715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // The user defined two fixture classes with the same name in
34725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // two namespaces - we'll tell him/her how to fix it.
34735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ADD_FAILURE()
34745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "All tests in the same test case must use the same test fixture\n"
34755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "class.  However, in test case "
34765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << this_test_info->test_case_name() << ",\n"
34775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "you defined test " << first_test_name
34785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << " and test " << this_test_name << "\n"
34795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "using two different test fixture classes.  This can happen if\n"
34805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "the two classes are from different namespaces or translation\n"
34815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "units and have the same name.  You should probably rename one\n"
34825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "of the classes to put the tests into different test cases.";
34835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
34845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return false;
34855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
34865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return true;
34885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
34895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_SEH
34915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
34925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Adds an "exception thrown" fatal failure to the current test.  This
34935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// function returns its result via an output parameter pointer because VC++
34945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// prohibits creation of objects with destructors on stack in functions
34955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// using __try (see error C2712).
34965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic std::string* FormatSehExceptionMessage(DWORD exception_code,
34975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                              const char* location) {
34985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message message;
34995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  message << "SEH exception with code 0x" << std::setbase(16) <<
35005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    exception_code << std::setbase(10) << " thrown in " << location << ".";
35015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return new std::string(message.GetString());
35035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
35045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_SEH
35065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
35085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_EXCEPTIONS
35105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Adds an "exception thrown" fatal failure to the current test.
35125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic std::string FormatCxxExceptionMessage(const char* description,
35135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             const char* location) {
35145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message message;
35155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (description != NULL) {
35165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    message << "C++ exception with description \"" << description << "\"";
35175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
35185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    message << "Unknown C++ exception";
35195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
35205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  message << " thrown in " << location << ".";
35215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return message.GetString();
35235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
35245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic std::string PrintTestPartResultToString(
35265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const TestPartResult& test_part_result);
35275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGoogleTestFailureException::GoogleTestFailureException(
35295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const TestPartResult& failure)
35305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}
35315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_EXCEPTIONS
35335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We put these helper functions in the internal namespace as IBM's xlC
35355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// compiler rejects the code if they were declared static.
35365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Runs the given method and handles SEH exceptions it throws, when
35385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SEH is supported; returns the 0-value for type Result in case of an
35395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SEH exception.  (Microsoft compilers cannot handle SEH and C++
35405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// exceptions in the same function.  Therefore, we provide a separate
35415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// wrapper function for handling SEH exceptions.)
35425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class T, typename Result>
35435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangResult HandleSehExceptionsInMethodIfSupported(
35445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T* object, Result (T::*method)(), const char* location) {
35455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_SEH
35465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  __try {
35475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return (object->*method)();
35485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } __except (internal::UnitTestOptions::GTestShouldProcessSEH(  // NOLINT
35495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GetExceptionCode())) {
35505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // We create the exception message on the heap because VC++ prohibits
35515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // creation of objects with destructors on stack in functions using __try
35525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // (see error C2712).
35535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    std::string* exception_message = FormatSehExceptionMessage(
35545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        GetExceptionCode(), location);
35555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,
35565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             *exception_message);
35575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    delete exception_message;
35585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return static_cast<Result>(0);
35595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
35605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
35615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  (void)location;
35625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return (object->*method)();
35635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_SEH
35645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
35655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
35665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Runs the given method and catches and reports C++ and/or SEH-style
35675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// exceptions, if they are supported; returns the 0-value for type
35685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Result in case of an SEH exception.
35695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <class T, typename Result>
35705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangResult HandleExceptionsInMethodIfSupported(
35715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    T* object, Result (T::*method)(), const char* location) {
35725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // NOTE: The user code can affect the way in which Google Test handles
35735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // exceptions by setting GTEST_FLAG(catch_exceptions), but only before
35745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // RUN_ALL_TESTS() starts. It is technically possible to check the flag
35755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // after the exception is caught and either report or re-throw the
35765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // exception based on the flag's value:
35775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
35785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // try {
35795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   // Perform the test method.
35805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // } catch (...) {
35815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   if (GTEST_FLAG(catch_exceptions))
35825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //     // Report the exception as failure.
35835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   else
35845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //     throw;  // Re-throws the original exception.
35855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // }
35865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
35875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // However, the purpose of this flag is to allow the program to drop into
35885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the debugger when the exception is thrown. On most platforms, once the
35895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // control enters the catch block, the exception origin information is
35905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // lost and the debugger will stop the program at the point of the
35915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // re-throw in this function -- instead of at the point of the original
35925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // throw statement in the code under test.  For this reason, we perform
35935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the check early, sacrificing the ability to affect Google Test's
35945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // exception handling in the method where the exception is thrown.
35955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (internal::GetUnitTestImpl()->catch_exceptions()) {
35965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_EXCEPTIONS
35975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    try {
35985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return HandleSehExceptionsInMethodIfSupported(object, method, location);
35995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } catch (const internal::GoogleTestFailureException&) {  // NOLINT
36005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // This exception type can only be thrown by a failed Google
36015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Test assertion with the intention of letting another testing
36025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // framework catch it.  Therefore we just re-throw it.
36035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      throw;
36045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } catch (const std::exception& e) {  // NOLINT
36055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      internal::ReportFailureInUnknownLocation(
36065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          TestPartResult::kFatalFailure,
36075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          FormatCxxExceptionMessage(e.what(), location));
36085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } catch (...) {  // NOLINT
36095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      internal::ReportFailureInUnknownLocation(
36105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          TestPartResult::kFatalFailure,
36115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          FormatCxxExceptionMessage(NULL, location));
36125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
36135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return static_cast<Result>(0);
36145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
36155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return HandleSehExceptionsInMethodIfSupported(object, method, location);
36165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_EXCEPTIONS
36175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
36185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return (object->*method)();
36195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
36205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
36215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
36235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Runs the test and updates the test result.
36255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid Test::Run() {
36265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!HasSameFixtureClass()) return;
36275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
36295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  impl->os_stack_trace_getter()->UponLeavingGTest();
36305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()");
36315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We will run the test only if SetUp() was successful.
36325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!HasFatalFailure()) {
36335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    impl->os_stack_trace_getter()->UponLeavingGTest();
36345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::HandleExceptionsInMethodIfSupported(
36355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        this, &Test::TestBody, "the test body");
36365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
36375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // However, we want to clean up as much as possible.  Hence we will
36395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // always call TearDown(), even if SetUp() or the test body has
36405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // failed.
36415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  impl->os_stack_trace_getter()->UponLeavingGTest();
36425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::HandleExceptionsInMethodIfSupported(
36435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      this, &Test::TearDown, "TearDown()");
36445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
36455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff the current test has a fatal failure.
36475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool Test::HasFatalFailure() {
36485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();
36495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
36505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff the current test has a non-fatal failure.
36525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool Test::HasNonfatalFailure() {
36535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::GetUnitTestImpl()->current_test_result()->
36545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      HasNonfatalFailure();
36555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
36565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class TestInfo
36585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Constructs a TestInfo object. It assumes ownership of the test factory
36605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// object.
36615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestInfo::TestInfo(const std::string& a_test_case_name,
36625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   const std::string& a_name,
36635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   const char* a_type_param,
36645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   const char* a_value_param,
36655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   internal::TypeId fixture_class_id,
36665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   internal::TestFactoryBase* factory)
36675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : test_case_name_(a_test_case_name),
36685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      name_(a_name),
36695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
36705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      value_param_(a_value_param ? new std::string(a_value_param) : NULL),
36715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      fixture_class_id_(fixture_class_id),
36725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      should_run_(false),
36735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      is_disabled_(false),
36745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      matches_filter_(false),
36755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      factory_(factory),
36765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      result_() {}
36775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Destructs a TestInfo object.
36795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestInfo::~TestInfo() { delete factory_; }
36805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
36825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
36835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Creates a new TestInfo object and registers it with Google Test;
36845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// returns the created object.
36855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
36865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Arguments:
36875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
36885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   test_case_name:   name of the test case
36895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   name:             name of the test
36905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   type_param:       the name of the test's type parameter, or NULL if
36915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                     this is not a typed or a type-parameterized test.
36925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   value_param:      text representation of the test's value parameter,
36935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                     or NULL if this is not a value-parameterized test.
36945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   fixture_class_id: ID of the test fixture class
36955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   set_up_tc:        pointer to the function that sets up the test case
36965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   tear_down_tc:     pointer to the function that tears down the test case
36975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   factory:          pointer to the factory that creates a test object.
36985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                     The newly created TestInfo instance will assume
36995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                     ownership of the factory object.
37005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestInfo* MakeAndRegisterTestInfo(
37015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* test_case_name,
37025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* name,
37035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* type_param,
37045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* value_param,
37055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TypeId fixture_class_id,
37065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    SetUpTestCaseFunc set_up_tc,
37075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TearDownTestCaseFunc tear_down_tc,
37085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TestFactoryBase* factory) {
37095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestInfo* const test_info =
37105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      new TestInfo(test_case_name, name, type_param, value_param,
37115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   fixture_class_id, factory);
37125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);
37135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return test_info;
37145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
37155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_PARAM_TEST
37175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid ReportInvalidTestCaseType(const char* test_case_name,
37185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const char* file, int line) {
37195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message errors;
37205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  errors
37215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "Attempted redefinition of test case " << test_case_name << ".\n"
37225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "All tests in the same test case must use the same test fixture\n"
37235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "class.  However, in test case " << test_case_name << ", you tried\n"
37245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "to define a test using a fixture class different from the one\n"
37255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "used earlier. This can happen if the two fixture classes are\n"
37265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "from different namespaces and have the same name. You should\n"
37275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "probably rename one of the classes to put the tests into different\n"
37285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "test cases.";
37295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
37315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          errors.GetString().c_str());
37325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
37335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_PARAM_TEST
37345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
37365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace {
37385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A predicate that checks the test name of a TestInfo against a known
37405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// value.
37415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
37425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This is used for implementation of the TestCase class only.  We put
37435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// it in the anonymous namespace to prevent polluting the outer
37445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// namespace.
37455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
37465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TestNameIs is copyable.
37475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TestNameIs {
37485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
37495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Constructor.
37505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
37515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // TestNameIs has NO default constructor.
37525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit TestNameIs(const char* name)
37535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : name_(name) {}
37545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true iff the test name of test_info matches name_.
37565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool operator()(const TestInfo * test_info) const {
37575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return test_info && test_info->name() == name_;
37585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
37595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
37615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string name_;
37625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
37635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace
37655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
37675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This method expands all parameterized tests registered with macros TEST_P
37695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.
37705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This will be done just once during the program runtime.
37715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UnitTestImpl::RegisterParameterizedTests() {
37725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_PARAM_TEST
37735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!parameterized_tests_registered_) {
37745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    parameterized_test_registry_.RegisterTests();
37755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    parameterized_tests_registered_ = true;
37765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
37775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
37785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
37795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
37815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Creates the test object, runs it, records its result, and then
37835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// deletes it.
37845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestInfo::Run() {
37855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!should_run_) return;
37865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Tells UnitTest where to store test result.
37885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
37895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  impl->set_current_test_info(this);
37905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
37925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Notifies the unit test event listeners that a test is about to start.
37945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  repeater->OnTestStart(*this);
37955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TimeInMillis start = internal::GetTimeInMillis();
37975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
37985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  impl->os_stack_trace_getter()->UponLeavingGTest();
37995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Creates the test object.
38015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Test* const test = internal::HandleExceptionsInMethodIfSupported(
38025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      factory_, &internal::TestFactoryBase::CreateTest,
38035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      "the test fixture's constructor");
38045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Runs the test only if the test object was created and its
38065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // constructor didn't generate a fatal failure.
38075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if ((test != NULL) && !Test::HasFatalFailure()) {
38085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // This doesn't throw as all user code that can throw are wrapped into
38095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // exception handling code.
38105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    test->Run();
38115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
38125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Deletes the test object.
38145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  impl->os_stack_trace_getter()->UponLeavingGTest();
38155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::HandleExceptionsInMethodIfSupported(
38165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      test, &Test::DeleteSelf_, "the test fixture's destructor");
38175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  result_.set_elapsed_time(internal::GetTimeInMillis() - start);
38195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Notifies the unit test event listener that a test has just finished.
38215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  repeater->OnTestEnd(*this);
38225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Tells UnitTest to stop associating assertion results to this
38245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // test.
38255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  impl->set_current_test_info(NULL);
38265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
38275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class TestCase
38295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of successful tests in this test case.
38315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint TestCase::successful_test_count() const {
38325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return CountIf(test_info_list_, TestPassed);
38335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
38345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of failed tests in this test case.
38365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint TestCase::failed_test_count() const {
38375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return CountIf(test_info_list_, TestFailed);
38385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
38395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of disabled tests that will be reported in the XML report.
38415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint TestCase::reportable_disabled_test_count() const {
38425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return CountIf(test_info_list_, TestReportableDisabled);
38435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
38445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of disabled tests in this test case.
38465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint TestCase::disabled_test_count() const {
38475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return CountIf(test_info_list_, TestDisabled);
38485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
38495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of tests to be printed in the XML report.
38515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint TestCase::reportable_test_count() const {
38525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return CountIf(test_info_list_, TestReportable);
38535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
38545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Get the number of tests in this test case that should run.
38565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint TestCase::test_to_run_count() const {
38575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return CountIf(test_info_list_, ShouldRunTest);
38585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
38595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of all tests.
38615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint TestCase::total_test_count() const {
38625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return static_cast<int>(test_info_list_.size());
38635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
38645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Creates a TestCase with the given name.
38665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
38675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Arguments:
38685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
38695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   name:         name of the test case
38705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   a_type_param: the name of the test case's type parameter, or NULL if
38715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                 this is not a typed or a type-parameterized test case.
38725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   set_up_tc:    pointer to the function that sets up the test case
38735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   tear_down_tc: pointer to the function that tears down the test case
38745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestCase::TestCase(const char* a_name, const char* a_type_param,
38755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   Test::SetUpTestCaseFunc set_up_tc,
38765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   Test::TearDownTestCaseFunc tear_down_tc)
38775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : name_(a_name),
38785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
38795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      set_up_tc_(set_up_tc),
38805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      tear_down_tc_(tear_down_tc),
38815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      should_run_(false),
38825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      elapsed_time_(0) {
38835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
38845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Destructor of TestCase.
38865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestCase::~TestCase() {
38875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Deletes every Test in the collection.
38885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ForEach(test_info_list_, internal::Delete<TestInfo>);
38895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
38905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the i-th test among all the tests. i can range from 0 to
38925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// total_test_count() - 1. If i is not in that range, returns NULL.
38935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst TestInfo* TestCase::GetTestInfo(int i) const {
38945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int index = GetElementOr(test_indices_, i, -1);
38955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return index < 0 ? NULL : test_info_list_[index];
38965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
38975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
38985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the i-th test among all the tests. i can range from 0 to
38995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// total_test_count() - 1. If i is not in that range, returns NULL.
39005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestInfo* TestCase::GetMutableTestInfo(int i) {
39015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int index = GetElementOr(test_indices_, i, -1);
39025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return index < 0 ? NULL : test_info_list_[index];
39035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
39045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Adds a test to this test case.  Will delete the test upon
39065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// destruction of the TestCase object.
39075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestCase::AddTestInfo(TestInfo * test_info) {
39085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  test_info_list_.push_back(test_info);
39095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  test_indices_.push_back(static_cast<int>(test_indices_.size()));
39105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
39115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Runs every test in this TestCase.
39135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestCase::Run() {
39145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!should_run_) return;
39155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
39175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  impl->set_current_test_case(this);
39185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
39205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  repeater->OnTestCaseStart(*this);
39225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  impl->os_stack_trace_getter()->UponLeavingGTest();
39235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::HandleExceptionsInMethodIfSupported(
39245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      this, &TestCase::RunSetUpTestCase, "SetUpTestCase()");
39255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const internal::TimeInMillis start = internal::GetTimeInMillis();
39275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (int i = 0; i < total_test_count(); i++) {
39285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GetMutableTestInfo(i)->Run();
39295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
39305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  elapsed_time_ = internal::GetTimeInMillis() - start;
39315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  impl->os_stack_trace_getter()->UponLeavingGTest();
39335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::HandleExceptionsInMethodIfSupported(
39345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      this, &TestCase::RunTearDownTestCase, "TearDownTestCase()");
39355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  repeater->OnTestCaseEnd(*this);
39375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  impl->set_current_test_case(NULL);
39385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
39395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Clears the results of all tests in this test case.
39415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestCase::ClearResult() {
39425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ad_hoc_test_result_.Clear();
39435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ForEach(test_info_list_, TestInfo::ClearTestResult);
39445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
39455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Shuffles the tests in this test case.
39475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestCase::ShuffleTests(internal::Random* random) {
39485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Shuffle(random, &test_indices_);
39495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
39505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Restores the test order to before the first shuffle.
39525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestCase::UnshuffleTests() {
39535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (size_t i = 0; i < test_indices_.size(); i++) {
39545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    test_indices_[i] = static_cast<int>(i);
39555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
39565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
39575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Formats a countable noun.  Depending on its quantity, either the
39595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// singular form or the plural form is used. e.g.
39605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
39615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// FormatCountableNoun(1, "formula", "formuli") returns "1 formula".
39625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// FormatCountableNoun(5, "book", "books") returns "5 books".
39635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic std::string FormatCountableNoun(int count,
39645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                       const char * singular_form,
39655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                       const char * plural_form) {
39665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::StreamableToString(count) + " " +
39675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      (count == 1 ? singular_form : plural_form);
39685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
39695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Formats the count of tests.
39715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic std::string FormatTestCount(int test_count) {
39725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return FormatCountableNoun(test_count, "test", "tests");
39735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
39745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Formats the count of test cases.
39765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic std::string FormatTestCaseCount(int test_case_count) {
39775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return FormatCountableNoun(test_case_count, "test case", "test cases");
39785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
39795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Converts a TestPartResult::Type enum to human-friendly string
39815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// representation.  Both kNonFatalFailure and kFatalFailure are translated
39825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to "Failure", as the user usually doesn't care about the difference
39835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// between the two when viewing the test result.
39845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char * TestPartResultTypeToString(TestPartResult::Type type) {
39855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  switch (type) {
39865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case TestPartResult::kSuccess:
39875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return "Success";
39885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
39895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case TestPartResult::kNonFatalFailure:
39905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case TestPartResult::kFatalFailure:
39915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef _MSC_VER
39925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return "error: ";
39935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
39945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return "Failure\n";
39955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
39965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    default:
39975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return "Unknown result type";
39985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
39995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
40005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
40025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a TestPartResult to an std::string.
40045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic std::string PrintTestPartResultToString(
40055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const TestPartResult& test_part_result) {
40065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return (Message()
40075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << internal::FormatFileLocation(test_part_result.file_name(),
40085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                          test_part_result.line_number())
40095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << " " << TestPartResultTypeToString(test_part_result.type())
40105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << test_part_result.message()).GetString();
40115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
40125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a TestPartResult.
40145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void PrintTestPartResult(const TestPartResult& test_part_result) {
40155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string& result =
40165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      PrintTestPartResultToString(test_part_result);
40175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  printf("%s\n", result.c_str());
40185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fflush(stdout);
40195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // If the test program runs in Visual Studio or a debugger, the
40205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // following statements add the test part result message to the Output
40215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // window such that the user can double-click on it to jump to the
40225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // corresponding source code location; otherwise they do nothing.
40235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
40245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We don't call OutputDebugString*() on Windows Mobile, as printing
40255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // to stdout is done by OutputDebugString() there already - we don't
40265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // want the same message printed twice.
40275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::OutputDebugStringA(result.c_str());
40285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::OutputDebugStringA("\n");
40295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
40305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
40315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class PrettyUnitTestResultPrinter
40335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangenum GTestColor {
40355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  COLOR_DEFAULT,
40365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  COLOR_RED,
40375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  COLOR_GREEN,
40385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  COLOR_YELLOW
40395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
40405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
40425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the character attribute for the given color.
40445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangWORD GetColorAttribute(GTestColor color) {
40455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  switch (color) {
40465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case COLOR_RED:    return FOREGROUND_RED;
40475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case COLOR_GREEN:  return FOREGROUND_GREEN;
40485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;
40495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    default:           return 0;
40505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
40515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
40525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
40545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the ANSI color code for the given color.  COLOR_DEFAULT is
40565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// an invalid input.
40575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char* GetAnsiColorCode(GTestColor color) {
40585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  switch (color) {
40595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case COLOR_RED:     return "1";
40605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case COLOR_GREEN:   return "2";
40615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case COLOR_YELLOW:  return "3";
40625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    default:            return NULL;
40635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  };
40645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
40655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
40675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff Google Test should use colors in the output.
40695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool ShouldUseColor(bool stdout_is_tty) {
40705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const gtest_color = GTEST_FLAG(color).c_str();
40715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) {
40735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS
40745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // On Windows the TERM variable is usually not set, but the
40755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // console there does support colors.
40765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return stdout_is_tty;
40775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
40785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // On non-Windows platforms, we rely on the TERM variable.
40795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* const term = posix::GetEnv("TERM");
40805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const bool term_supports_color =
40815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        String::CStringEquals(term, "xterm") ||
40825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        String::CStringEquals(term, "xterm-color") ||
40835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        String::CStringEquals(term, "xterm-256color") ||
40845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        String::CStringEquals(term, "screen") ||
40855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        String::CStringEquals(term, "screen-256color") ||
40865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        String::CStringEquals(term, "linux") ||
40875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        String::CStringEquals(term, "cygwin");
40885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return stdout_is_tty && term_supports_color;
40895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS
40905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
40915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
40925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return String::CaseInsensitiveCStringEquals(gtest_color, "yes") ||
40935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      String::CaseInsensitiveCStringEquals(gtest_color, "true") ||
40945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      String::CaseInsensitiveCStringEquals(gtest_color, "t") ||
40955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      String::CStringEquals(gtest_color, "1");
40965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We take "yes", "true", "t", and "1" as meaning "yes".  If the
40975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // value is neither one of these nor "auto", we treat it as "no" to
40985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // be conservative.
40995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
41005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helpers for printing colored strings to stdout. Note that on Windows, we
41025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// cannot simply emit special characters and have the terminal change colors.
41035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This routine must actually emit the characters rather than return a string
41045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// that would be colored when printed, as can be done on Linux.
41055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid ColoredPrintf(GTestColor color, const char* fmt, ...) {
41065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  va_list args;
41075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  va_start(args, fmt);
41085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS || GTEST_OS_IOS
41105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const bool use_color = false;
41115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
41125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static const bool in_color_mode =
41135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);
41145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const bool use_color = in_color_mode && (color != COLOR_DEFAULT);
41155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
41165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The '!= 0' comparison is necessary to satisfy MSVC 7.1.
41175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!use_color) {
41195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    vprintf(fmt, args);
41205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    va_end(args);
41215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return;
41225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
41235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
41255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
41265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the current text color.
41285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  CONSOLE_SCREEN_BUFFER_INFO buffer_info;
41295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);
41305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const WORD old_color_attrs = buffer_info.wAttributes;
41315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We need to flush the stream buffers into the console before each
41335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // SetConsoleTextAttribute call lest it affect the text that is already
41345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // printed but has not yet reached the console.
41355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fflush(stdout);
41365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  SetConsoleTextAttribute(stdout_handle,
41375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                          GetColorAttribute(color) | FOREGROUND_INTENSITY);
41385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  vprintf(fmt, args);
41395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fflush(stdout);
41415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Restores the text color.
41425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  SetConsoleTextAttribute(stdout_handle, old_color_attrs);
41435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
41445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  printf("\033[0;3%sm", GetAnsiColorCode(color));
41455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  vprintf(fmt, args);
41465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  printf("\033[m");  // Resets the terminal to default.
41475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
41485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  va_end(args);
41495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
41505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Text printed in Google Test's text output and --gunit_list_tests
41525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// output to label the type parameter and value parameter for a test.
41535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char kTypeParamLabel[] = "TypeParam";
41545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char kValueParamLabel[] = "GetParam()";
41555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintFullTestCommentIfPresent(const TestInfo& test_info) {
41575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const type_param = test_info.type_param();
41585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const value_param = test_info.value_param();
41595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (type_param != NULL || value_param != NULL) {
41615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    printf(", where ");
41625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (type_param != NULL) {
41635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      printf("%s = %s", kTypeParamLabel, type_param);
41645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (value_param != NULL)
41655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        printf(" and ");
41665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
41675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (value_param != NULL) {
41685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      printf("%s = %s", kValueParamLabel, value_param);
41695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
41705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
41715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
41725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This class implements the TestEventListener interface.
41745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
41755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Class PrettyUnitTestResultPrinter is copyable.
41765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass PrettyUnitTestResultPrinter : public TestEventListener {
41775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
41785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrettyUnitTestResultPrinter() {}
41795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void PrintTestName(const char * test_case, const char * test) {
41805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    printf("%s.%s", test_case, test);
41815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
41825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The following methods override what's in the TestEventListener class.
41845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
41855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
41865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
41875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
41885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestCaseStart(const TestCase& test_case);
41895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestStart(const TestInfo& test_info);
41905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestPartResult(const TestPartResult& result);
41915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestEnd(const TestInfo& test_info);
41925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestCaseEnd(const TestCase& test_case);
41935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
41945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
41955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
41965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
41975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
41985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
41995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void PrintFailedTests(const UnitTest& unit_test);
42005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
42015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Fired before each iteration of tests starts.
42035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrettyUnitTestResultPrinter::OnTestIterationStart(
42045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const UnitTest& unit_test, int iteration) {
42055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (GTEST_FLAG(repeat) != 1)
42065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1);
42075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const filter = GTEST_FLAG(filter).c_str();
42095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Prints the filter if it's not *.  This reminds the user that some
42115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // tests may be skipped.
42125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!String::CStringEquals(filter, kUniversalFilter)) {
42135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ColoredPrintf(COLOR_YELLOW,
42145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  "Note: %s filter = %s\n", GTEST_NAME_, filter);
42155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
42165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {
42185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);
42195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ColoredPrintf(COLOR_YELLOW,
42205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  "Note: This is test shard %d of %s.\n",
42215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  static_cast<int>(shard_index) + 1,
42225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  internal::posix::GetEnv(kTestTotalShards));
42235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
42245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (GTEST_FLAG(shuffle)) {
42265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ColoredPrintf(COLOR_YELLOW,
42275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  "Note: Randomizing tests' orders with a seed of %d .\n",
42285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  unit_test.random_seed());
42295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
42305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ColoredPrintf(COLOR_GREEN,  "[==========] ");
42325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  printf("Running %s from %s.\n",
42335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         FormatTestCount(unit_test.test_to_run_count()).c_str(),
42345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
42355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fflush(stdout);
42365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
42375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
42395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const UnitTest& /*unit_test*/) {
42405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ColoredPrintf(COLOR_GREEN,  "[----------] ");
42415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  printf("Global test environment set-up.\n");
42425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fflush(stdout);
42435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
42445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
42465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string counts =
42475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
42485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ColoredPrintf(COLOR_GREEN, "[----------] ");
42495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  printf("%s from %s", counts.c_str(), test_case.name());
42505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (test_case.type_param() == NULL) {
42515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    printf("\n");
42525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
42535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param());
42545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
42555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fflush(stdout);
42565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
42575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
42595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ColoredPrintf(COLOR_GREEN,  "[ RUN      ] ");
42605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTestName(test_info.test_case_name(), test_info.name());
42615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  printf("\n");
42625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fflush(stdout);
42635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
42645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Called after an assertion failure.
42665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrettyUnitTestResultPrinter::OnTestPartResult(
42675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const TestPartResult& result) {
42685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // If the test part succeeded, we don't need to do anything.
42695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (result.type() == TestPartResult::kSuccess)
42705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return;
42715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Print failure message from the assertion (e.g. expected this and got that).
42735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTestPartResult(result);
42745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fflush(stdout);
42755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
42765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
42785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (test_info.result()->Passed()) {
42795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ColoredPrintf(COLOR_GREEN, "[       OK ] ");
42805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
42815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
42825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
42835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintTestName(test_info.test_case_name(), test_info.name());
42845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (test_info.result()->Failed())
42855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    PrintFullTestCommentIfPresent(test_info);
42865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (GTEST_FLAG(print_time)) {
42885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    printf(" (%s ms)\n", internal::StreamableToString(
42895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           test_info.result()->elapsed_time()).c_str());
42905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
42915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    printf("\n");
42925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
42935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fflush(stdout);
42945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
42955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
42975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!GTEST_FLAG(print_time)) return;
42985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
42995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string counts =
43005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
43015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ColoredPrintf(COLOR_GREEN, "[----------] ");
43025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  printf("%s from %s (%s ms total)\n\n",
43035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         counts.c_str(), test_case.name(),
43045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         internal::StreamableToString(test_case.elapsed_time()).c_str());
43055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fflush(stdout);
43065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
43075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
43085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(
43095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const UnitTest& /*unit_test*/) {
43105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ColoredPrintf(COLOR_GREEN,  "[----------] ");
43115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  printf("Global test environment tear-down\n");
43125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fflush(stdout);
43135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
43145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
43155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Internal helper for printing the list of failed tests.
43165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {
43175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int failed_test_count = unit_test.failed_test_count();
43185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (failed_test_count == 0) {
43195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return;
43205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
43215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
43225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
43235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const TestCase& test_case = *unit_test.GetTestCase(i);
43245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {
43255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      continue;
43265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
43275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (int j = 0; j < test_case.total_test_count(); ++j) {
43285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const TestInfo& test_info = *test_case.GetTestInfo(j);
43295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (!test_info.should_run() || test_info.result()->Passed()) {
43305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        continue;
43315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
43325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
43335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      printf("%s.%s", test_case.name(), test_info.name());
43345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      PrintFullTestCommentIfPresent(test_info);
43355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      printf("\n");
43365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
43375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
43385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
43395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
43405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
43415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                     int /*iteration*/) {
43425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ColoredPrintf(COLOR_GREEN,  "[==========] ");
43435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  printf("%s from %s ran.",
43445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         FormatTestCount(unit_test.test_to_run_count()).c_str(),
43455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
43465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (GTEST_FLAG(print_time)) {
43475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    printf(" (%s ms total)",
43485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           internal::StreamableToString(unit_test.elapsed_time()).c_str());
43495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
43505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  printf("\n");
43515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ColoredPrintf(COLOR_GREEN,  "[  PASSED  ] ");
43525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());
43535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
43545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int num_failures = unit_test.failed_test_count();
43555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!unit_test.Passed()) {
43565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int failed_test_count = unit_test.failed_test_count();
43575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ColoredPrintf(COLOR_RED,  "[  FAILED  ] ");
43585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
43595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    PrintFailedTests(unit_test);
43605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    printf("\n%2d FAILED %s\n", num_failures,
43615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        num_failures == 1 ? "TEST" : "TESTS");
43625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
43635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
43645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int num_disabled = unit_test.reportable_disabled_test_count();
43655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
43665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (!num_failures) {
43675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      printf("\n");  // Add a spacer if no FAILURE banner is displayed.
43685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
43695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ColoredPrintf(COLOR_YELLOW,
43705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  "  YOU HAVE %d DISABLED %s\n\n",
43715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  num_disabled,
43725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  num_disabled == 1 ? "TEST" : "TESTS");
43735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
43745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Ensure that Google Test output is printed before, e.g., heapchecker output.
43755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fflush(stdout);
43765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
43775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
43785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// End PrettyUnitTestResultPrinter
43795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
43805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class TestEventRepeater
43815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
43825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This class forwards events to other event listeners.
43835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TestEventRepeater : public TestEventListener {
43845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
43855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestEventRepeater() : forwarding_enabled_(true) {}
43865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual ~TestEventRepeater();
43875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void Append(TestEventListener *listener);
43885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestEventListener* Release(TestEventListener* listener);
43895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
43905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Controls whether events will be forwarded to listeners_. Set to false
43915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // in death test child processes.
43925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool forwarding_enabled() const { return forwarding_enabled_; }
43935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }
43945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
43955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestProgramStart(const UnitTest& unit_test);
43965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
43975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
43985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);
43995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestCaseStart(const TestCase& test_case);
44005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestStart(const TestInfo& test_info);
44015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestPartResult(const TestPartResult& result);
44025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestEnd(const TestInfo& test_info);
44035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestCaseEnd(const TestCase& test_case);
44045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
44055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);
44065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
44075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestProgramEnd(const UnitTest& unit_test);
44085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
44095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
44105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Controls whether events will be forwarded to listeners_. Set to false
44115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // in death test child processes.
44125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool forwarding_enabled_;
44135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The list of listeners that receive events.
44145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::vector<TestEventListener*> listeners_;
44155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
44165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);
44175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
44185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
44195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestEventRepeater::~TestEventRepeater() {
44205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ForEach(listeners_, Delete<TestEventListener>);
44215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
44225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
44235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestEventRepeater::Append(TestEventListener *listener) {
44245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  listeners_.push_back(listener);
44255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
44265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
44275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TODO(vladl@google.com): Factor the search functionality into Vector::Find.
44285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestEventListener* TestEventRepeater::Release(TestEventListener *listener) {
44295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (size_t i = 0; i < listeners_.size(); ++i) {
44305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (listeners_[i] == listener) {
44315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      listeners_.erase(listeners_.begin() + i);
44325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return listener;
44335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
44345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
44355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
44365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return NULL;
44375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
44385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
44395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Since most methods are very similar, use macros to reduce boilerplate.
44405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This defines a member that forwards the call to all listeners.
44415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_REPEATER_METHOD_(Name, Type) \
44425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestEventRepeater::Name(const Type& parameter) { \
44435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (forwarding_enabled_) { \
44445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (size_t i = 0; i < listeners_.size(); i++) { \
44455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      listeners_[i]->Name(parameter); \
44465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } \
44475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } \
44485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
44495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This defines a member that forwards the call to all listeners in reverse
44505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// order.
44515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \
44525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestEventRepeater::Name(const Type& parameter) { \
44535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (forwarding_enabled_) { \
44545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \
44555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      listeners_[i]->Name(parameter); \
44565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } \
44575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } \
44585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
44595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
44605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)
44615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)
44625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)
44635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_REPEATER_METHOD_(OnTestStart, TestInfo)
44645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)
44655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)
44665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)
44675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)
44685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)
44695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)
44705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)
44715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
44725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_REPEATER_METHOD_
44735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_REVERSE_REPEATER_METHOD_
44745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
44755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,
44765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             int iteration) {
44775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (forwarding_enabled_) {
44785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (size_t i = 0; i < listeners_.size(); i++) {
44795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      listeners_[i]->OnTestIterationStart(unit_test, iteration);
44805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
44815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
44825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
44835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
44845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,
44855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                           int iteration) {
44865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (forwarding_enabled_) {
44875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {
44885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      listeners_[i]->OnTestIterationEnd(unit_test, iteration);
44895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
44905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
44915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
44925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
44935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// End TestEventRepeater
44945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
44955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This class generates an XML output file.
44965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass XmlUnitTestResultPrinter : public EmptyTestEventListener {
44975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
44985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit XmlUnitTestResultPrinter(const char* output_file);
44995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
45005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
45015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
45025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
45035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Is c a whitespace character that is normalized to a space character
45045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // when it appears in an XML attribute value?
45055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool IsNormalizableWhitespace(char c) {
45065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return c == 0x9 || c == 0xA || c == 0xD;
45075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
45085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
45095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // May c appear in a well-formed XML document?
45105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static bool IsValidXmlCharacter(char c) {
45115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return IsNormalizableWhitespace(c) || c >= 0x20;
45125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
45135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
45145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns an XML-escaped copy of the input string str.  If
45155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // is_attribute is true, the text is meant to appear as an attribute
45165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // value, and normalizable whitespace is preserved by replacing it
45175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // with character references.
45185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static std::string EscapeXml(const std::string& str, bool is_attribute);
45195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
45205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the given string with all characters invalid in XML removed.
45215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static std::string RemoveInvalidXmlCharacters(const std::string& str);
45225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
45235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Convenience wrapper around EscapeXml when str is an attribute value.
45245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static std::string EscapeXmlAttribute(const std::string& str) {
45255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return EscapeXml(str, true);
45265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
45275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
45285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Convenience wrapper around EscapeXml when str is not an attribute value.
45295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static std::string EscapeXmlText(const char* str) {
45305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return EscapeXml(str, false);
45315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
45325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
45335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Verifies that the given attribute belongs to the given element and
45345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // streams the attribute as XML.
45355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void OutputXmlAttribute(std::ostream* stream,
45365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                 const std::string& element_name,
45375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                 const std::string& name,
45385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                 const std::string& value);
45395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
45405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
45415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void OutputXmlCDataSection(::std::ostream* stream, const char* data);
45425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
45435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Streams an XML representation of a TestInfo object.
45445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void OutputXmlTestInfo(::std::ostream* stream,
45455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                const char* test_case_name,
45465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                const TestInfo& test_info);
45475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
45485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Prints an XML representation of a TestCase object
45495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void PrintXmlTestCase(::std::ostream* stream,
45505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const TestCase& test_case);
45515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
45525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Prints an XML summary of unit_test to output stream out.
45535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static void PrintXmlUnitTest(::std::ostream* stream,
45545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const UnitTest& unit_test);
45555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
45565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Produces a string representing the test properties in a result as space
45575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // delimited XML attributes based on the property key="value" pairs.
45585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // When the std::string is not empty, it includes a space at the beginning,
45595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // to delimit this attribute from prior attributes.
45605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static std::string TestPropertiesAsXmlAttributes(const TestResult& result);
45615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
45625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The output file.
45635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string output_file_;
45645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
45655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);
45665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
45675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
45685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Creates a new XmlUnitTestResultPrinter.
45695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangXmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)
45705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : output_file_(output_file) {
45715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (output_file_.c_str() == NULL || output_file_.empty()) {
45725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fprintf(stderr, "XML output file may not be null\n");
45735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fflush(stderr);
45745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    exit(EXIT_FAILURE);
45755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
45765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
45775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
45785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Called after the unit test ends.
45795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
45805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                  int /*iteration*/) {
45815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FILE* xmlout = NULL;
45825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FilePath output_file(output_file_);
45835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FilePath output_dir(output_file.RemoveFileName());
45845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
45855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (output_dir.CreateDirectoriesRecursively()) {
45865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    xmlout = posix::FOpen(output_file_.c_str(), "w");
45875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
45885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (xmlout == NULL) {
45895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // TODO(wan): report the reason of the failure.
45905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    //
45915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // We don't do it for now as:
45925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    //
45935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    //   1. There is no urgent need for it.
45945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    //   2. It's a bit involved to make the errno variable thread-safe on
45955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    //      all three operating systems (Linux, Windows, and Mac OS).
45965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    //   3. To interpret the meaning of errno in a thread-safe way,
45975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    //      we need the strerror_r() function, which is not available on
45985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    //      Windows.
45995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fprintf(stderr,
46005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            "Unable to open file \"%s\"\n",
46015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            output_file_.c_str());
46025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fflush(stderr);
46035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    exit(EXIT_FAILURE);
46045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
46055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::stringstream stream;
46065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintXmlUnitTest(&stream, unit_test);
46075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fprintf(xmlout, "%s", StringStreamToString(&stream).c_str());
46085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fclose(xmlout);
46095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
46105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
46115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns an XML-escaped copy of the input string str.  If is_attribute
46125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// is true, the text is meant to appear as an attribute value, and
46135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// normalizable whitespace is preserved by replacing it with character
46145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// references.
46155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
46165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Invalid XML characters in str, if any, are stripped from the output.
46175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// It is expected that most, if not all, of the text processed by this
46185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// module will consist of ordinary English text.
46195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// If this module is ever modified to produce version 1.1 XML output,
46205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// most invalid characters can be retained using character references.
46215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TODO(wan): It might be nice to have a minimally invasive, human-readable
46225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// escaping scheme for invalid characters, rather than dropping them.
46235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string XmlUnitTestResultPrinter::EscapeXml(
46245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const std::string& str, bool is_attribute) {
46255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message m;
46265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
46275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (size_t i = 0; i < str.size(); ++i) {
46285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char ch = str[i];
46295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    switch (ch) {
46305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case '<':
46315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        m << "&lt;";
46325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        break;
46335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case '>':
46345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        m << "&gt;";
46355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        break;
46365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case '&':
46375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        m << "&amp;";
46385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        break;
46395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case '\'':
46405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        if (is_attribute)
46415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          m << "&apos;";
46425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        else
46435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          m << '\'';
46445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        break;
46455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case '"':
46465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        if (is_attribute)
46475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          m << "&quot;";
46485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        else
46495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          m << '"';
46505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        break;
46515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      default:
46525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        if (IsValidXmlCharacter(ch)) {
46535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          if (is_attribute && IsNormalizableWhitespace(ch))
46545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            m << "&#x" << String::FormatByte(static_cast<unsigned char>(ch))
46555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              << ";";
46565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          else
46575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            m << ch;
46585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        }
46595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        break;
46605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
46615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
46625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
46635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return m.GetString();
46645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
46655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
46665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the given string with all characters invalid in XML removed.
46675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Currently invalid characters are dropped from the string. An
46685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// alternative is to replace them with certain characters such as . or ?.
46695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(
46705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const std::string& str) {
46715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string output;
46725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  output.reserve(str.size());
46735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)
46745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (IsValidXmlCharacter(*it))
46755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      output.push_back(*it);
46765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
46775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return output;
46785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
46795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
46805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The following routines generate an XML representation of a UnitTest
46815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// object.
46825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
46835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This is how Google Test concepts map to the DTD:
46845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
46855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// <testsuites name="AllTests">        <-- corresponds to a UnitTest object
46865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   <testsuite name="testcase-name">  <-- corresponds to a TestCase object
46875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     <testcase name="test-name">     <-- corresponds to a TestInfo object
46885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//       <failure message="...">...</failure>
46895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//       <failure message="...">...</failure>
46905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//       <failure message="...">...</failure>
46915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                                     <-- individual assertion failures
46925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     </testcase>
46935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   </testsuite>
46945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// </testsuites>
46955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
46965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Formats the given time in milliseconds as seconds.
46975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
46985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::std::stringstream ss;
46995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ss << ms/1000.0;
47005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ss.str();
47015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
47025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
47035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Converts the given epoch time in milliseconds to a date string in the ISO
47045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 8601 format, without the timezone information.
47055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
47065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Using non-reentrant version as localtime_r is not portable.
47075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  time_t seconds = static_cast<time_t>(ms / 1000);
47085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef _MSC_VER
47095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(push)          // Saves the current warning state.
47105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(disable:4996)  // Temporarily disables warning 4996
47115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                // (function or variable may be unsafe).
47125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
47135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(pop)           // Restores the warning state again.
47145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
47155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
47165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
47175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (time_struct == NULL)
47185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return "";  // Invalid ms value
47195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
47205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // YYYY-MM-DDThh:mm:ss
47215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return StreamableToString(time_struct->tm_year + 1900) + "-" +
47225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      String::FormatIntWidth2(time_struct->tm_mon + 1) + "-" +
47235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      String::FormatIntWidth2(time_struct->tm_mday) + "T" +
47245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      String::FormatIntWidth2(time_struct->tm_hour) + ":" +
47255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      String::FormatIntWidth2(time_struct->tm_min) + ":" +
47265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      String::FormatIntWidth2(time_struct->tm_sec);
47275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
47285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
47295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
47305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
47315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                     const char* data) {
47325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* segment = data;
47335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *stream << "<![CDATA[";
47345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (;;) {
47355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* const next_segment = strstr(segment, "]]>");
47365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (next_segment != NULL) {
47375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      stream->write(
47385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          segment, static_cast<std::streamsize>(next_segment - segment));
47395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *stream << "]]>]]&gt;<![CDATA[";
47405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      segment = next_segment + strlen("]]>");
47415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
47425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *stream << segment;
47435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
47445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
47455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
47465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *stream << "]]>";
47475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
47485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
47495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid XmlUnitTestResultPrinter::OutputXmlAttribute(
47505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    std::ostream* stream,
47515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const std::string& element_name,
47525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const std::string& name,
47535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const std::string& value) {
47545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::vector<std::string>& allowed_names =
47555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GetReservedAttributesForElement(element_name);
47565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
47575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=
47585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   allowed_names.end())
47595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "Attribute " << name << " is not allowed for element <" << element_name
47605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << ">.";
47615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
47625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *stream << " " << name << "=\"" << EscapeXmlAttribute(value) << "\"";
47635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
47645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
47655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints an XML representation of a TestInfo object.
47665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TODO(wan): There is also value in printing properties with the plain printer.
47675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
47685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                 const char* test_case_name,
47695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                 const TestInfo& test_info) {
47705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestResult& result = *test_info.result();
47715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string kTestcase = "testcase";
47725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
47735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *stream << "    <testcase";
47745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OutputXmlAttribute(stream, kTestcase, "name", test_info.name());
47755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
47765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (test_info.value_param() != NULL) {
47775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    OutputXmlAttribute(stream, kTestcase, "value_param",
47785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                       test_info.value_param());
47795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
47805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (test_info.type_param() != NULL) {
47815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    OutputXmlAttribute(stream, kTestcase, "type_param", test_info.type_param());
47825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
47835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
47845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OutputXmlAttribute(stream, kTestcase, "status",
47855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                     test_info.should_run() ? "run" : "notrun");
47865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OutputXmlAttribute(stream, kTestcase, "time",
47875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                     FormatTimeInMillisAsSeconds(result.elapsed_time()));
47885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OutputXmlAttribute(stream, kTestcase, "classname", test_case_name);
47895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *stream << TestPropertiesAsXmlAttributes(result);
47905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
47915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int failures = 0;
47925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (int i = 0; i < result.total_part_count(); ++i) {
47935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const TestPartResult& part = result.GetTestPartResult(i);
47945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (part.failed()) {
47955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (++failures == 1) {
47965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        *stream << ">\n";
47975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
47985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const string location = internal::FormatCompilerIndependentFileLocation(
47995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          part.file_name(), part.line_number());
48005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const string summary = location + "\n" + part.summary();
48015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *stream << "      <failure message=\""
48025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              << EscapeXmlAttribute(summary.c_str())
48035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              << "\" type=\"\">";
48045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const string detail = location + "\n" + part.message();
48055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());
48065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *stream << "</failure>\n";
48075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
48085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
48095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
48105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (failures == 0)
48115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *stream << " />\n";
48125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  else
48135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *stream << "    </testcase>\n";
48145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
48155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
48165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints an XML representation of a TestCase object
48175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid XmlUnitTestResultPrinter::PrintXmlTestCase(std::ostream* stream,
48185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                const TestCase& test_case) {
48195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string kTestsuite = "testsuite";
48205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *stream << "  <" << kTestsuite;
48215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OutputXmlAttribute(stream, kTestsuite, "name", test_case.name());
48225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OutputXmlAttribute(stream, kTestsuite, "tests",
48235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                     StreamableToString(test_case.reportable_test_count()));
48245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OutputXmlAttribute(stream, kTestsuite, "failures",
48255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                     StreamableToString(test_case.failed_test_count()));
48265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OutputXmlAttribute(
48275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      stream, kTestsuite, "disabled",
48285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      StreamableToString(test_case.reportable_disabled_test_count()));
48295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OutputXmlAttribute(stream, kTestsuite, "errors", "0");
48305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OutputXmlAttribute(stream, kTestsuite, "time",
48315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                     FormatTimeInMillisAsSeconds(test_case.elapsed_time()));
48325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *stream << TestPropertiesAsXmlAttributes(test_case.ad_hoc_test_result())
48335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << ">\n";
48345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
48355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (int i = 0; i < test_case.total_test_count(); ++i) {
48365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (test_case.GetTestInfo(i)->is_reportable())
48375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      OutputXmlTestInfo(stream, test_case.name(), *test_case.GetTestInfo(i));
48385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
48395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *stream << "  </" << kTestsuite << ">\n";
48405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
48415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
48425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints an XML summary of unit_test to output stream out.
48435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,
48445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                const UnitTest& unit_test) {
48455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string kTestsuites = "testsuites";
48465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
48475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
48485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *stream << "<" << kTestsuites;
48495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
48505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OutputXmlAttribute(stream, kTestsuites, "tests",
48515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                     StreamableToString(unit_test.reportable_test_count()));
48525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OutputXmlAttribute(stream, kTestsuites, "failures",
48535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                     StreamableToString(unit_test.failed_test_count()));
48545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OutputXmlAttribute(
48555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      stream, kTestsuites, "disabled",
48565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      StreamableToString(unit_test.reportable_disabled_test_count()));
48575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OutputXmlAttribute(stream, kTestsuites, "errors", "0");
48585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OutputXmlAttribute(
48595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      stream, kTestsuites, "timestamp",
48605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()));
48615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OutputXmlAttribute(stream, kTestsuites, "time",
48625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                     FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));
48635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
48645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (GTEST_FLAG(shuffle)) {
48655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    OutputXmlAttribute(stream, kTestsuites, "random_seed",
48665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                       StreamableToString(unit_test.random_seed()));
48675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
48685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
48695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result());
48705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
48715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  OutputXmlAttribute(stream, kTestsuites, "name", "AllTests");
48725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *stream << ">\n";
48735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
48745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
48755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (unit_test.GetTestCase(i)->reportable_test_count() > 0)
48765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      PrintXmlTestCase(stream, *unit_test.GetTestCase(i));
48775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
48785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *stream << "</" << kTestsuites << ">\n";
48795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
48805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
48815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Produces a string representing the test properties in a result as space
48825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// delimited XML attributes based on the property key="value" pairs.
48835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
48845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const TestResult& result) {
48855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message attributes;
48865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (int i = 0; i < result.test_property_count(); ++i) {
48875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const TestProperty& property = result.GetTestProperty(i);
48885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    attributes << " " << property.key() << "="
48895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        << "\"" << EscapeXmlAttribute(property.value()) << "\"";
48905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
48915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return attributes.GetString();
48925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
48935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
48945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// End XmlUnitTestResultPrinter
48955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
48965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_CAN_STREAM_RESULTS_
48975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
48985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Checks if str contains '=', '&', '%' or '\n' characters. If yes,
48995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// replaces them by "%xx" where xx is their hexadecimal value. For
49005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// example, replaces "=" with "%3D".  This algorithm is O(strlen(str))
49015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in both time and space -- important as the input str may contain an
49025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// arbitrarily long test failure message and stack trace.
49035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstring StreamingListener::UrlEncode(const char* str) {
49045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  string result;
49055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  result.reserve(strlen(str) + 1);
49065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (char ch = *str; ch != '\0'; ch = *++str) {
49075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    switch (ch) {
49085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case '%':
49095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case '=':
49105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case '&':
49115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case '\n':
49125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        result.append("%" + String::FormatByte(static_cast<unsigned char>(ch)));
49135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        break;
49145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      default:
49155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        result.push_back(ch);
49165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        break;
49175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
49185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
49195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return result;
49205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
49215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
49225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid StreamingListener::SocketWriter::MakeConnection() {
49235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_CHECK_(sockfd_ == -1)
49245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "MakeConnection() can't be called when there is already a connection.";
49255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
49265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  addrinfo hints;
49275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  memset(&hints, 0, sizeof(hints));
49285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  hints.ai_family = AF_UNSPEC;    // To allow both IPv4 and IPv6 addresses.
49295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  hints.ai_socktype = SOCK_STREAM;
49305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  addrinfo* servinfo = NULL;
49315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
49325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Use the getaddrinfo() to get a linked list of IP addresses for
49335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the given host name.
49345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int error_num = getaddrinfo(
49355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);
49365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (error_num != 0) {
49375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: "
49385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        << gai_strerror(error_num);
49395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
49405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
49415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Loop through all the results and connect to the first we can.
49425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;
49435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang       cur_addr = cur_addr->ai_next) {
49445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    sockfd_ = socket(
49455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);
49465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (sockfd_ != -1) {
49475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Connect the client socket to the server socket.
49485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {
49495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        close(sockfd_);
49505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        sockfd_ = -1;
49515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
49525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
49535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
49545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
49555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  freeaddrinfo(servinfo);  // all done with this structure
49565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
49575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (sockfd_ == -1) {
49585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to "
49595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        << host_name_ << ":" << port_num_;
49605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
49615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
49625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
49635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// End of class Streaming Listener
49645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_CAN_STREAM_RESULTS__
49655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
49665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Class ScopedTrace
49675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
49685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Pushes the given source file location and message onto a per-thread
49695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// trace stack maintained by Google Test.
49705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangScopedTrace::ScopedTrace(const char* file, int line, const Message& message)
49715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
49725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TraceInfo trace;
49735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  trace.file = file;
49745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  trace.line = line;
49755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  trace.message = message.GetString();
49765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
49775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  UnitTest::GetInstance()->PushGTestTrace(trace);
49785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
49795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
49805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Pops the info pushed by the c'tor.
49815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangScopedTrace::~ScopedTrace()
49825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
49835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  UnitTest::GetInstance()->PopGTestTrace();
49845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
49855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
49865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
49875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class OsStackTraceGetter
49885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
49895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the current OS stack trace as an std::string.  Parameters:
49905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
49915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   max_depth  - the maximum number of stack frames to be included
49925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                in the trace.
49935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   skip_count - the number of top frames to be skipped; doesn't count
49945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                against max_depth.
49955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
49965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstring OsStackTraceGetter::CurrentStackTrace(int /* max_depth */,
49975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             int /* skip_count */)
49985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_LOCK_EXCLUDED_(mutex_) {
49995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return "";
50005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
50015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
50025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid OsStackTraceGetter::UponLeavingGTest()
50035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_LOCK_EXCLUDED_(mutex_) {
50045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
50055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
50065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char* const
50075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangOsStackTraceGetter::kElidedFramesMarker =
50085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "... " GTEST_NAME_ " internal frames ...";
50095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
50105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A helper class that creates the premature-exit file in its
50115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// constructor and deletes the file in its destructor.
50125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ScopedPrematureExitFile {
50135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
50145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit ScopedPrematureExitFile(const char* premature_exit_filepath)
50155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : premature_exit_filepath_(premature_exit_filepath) {
50165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // If a path to the premature-exit file is specified...
50175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (premature_exit_filepath != NULL && *premature_exit_filepath != '\0') {
50185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // create the file with a single "0" character in it.  I/O
50195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // errors are ignored as there's nothing better we can do and we
50205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // don't want to fail the test because of this.
50215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      FILE* pfile = posix::FOpen(premature_exit_filepath, "w");
50225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      fwrite("0", 1, 1, pfile);
50235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      fclose(pfile);
50245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
50255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
50265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
50275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~ScopedPrematureExitFile() {
50285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (premature_exit_filepath_ != NULL && *premature_exit_filepath_ != '\0') {
50295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      remove(premature_exit_filepath_);
50305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
50315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
50325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
50335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
50345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const premature_exit_filepath_;
50355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
50365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile);
50375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
50385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
50395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
50405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
50415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class TestEventListeners
50425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
50435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestEventListeners::TestEventListeners()
50445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : repeater_(new internal::TestEventRepeater()),
50455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      default_result_printer_(NULL),
50465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      default_xml_generator_(NULL) {
50475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
50485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
50495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestEventListeners::~TestEventListeners() { delete repeater_; }
50505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
50515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the standard listener responsible for the default console
50525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// output.  Can be removed from the listeners list to shut down default
50535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// console output.  Note that removing this object from the listener list
50545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// with Release transfers its ownership to the user.
50555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestEventListeners::Append(TestEventListener* listener) {
50565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  repeater_->Append(listener);
50575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
50585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
50595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Removes the given event listener from the list and returns it.  It then
50605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// becomes the caller's responsibility to delete the listener. Returns
50615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// NULL if the listener is not found in the list.
50625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestEventListener* TestEventListeners::Release(TestEventListener* listener) {
50635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (listener == default_result_printer_)
50645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    default_result_printer_ = NULL;
50655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  else if (listener == default_xml_generator_)
50665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    default_xml_generator_ = NULL;
50675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return repeater_->Release(listener);
50685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
50695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
50705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns repeater that broadcasts the TestEventListener events to all
50715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// subscribers.
50725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestEventListener* TestEventListeners::repeater() { return repeater_; }
50735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
50745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Sets the default_result_printer attribute to the provided listener.
50755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The listener is also added to the listener list and previous
50765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// default_result_printer is removed from it and deleted. The listener can
50775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// also be NULL in which case it will not be added to the list. Does
50785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// nothing if the previous and the current listener objects are the same.
50795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {
50805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (default_result_printer_ != listener) {
50815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // It is an error to pass this method a listener that is already in the
50825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // list.
50835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    delete Release(default_result_printer_);
50845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    default_result_printer_ = listener;
50855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (listener != NULL)
50865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      Append(listener);
50875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
50885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
50895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
50905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Sets the default_xml_generator attribute to the provided listener.  The
50915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// listener is also added to the listener list and previous
50925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// default_xml_generator is removed from it and deleted. The listener can
50935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// also be NULL in which case it will not be added to the list. Does
50945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// nothing if the previous and the current listener objects are the same.
50955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {
50965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (default_xml_generator_ != listener) {
50975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // It is an error to pass this method a listener that is already in the
50985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // list.
50995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    delete Release(default_xml_generator_);
51005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    default_xml_generator_ = listener;
51015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (listener != NULL)
51025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      Append(listener);
51035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
51045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
51055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
51065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Controls whether events will be forwarded by the repeater to the
51075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// listeners in the list.
51085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool TestEventListeners::EventForwardingEnabled() const {
51095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return repeater_->forwarding_enabled();
51105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
51115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
51125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestEventListeners::SuppressEventForwarding() {
51135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  repeater_->set_forwarding_enabled(false);
51145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
51155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
51165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// class UnitTest
51175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
51185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the singleton UnitTest object.  The first time this method is
51195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// called, a UnitTest object is constructed and returned.  Consecutive
51205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// calls will return the same object.
51215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
51225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We don't protect this under mutex_ as a user is not supposed to
51235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// call this before main() starts, from which point on the return
51245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// value will never change.
51255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangUnitTest* UnitTest::GetInstance() {
51265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // When compiled with MSVC 7.1 in optimized mode, destroying the
51275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // UnitTest object upon exiting the program messes up the exit code,
51285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // causing successful tests to appear failed.  We have to use a
51295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // different implementation in this case to bypass the compiler bug.
51305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This implementation makes the compiler happy, at the cost of
51315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // leaking the UnitTest object.
51325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
51335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // CodeGear C++Builder insists on a public destructor for the
51345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // default implementation.  Use this implementation to keep good OO
51355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // design with private destructor.
51365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
51375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
51385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static UnitTest* const instance = new UnitTest;
51395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return instance;
51405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
51415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static UnitTest instance;
51425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return &instance;
51435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
51445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
51455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
51465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of successful test cases.
51475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTest::successful_test_case_count() const {
51485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return impl()->successful_test_case_count();
51495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
51505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
51515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of failed test cases.
51525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTest::failed_test_case_count() const {
51535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return impl()->failed_test_case_count();
51545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
51555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
51565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of all test cases.
51575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTest::total_test_case_count() const {
51585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return impl()->total_test_case_count();
51595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
51605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
51615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of all test cases that contain at least one test
51625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// that should run.
51635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTest::test_case_to_run_count() const {
51645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return impl()->test_case_to_run_count();
51655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
51665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
51675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of successful tests.
51685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTest::successful_test_count() const {
51695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return impl()->successful_test_count();
51705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
51715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
51725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of failed tests.
51735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTest::failed_test_count() const { return impl()->failed_test_count(); }
51745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
51755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of disabled tests that will be reported in the XML report.
51765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTest::reportable_disabled_test_count() const {
51775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return impl()->reportable_disabled_test_count();
51785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
51795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
51805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of disabled tests.
51815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTest::disabled_test_count() const {
51825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return impl()->disabled_test_count();
51835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
51845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
51855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of tests to be printed in the XML report.
51865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTest::reportable_test_count() const {
51875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return impl()->reportable_test_count();
51885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
51895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
51905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of all tests.
51915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTest::total_test_count() const { return impl()->total_test_count(); }
51925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
51935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the number of tests that should run.
51945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
51955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
51965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the time of the test program start, in ms from the start of the
51975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// UNIX epoch.
51985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::TimeInMillis UnitTest::start_timestamp() const {
51995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return impl()->start_timestamp();
52005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
52015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
52025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the elapsed time, in milliseconds.
52035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::TimeInMillis UnitTest::elapsed_time() const {
52045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return impl()->elapsed_time();
52055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
52065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
52075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff the unit test passed (i.e. all test cases passed).
52085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool UnitTest::Passed() const { return impl()->Passed(); }
52095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
52105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff the unit test failed (i.e. some test case failed
52115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// or something outside of all tests failed).
52125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool UnitTest::Failed() const { return impl()->Failed(); }
52135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
52145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the i-th test case among all the test cases. i can range from 0 to
52155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// total_test_case_count() - 1. If i is not in that range, returns NULL.
52165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst TestCase* UnitTest::GetTestCase(int i) const {
52175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return impl()->GetTestCase(i);
52185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
52195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
52205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the TestResult containing information on test failures and
52215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// properties logged outside of individual test cases.
52225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst TestResult& UnitTest::ad_hoc_test_result() const {
52235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return *impl()->ad_hoc_test_result();
52245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
52255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
52265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the i-th test case among all the test cases. i can range from 0 to
52275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// total_test_case_count() - 1. If i is not in that range, returns NULL.
52285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestCase* UnitTest::GetMutableTestCase(int i) {
52295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return impl()->GetMutableTestCase(i);
52305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
52315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
52325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the list of event listeners that can be used to track events
52335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// inside Google Test.
52345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestEventListeners& UnitTest::listeners() {
52355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return *impl()->listeners();
52365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
52375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
52385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Registers and returns a global test environment.  When a test
52395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// program is run, all global test environments will be set-up in the
52405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// order they were registered.  After all tests in the program have
52415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// finished, all global test environments will be torn-down in the
52425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// *reverse* order they were registered.
52435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
52445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The UnitTest object takes ownership of the given environment.
52455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
52465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We don't protect this under mutex_, as we only support calling it
52475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// from the main thread.
52485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangEnvironment* UnitTest::AddEnvironment(Environment* env) {
52495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (env == NULL) {
52505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return NULL;
52515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
52525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
52535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  impl_->environments().push_back(env);
52545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return env;
52555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
52565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
52575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Adds a TestPartResult to the current TestResult object.  All Google Test
52585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
52595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this to report their results.  The user code should use the
52605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// assertion macros instead of calling this directly.
52615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UnitTest::AddTestPartResult(
52625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TestPartResult::Type result_type,
52635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* file_name,
52645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int line_number,
52655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const std::string& message,
52665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) {
52675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message msg;
52685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  msg << message;
52695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
52705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::MutexLock lock(&mutex_);
52715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (impl_->gtest_trace_stack().size() > 0) {
52725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    msg << "\n" << GTEST_NAME_ << " trace:";
52735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
52745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (int i = static_cast<int>(impl_->gtest_trace_stack().size());
52755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         i > 0; --i) {
52765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];
52775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)
52785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << " " << trace.message;
52795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
52805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
52815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
52825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {
52835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    msg << internal::kStackTraceMarker << os_stack_trace;
52845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
52855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
52865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestPartResult result =
52875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TestPartResult(result_type, file_name, line_number,
52885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   msg.GetString().c_str());
52895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  impl_->GetTestPartResultReporterForCurrentThread()->
52905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ReportTestPartResult(result);
52915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
52925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (result_type != TestPartResult::kSuccess) {
52935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // gtest_break_on_failure takes precedence over
52945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // gtest_throw_on_failure.  This allows a user to set the latter
52955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // in the code (perhaps in order to use Google Test assertions
52965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // with another testing framework) and specify the former on the
52975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // command line for debugging.
52985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (GTEST_FLAG(break_on_failure)) {
52995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS
53005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Using DebugBreak on Windows allows gtest to still break into a debugger
53015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // when a failure happens and both the --gtest_break_on_failure and
53025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // the --gtest_catch_exceptions flags are specified.
53035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      DebugBreak();
53045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
53055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Dereference NULL through a volatile pointer to prevent the compiler
53065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // from removing. We use this rather than abort() or __builtin_trap() for
53075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // portability: Symbian doesn't implement abort() well, and some debuggers
53085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // don't correctly trap abort().
53095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *static_cast<volatile int*>(NULL) = 1;
53105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS
53115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else if (GTEST_FLAG(throw_on_failure)) {
53125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_EXCEPTIONS
53135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      throw internal::GoogleTestFailureException(result);
53145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
53155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We cannot call abort() as it generates a pop-up in debug mode
53165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // that cannot be suppressed in VC 7.1 or below.
53175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      exit(1);
53185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
53195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
53205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
53215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
53225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Adds a TestProperty to the current TestResult object when invoked from
53245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// inside a test, to current TestCase's ad_hoc_test_result_ when invoked
53255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// from SetUpTestCase or TearDownTestCase, or to the global property set
53265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// when invoked elsewhere.  If the result already contains a property with
53275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the same key, the value will be updated.
53285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UnitTest::RecordProperty(const std::string& key,
53295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                              const std::string& value) {
53305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  impl_->RecordProperty(TestProperty(key, value));
53315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
53325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Runs all tests in this UnitTest object and prints the result.
53345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns 0 if successful, or 1 otherwise.
53355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
53365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// We don't protect this under mutex_, as we only support calling it
53375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// from the main thread.
53385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTest::Run() {
53395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const bool in_death_test_child_process =
53405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      internal::GTEST_FLAG(internal_run_death_test).length() > 0;
53415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Google Test implements this protocol for catching that a test
53435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // program exits before returning control to Google Test:
53445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
53455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   1. Upon start, Google Test creates a file whose absolute path
53465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //      is specified by the environment variable
53475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //      TEST_PREMATURE_EXIT_FILE.
53485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   2. When Google Test has finished its work, it deletes the file.
53495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
53505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before
53515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // running a Google-Test-based test program and check the existence
53525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // of the file at the end of the test execution to see if it has
53535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // exited prematurely.
53545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // If we are in the child process of a death test, don't
53565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // create/delete the premature exit file, as doing so is unnecessary
53575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // and will confuse the parent process.  Otherwise, create/delete
53585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the file upon entering/leaving this function.  If the program
53595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // somehow exits before this function has a chance to return, the
53605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // premature-exit file will be left undeleted, causing a test runner
53615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // that understands the premature-exit-file protocol to report the
53625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // test as having failed.
53635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const internal::ScopedPrematureExitFile premature_exit_file(
53645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      in_death_test_child_process ?
53655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      NULL : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));
53665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Captures the value of GTEST_FLAG(catch_exceptions).  This value will be
53685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // used for the duration of the program.
53695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));
53705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_SEH
53725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Either the user wants Google Test to catch exceptions thrown by the
53735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // tests or this is executing in the context of death test child
53745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // process. In either case the user does not want to see pop-up dialogs
53755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // about crashes - they are expected.
53765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (impl()->catch_exceptions() || in_death_test_child_process) {
53775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if !GTEST_OS_WINDOWS_MOBILE
53785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // SetErrorMode doesn't exist on CE.
53795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
53805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
53815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // !GTEST_OS_WINDOWS_MOBILE
53825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE
53845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Death test children can be terminated with _abort().  On Windows,
53855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // _abort() can show a dialog with a warning message.  This forces the
53865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // abort message to go to stderr instead.
53875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    _set_error_mode(_OUT_TO_STDERR);
53885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif
53895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
53905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
53915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // In the debug version, Visual Studio pops up a separate dialog
53925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // offering a choice to debug the aborted program. We need to suppress
53935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement
53945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // executed. Google Test will notify the user of any unexpected
53955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // failure via stderr.
53965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    //
53975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.
53985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Users of prior VC versions shall suffer the agony and pain of
53995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // clicking through the countless debug dialogs.
54005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // TODO(vladl@google.com): find a way to suppress the abort dialog() in the
54015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // debug mode when compiled with VC 7.1 or lower.
54025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (!GTEST_FLAG(break_on_failure))
54035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      _set_abort_behavior(
54045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          0x0,                                    // Clear the following flags:
54055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          _WRITE_ABORT_MSG | _CALL_REPORTFAULT);  // pop-up window, core dump.
54065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif
54075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
54085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_SEH
54095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return internal::HandleExceptionsInMethodIfSupported(
54115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      impl(),
54125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      &internal::UnitTestImpl::RunAllTests,
54135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      "auxiliary test code (environments or event listeners)") ? 0 : 1;
54145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
54155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the working directory when the first TEST() or TEST_F() was
54175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// executed.
54185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char* UnitTest::original_working_dir() const {
54195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return impl_->original_working_dir_.c_str();
54205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
54215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the TestCase object for the test that's currently running,
54235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// or NULL if no test is running.
54245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst TestCase* UnitTest::current_test_case() const
54255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_LOCK_EXCLUDED_(mutex_) {
54265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::MutexLock lock(&mutex_);
54275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return impl_->current_test_case();
54285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
54295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the TestInfo object for the test that's currently running,
54315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// or NULL if no test is running.
54325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst TestInfo* UnitTest::current_test_info() const
54335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_LOCK_EXCLUDED_(mutex_) {
54345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::MutexLock lock(&mutex_);
54355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return impl_->current_test_info();
54365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
54375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the random seed used at the start of the current test run.
54395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTest::random_seed() const { return impl_->random_seed(); }
54405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_PARAM_TEST
54425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns ParameterizedTestCaseRegistry object used to keep track of
54435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// value-parameterized tests and instantiate and register them.
54445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginternal::ParameterizedTestCaseRegistry&
54455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    UnitTest::parameterized_test_registry()
54465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        GTEST_LOCK_EXCLUDED_(mutex_) {
54475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return impl_->parameterized_test_registry();
54485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
54495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_PARAM_TEST
54505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Creates an empty UnitTest.
54525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangUnitTest::UnitTest() {
54535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  impl_ = new internal::UnitTestImpl(this);
54545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
54555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Destructor of UnitTest.
54575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangUnitTest::~UnitTest() {
54585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  delete impl_;
54595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
54605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
54625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google Test trace stack.
54635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UnitTest::PushGTestTrace(const internal::TraceInfo& trace)
54645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_LOCK_EXCLUDED_(mutex_) {
54655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::MutexLock lock(&mutex_);
54665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  impl_->gtest_trace_stack().push_back(trace);
54675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
54685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Pops a trace from the per-thread Google Test trace stack.
54705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UnitTest::PopGTestTrace()
54715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_LOCK_EXCLUDED_(mutex_) {
54725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::MutexLock lock(&mutex_);
54735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  impl_->gtest_trace_stack().pop_back();
54745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
54755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
54775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
54785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangUnitTestImpl::UnitTestImpl(UnitTest* parent)
54795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : parent_(parent),
54805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef _MSC_VER
54815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(push)                    // Saves the current warning state.
54825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(disable:4355)            // Temporarily disables warning 4355
54835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                         // (using this in initializer).
54845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      default_global_test_part_result_reporter_(this),
54855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      default_per_thread_test_part_result_reporter_(this),
54865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(pop)                     // Restores the warning state again.
54875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
54885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      default_global_test_part_result_reporter_(this),
54895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      default_per_thread_test_part_result_reporter_(this),
54905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // _MSC_VER
54915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      global_test_part_result_repoter_(
54925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          &default_global_test_part_result_reporter_),
54935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      per_thread_test_part_result_reporter_(
54945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          &default_per_thread_test_part_result_reporter_),
54955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_PARAM_TEST
54965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      parameterized_test_registry_(),
54975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      parameterized_tests_registered_(false),
54985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_PARAM_TEST
54995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      last_death_test_case_(-1),
55005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      current_test_case_(NULL),
55015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      current_test_info_(NULL),
55025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ad_hoc_test_result_(),
55035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      os_stack_trace_getter_(NULL),
55045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      post_flag_parse_init_performed_(false),
55055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      random_seed_(0),  // Will be overridden by the flag before first use.
55065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      random_(0),  // Will be reseeded before first use.
55075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      start_timestamp_(0),
55085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      elapsed_time_(0),
55095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_DEATH_TEST
55105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      death_test_factory_(new DefaultDeathTestFactory),
55115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
55125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Will be overridden by the flag before first use.
55135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      catch_exceptions_(false) {
55145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);
55155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
55165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
55175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangUnitTestImpl::~UnitTestImpl() {
55185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Deletes every TestCase.
55195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ForEach(test_cases_, internal::Delete<TestCase>);
55205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
55215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Deletes every Environment.
55225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ForEach(environments_, internal::Delete<Environment>);
55235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
55245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  delete os_stack_trace_getter_;
55255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
55265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
55275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Adds a TestProperty to the current TestResult object when invoked in a
55285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// context of a test, to current test case's ad_hoc_test_result when invoke
55295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// from SetUpTestCase/TearDownTestCase, or to the global property set
55305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// otherwise.  If the result already contains a property with the same key,
55315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the value will be updated.
55325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UnitTestImpl::RecordProperty(const TestProperty& test_property) {
55335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string xml_element;
55345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestResult* test_result;  // TestResult appropriate for property recording.
55355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
55365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (current_test_info_ != NULL) {
55375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    xml_element = "testcase";
55385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    test_result = &(current_test_info_->result_);
55395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else if (current_test_case_ != NULL) {
55405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    xml_element = "testsuite";
55415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    test_result = &(current_test_case_->ad_hoc_test_result_);
55425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
55435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    xml_element = "testsuites";
55445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    test_result = &ad_hoc_test_result_;
55455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
55465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  test_result->RecordProperty(xml_element, test_property);
55475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
55485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
55495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_DEATH_TEST
55505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Disables event forwarding if the control is currently in a death test
55515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// subprocess. Must not be called before InitGoogleTest.
55525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UnitTestImpl::SuppressTestEventsIfInSubprocess() {
55535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (internal_run_death_test_flag_.get() != NULL)
55545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    listeners()->SuppressEventForwarding();
55555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
55565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_DEATH_TEST
55575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
55585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Initializes event listeners performing XML output as specified by
55595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// UnitTestOptions. Must not be called before InitGoogleTest.
55605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UnitTestImpl::ConfigureXmlOutput() {
55615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string& output_format = UnitTestOptions::GetOutputFormat();
55625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (output_format == "xml") {
55635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(
55645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
55655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else if (output_format != "") {
55665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    printf("WARNING: unrecognized output format \"%s\" ignored.\n",
55675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           output_format.c_str());
55685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fflush(stdout);
55695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
55705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
55715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
55725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_CAN_STREAM_RESULTS_
55735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Initializes event listeners for streaming test results in string form.
55745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Must not be called before InitGoogleTest.
55755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UnitTestImpl::ConfigureStreamingOutput() {
55765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string& target = GTEST_FLAG(stream_result_to);
55775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!target.empty()) {
55785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const size_t pos = target.find(':');
55795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (pos != std::string::npos) {
55805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      listeners()->Append(new StreamingListener(target.substr(0, pos),
55815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                target.substr(pos+1)));
55825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
55835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      printf("WARNING: unrecognized streaming target \"%s\" ignored.\n",
55845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang             target.c_str());
55855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      fflush(stdout);
55865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
55875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
55885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
55895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_CAN_STREAM_RESULTS_
55905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
55915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Performs initialization dependent upon flag values obtained in
55925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
55935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
55945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this function is also called from RunAllTests.  Since this function can be
55955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// called more than once, it has to be idempotent.
55965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UnitTestImpl::PostFlagParsingInit() {
55975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Ensures that this function does not execute more than once.
55985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!post_flag_parse_init_performed_) {
55995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    post_flag_parse_init_performed_ = true;
56005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_DEATH_TEST
56025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    InitDeathTestSubprocessControlInfo();
56035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    SuppressTestEventsIfInSubprocess();
56045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_DEATH_TEST
56055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Registers parameterized tests. This makes parameterized tests
56075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // available to the UnitTest reflection API without running
56085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // RUN_ALL_TESTS.
56095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    RegisterParameterizedTests();
56105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Configures listeners for XML output. This makes it possible for users
56125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // to shut down the default XML output before invoking RUN_ALL_TESTS.
56135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ConfigureXmlOutput();
56145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_CAN_STREAM_RESULTS_
56165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Configures listeners for streaming test results to the specified server.
56175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ConfigureStreamingOutput();
56185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_CAN_STREAM_RESULTS_
56195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
56205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
56215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A predicate that checks the name of a TestCase against a known
56235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// value.
56245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
56255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This is used for implementation of the UnitTest class only.  We put
56265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// it in the anonymous namespace to prevent polluting the outer
56275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// namespace.
56285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
56295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TestCaseNameIs is copyable.
56305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass TestCaseNameIs {
56315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
56325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Constructor.
56335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit TestCaseNameIs(const std::string& name)
56345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : name_(name) {}
56355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns true iff the name of test_case matches name_.
56375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool operator()(const TestCase* test_case) const {
56385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;
56395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
56405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
56425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string name_;
56435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
56445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Finds and returns a TestCase with the given name.  If one doesn't
56465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// exist, creates one and returns it.  It's the CALLER'S
56475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// RESPONSIBILITY to ensure that this function is only called WHEN THE
56485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TESTS ARE NOT SHUFFLED.
56495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
56505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Arguments:
56515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
56525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   test_case_name: name of the test case
56535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   type_param:     the name of the test case's type parameter, or NULL if
56545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//                   this is not a typed or a type-parameterized test case.
56555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   set_up_tc:      pointer to the function that sets up the test case
56565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   tear_down_tc:   pointer to the function that tears down the test case
56575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestCase* UnitTestImpl::GetTestCase(const char* test_case_name,
56585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                    const char* type_param,
56595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                    Test::SetUpTestCaseFunc set_up_tc,
56605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                    Test::TearDownTestCaseFunc tear_down_tc) {
56615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Can we find a TestCase with the given name?
56625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::vector<TestCase*>::const_iterator test_case =
56635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      std::find_if(test_cases_.begin(), test_cases_.end(),
56645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   TestCaseNameIs(test_case_name));
56655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (test_case != test_cases_.end())
56675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *test_case;
56685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // No.  Let's create one.
56705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestCase* const new_test_case =
56715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);
56725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Is this a death test case?
56745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (internal::UnitTestOptions::MatchesFilter(test_case_name,
56755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                               kDeathTestCaseFilter)) {
56765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Yes.  Inserts the test case after the last death test case
56775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // defined so far.  This only works when the test cases haven't
56785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // been shuffled.  Otherwise we may end up running a death test
56795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // after a non-death test.
56805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ++last_death_test_case_;
56815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    test_cases_.insert(test_cases_.begin() + last_death_test_case_,
56825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                       new_test_case);
56835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
56845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // No.  Appends to the end of the list.
56855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    test_cases_.push_back(new_test_case);
56865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
56875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));
56895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return new_test_case;
56905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
56915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helpers for setting up / tearing down the given environment.  They
56935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// are for use in the ForEach() function.
56945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void SetUpEnvironment(Environment* env) { env->SetUp(); }
56955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void TearDownEnvironment(Environment* env) { env->TearDown(); }
56965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
56975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Runs all tests in this UnitTest object, prints the result, and
56985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// returns true if all tests are successful.  If any exception is
56995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// thrown during a test, the test is considered to be failed, but the
57005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// rest of the tests will still be run.
57015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
57025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// When parameterized tests are enabled, it expands and registers
57035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// parameterized tests first in RegisterParameterizedTests().
57045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All other functions called from RunAllTests() may safely assume that
57055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// parameterized tests are ready to be counted and run.
57065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool UnitTestImpl::RunAllTests() {
57075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Makes sure InitGoogleTest() was called.
57085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!GTestIsInitialized()) {
57095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    printf("%s",
57105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           "\nThis test program did NOT call ::testing::InitGoogleTest "
57115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           "before calling RUN_ALL_TESTS().  Please fix it.\n");
57125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return false;
57135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
57145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Do not run any test if the --help flag was specified.
57165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (g_help_flag)
57175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return true;
57185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Repeats the call to the post-flag parsing initialization in case the
57205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // user didn't call InitGoogleTest.
57215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PostFlagParsingInit();
57225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Even if sharding is not on, test runners may want to use the
57245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding
57255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // protocol.
57265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::WriteToShardStatusFileIfNeeded();
57275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // True iff we are in a subprocess for running a thread-safe-style
57295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // death test.
57305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool in_subprocess_for_death_test = false;
57315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_DEATH_TEST
57335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);
57345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_DEATH_TEST
57355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,
57375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                        in_subprocess_for_death_test);
57385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Compares the full test names with the filter to decide which
57405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // tests to run.
57415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const bool has_tests_to_run = FilterTests(should_shard
57425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                              ? HONOR_SHARDING_PROTOCOL
57435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                              : IGNORE_SHARDING_PROTOCOL) > 0;
57445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Lists the tests and exits if the --gtest_list_tests flag was specified.
57465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (GTEST_FLAG(list_tests)) {
57475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // This must be called *after* FilterTests() has been called.
57485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ListTestsMatchingFilter();
57495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return true;
57505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
57515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  random_seed_ = GTEST_FLAG(shuffle) ?
57535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;
57545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // True iff at least one test has failed.
57565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool failed = false;
57575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestEventListener* repeater = listeners()->repeater();
57595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  start_timestamp_ = GetTimeInMillis();
57615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  repeater->OnTestProgramStart(*parent_);
57625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // How many times to repeat the tests?  We don't want to repeat them
57645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // when we are inside the subprocess of a death test.
57655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);
57665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Repeats forever if the repeat count is negative.
57675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const bool forever = repeat < 0;
57685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (int i = 0; forever || i != repeat; i++) {
57695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // We want to preserve failures generated by ad-hoc test
57705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // assertions executed before RUN_ALL_TESTS().
57715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ClearNonAdHocTestResult();
57725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const TimeInMillis start = GetTimeInMillis();
57745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Shuffles test cases and tests if requested.
57765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (has_tests_to_run && GTEST_FLAG(shuffle)) {
57775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      random()->Reseed(random_seed_);
57785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // This should be done before calling OnTestIterationStart(),
57795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // such that a test event listener can see the actual test order
57805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // in the event.
57815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ShuffleTests();
57825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
57835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Tells the unit test event listeners that the tests are about to start.
57855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    repeater->OnTestIterationStart(*parent_, i);
57865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Runs each test case if there is at least one test to run.
57885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (has_tests_to_run) {
57895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Sets up all environments beforehand.
57905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      repeater->OnEnvironmentsSetUpStart(*parent_);
57915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ForEach(environments_, SetUpEnvironment);
57925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      repeater->OnEnvironmentsSetUpEnd(*parent_);
57935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
57945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Runs the tests only if there was no fatal failure during global
57955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // set-up.
57965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (!Test::HasFatalFailure()) {
57975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        for (int test_index = 0; test_index < total_test_case_count();
57985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang             test_index++) {
57995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          GetMutableTestCase(test_index)->Run();
58005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        }
58015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
58025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
58035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Tears down all environments in reverse order afterwards.
58045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      repeater->OnEnvironmentsTearDownStart(*parent_);
58055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      std::for_each(environments_.rbegin(), environments_.rend(),
58065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    TearDownEnvironment);
58075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      repeater->OnEnvironmentsTearDownEnd(*parent_);
58085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
58095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
58105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    elapsed_time_ = GetTimeInMillis() - start;
58115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
58125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Tells the unit test event listener that the tests have just finished.
58135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    repeater->OnTestIterationEnd(*parent_, i);
58145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
58155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Gets the result and clears it.
58165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (!Passed()) {
58175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      failed = true;
58185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
58195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
58205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Restores the original test order after the iteration.  This
58215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // allows the user to quickly repro a failure that happens in the
58225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // N-th iteration without repeating the first (N - 1) iterations.
58235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in
58245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // case the user somehow changes the value of the flag somewhere
58255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // (it's always safe to unshuffle the tests).
58265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    UnshuffleTests();
58275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
58285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (GTEST_FLAG(shuffle)) {
58295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Picks a new random seed for each iteration.
58305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      random_seed_ = GetNextRandomSeed(random_seed_);
58315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
58325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
58335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
58345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  repeater->OnTestProgramEnd(*parent_);
58355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
58365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return !failed;
58375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
58385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
58395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
58405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// if the variable is present. If a file already exists at this location, this
58415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// function will write over it. If the variable is present, but the file cannot
58425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// be created, prints an error and exits.
58435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid WriteToShardStatusFileIfNeeded() {
58445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);
58455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (test_shard_file != NULL) {
58465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    FILE* const file = posix::FOpen(test_shard_file, "w");
58475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (file == NULL) {
58485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ColoredPrintf(COLOR_RED,
58495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    "Could not write to the test shard status file \"%s\" "
58505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    "specified by the %s environment variable.\n",
58515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    test_shard_file, kTestShardStatusFile);
58525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      fflush(stdout);
58535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      exit(EXIT_FAILURE);
58545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
58555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fclose(file);
58565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
58575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
58585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
58595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Checks whether sharding is enabled by examining the relevant
58605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// environment variable values. If the variables are present,
58615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// but inconsistent (i.e., shard_index >= total_shards), prints
58625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// an error and exits. If in_subprocess_for_death_test, sharding is
58635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// disabled because it must only be applied to the original test
58645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// process. Otherwise, we could filter out death tests we intended to execute.
58655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool ShouldShard(const char* total_shards_env,
58665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                 const char* shard_index_env,
58675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                 bool in_subprocess_for_death_test) {
58685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (in_subprocess_for_death_test) {
58695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return false;
58705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
58715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
58725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);
58735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);
58745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
58755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (total_shards == -1 && shard_index == -1) {
58765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return false;
58775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else if (total_shards == -1 && shard_index != -1) {
58785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Message msg = Message()
58795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "Invalid environment variables: you have "
58805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << kTestShardIndex << " = " << shard_index
58815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << ", but have left " << kTestTotalShards << " unset.\n";
58825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
58835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fflush(stdout);
58845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    exit(EXIT_FAILURE);
58855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else if (total_shards != -1 && shard_index == -1) {
58865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Message msg = Message()
58875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "Invalid environment variables: you have "
58885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << kTestTotalShards << " = " << total_shards
58895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << ", but have left " << kTestShardIndex << " unset.\n";
58905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
58915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fflush(stdout);
58925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    exit(EXIT_FAILURE);
58935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else if (shard_index < 0 || shard_index >= total_shards) {
58945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const Message msg = Message()
58955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "Invalid environment variables: we require 0 <= "
58965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << kTestShardIndex << " < " << kTestTotalShards
58975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << ", but you have " << kTestShardIndex << "=" << shard_index
58985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << ", " << kTestTotalShards << "=" << total_shards << ".\n";
58995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
59005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fflush(stdout);
59015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    exit(EXIT_FAILURE);
59025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
59035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
59045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return total_shards > 1;
59055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
59065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
59075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Parses the environment variable var as an Int32. If it is unset,
59085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// returns default_val. If it is not an Int32, prints an error
59095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and aborts.
59105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangInt32 Int32FromEnvOrDie(const char* var, Int32 default_val) {
59115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* str_val = posix::GetEnv(var);
59125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (str_val == NULL) {
59135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return default_val;
59145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
59155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
59165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Int32 result;
59175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!ParseInt32(Message() << "The value of environment variable " << var,
59185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  str_val, &result)) {
59195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    exit(EXIT_FAILURE);
59205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
59215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return result;
59225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
59235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
59245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Given the total number of shards, the shard index, and the test id,
59255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// returns true iff the test should be run on this shard. The test id is
59265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// some arbitrary but unique non-negative integer assigned to each test
59275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// method. Assumes that 0 <= shard_index < total_shards.
59285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
59295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return (test_id % total_shards) == shard_index;
59305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
59315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
59325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Compares the name of each test with the user-specified filter to
59335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// decide whether the test should be run, then records the result in
59345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// each TestCase and TestInfo object.
59355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// If shard_tests == true, further filters tests based on sharding
59365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// variables in the environment - see
59375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide.
59385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the number of tests that should run.
59395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
59405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
59415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      Int32FromEnvOrDie(kTestTotalShards, -1) : -1;
59425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
59435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      Int32FromEnvOrDie(kTestShardIndex, -1) : -1;
59445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
59455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // num_runnable_tests are the number of tests that will
59465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // run across all shards (i.e., match filter and are not disabled).
59475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // num_selected_tests are the number of tests to be run on
59485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // this shard.
59495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int num_runnable_tests = 0;
59505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int num_selected_tests = 0;
59515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (size_t i = 0; i < test_cases_.size(); i++) {
59525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    TestCase* const test_case = test_cases_[i];
59535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const std::string &test_case_name = test_case->name();
59545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    test_case->set_should_run(false);
59555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
59565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
59575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      TestInfo* const test_info = test_case->test_info_list()[j];
59585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const std::string test_name(test_info->name());
59595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // A test is disabled if test case name or test name matches
59605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // kDisableTestFilter.
59615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const bool is_disabled =
59625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          internal::UnitTestOptions::MatchesFilter(test_case_name,
59635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                   kDisableTestFilter) ||
59645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          internal::UnitTestOptions::MatchesFilter(test_name,
59655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                   kDisableTestFilter);
59665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      test_info->is_disabled_ = is_disabled;
59675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
59685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const bool matches_filter =
59695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          internal::UnitTestOptions::FilterMatchesTest(test_case_name,
59705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                       test_name);
59715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      test_info->matches_filter_ = matches_filter;
59725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
59735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const bool is_runnable =
59745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&
59755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          matches_filter;
59765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
59775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const bool is_selected = is_runnable &&
59785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          (shard_tests == IGNORE_SHARDING_PROTOCOL ||
59795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           ShouldRunTestOnShard(total_shards, shard_index,
59805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                num_runnable_tests));
59815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
59825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      num_runnable_tests += is_runnable;
59835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      num_selected_tests += is_selected;
59845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
59855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      test_info->should_run_ = is_selected;
59865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      test_case->set_should_run(test_case->should_run() || is_selected);
59875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
59885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
59895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return num_selected_tests;
59905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
59915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
59925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints the given C-string on a single line by replacing all '\n'
59935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// characters with string "\\n".  If the output takes more than
59945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// max_length characters, only prints the first max_length characters
59955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and "...".
59965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void PrintOnOneLine(const char* str, int max_length) {
59975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (str != NULL) {
59985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (int i = 0; *str != '\0'; ++str) {
59995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (i >= max_length) {
60005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        printf("...");
60015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        break;
60025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
60035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (*str == '\n') {
60045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        printf("\\n");
60055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        i += 2;
60065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      } else {
60075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        printf("%c", *str);
60085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ++i;
60095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
60105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
60115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
60125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
60135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
60145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints the names of the tests matching the user-specified filter flag.
60155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UnitTestImpl::ListTestsMatchingFilter() {
60165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Print at most this many characters for each type/value parameter.
60175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int kMaxParamLength = 250;
60185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
60195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (size_t i = 0; i < test_cases_.size(); i++) {
60205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const TestCase* const test_case = test_cases_[i];
60215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bool printed_test_case_name = false;
60225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
60235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
60245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const TestInfo* const test_info =
60255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          test_case->test_info_list()[j];
60265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (test_info->matches_filter_) {
60275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        if (!printed_test_case_name) {
60285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          printed_test_case_name = true;
60295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          printf("%s.", test_case->name());
60305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          if (test_case->type_param() != NULL) {
60315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            printf("  # %s = ", kTypeParamLabel);
60325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            // We print the type parameter on a single line to make
60335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            // the output easy to parse by a program.
60345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            PrintOnOneLine(test_case->type_param(), kMaxParamLength);
60355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          }
60365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          printf("\n");
60375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        }
60385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        printf("  %s", test_info->name());
60395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        if (test_info->value_param() != NULL) {
60405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          printf("  # %s = ", kValueParamLabel);
60415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          // We print the value parameter on a single line to make the
60425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          // output easy to parse by a program.
60435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          PrintOnOneLine(test_info->value_param(), kMaxParamLength);
60445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        }
60455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        printf("\n");
60465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
60475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
60485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
60495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fflush(stdout);
60505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
60515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
60525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Sets the OS stack trace getter.
60535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
60545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Does nothing if the input and the current OS stack trace getter are
60555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the same; otherwise, deletes the old getter and makes the input the
60565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// current getter.
60575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UnitTestImpl::set_os_stack_trace_getter(
60585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    OsStackTraceGetterInterface* getter) {
60595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (os_stack_trace_getter_ != getter) {
60605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    delete os_stack_trace_getter_;
60615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    os_stack_trace_getter_ = getter;
60625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
60635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
60645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
60655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the current OS stack trace getter if it is not NULL;
60665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// otherwise, creates an OsStackTraceGetter, makes it the current
60675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// getter, and returns it.
60685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangOsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
60695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (os_stack_trace_getter_ == NULL) {
60705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    os_stack_trace_getter_ = new OsStackTraceGetter;
60715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
60725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
60735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return os_stack_trace_getter_;
60745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
60755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
60765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the TestResult for the test that's currently running, or
60775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the TestResult for the ad hoc test if no test is running.
60785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangTestResult* UnitTestImpl::current_test_result() {
60795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return current_test_info_ ?
60805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      &(current_test_info_->result_) : &ad_hoc_test_result_;
60815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
60825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
60835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Shuffles all test cases, and the tests within each test case,
60845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// making sure that death tests are still run first.
60855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UnitTestImpl::ShuffleTests() {
60865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Shuffles the death test cases.
60875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);
60885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
60895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Shuffles the non-death test cases.
60905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ShuffleRange(random(), last_death_test_case_ + 1,
60915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang               static_cast<int>(test_cases_.size()), &test_case_indices_);
60925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
60935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Shuffles the tests inside each test case.
60945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (size_t i = 0; i < test_cases_.size(); i++) {
60955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    test_cases_[i]->ShuffleTests(random());
60965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
60975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
60985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
60995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Restores the test cases and tests to their order before the first shuffle.
61005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UnitTestImpl::UnshuffleTests() {
61015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (size_t i = 0; i < test_cases_.size(); i++) {
61025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Unshuffles the tests in each test case.
61035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    test_cases_[i]->UnshuffleTests();
61045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Resets the index of each test case.
61055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    test_case_indices_[i] = static_cast<int>(i);
61065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
61075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
61085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
61095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the current OS stack trace as an std::string.
61105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
61115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The maximum number of stack frames to be included is specified by
61125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the gtest_stack_trace_depth flag.  The skip_count parameter
61135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// specifies the number of top frames to be skipped, which doesn't
61145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// count against the number of frames to be included.
61155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
61165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// For example, if Foo() calls Bar(), which in turn calls
61175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
61185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
61195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
61205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                            int skip_count) {
61215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We pass skip_count + 1 to skip this wrapper function in addition
61225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // to what the user really wants to skip.
61235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);
61245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
61255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
61265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to
61275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// suppress unreachable code warnings.
61285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace {
61295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ClassUniqueToAlwaysTrue {};
61305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
61315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
61325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool IsTrue(bool condition) { return condition; }
61335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
61345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool AlwaysTrue() {
61355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_EXCEPTIONS
61365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This condition is always false so AlwaysTrue() never actually throws,
61375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // but it makes the compiler think that it may throw.
61385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (IsTrue(false))
61395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    throw ClassUniqueToAlwaysTrue();
61405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_EXCEPTIONS
61415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return true;
61425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
61435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
61445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// If *pstr starts with the given prefix, modifies *pstr to be right
61455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// past the prefix and returns true; otherwise leaves *pstr unchanged
61465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and returns false.  None of pstr, *pstr, and prefix can be NULL.
61475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool SkipPrefix(const char* prefix, const char** pstr) {
61485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const size_t prefix_len = strlen(prefix);
61495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (strncmp(*pstr, prefix, prefix_len) == 0) {
61505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *pstr += prefix_len;
61515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return true;
61525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
61535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return false;
61545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
61555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
61565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Parses a string as a command line flag.  The string should have
61575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the format "--flag=value".  When def_optional is true, the "=value"
61585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// part can be omitted.
61595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
61605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the value of the flag, or NULL if the parsing failed.
61615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char* ParseFlagValue(const char* str,
61625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                           const char* flag,
61635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                           bool def_optional) {
61645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // str and flag must not be NULL.
61655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (str == NULL || flag == NULL) return NULL;
61665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
61675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The flag must start with "--" followed by GTEST_FLAG_PREFIX_.
61685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag;
61695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const size_t flag_len = flag_str.length();
61705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;
61715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
61725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Skips the flag name.
61735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* flag_end = str + flag_len;
61745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
61755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // When def_optional is true, it's OK to not have a "=value" part.
61765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (def_optional && (flag_end[0] == '\0')) {
61775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return flag_end;
61785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
61795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
61805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // If def_optional is true and there are more characters after the
61815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // flag name, or if def_optional is false, there must be a '=' after
61825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the flag name.
61835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (flag_end[0] != '=') return NULL;
61845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
61855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the string after "=".
61865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return flag_end + 1;
61875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
61885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
61895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Parses a string for a bool flag, in the form of either
61905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "--flag=value" or "--flag".
61915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
61925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// In the former case, the value is taken as true as long as it does
61935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// not start with '0', 'f', or 'F'.
61945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
61955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// In the latter case, the value is taken as true.
61965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
61975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// On success, stores the value of the flag in *value, and returns
61985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// true.  On failure, returns false without changing *value.
61995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool ParseBoolFlag(const char* str, const char* flag, bool* value) {
62005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the value of the flag as a string.
62015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const value_str = ParseFlagValue(str, flag, true);
62025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
62035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Aborts if the parsing failed.
62045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (value_str == NULL) return false;
62055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
62065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Converts the string value to a bool.
62075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');
62085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return true;
62095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
62105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
62115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Parses a string for an Int32 flag, in the form of
62125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "--flag=value".
62135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
62145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// On success, stores the value of the flag in *value, and returns
62155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// true.  On failure, returns false without changing *value.
62165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
62175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the value of the flag as a string.
62185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const value_str = ParseFlagValue(str, flag, false);
62195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
62205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Aborts if the parsing failed.
62215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (value_str == NULL) return false;
62225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
62235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Sets *value to the value of the flag.
62245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ParseInt32(Message() << "The value of flag --" << flag,
62255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                    value_str, value);
62265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
62275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
62285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Parses a string for a string flag, in the form of
62295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "--flag=value".
62305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
62315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// On success, stores the value of the flag in *value, and returns
62325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// true.  On failure, returns false without changing *value.
62335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool ParseStringFlag(const char* str, const char* flag, std::string* value) {
62345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Gets the value of the flag as a string.
62355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const value_str = ParseFlagValue(str, flag, false);
62365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
62375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Aborts if the parsing failed.
62385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (value_str == NULL) return false;
62395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
62405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Sets *value to the value of the flag.
62415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *value = value_str;
62425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return true;
62435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
62445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
62455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Determines whether a string has a prefix that Google Test uses for its
62465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.
62475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// If Google Test detects that a command line flag has its prefix but is not
62485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// recognized, it will print its help message. Flags starting with
62495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test
62505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// internal flags and do not trigger the help message.
62515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic bool HasGoogleTestFlagPrefix(const char* str) {
62525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return (SkipPrefix("--", &str) ||
62535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          SkipPrefix("-", &str) ||
62545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          SkipPrefix("/", &str)) &&
62555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) &&
62565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||
62575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));
62585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
62595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
62605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a string containing code-encoded text.  The following escape
62615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// sequences can be used in the string to control the text color:
62625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
62635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   @@    prints a single '@' character.
62645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   @R    changes the color to red.
62655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   @G    changes the color to green.
62665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   @Y    changes the color to yellow.
62675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   @D    changes to the default terminal text color.
62685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
62695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TODO(wan@google.com): Write tests for this once we add stdout
62705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// capturing to Google Test.
62715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void PrintColorEncoded(const char* str) {
62725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTestColor color = COLOR_DEFAULT;  // The current color.
62735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
62745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Conceptually, we split the string into segments divided by escape
62755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // sequences.  Then we print one segment at a time.  At the end of
62765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // each iteration, the str pointer advances to the beginning of the
62775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // next segment.
62785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (;;) {
62795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* p = strchr(str, '@');
62805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (p == NULL) {
62815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ColoredPrintf(color, "%s", str);
62825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return;
62835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
62845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
62855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ColoredPrintf(color, "%s", std::string(str, p).c_str());
62865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
62875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char ch = p[1];
62885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    str = p + 2;
62895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (ch == '@') {
62905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ColoredPrintf(color, "@");
62915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else if (ch == 'D') {
62925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      color = COLOR_DEFAULT;
62935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else if (ch == 'R') {
62945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      color = COLOR_RED;
62955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else if (ch == 'G') {
62965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      color = COLOR_GREEN;
62975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else if (ch == 'Y') {
62985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      color = COLOR_YELLOW;
62995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
63005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      --str;
63015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
63025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
63035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
63045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
63055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char kColorEncodedHelpMessage[] =
63065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"This program contains tests written using " GTEST_NAME_ ". You can use the\n"
63075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"following command line flags to control its behavior:\n"
63085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"\n"
63095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"Test Selection:\n"
63105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"  @G--" GTEST_FLAG_PREFIX_ "list_tests@D\n"
63115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      List the names of all tests instead of running them. The name of\n"
63125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      TEST(Foo, Bar) is \"Foo.Bar\".\n"
63135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"  @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS"
63145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "[@G-@YNEGATIVE_PATTERNS]@D\n"
63155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      Run only the tests whose name matches one of the positive patterns but\n"
63165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      none of the negative patterns. '?' matches any single character; '*'\n"
63175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      matches any substring; ':' separates two patterns.\n"
63185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"  @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests@D\n"
63195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      Run all disabled tests too.\n"
63205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"\n"
63215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"Test Execution:\n"
63225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"  @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n"
63235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      Run the tests repeatedly; use a negative count to repeat forever.\n"
63245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"  @G--" GTEST_FLAG_PREFIX_ "shuffle@D\n"
63255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      Randomize tests' orders on every iteration.\n"
63265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"  @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n"
63275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      Random number seed to use for shuffling test orders (between 1 and\n"
63285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      99999, or 0 to use a seed based on the current time).\n"
63295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"\n"
63305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"Test Output:\n"
63315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"  @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\n"
63325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      Enable/disable colored output. The default is @Gauto@D.\n"
63335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"  -@G-" GTEST_FLAG_PREFIX_ "print_time=0@D\n"
63345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      Don't print the elapsed time of each test.\n"
63355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"  @G--" GTEST_FLAG_PREFIX_ "output=xml@Y[@G:@YDIRECTORY_PATH@G"
63365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n"
63375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      Generate an XML report in the given directory or with the given file\n"
63385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      name. @YFILE_PATH@D defaults to @Gtest_details.xml@D.\n"
63395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_CAN_STREAM_RESULTS_
63405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"  @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST@G:@YPORT@D\n"
63415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      Stream test results to the given server.\n"
63425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_CAN_STREAM_RESULTS_
63435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"\n"
63445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"Assertion Behavior:\n"
63455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
63465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"  @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\n"
63475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      Set the default death test style.\n"
63485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
63495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"  @G--" GTEST_FLAG_PREFIX_ "break_on_failure@D\n"
63505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      Turn assertion failures into debugger break-points.\n"
63515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"  @G--" GTEST_FLAG_PREFIX_ "throw_on_failure@D\n"
63525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      Turn assertion failures into C++ exceptions.\n"
63535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"  @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0@D\n"
63545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      Do not report exceptions as test failures. Instead, allow them\n"
63555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"      to crash the program or throw a pop-up (on Windows).\n"
63565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"\n"
63575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests@D, you can alternatively set "
63585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "the corresponding\n"
63595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"environment variable of a flag (all letters in upper-case). For example, to\n"
63605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_
63615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "color=no@D or set\n"
63625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR@D environment variable to @Gno@D.\n"
63635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"\n"
63645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"For more information, please read the " GTEST_NAME_ " documentation at\n"
63655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n"
63665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"(not one in your own code or tests), please report it to\n"
63675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang"@G<" GTEST_DEV_EMAIL_ ">@D.\n";
63685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
63695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Parses the command line for Google Test flags, without initializing
63705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// other parts of Google Test.  The type parameter CharType can be
63715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// instantiated to either char or wchar_t.
63725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename CharType>
63735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
63745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (int i = 1; i < *argc; i++) {
63755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const std::string arg_string = StreamableToString(argv[i]);
63765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* const arg = arg_string.c_str();
63775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
63785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    using internal::ParseBoolFlag;
63795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    using internal::ParseInt32Flag;
63805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    using internal::ParseStringFlag;
63815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
63825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Do we see a Google Test flag?
63835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,
63845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      &GTEST_FLAG(also_run_disabled_tests)) ||
63855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ParseBoolFlag(arg, kBreakOnFailureFlag,
63865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      &GTEST_FLAG(break_on_failure)) ||
63875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ParseBoolFlag(arg, kCatchExceptionsFlag,
63885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      &GTEST_FLAG(catch_exceptions)) ||
63895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ParseStringFlag(arg, kColorFlag, &GTEST_FLAG(color)) ||
63905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ParseStringFlag(arg, kDeathTestStyleFlag,
63915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        &GTEST_FLAG(death_test_style)) ||
63925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ParseBoolFlag(arg, kDeathTestUseFork,
63935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      &GTEST_FLAG(death_test_use_fork)) ||
63945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ParseStringFlag(arg, kFilterFlag, &GTEST_FLAG(filter)) ||
63955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ParseStringFlag(arg, kInternalRunDeathTestFlag,
63965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        &GTEST_FLAG(internal_run_death_test)) ||
63975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ParseBoolFlag(arg, kListTestsFlag, &GTEST_FLAG(list_tests)) ||
63985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ParseStringFlag(arg, kOutputFlag, &GTEST_FLAG(output)) ||
63995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ParseBoolFlag(arg, kPrintTimeFlag, &GTEST_FLAG(print_time)) ||
64005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ParseInt32Flag(arg, kRandomSeedFlag, &GTEST_FLAG(random_seed)) ||
64015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ParseInt32Flag(arg, kRepeatFlag, &GTEST_FLAG(repeat)) ||
64025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ParseBoolFlag(arg, kShuffleFlag, &GTEST_FLAG(shuffle)) ||
64035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ParseInt32Flag(arg, kStackTraceDepthFlag,
64045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                       &GTEST_FLAG(stack_trace_depth)) ||
64055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ParseStringFlag(arg, kStreamResultToFlag,
64065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        &GTEST_FLAG(stream_result_to)) ||
64075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ParseBoolFlag(arg, kThrowOnFailureFlag,
64085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      &GTEST_FLAG(throw_on_failure))
64095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ) {
64105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Yes.  Shift the remainder of the argv list left by one.  Note
64115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // that argv has (*argc + 1) elements, the last one always being
64125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // NULL.  The following loop moves the trailing NULL element as
64135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // well.
64145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      for (int j = i; j != *argc; j++) {
64155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        argv[j] = argv[j + 1];
64165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
64175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
64185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Decrements the argument count.
64195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      (*argc)--;
64205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
64215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We also need to decrement the iterator as we just removed
64225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // an element.
64235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      i--;
64245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else if (arg_string == "--help" || arg_string == "-h" ||
64255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang               arg_string == "-?" || arg_string == "/?" ||
64265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang               HasGoogleTestFlagPrefix(arg)) {
64275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Both help flag and unrecognized Google Test flags (excluding
64285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // internal ones) trigger help display.
64295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      g_help_flag = true;
64305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
64315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
64325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
64335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (g_help_flag) {
64345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // We print the help here instead of in RUN_ALL_TESTS(), as the
64355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // latter may not be called at all if the user is using Google
64365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Test with another testing framework.
64375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    PrintColorEncoded(kColorEncodedHelpMessage);
64385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
64395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
64405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
64415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Parses the command line for Google Test flags, without initializing
64425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// other parts of Google Test.
64435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid ParseGoogleTestFlagsOnly(int* argc, char** argv) {
64445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ParseGoogleTestFlagsOnlyImpl(argc, argv);
64455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
64465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
64475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ParseGoogleTestFlagsOnlyImpl(argc, argv);
64485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
64495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
64505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The internal implementation of InitGoogleTest().
64515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
64525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The type parameter CharType can be instantiated to either char or
64535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// wchar_t.
64545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename CharType>
64555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid InitGoogleTestImpl(int* argc, CharType** argv) {
64565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  g_init_gtest_count++;
64575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
64585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We don't want to run the initialization code twice.
64595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (g_init_gtest_count != 1) return;
64605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
64615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (*argc <= 0) return;
64625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
64635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::g_executable_path = internal::StreamableToString(argv[0]);
64645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
64655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_DEATH_TEST
64665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
64675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  g_argvs.clear();
64685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (int i = 0; i != *argc; i++) {
64695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    g_argvs.push_back(StreamableToString(argv[i]));
64705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
64715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
64725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_DEATH_TEST
64735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
64745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ParseGoogleTestFlagsOnly(argc, argv);
64755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GetUnitTestImpl()->PostFlagParsingInit();
64765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
64775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
64785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
64795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
64805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Initializes Google Test.  This must be called before calling
64815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// RUN_ALL_TESTS().  In particular, it parses a command line for the
64825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// flags that Google Test recognizes.  Whenever a Google Test flag is
64835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// seen, it is removed from argv, and *argc is decremented.
64845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
64855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// No value is returned.  Instead, the Google Test flag variables are
64865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// updated.
64875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
64885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Calling the function for the second time has no user-visible effect.
64895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid InitGoogleTest(int* argc, char** argv) {
64905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::InitGoogleTestImpl(argc, argv);
64915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
64925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
64935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This overloaded version can be used in Windows programs compiled in
64945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// UNICODE mode.
64955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid InitGoogleTest(int* argc, wchar_t** argv) {
64965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  internal::InitGoogleTestImpl(argc, argv);
64975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
64985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
64995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
65005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2005, Google Inc.
65015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
65025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
65035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
65045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
65055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
65065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
65075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
65085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
65095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
65105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
65115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
65125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
65135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
65145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
65155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
65165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
65175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
65185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
65195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
65205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
65215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
65225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
65235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
65245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
65255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
65265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
65275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
65285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
65295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: wan@google.com (Zhanyong Wan), vladl@google.com (Vlad Losev)
65305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
65315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This file implements death tests.
65325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
65335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
65345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_DEATH_TEST
65355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
65365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_MAC
65375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  include <crt_externs.h>
65385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_OS_MAC
65395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
65405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <errno.h>
65415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <fcntl.h>
65425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <limits.h>
65435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
65445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_LINUX
65455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  include <signal.h>
65465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_OS_LINUX
65475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
65485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <stdarg.h>
65495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
65505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_WINDOWS
65515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  include <windows.h>
65525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
65535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  include <sys/mman.h>
65545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  include <sys/wait.h>
65555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_OS_WINDOWS
65565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
65575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_QNX
65585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  include <spawn.h>
65595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_OS_QNX
65605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
65615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_DEATH_TEST
65625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
65635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
65645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Indicates that this translation unit is part of Google Test's
65655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// implementation.  It must come before gtest-internal-inl.h is
65665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// included, or there will be a compiler error.  This trick is to
65675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// prevent a user from accidentally including gtest-internal-inl.h in
65685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// his code.
65695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_IMPLEMENTATION_ 1
65705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_IMPLEMENTATION_
65715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
65725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
65735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
65745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Constants.
65755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
65765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The default death test style.
65775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char kDefaultDeathTestStyle[] = "fast";
65785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
65795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DEFINE_string_(
65805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    death_test_style,
65815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
65825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "Indicates how to run a death test in a forked child process: "
65835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "\"threadsafe\" (child process re-executes the test binary "
65845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "from the beginning, running only the specific death test) or "
65855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "\"fast\" (child process runs the death test immediately "
65865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "after forking).");
65875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
65885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DEFINE_bool_(
65895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    death_test_use_fork,
65905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::BoolFromGTestEnv("death_test_use_fork", false),
65915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "Instructs to use fork()/_exit() instead of clone() in death tests. "
65925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "Ignored and always uses fork() on POSIX systems where clone() is not "
65935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "implemented. Useful when running under valgrind or similar tools if "
65945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "those do not support clone(). Valgrind 3.3.1 will just fail if "
65955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "it sees an unsupported combination of clone() flags. "
65965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "It is not recommended to use this flag w/o valgrind though it will "
65975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "work in 99% of the cases. Once valgrind is fixed, this flag will "
65985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "most likely be removed.");
65995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
66015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_DEFINE_string_(
66025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal_run_death_test, "",
66035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "Indicates the file, line number, temporal index of "
66045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "the single death test to run, and a file descriptor to "
66055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "which a success code may be sent, all separated by "
66065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "the '|' characters.  This flag is specified if and only if the current "
66075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "process is a sub-process launched for running a thread-safe "
66085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    "death test.  FOR INTERNAL USE ONLY.");
66095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
66105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_DEATH_TEST
66125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
66145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Valid only for fast death tests. Indicates the code is running in the
66165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// child process of a fast style death test.
66175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic bool g_in_fast_death_test_child = false;
66185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns a Boolean value indicating whether the caller is currently
66205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// executing in the context of the death test child process.  Tools such as
66215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Valgrind heap checkers may need this to modify their behavior in death
66225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// tests.  IMPORTANT: This is an internal utility.  Using it may break the
66235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// implementation of death tests.  User code MUST NOT use it.
66245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool InDeathTestChild() {
66255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_WINDOWS
66265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // On Windows, death tests are thread-safe regardless of the value of the
66285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // death_test_style flag.
66295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return !GTEST_FLAG(internal_run_death_test).empty();
66305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
66325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (GTEST_FLAG(death_test_style) == "threadsafe")
66345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return !GTEST_FLAG(internal_run_death_test).empty();
66355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  else
66365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return g_in_fast_death_test_child;
66375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
66385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
66395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
66415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ExitedWithCode constructor.
66435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
66445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
66455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ExitedWithCode function-call operator.
66475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool ExitedWithCode::operator()(int exit_status) const {
66485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_WINDOWS
66495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return exit_status == exit_code_;
66515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
66535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
66555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_OS_WINDOWS
66575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
66585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if !GTEST_OS_WINDOWS
66605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// KilledBySignal constructor.
66615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangKilledBySignal::KilledBySignal(int signum) : signum_(signum) {
66625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
66635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// KilledBySignal function-call operator.
66655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool KilledBySignal::operator()(int exit_status) const {
66665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
66675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
66685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // !GTEST_OS_WINDOWS
66695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
66715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Utilities needed for death tests.
66735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Generates a textual description of a given exit code, in the format
66755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// specified by wait(2).
66765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic std::string ExitSummary(int exit_code) {
66775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message m;
66785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_WINDOWS
66805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  m << "Exited with exit status " << exit_code;
66825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
66845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (WIFEXITED(exit_code)) {
66865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    m << "Exited with exit status " << WEXITSTATUS(exit_code);
66875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else if (WIFSIGNALED(exit_code)) {
66885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    m << "Terminated by signal " << WTERMSIG(exit_code);
66895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
66905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  ifdef WCOREDUMP
66915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (WCOREDUMP(exit_code)) {
66925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    m << " (core dumped)";
66935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
66945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  endif
66955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_OS_WINDOWS
66965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
66975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return m.GetString();
66985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
66995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
67005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true if exit_status describes a process that was terminated
67015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// by a signal, or exited normally with a nonzero exit code.
67025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool ExitedUnsuccessfully(int exit_status) {
67035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return !ExitedWithCode(0)(exit_status);
67045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
67055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
67065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if !GTEST_OS_WINDOWS
67075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Generates a textual failure message when a death test finds more than
67085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// one thread running, or cannot determine the number of threads, prior
67095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to executing the given statement.  It is the responsibility of the
67105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// caller not to pass a thread_count of 1.
67115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic std::string DeathTestThreadWarning(size_t thread_count) {
67125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message msg;
67135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  msg << "Death tests use fork(), which is unsafe particularly"
67145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
67155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (thread_count == 0)
67165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    msg << "couldn't detect the number of threads.";
67175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  else
67185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    msg << "detected " << thread_count << " threads.";
67195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return msg.GetString();
67205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
67215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // !GTEST_OS_WINDOWS
67225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
67235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Flag characters for reporting a death test that did not die.
67245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char kDeathTestLived = 'L';
67255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char kDeathTestReturned = 'R';
67265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char kDeathTestThrew = 'T';
67275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char kDeathTestInternalError = 'I';
67285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
67295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// An enumeration describing all of the possible ways that a death test can
67305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// conclude.  DIED means that the process died while executing the test
67315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// code; LIVED means that process lived beyond the end of the test code;
67325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// RETURNED means that the test statement attempted to execute a return
67335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// statement, which is not allowed; THREW means that the test statement
67345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// returned control by throwing an exception.  IN_PROGRESS means the test
67355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// has not yet concluded.
67365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TODO(vladl@google.com): Unify names and possibly values for
67375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// AbortReason, DeathTestOutcome, and flag characters above.
67385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangenum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
67395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
67405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Routine for aborting the program which is safe to call from an
67415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// exec-style death test child process, in which case the error
67425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// message is propagated back to the parent process.  Otherwise, the
67435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// message is simply printed to stderr.  In either case, the program
67445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// then exits with status 1.
67455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid DeathTestAbort(const std::string& message) {
67465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // On a POSIX system, this function may be called from a threadsafe-style
67475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // death test child process, which operates on a very small stack.  Use
67485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the heap for any additional non-minuscule memory requirements.
67495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const InternalRunDeathTestFlag* const flag =
67505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GetUnitTestImpl()->internal_run_death_test_flag();
67515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (flag != NULL) {
67525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    FILE* parent = posix::FDOpen(flag->write_fd(), "w");
67535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fputc(kDeathTestInternalError, parent);
67545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fprintf(parent, "%s", message.c_str());
67555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fflush(parent);
67565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    _exit(1);
67575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
67585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fprintf(stderr, "%s", message.c_str());
67595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fflush(stderr);
67605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    posix::Abort();
67615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
67625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
67635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
67645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A replacement for CHECK that calls DeathTestAbort if the assertion
67655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// fails.
67665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_DEATH_TEST_CHECK_(expression) \
67675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  do { \
67685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (!::testing::internal::IsTrue(expression)) { \
67695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      DeathTestAbort( \
67705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          ::std::string("CHECK failed: File ") + __FILE__ +  ", line " \
67715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          + ::testing::internal::StreamableToString(__LINE__) + ": " \
67725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          + #expression); \
67735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } \
67745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } while (::testing::internal::AlwaysFalse())
67755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
67765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for
67775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// evaluating any system call that fulfills two conditions: it must return
67785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// -1 on failure, and set errno to EINTR when it is interrupted and
67795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// should be tried again.  The macro expands to a loop that repeatedly
67805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// evaluates the expression as long as it evaluates to -1 and sets
67815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// errno to EINTR.  If the expression evaluates to -1 but errno is
67825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// something other than EINTR, DeathTestAbort is called.
67835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
67845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  do { \
67855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int gtest_retval; \
67865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    do { \
67875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      gtest_retval = (expression); \
67885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } while (gtest_retval == -1 && errno == EINTR); \
67895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (gtest_retval == -1) { \
67905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      DeathTestAbort( \
67915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          ::std::string("CHECK failed: File ") + __FILE__ + ", line " \
67925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          + ::testing::internal::StreamableToString(__LINE__) + ": " \
67935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          + #expression + " != -1"); \
67945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } \
67955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } while (::testing::internal::AlwaysFalse())
67965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
67975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the message describing the last system error in errno.
67985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string GetLastErrnoDescription() {
67995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return errno == 0 ? "" : posix::StrError(errno);
68005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
68015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
68025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This is called from a death test parent process to read a failure
68035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// message from the death test child process and log it with the FATAL
68045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// severity. On Windows, the message is read from a pipe handle. On other
68055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// platforms, it is read from a file descriptor.
68065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void FailFromInternalError(int fd) {
68075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message error;
68085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char buffer[256];
68095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int num_read;
68105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
68115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  do {
68125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    while ((num_read = posix::Read(fd, buffer, 255)) > 0) {
68135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      buffer[num_read] = '\0';
68145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      error << buffer;
68155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
68165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } while (num_read == -1 && errno == EINTR);
68175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
68185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (num_read == 0) {
68195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_LOG_(FATAL) << error.GetString();
68205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
68215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int last_error = errno;
68225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_LOG_(FATAL) << "Error while reading death test internal: "
68235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      << GetLastErrnoDescription() << " [" << last_error << "]";
68245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
68255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
68265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
68275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Death test constructor.  Increments the running death test count
68285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// for the current test.
68295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangDeathTest::DeathTest() {
68305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TestInfo* const info = GetUnitTestImpl()->current_test_info();
68315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (info == NULL) {
68325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    DeathTestAbort("Cannot run a death test outside of a TEST or "
68335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   "TEST_F construct");
68345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
68355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
68365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
68375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Creates and returns a death test by dispatching to the current
68385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// death test factory.
68395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool DeathTest::Create(const char* statement, const RE* regex,
68405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                       const char* file, int line, DeathTest** test) {
68415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return GetUnitTestImpl()->death_test_factory()->Create(
68425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      statement, regex, file, line, test);
68435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
68445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
68455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char* DeathTest::LastMessage() {
68465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return last_death_test_message_.c_str();
68475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
68485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
68495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid DeathTest::set_last_death_test_message(const std::string& message) {
68505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  last_death_test_message_ = message;
68515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
68525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
68535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string DeathTest::last_death_test_message_;
68545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
68555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Provides cross platform implementation for some death functionality.
68565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass DeathTestImpl : public DeathTest {
68575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang protected:
68585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  DeathTestImpl(const char* a_statement, const RE* a_regex)
68595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : statement_(a_statement),
68605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        regex_(a_regex),
68615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        spawned_(false),
68625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        status_(-1),
68635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        outcome_(IN_PROGRESS),
68645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        read_fd_(-1),
68655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        write_fd_(-1) {}
68665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
68675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // read_fd_ is expected to be closed and cleared by a derived class.
68685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
68695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
68705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void Abort(AbortReason reason);
68715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual bool Passed(bool status_ok);
68725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
68735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* statement() const { return statement_; }
68745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const RE* regex() const { return regex_; }
68755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool spawned() const { return spawned_; }
68765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
68775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int status() const { return status_; }
68785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void set_status(int a_status) { status_ = a_status; }
68795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  DeathTestOutcome outcome() const { return outcome_; }
68805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
68815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int read_fd() const { return read_fd_; }
68825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void set_read_fd(int fd) { read_fd_ = fd; }
68835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int write_fd() const { return write_fd_; }
68845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void set_write_fd(int fd) { write_fd_ = fd; }
68855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
68865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Called in the parent process only. Reads the result code of the death
68875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // test child process via a pipe, interprets it to set the outcome_
68885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // member, and closes read_fd_.  Outputs diagnostics and terminates in
68895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // case of unexpected codes.
68905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void ReadAndInterpretStatusByte();
68915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
68925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
68935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The textual content of the code this object is testing.  This class
68945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // doesn't own this string and should not attempt to delete it.
68955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const statement_;
68965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The regular expression which test output must match.  DeathTestImpl
68975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // doesn't own this object and should not attempt to delete it.
68985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const RE* const regex_;
68995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // True if the death test child process has been successfully spawned.
69005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool spawned_;
69015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The exit status of the child process.
69025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int status_;
69035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // How the death test concluded.
69045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  DeathTestOutcome outcome_;
69055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Descriptor to the read end of the pipe to the child process.  It is
69065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // always -1 in the child process.  The child keeps its write end of the
69075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // pipe in write_fd_.
69085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int read_fd_;
69095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Descriptor to the child's write end of the pipe to the parent process.
69105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // It is always -1 in the parent process.  The parent keeps its end of the
69115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // pipe in read_fd_.
69125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int write_fd_;
69135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
69145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
69155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Called in the parent process only. Reads the result code of the death
69165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// test child process via a pipe, interprets it to set the outcome_
69175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// member, and closes read_fd_.  Outputs diagnostics and terminates in
69185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// case of unexpected codes.
69195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid DeathTestImpl::ReadAndInterpretStatusByte() {
69205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char flag;
69215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int bytes_read;
69225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
69235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The read() here blocks until data is available (signifying the
69245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // failure of the death test) or until the pipe is closed (signifying
69255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // its success), so it's okay to call this in the parent before
69265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the child process has exited.
69275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  do {
69285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bytes_read = posix::Read(read_fd(), &flag, 1);
69295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } while (bytes_read == -1 && errno == EINTR);
69305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
69315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (bytes_read == 0) {
69325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    set_outcome(DIED);
69335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else if (bytes_read == 1) {
69345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    switch (flag) {
69355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case kDeathTestReturned:
69365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        set_outcome(RETURNED);
69375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        break;
69385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case kDeathTestThrew:
69395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        set_outcome(THREW);
69405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        break;
69415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case kDeathTestLived:
69425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        set_outcome(LIVED);
69435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        break;
69445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case kDeathTestInternalError:
69455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        FailFromInternalError(read_fd());  // Does not return.
69465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        break;
69475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      default:
69485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        GTEST_LOG_(FATAL) << "Death test child process reported "
69495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                          << "unexpected status byte ("
69505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                          << static_cast<unsigned int>(flag) << ")";
69515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
69525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
69535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_LOG_(FATAL) << "Read from death test child process failed: "
69545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      << GetLastErrnoDescription();
69555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
69565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));
69575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  set_read_fd(-1);
69585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
69595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
69605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Signals that the death test code which should have exited, didn't.
69615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Should be called only in a death test child process.
69625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Writes a status byte to the child's status file descriptor, then
69635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// calls _exit(1).
69645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid DeathTestImpl::Abort(AbortReason reason) {
69655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The parent process considers the death test to be a failure if
69665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // it finds any data in our pipe.  So, here we write a single flag byte
69675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // to the pipe, then exit.
69685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char status_ch =
69695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      reason == TEST_DID_NOT_DIE ? kDeathTestLived :
69705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;
69715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
69725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));
69735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We are leaking the descriptor here because on some platforms (i.e.,
69745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // when built as Windows DLL), destructors of global objects will still
69755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // run after calling _exit(). On such systems, write_fd_ will be
69765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // indirectly closed from the destructor of UnitTestImpl, causing double
69775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // close if it is also closed here. On debug configurations, double close
69785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // may assert. As there are no in-process buffers to flush here, we are
69795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // relying on the OS to close the descriptor after the process terminates
69805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // when the destructors are not run.
69815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  _exit(1);  // Exits w/o any normal exit hooks (we were supposed to crash)
69825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
69835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
69845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns an indented copy of stderr output for a death test.
69855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This makes distinguishing death test output lines from regular log lines
69865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// much easier.
69875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic ::std::string FormatDeathTestOutput(const ::std::string& output) {
69885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::std::string ret;
69895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (size_t at = 0; ; ) {
69905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const size_t line_end = output.find('\n', at);
69915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ret += "[  DEATH   ] ";
69925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (line_end == ::std::string::npos) {
69935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ret += output.substr(at);
69945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
69955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
69965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ret += output.substr(at, line_end + 1 - at);
69975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    at = line_end + 1;
69985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
69995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ret;
70005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
70015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Assesses the success or failure of a death test, using both private
70035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// members which have previously been set, and one argument:
70045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
70055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Private data members:
70065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   outcome:  An enumeration describing how the death test
70075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//             concluded: DIED, LIVED, THREW, or RETURNED.  The death test
70085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//             fails in the latter three cases.
70095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   status:   The exit status of the child process. On *nix, it is in the
70105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//             in the format specified by wait(2). On Windows, this is the
70115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//             value supplied to the ExitProcess() API or a numeric code
70125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//             of the exception that terminated the program.
70135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   regex:    A regular expression object to be applied to
70145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//             the test's captured standard error output; the death test
70155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//             fails if it does not match.
70165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
70175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Argument:
70185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   status_ok: true if exit_status is acceptable in the context of
70195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//              this particular death test, which fails if it is false
70205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
70215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff all of the above conditions are met.  Otherwise, the
70225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// first failing condition, in the order given above, is the one that is
70235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// reported. Also sets the last death test message string.
70245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool DeathTestImpl::Passed(bool status_ok) {
70255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!spawned())
70265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return false;
70275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string error_message = GetCapturedStderr();
70295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool success = false;
70315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message buffer;
70325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  buffer << "Death test: " << statement() << "\n";
70345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  switch (outcome()) {
70355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case LIVED:
70365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      buffer << "    Result: failed to die.\n"
70375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang             << " Error msg:\n" << FormatDeathTestOutput(error_message);
70385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
70395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case THREW:
70405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      buffer << "    Result: threw an exception.\n"
70415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang             << " Error msg:\n" << FormatDeathTestOutput(error_message);
70425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
70435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case RETURNED:
70445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      buffer << "    Result: illegal return in test statement.\n"
70455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang             << " Error msg:\n" << FormatDeathTestOutput(error_message);
70465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
70475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case DIED:
70485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (status_ok) {
70495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        const bool matched = RE::PartialMatch(error_message.c_str(), *regex());
70505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        if (matched) {
70515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          success = true;
70525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        } else {
70535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          buffer << "    Result: died but not with expected error.\n"
70545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                 << "  Expected: " << regex()->pattern() << "\n"
70555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                 << "Actual msg:\n" << FormatDeathTestOutput(error_message);
70565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        }
70575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      } else {
70585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        buffer << "    Result: died but not with expected exit code:\n"
70595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang               << "            " << ExitSummary(status()) << "\n"
70605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang               << "Actual msg:\n" << FormatDeathTestOutput(error_message);
70615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
70625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
70635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case IN_PROGRESS:
70645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    default:
70655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_LOG_(FATAL)
70665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << "DeathTest::Passed somehow called before conclusion of test";
70675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
70685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  DeathTest::set_last_death_test_message(buffer.GetString());
70705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return success;
70715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
70725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
70735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_WINDOWS
70745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// WindowsDeathTest implements death tests on Windows. Due to the
70755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// specifics of starting new processes on Windows, death tests there are
70765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// always threadsafe, and Google Test considers the
70775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// --gtest_death_test_style=fast setting to be equivalent to
70785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// --gtest_death_test_style=threadsafe there.
70795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
70805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A few implementation notes:  Like the Linux version, the Windows
70815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// implementation uses pipes for child-to-parent communication. But due to
70825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the specifics of pipes on Windows, some extra steps are required:
70835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
70845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 1. The parent creates a communication pipe and stores handles to both
70855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    ends of it.
70865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 2. The parent starts the child and provides it with the information
70875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    necessary to acquire the handle to the write end of the pipe.
70885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 3. The child acquires the write end of the pipe and signals the parent
70895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    using a Windows event.
70905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 4. Now the parent can release the write end of the pipe on its side. If
70915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    this is done before step 3, the object's reference count goes down to
70925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    0 and it is destroyed, preventing the child from acquiring it. The
70935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    parent now has to release it, or read operations on the read end of
70945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    the pipe will not return when the child terminates.
70955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 5. The parent reads child's output through the pipe (outcome code and
70965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    any possible error messages) from the pipe, and its stderr and then
70975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//    determines whether to fail the test.
70985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
70995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Note: to distinguish Win32 API calls from the local method and function
71005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// calls, the former are explicitly resolved in the global namespace.
71015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
71025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass WindowsDeathTest : public DeathTestImpl {
71035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
71045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  WindowsDeathTest(const char* a_statement,
71055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   const RE* a_regex,
71065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   const char* file,
71075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   int line)
71085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}
71095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // All of these virtual functions are inherited from DeathTest.
71115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual int Wait();
71125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual TestRole AssumeRole();
71135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
71155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The name of the file in which the death test is located.
71165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const file_;
71175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The line number on which the death test is located.
71185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int line_;
71195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Handle to the write end of the pipe to the child process.
71205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  AutoHandle write_handle_;
71215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Child process handle.
71225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  AutoHandle child_handle_;
71235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Event the child process uses to signal the parent that it has
71245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // acquired the handle to the write end of the pipe. After seeing this
71255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // event the parent can release its own handles to make sure its
71265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // ReadFile() calls return when the child terminates.
71275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  AutoHandle event_handle_;
71285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
71295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Waits for the child in a death test to exit, returning its exit
71315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// status, or 0 if no child process exists.  As a side effect, sets the
71325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// outcome data member.
71335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint WindowsDeathTest::Wait() {
71345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!spawned())
71355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return 0;
71365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Wait until the child either signals that it has acquired the write end
71385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // of the pipe or it dies.
71395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };
71405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  switch (::WaitForMultipleObjects(2,
71415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                   wait_handles,
71425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                   FALSE,  // Waits for any of the handles.
71435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                   INFINITE)) {
71445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case WAIT_OBJECT_0:
71455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case WAIT_OBJECT_0 + 1:
71465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
71475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    default:
71485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_DEATH_TEST_CHECK_(false);  // Should not get here.
71495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
71505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The child has acquired the write end of the pipe or exited.
71525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We release the handle on our side and continue.
71535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  write_handle_.Reset();
71545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  event_handle_.Reset();
71555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ReadAndInterpretStatusByte();
71575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Waits for the child process to exit if it haven't already. This
71595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // returns immediately if the child has already exited, regardless of
71605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // whether previous calls to WaitForMultipleObjects synchronized on this
71615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // handle or not.
71625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_(
71635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),
71645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                             INFINITE));
71655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  DWORD status_code;
71665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_(
71675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);
71685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  child_handle_.Reset();
71695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  set_status(static_cast<int>(status_code));
71705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return status();
71715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
71725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The AssumeRole process for a Windows death test.  It creates a child
71745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// process with the same executable as the current process to run the
71755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// death test.  The child process is given the --gtest_filter and
71765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// --gtest_internal_run_death_test flags such that it knows to run the
71775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// current death test only.
71785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangDeathTest::TestRole WindowsDeathTest::AssumeRole() {
71795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const UnitTestImpl* const impl = GetUnitTestImpl();
71805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const InternalRunDeathTestFlag* const flag =
71815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      impl->internal_run_death_test_flag();
71825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestInfo* const info = impl->current_test_info();
71835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int death_test_index = info->result()->death_test_count();
71845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (flag != NULL) {
71865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // ParseInternalRunDeathTestFlag() has performed all the necessary
71875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // processing.
71885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    set_write_fd(flag->write_fd());
71895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return EXECUTE_TEST;
71905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
71915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
71925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // WindowsDeathTest uses an anonymous pipe to communicate results of
71935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // a death test.
71945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  SECURITY_ATTRIBUTES handles_are_inheritable = {
71955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
71965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  HANDLE read_handle, write_handle;
71975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_(
71985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,
71995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   0)  // Default buffer size.
72005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      != FALSE);
72015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),
72025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                O_RDONLY));
72035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  write_handle_.Reset(write_handle);
72045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  event_handle_.Reset(::CreateEvent(
72055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      &handles_are_inheritable,
72065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      TRUE,    // The event will automatically reset to non-signaled state.
72075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      FALSE,   // The initial state is non-signalled.
72085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      NULL));  // The even is unnamed.
72095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);
72105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string filter_flag =
72115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" +
72125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      info->test_case_name() + "." + info->name();
72135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string internal_flag =
72145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag +
72155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      "=" + file_ + "|" + StreamableToString(line_) + "|" +
72165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      StreamableToString(death_test_index) + "|" +
72175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      StreamableToString(static_cast<unsigned int>(::GetCurrentProcessId())) +
72185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // size_t has the same width as pointers on both 32-bit and 64-bit
72195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Windows platforms.
72205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.
72215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      "|" + StreamableToString(reinterpret_cast<size_t>(write_handle)) +
72225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      "|" + StreamableToString(reinterpret_cast<size_t>(event_handle_.Get()));
72235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char executable_path[_MAX_PATH + 1];  // NOLINT
72255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_(
72265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,
72275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                            executable_path,
72285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                            _MAX_PATH));
72295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string command_line =
72315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      std::string(::GetCommandLineA()) + " " + filter_flag + " \"" +
72325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      internal_flag + "\"";
72335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  DeathTest::set_last_death_test_message("");
72355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  CaptureStderr();
72375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Flush the log buffers since the log streams are shared with the child.
72385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FlushInfoLog();
72395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The child process will share the standard handles with the parent.
72415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  STARTUPINFOA startup_info;
72425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  memset(&startup_info, 0, sizeof(STARTUPINFO));
72435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  startup_info.dwFlags = STARTF_USESTDHANDLES;
72445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
72455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
72465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
72475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PROCESS_INFORMATION process_info;
72495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_(::CreateProcessA(
72505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      executable_path,
72515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const_cast<char*>(command_line.c_str()),
72525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      NULL,   // Retuned process handle is not inheritable.
72535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      NULL,   // Retuned thread handle is not inheritable.
72545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      TRUE,   // Child inherits all inheritable handles (for write_handle_).
72555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      0x0,    // Default creation flags.
72565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      NULL,   // Inherit the parent's environment.
72575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      UnitTest::GetInstance()->original_working_dir(),
72585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      &startup_info,
72595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      &process_info) != FALSE);
72605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  child_handle_.Reset(process_info.hProcess);
72615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::CloseHandle(process_info.hThread);
72625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  set_spawned(true);
72635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return OVERSEE_TEST;
72645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
72655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else  // We are not on Windows.
72665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ForkingDeathTest provides implementations for most of the abstract
72685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// methods of the DeathTest interface.  Only the AssumeRole method is
72695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// left undefined.
72705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ForkingDeathTest : public DeathTestImpl {
72715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
72725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ForkingDeathTest(const char* statement, const RE* regex);
72735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // All of these virtual functions are inherited from DeathTest.
72755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual int Wait();
72765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang protected:
72785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
72795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
72815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // PID of child process during death test; 0 in the child process itself.
72825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  pid_t child_pid_;
72835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
72845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Constructs a ForkingDeathTest.
72865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)
72875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : DeathTestImpl(a_statement, a_regex),
72885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      child_pid_(-1) {}
72895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Waits for the child in a death test to exit, returning its exit
72915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// status, or 0 if no child process exists.  As a side effect, sets the
72925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// outcome data member.
72935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint ForkingDeathTest::Wait() {
72945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!spawned())
72955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return 0;
72965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ReadAndInterpretStatusByte();
72985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
72995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int status_value;
73005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
73015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  set_status(status_value);
73025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return status_value;
73035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
73045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A concrete death test class that forks, then immediately runs the test
73065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the child process.
73075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass NoExecDeathTest : public ForkingDeathTest {
73085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
73095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  NoExecDeathTest(const char* a_statement, const RE* a_regex) :
73105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ForkingDeathTest(a_statement, a_regex) { }
73115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual TestRole AssumeRole();
73125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
73135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The AssumeRole process for a fork-and-run death test.  It implements a
73155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// straightforward fork, with a simple pipe to transmit the status byte.
73165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangDeathTest::TestRole NoExecDeathTest::AssumeRole() {
73175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const size_t thread_count = GetThreadCount();
73185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (thread_count != 1) {
73195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
73205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
73215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int pipe_fd[2];
73235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
73245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  DeathTest::set_last_death_test_message("");
73265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  CaptureStderr();
73275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // When we fork the process below, the log file buffers are copied, but the
73285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // file descriptors are shared.  We flush all log files here so that closing
73295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the file descriptors in the child process doesn't throw off the
73305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // synchronization between descriptors and buffers in the parent process.
73315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // This is as close to the fork as possible to avoid a race condition in case
73325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // there are multiple threads running before the death test, and another
73335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // thread writes to the log file.
73345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FlushInfoLog();
73355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const pid_t child_pid = fork();
73375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
73385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  set_child_pid(child_pid);
73395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (child_pid == 0) {
73405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
73415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    set_write_fd(pipe_fd[1]);
73425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Redirects all logging to stderr in the child process to prevent
73435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // concurrent writes to the log files.  We capture stderr in the parent
73445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // process and append the child process' output to a log.
73455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    LogToStderr();
73465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Event forwarding to the listeners of event listener API mush be shut
73475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // down in death test subprocesses.
73485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GetUnitTestImpl()->listeners()->SuppressEventForwarding();
73495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    g_in_fast_death_test_child = true;
73505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return EXECUTE_TEST;
73515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
73525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
73535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    set_read_fd(pipe_fd[0]);
73545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    set_spawned(true);
73555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return OVERSEE_TEST;
73565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
73575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
73585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A concrete death test class that forks and re-executes the main
73605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// program from the beginning, with command-line flags set that cause
73615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// only this specific death test to be run.
73625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass ExecDeathTest : public ForkingDeathTest {
73635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
73645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ExecDeathTest(const char* a_statement, const RE* a_regex,
73655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                const char* file, int line) :
73665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
73675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  virtual TestRole AssumeRole();
73685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
73695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static ::std::vector<testing::internal::string>
73705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GetArgvsForDeathTestChildProcess() {
73715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::std::vector<testing::internal::string> args = GetInjectableArgvs();
73725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return args;
73735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
73745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The name of the file in which the death test is located.
73755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const file_;
73765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The line number on which the death test is located.
73775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int line_;
73785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
73795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Utility class for accumulating command-line arguments.
73815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass Arguments {
73825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
73835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Arguments() {
73845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    args_.push_back(NULL);
73855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
73865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~Arguments() {
73885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
73895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         ++i) {
73905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      free(*i);
73915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
73925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
73935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void AddArgument(const char* argument) {
73945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    args_.insert(args_.end() - 1, posix::StrDup(argument));
73955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
73965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
73975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  template <typename Str>
73985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  void AddArguments(const ::std::vector<Str>& arguments) {
73995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
74005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         i != arguments.end();
74015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         ++i) {
74025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
74035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
74045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
74055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char* const* Argv() {
74065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return &args_[0];
74075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
74085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
74105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::vector<char*> args_;
74115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
74125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A struct that encompasses the arguments to the child process of a
74145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// threadsafe-style death test process.
74155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstruct ExecDeathTestArgs {
74165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char* const* argv;  // Command-line arguments for the child's call to exec
74175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int close_fd;       // File descriptor to close; the read end of a pipe
74185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
74195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  if GTEST_OS_MAC
74215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline char** GetEnviron() {
74225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // When Google Test is built as a framework on MacOS X, the environ variable
74235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // is unavailable. Apple's documentation (man environ) recommends using
74245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // _NSGetEnviron() instead.
74255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return *_NSGetEnviron();
74265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
74275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  else
74285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Some POSIX platforms expect you to declare environ. extern "C" makes
74295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// it reside in the global namespace.
74305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangextern "C" char** environ;
74315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline char** GetEnviron() { return environ; }
74325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  endif  // GTEST_OS_MAC
74335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  if !GTEST_OS_QNX
74355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The main function for a threadsafe-style death test child process.
74365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This function is called in a clone()-ed process and thus must avoid
74375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// any potentially unsafe operations like malloc or libc functions.
74385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic int ExecDeathTestChildMain(void* child_arg) {
74395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
74405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
74415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We need to execute the test program in the same environment where
74435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // it was originally invoked.  Therefore we change to the original
74445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // working directory first.
74455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const original_dir =
74465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      UnitTest::GetInstance()->original_working_dir();
74475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We can safely call chdir() as it's a direct system call.
74485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (chdir(original_dir) != 0) {
74495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
74505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   GetLastErrnoDescription());
74515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return EXIT_FAILURE;
74525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
74535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We can safely call execve() as it's a direct system call.  We
74555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // cannot use execvp() as it's a libc function and thus potentially
74565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // unsafe.  Since execve() doesn't search the PATH, the user must
74575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // invoke the test program via a valid path that contains at least
74585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // one path separator.
74595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  execve(args->argv[0], args->argv, GetEnviron());
74605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  DeathTestAbort(std::string("execve(") + args->argv[0] + ", ...) in " +
74615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                 original_dir + " failed: " +
74625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                 GetLastErrnoDescription());
74635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return EXIT_FAILURE;
74645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
74655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  endif  // !GTEST_OS_QNX
74665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Two utility routines that together determine the direction the stack
74685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// grows.
74695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This could be accomplished more elegantly by a single recursive
74705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// function, but we want to guard against the unlikely possibility of
74715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// a smart compiler optimizing the recursion away.
74725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
74735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
74745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// StackLowerThanAddress into StackGrowsDown, which then doesn't give
74755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// correct answer.
74765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid StackLowerThanAddress(const void* ptr, bool* result) GTEST_NO_INLINE_;
74775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid StackLowerThanAddress(const void* ptr, bool* result) {
74785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int dummy;
74795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *result = (&dummy < ptr);
74805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
74815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool StackGrowsDown() {
74835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int dummy;
74845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool result;
74855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  StackLowerThanAddress(&dummy, &result);
74865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return result;
74875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
74885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
74895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Spawns a child process with the same executable as the current process in
74905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// a thread-safe manner and instructs it to run the death test.  The
74915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// implementation uses fork(2) + exec.  On systems where clone(2) is
74925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// available, it is used instead, being slightly more thread-safe.  On QNX,
74935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// fork supports only single-threaded environments, so this function uses
74945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// spawn(2) there instead.  The function dies with an error message if
74955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// anything goes wrong.
74965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
74975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ExecDeathTestArgs args = { argv, close_fd };
74985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  pid_t child_pid = -1;
74995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  if GTEST_OS_QNX
75015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Obtains the current directory and sets it to be closed in the child
75025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // process.
75035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int cwd_fd = open(".", O_RDONLY);
75045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);
75055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));
75065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We need to execute the test program in the same environment where
75075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // it was originally invoked.  Therefore we change to the original
75085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // working directory first.
75095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const original_dir =
75105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      UnitTest::GetInstance()->original_working_dir();
75115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We can safely call chdir() as it's a direct system call.
75125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (chdir(original_dir) != 0) {
75135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
75145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   GetLastErrnoDescription());
75155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return EXIT_FAILURE;
75165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
75175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int fd_flags;
75195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Set close_fd to be closed after spawn.
75205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));
75215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,
75225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                        fd_flags | FD_CLOEXEC));
75235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  struct inheritance inherit = {0};
75245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // spawn is a system call.
75255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());
75265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Restores the current working directory.
75275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
75285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
75295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  else   // GTEST_OS_QNX
75315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   if GTEST_OS_LINUX
75325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // When a SIGPROF signal is received while fork() or clone() are executing,
75335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // the process may hang. To avoid this, we ignore SIGPROF here and re-enable
75345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // it after the call to fork()/clone() is complete.
75355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  struct sigaction saved_sigprof_action;
75365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  struct sigaction ignore_sigprof_action;
75375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action));
75385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  sigemptyset(&ignore_sigprof_action.sa_mask);
75395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ignore_sigprof_action.sa_handler = SIG_IGN;
75405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(
75415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));
75425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   endif  // GTEST_OS_LINUX
75435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   if GTEST_HAS_CLONE
75455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const bool use_fork = GTEST_FLAG(death_test_use_fork);
75465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!use_fork) {
75485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    static const bool stack_grows_down = StackGrowsDown();
75495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const size_t stack_size = getpagesize();
75505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
75515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
75525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                             MAP_ANON | MAP_PRIVATE, -1, 0);
75535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
75545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Maximum stack alignment in bytes:  For a downward-growing stack, this
75565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // amount is subtracted from size of the stack space to get an address
75575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // that is within the stack space and is aligned on all systems we care
75585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // about.  As far as I know there is no ABI with stack alignment greater
75595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // than 64.  We assume stack and stack_size already have alignment of
75605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // kMaxStackAlignment.
75615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const size_t kMaxStackAlignment = 64;
75625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    void* const stack_top =
75635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        static_cast<char*>(stack) +
75645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            (stack_grows_down ? stack_size - kMaxStackAlignment : 0);
75655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment &&
75665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        reinterpret_cast<intptr_t>(stack_top) % kMaxStackAlignment == 0);
75675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
75695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
75715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
75725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   else
75735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const bool use_fork = true;
75745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#   endif  // GTEST_HAS_CLONE
75755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (use_fork && (child_pid = fork()) == 0) {
75775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ExecDeathTestChildMain(&args);
75785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      _exit(0);
75795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
75805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  endif  // GTEST_OS_QNX
75815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  if GTEST_OS_LINUX
75825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_SYSCALL_(
75835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      sigaction(SIGPROF, &saved_sigprof_action, NULL));
75845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  endif  // GTEST_OS_LINUX
75855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
75875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return child_pid;
75885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
75895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
75905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The AssumeRole process for a fork-and-exec death test.  It re-executes the
75915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// main program from the beginning, setting the --gtest_filter
75925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and --gtest_internal_run_death_test flags to cause only the current
75935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// death test to be re-run.
75945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangDeathTest::TestRole ExecDeathTest::AssumeRole() {
75955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const UnitTestImpl* const impl = GetUnitTestImpl();
75965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const InternalRunDeathTestFlag* const flag =
75975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      impl->internal_run_death_test_flag();
75985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const TestInfo* const info = impl->current_test_info();
75995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int death_test_index = info->result()->death_test_count();
76005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (flag != NULL) {
76025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    set_write_fd(flag->write_fd());
76035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return EXECUTE_TEST;
76045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
76055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int pipe_fd[2];
76075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
76085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Clear the close-on-exec flag on the write end of the pipe, lest
76095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // it be closed when the child process does an exec:
76105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
76115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string filter_flag =
76135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "="
76145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      + info->test_case_name() + "." + info->name();
76155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string internal_flag =
76165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="
76175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      + file_ + "|" + StreamableToString(line_) + "|"
76185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      + StreamableToString(death_test_index) + "|"
76195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      + StreamableToString(pipe_fd[1]);
76205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Arguments args;
76215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  args.AddArguments(GetArgvsForDeathTestChildProcess());
76225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  args.AddArgument(filter_flag.c_str());
76235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  args.AddArgument(internal_flag.c_str());
76245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  DeathTest::set_last_death_test_message("");
76265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  CaptureStderr();
76285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // See the comment in NoExecDeathTest::AssumeRole for why the next line
76295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // is necessary.
76305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FlushInfoLog();
76315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);
76335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
76345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  set_child_pid(child_pid);
76355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  set_read_fd(pipe_fd[0]);
76365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  set_spawned(true);
76375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return OVERSEE_TEST;
76385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
76395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // !GTEST_OS_WINDOWS
76415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Creates a concrete DeathTest-derived class that depends on the
76435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// --gtest_death_test_style flag, and sets the pointer pointed to
76445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// by the "test" argument to its address.  If the test should be
76455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// skipped, sets that pointer to NULL.  Returns true, unless the
76465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// flag is set to an invalid value.
76475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
76485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     const char* file, int line,
76495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     DeathTest** test) {
76505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  UnitTestImpl* const impl = GetUnitTestImpl();
76515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const InternalRunDeathTestFlag* const flag =
76525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      impl->internal_run_death_test_flag();
76535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int death_test_index = impl->current_test_info()
76545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ->increment_death_test_count();
76555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (flag != NULL) {
76575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (death_test_index > flag->index()) {
76585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      DeathTest::set_last_death_test_message(
76595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          "Death test count (" + StreamableToString(death_test_index)
76605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          + ") somehow exceeded expected maximum ("
76615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          + StreamableToString(flag->index()) + ")");
76625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return false;
76635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
76645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (!(flag->file() == file && flag->line() == line &&
76665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          flag->index() == death_test_index)) {
76675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *test = NULL;
76685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return true;
76695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
76705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
76715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_WINDOWS
76735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (GTEST_FLAG(death_test_style) == "threadsafe" ||
76755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      GTEST_FLAG(death_test_style) == "fast") {
76765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *test = new WindowsDeathTest(statement, regex, file, line);
76775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
76785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
76805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (GTEST_FLAG(death_test_style) == "threadsafe") {
76825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *test = new ExecDeathTest(statement, regex, file, line);
76835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else if (GTEST_FLAG(death_test_style) == "fast") {
76845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *test = new NoExecDeathTest(statement, regex);
76855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
76865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_OS_WINDOWS
76885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  else {  // NOLINT - this is more readable than unbalanced brackets inside #if.
76905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    DeathTest::set_last_death_test_message(
76915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        "Unknown death test style \"" + GTEST_FLAG(death_test_style)
76925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        + "\" encountered");
76935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return false;
76945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
76955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return true;
76975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
76985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
76995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Splits a given string on a given delimiter, populating a given
77005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// vector with the fields.  GTEST_HAS_DEATH_TEST implies that we have
77015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ::std::string, so we can use it here.
77025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void SplitString(const ::std::string& str, char delimiter,
77035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                        ::std::vector< ::std::string>* dest) {
77045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::std::vector< ::std::string> parsed;
77055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::std::string::size_type pos = 0;
77065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  while (::testing::internal::AlwaysTrue()) {
77075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const ::std::string::size_type colon = str.find(delimiter, pos);
77085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (colon == ::std::string::npos) {
77095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      parsed.push_back(str.substr(pos));
77105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
77115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
77125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      parsed.push_back(str.substr(pos, colon - pos));
77135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      pos = colon + 1;
77145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
77155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
77165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  dest->swap(parsed);
77175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
77185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_WINDOWS
77205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Recreates the pipe and event handles from the provided parameters,
77215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// signals the event, and returns a file descriptor wrapped around the pipe
77225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// handle. This function is called in the child process only.
77235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint GetStatusFileDescriptor(unsigned int parent_process_id,
77245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            size_t write_handle_as_size_t,
77255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                            size_t event_handle_as_size_t) {
77265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
77275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                   FALSE,  // Non-inheritable.
77285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                                   parent_process_id));
77295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
77305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    DeathTestAbort("Unable to open parent process " +
77315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   StreamableToString(parent_process_id));
77325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
77335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // TODO(vladl@google.com): Replace the following check with a
77355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // compile-time assertion when available.
77365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
77375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const HANDLE write_handle =
77395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      reinterpret_cast<HANDLE>(write_handle_as_size_t);
77405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  HANDLE dup_write_handle;
77415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The newly initialized handle is accessible only in in the parent
77435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // process. To obtain one accessible within the child, we need to use
77445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // DuplicateHandle.
77455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
77465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                         ::GetCurrentProcess(), &dup_write_handle,
77475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                         0x0,    // Requested privileges ignored since
77485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                 // DUPLICATE_SAME_ACCESS is used.
77495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                         FALSE,  // Request non-inheritable handler.
77505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                         DUPLICATE_SAME_ACCESS)) {
77515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    DeathTestAbort("Unable to duplicate the pipe handle " +
77525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   StreamableToString(write_handle_as_size_t) +
77535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   " from the parent process " +
77545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   StreamableToString(parent_process_id));
77555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
77565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
77585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  HANDLE dup_event_handle;
77595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
77615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                         ::GetCurrentProcess(), &dup_event_handle,
77625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                         0x0,
77635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                         FALSE,
77645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                         DUPLICATE_SAME_ACCESS)) {
77655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    DeathTestAbort("Unable to duplicate the event handle " +
77665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   StreamableToString(event_handle_as_size_t) +
77675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   " from the parent process " +
77685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   StreamableToString(parent_process_id));
77695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
77705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int write_fd =
77725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
77735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (write_fd == -1) {
77745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    DeathTestAbort("Unable to convert pipe handle " +
77755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   StreamableToString(write_handle_as_size_t) +
77765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   " to a file descriptor");
77775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
77785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Signals the parent that the write end of the pipe has been acquired
77805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // so the parent can release its own write end.
77815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::SetEvent(dup_event_handle);
77825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return write_fd;
77845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
77855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_OS_WINDOWS
77865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns a newly created InternalRunDeathTestFlag object with fields
77885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// initialized from the GTEST_FLAG(internal_run_death_test) flag if
77895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the flag is specified; otherwise returns NULL.
77905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangInternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
77915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
77925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
77935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
77945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // can use it here.
77955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int line = -1;
77965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int index = -1;
77975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::std::vector< ::std::string> fields;
77985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);
77995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int write_fd = -1;
78005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_WINDOWS
78025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  unsigned int parent_process_id = 0;
78045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  size_t write_handle_as_size_t = 0;
78055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  size_t event_handle_as_size_t = 0;
78065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (fields.size() != 6
78085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      || !ParseNaturalNumber(fields[1], &line)
78095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      || !ParseNaturalNumber(fields[2], &index)
78105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      || !ParseNaturalNumber(fields[3], &parent_process_id)
78115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
78125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
78135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    DeathTestAbort("Bad --gtest_internal_run_death_test flag: " +
78145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                   GTEST_FLAG(internal_run_death_test));
78155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
78165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  write_fd = GetStatusFileDescriptor(parent_process_id,
78175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     write_handle_as_size_t,
78185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                     event_handle_as_size_t);
78195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
78205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (fields.size() != 4
78225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      || !ParseNaturalNumber(fields[1], &line)
78235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      || !ParseNaturalNumber(fields[2], &index)
78245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      || !ParseNaturalNumber(fields[3], &write_fd)) {
78255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    DeathTestAbort("Bad --gtest_internal_run_death_test flag: "
78265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        + GTEST_FLAG(internal_run_death_test));
78275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
78285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_OS_WINDOWS
78305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
78325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
78335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
78355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_DEATH_TEST
78375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
78395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2008, Google Inc.
78405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
78415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
78425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
78435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
78445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
78455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
78465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
78475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
78485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
78495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
78505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
78515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
78525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
78535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
78545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
78555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
78565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
78575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
78585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
78595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
78605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
78615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
78625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
78635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
78645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
78655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
78665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
78675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
78685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Authors: keith.ray@gmail.com (Keith Ray)
78695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stdlib.h>
78725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS_MOBILE
78745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <windows.h>
78755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif GTEST_OS_WINDOWS
78765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <direct.h>
78775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <io.h>
78785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif GTEST_OS_SYMBIAN
78795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Symbian OpenC has PATH_MAX in sys/syslimits.h
78805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <sys/syslimits.h>
78815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
78825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <limits.h>
78835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <climits>  // Some Linux distributions define PATH_MAX here.
78845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS_MOBILE
78855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS
78875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_PATH_MAX_ _MAX_PATH
78885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif defined(PATH_MAX)
78895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_PATH_MAX_ PATH_MAX
78905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif defined(_XOPEN_PATH_MAX)
78915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_PATH_MAX_ _XOPEN_PATH_MAX
78925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
78935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# define GTEST_PATH_MAX_ _POSIX_PATH_MAX
78945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS
78955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
78975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
78985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
78995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS
79015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// On Windows, '\\' is the standard path separator, but many tools and the
79025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Windows API also accept '/' as an alternate path separator. Unless otherwise
79035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// noted, a file path can contain either kind of path separators, or a mixture
79045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// of them.
79055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kPathSeparator = '\\';
79065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kAlternatePathSeparator = '/';
79075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kPathSeparatorString[] = "\\";
79085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kAlternatePathSeparatorString[] = "/";
79095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_WINDOWS_MOBILE
79105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Windows CE doesn't have a current directory. You should not use
79115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the current directory in tests on Windows CE, but this at least
79125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// provides a reasonable fallback.
79135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kCurrentDirectoryString[] = "\\";
79145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Windows CE doesn't define INVALID_FILE_ATTRIBUTES
79155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst DWORD kInvalidFileAttributes = 0xffffffff;
79165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
79175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kCurrentDirectoryString[] = ".\\";
79185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_OS_WINDOWS_MOBILE
79195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
79205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kPathSeparator = '/';
79215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kPathSeparatorString[] = "/";
79225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kCurrentDirectoryString[] = "./";
79235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS
79245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns whether the given character is a valid path separator.
79265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic bool IsPathSeparator(char c) {
79275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_ALT_PATH_SEP_
79285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return (c == kPathSeparator) || (c == kAlternatePathSeparator);
79295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
79305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return c == kPathSeparator;
79315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
79325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
79335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the current working directory, or "" if unsuccessful.
79355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangFilePath FilePath::GetCurrentDir() {
79365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS_MOBILE
79375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Windows CE doesn't have a current directory, so we just return
79385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // something reasonable.
79395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return FilePath(kCurrentDirectoryString);
79405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif GTEST_OS_WINDOWS
79415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
79425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
79435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
79445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
79455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
79465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS_MOBILE
79475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
79485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns a copy of the FilePath with the case-insensitive extension removed.
79505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
79515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// FilePath("dir/file"). If a case-insensitive extension is not
79525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// found, returns a copy of the original FilePath.
79535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangFilePath FilePath::RemoveExtension(const char* extension) const {
79545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string dot_extension = std::string(".") + extension;
79555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (String::EndsWithCaseInsensitive(pathname_, dot_extension)) {
79565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return FilePath(pathname_.substr(
79575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        0, pathname_.length() - dot_extension.length()));
79585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
79595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return *this;
79605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
79615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns a pointer to the last occurence of a valid path separator in
79635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the FilePath. On Windows, for example, both '/' and '\' are valid path
79645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// separators. Returns NULL if no path separator was found.
79655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char* FilePath::FindLastPathSeparator() const {
79665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const last_sep = strrchr(c_str(), kPathSeparator);
79675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_ALT_PATH_SEP_
79685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);
79695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Comparing two pointers of which only one is NULL is undefined.
79705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (last_alt_sep != NULL &&
79715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      (last_sep == NULL || last_alt_sep > last_sep)) {
79725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return last_alt_sep;
79735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
79745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
79755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return last_sep;
79765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
79775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns a copy of the FilePath with the directory part removed.
79795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Example: FilePath("path/to/file").RemoveDirectoryName() returns
79805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// FilePath("file"). If there is no directory part ("just_a_file"), it returns
79815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the FilePath unmodified. If there is no file part ("just_a_dir/") it
79825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// returns an empty FilePath ("").
79835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// On Windows platform, '\' is the path separator, otherwise it is '/'.
79845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangFilePath FilePath::RemoveDirectoryName() const {
79855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const last_sep = FindLastPathSeparator();
79865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return last_sep ? FilePath(last_sep + 1) : *this;
79875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
79885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
79895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// RemoveFileName returns the directory path with the filename removed.
79905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
79915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
79925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
79935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
79945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// On Windows platform, '\' is the path separator, otherwise it is '/'.
79955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangFilePath FilePath::RemoveFileName() const {
79965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const last_sep = FindLastPathSeparator();
79975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string dir;
79985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (last_sep) {
79995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    dir = std::string(c_str(), last_sep + 1 - c_str());
80005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
80015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    dir = kCurrentDirectoryString;
80025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
80035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return FilePath(dir);
80045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
80055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
80065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper functions for naming files in a directory for xml output.
80075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
80085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Given directory = "dir", base_name = "test", number = 0,
80095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// extension = "xml", returns "dir/test.xml". If number is greater
80105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// than zero (e.g., 12), returns "dir/test_12.xml".
80115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// On Windows platform, uses \ as the separator rather than /.
80125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangFilePath FilePath::MakeFileName(const FilePath& directory,
80135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                const FilePath& base_name,
80145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                int number,
80155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                const char* extension) {
80165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string file;
80175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (number == 0) {
80185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    file = base_name.string() + "." + extension;
80195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
80205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    file = base_name.string() + "_" + StreamableToString(number)
80215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        + "." + extension;
80225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
80235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ConcatPaths(directory, FilePath(file));
80245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
80255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
80265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml".
80275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// On Windows, uses \ as the separator rather than /.
80285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangFilePath FilePath::ConcatPaths(const FilePath& directory,
80295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                               const FilePath& relative_path) {
80305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (directory.IsEmpty())
80315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return relative_path;
80325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const FilePath dir(directory.RemoveTrailingPathSeparator());
80335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return FilePath(dir.string() + kPathSeparator + relative_path.string());
80345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
80355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
80365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true if pathname describes something findable in the file-system,
80375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// either a file, directory, or whatever.
80385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool FilePath::FileOrDirectoryExists() const {
80395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS_MOBILE
80405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());
80415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const DWORD attributes = GetFileAttributes(unicode);
80425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  delete [] unicode;
80435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return attributes != kInvalidFileAttributes;
80445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
80455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  posix::StatStruct file_stat;
80465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return posix::Stat(pathname_.c_str(), &file_stat) == 0;
80475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS_MOBILE
80485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
80495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
80505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true if pathname describes a directory in the file-system
80515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// that exists.
80525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool FilePath::DirectoryExists() const {
80535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool result = false;
80545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS
80555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Don't strip off trailing separator if path is a root directory on
80565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Windows (like "C:\\").
80575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const FilePath& path(IsRootDirectory() ? *this :
80585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                           RemoveTrailingPathSeparator());
80595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
80605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const FilePath& path(*this);
80615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
80625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
80635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS_MOBILE
80645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  LPCWSTR unicode = String::AnsiToUtf16(path.c_str());
80655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const DWORD attributes = GetFileAttributes(unicode);
80665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  delete [] unicode;
80675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if ((attributes != kInvalidFileAttributes) &&
80685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      (attributes & FILE_ATTRIBUTE_DIRECTORY)) {
80695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    result = true;
80705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
80715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
80725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  posix::StatStruct file_stat;
80735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  result = posix::Stat(path.c_str(), &file_stat) == 0 &&
80745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      posix::IsDir(file_stat);
80755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS_MOBILE
80765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
80775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return result;
80785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
80795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
80805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true if pathname describes a root directory. (Windows has one
80815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// root directory per disk drive.)
80825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool FilePath::IsRootDirectory() const {
80835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS
80845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // TODO(wan@google.com): on Windows a network share like
80855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // \\server\share can be a root directory, although it cannot be the
80865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // current directory.  Handle this properly.
80875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return pathname_.length() == 3 && IsAbsolutePath();
80885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
80895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);
80905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
80915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
80925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
80935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true if pathname describes an absolute path.
80945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool FilePath::IsAbsolutePath() const {
80955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const name = pathname_.c_str();
80965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS
80975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return pathname_.length() >= 3 &&
80985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang     ((name[0] >= 'a' && name[0] <= 'z') ||
80995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      (name[0] >= 'A' && name[0] <= 'Z')) &&
81005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang     name[1] == ':' &&
81015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang     IsPathSeparator(name[2]);
81025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
81035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return IsPathSeparator(name[0]);
81045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
81055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
81065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
81075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns a pathname for a file that does not currently exist. The pathname
81085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// will be directory/base_name.extension or
81095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// directory/base_name_<number>.extension if directory/base_name.extension
81105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// already exists. The number will be incremented until a pathname is found
81115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// that does not already exist.
81125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
81135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// There could be a race condition if two or more processes are calling this
81145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// function at the same time -- they could both pick the same filename.
81155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangFilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
81165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                          const FilePath& base_name,
81175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                          const char* extension) {
81185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FilePath full_pathname;
81195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int number = 0;
81205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  do {
81215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    full_pathname.Set(MakeFileName(directory, base_name, number++, extension));
81225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } while (full_pathname.FileOrDirectoryExists());
81235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return full_pathname;
81245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
81255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
81265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true if FilePath ends with a path separator, which indicates that
81275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// it is intended to represent a directory. Returns false otherwise.
81285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This does NOT check that a directory (or file) actually exists.
81295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool FilePath::IsDirectory() const {
81305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return !pathname_.empty() &&
81315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);
81325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
81335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
81345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Create directories so that path exists. Returns true if successful or if
81355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the directories already exist; returns false if unable to create directories
81365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// for any reason.
81375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool FilePath::CreateDirectoriesRecursively() const {
81385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!this->IsDirectory()) {
81395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return false;
81405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
81415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
81425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (pathname_.length() == 0 || this->DirectoryExists()) {
81435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return true;
81445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
81455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
81465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());
81475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return parent.CreateDirectoriesRecursively() && this->CreateFolder();
81485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
81495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
81505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Create the directory so that path exists. Returns true if successful or
81515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// if the directory already exists; returns false if unable to create the
81525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// directory for any reason, including if the parent directory does not
81535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// exist. Not named "CreateDirectory" because that's a macro on Windows.
81545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool FilePath::CreateFolder() const {
81555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS_MOBILE
81565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  FilePath removed_sep(this->RemoveTrailingPathSeparator());
81575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());
81585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int result = CreateDirectory(unicode, NULL) ? 0 : -1;
81595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  delete [] unicode;
81605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif GTEST_OS_WINDOWS
81615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int result = _mkdir(pathname_.c_str());
81625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
81635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int result = mkdir(pathname_.c_str(), 0777);
81645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS_MOBILE
81655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
81665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (result == -1) {
81675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return this->DirectoryExists();  // An error is OK if the directory exists.
81685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
81695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return true;  // No error.
81705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
81715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
81725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// If input name has a trailing separator character, remove it and return the
81735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// name, otherwise return the name string unmodified.
81745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// On Windows platform, uses \ as the separator, other platforms use /.
81755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangFilePath FilePath::RemoveTrailingPathSeparator() const {
81765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return IsDirectory()
81775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ? FilePath(pathname_.substr(0, pathname_.length() - 1))
81785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      : *this;
81795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
81805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
81815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Removes any redundant separators that might be in the pathname.
81825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
81835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// redundancies that might be in a pathname involving "." or "..".
81845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// TODO(wan@google.com): handle Windows network shares (e.g. \\server\share).
81855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid FilePath::Normalize() {
81865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (pathname_.c_str() == NULL) {
81875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    pathname_ = "";
81885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return;
81895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
81905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* src = pathname_.c_str();
81915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char* const dest = new char[pathname_.length() + 1];
81925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char* dest_ptr = dest;
81935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  memset(dest_ptr, 0, pathname_.length() + 1);
81945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
81955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  while (*src != '\0') {
81965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *dest_ptr = *src;
81975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (!IsPathSeparator(*src)) {
81985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      src++;
81995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
82005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_ALT_PATH_SEP_
82015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (*dest_ptr == kAlternatePathSeparator) {
82025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        *dest_ptr = kPathSeparator;
82035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
82045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif
82055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      while (IsPathSeparator(*src))
82065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        src++;
82075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
82085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    dest_ptr++;
82095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
82105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *dest_ptr = '\0';
82115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  pathname_ = dest;
82125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  delete[] dest;
82135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
82145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
82165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
82175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2008, Google Inc.
82185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
82195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
82205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
82215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
82225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
82235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
82245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
82255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
82265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
82275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
82285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
82295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
82305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
82315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
82325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
82335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
82345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
82355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
82365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
82375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
82385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
82395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
82405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
82415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
82425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
82435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
82445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
82455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
82465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: wan@google.com (Zhanyong Wan)
82475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <limits.h>
82505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stdlib.h>
82515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stdio.h>
82525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <string.h>
82535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS_MOBILE
82555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <windows.h>  // For TerminateProcess()
82565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif GTEST_OS_WINDOWS
82575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <io.h>
82585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <sys/stat.h>
82595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
82605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <unistd.h>
82615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS_MOBILE
82625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_MAC
82645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <mach/mach_init.h>
82655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <mach/task.h>
82665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <mach/vm_map.h>
82675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_MAC
82685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_QNX
82705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <devctl.h>
82715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# include <sys/procfs.h>
82725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_QNX
82735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Indicates that this translation unit is part of Google Test's
82765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// implementation.  It must come before gtest-internal-inl.h is
82775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// included, or there will be a compiler error.  This trick is to
82785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// prevent a user from accidentally including gtest-internal-inl.h in
82795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// his code.
82805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_IMPLEMENTATION_ 1
82815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_IMPLEMENTATION_
82825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
82845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
82855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if defined(_MSC_VER) || defined(__BORLANDC__)
82875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// MSVC and C++Builder do not provide a definition of STDERR_FILENO.
82885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst int kStdOutFileno = 1;
82895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst int kStdErrFileno = 2;
82905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
82915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst int kStdOutFileno = STDOUT_FILENO;
82925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst int kStdErrFileno = STDERR_FILENO;
82935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // _MSC_VER
82945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_MAC
82965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
82975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the number of threads running in the process, or 0 to indicate that
82985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// we cannot detect it.
82995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangsize_t GetThreadCount() {
83005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const task_t task = mach_task_self();
83015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  mach_msg_type_number_t thread_count;
83025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  thread_act_array_t thread_list;
83035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const kern_return_t status = task_threads(task, &thread_list, &thread_count);
83045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (status == KERN_SUCCESS) {
83055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // task_threads allocates resources in thread_list and we need to free them
83065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // to avoid leaks.
83075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    vm_deallocate(task,
83085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  reinterpret_cast<vm_address_t>(thread_list),
83095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  sizeof(thread_t) * thread_count);
83105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return static_cast<size_t>(thread_count);
83115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
83125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return 0;
83135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
83145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
83155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif GTEST_OS_QNX
83175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the number of threads running in the process, or 0 to indicate that
83195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// we cannot detect it.
83205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangsize_t GetThreadCount() {
83215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int fd = open("/proc/self/as", O_RDONLY);
83225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (fd < 0) {
83235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return 0;
83245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
83255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  procfs_info process_info;
83265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int status =
83275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), NULL);
83285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  close(fd);
83295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (status == EOK) {
83305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return static_cast<size_t>(process_info.num_threads);
83315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
83325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return 0;
83335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
83345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
83355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
83375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangsize_t GetThreadCount() {
83395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // There's no portable way to detect the number of threads, so we just
83405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // return 0 to indicate that we cannot detect it.
83415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return 0;
83425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
83435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_MAC
83455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_USES_POSIX_RE
83475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Implements RE.  Currently only needed for death tests.
83495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangRE::~RE() {
83515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (is_valid_) {
83525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // regfree'ing an invalid regex might crash because the content
83535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // of the regex is undefined. Since the regex's are essentially
83545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // the same, one cannot be valid (or invalid) without the other
83555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // being so too.
83565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    regfree(&partial_regex_);
83575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    regfree(&full_regex_);
83585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
83595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  free(const_cast<char*>(pattern_));
83605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
83615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff regular expression re matches the entire str.
83635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool RE::FullMatch(const char* str, const RE& re) {
83645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!re.is_valid_) return false;
83655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  regmatch_t match;
83675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return regexec(&re.full_regex_, str, 1, &match, 0) == 0;
83685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
83695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff regular expression re matches a substring of str
83715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (including str itself).
83725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool RE::PartialMatch(const char* str, const RE& re) {
83735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!re.is_valid_) return false;
83745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  regmatch_t match;
83765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;
83775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
83785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Initializes an RE from its string representation.
83805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid RE::Init(const char* regex) {
83815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  pattern_ = posix::StrDup(regex);
83825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Reserves enough bytes to hold the regular expression used for a
83845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // full match.
83855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const size_t full_regex_len = strlen(regex) + 10;
83865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char* const full_pattern = new char[full_regex_len];
83875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
83885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  snprintf(full_pattern, full_regex_len, "^(%s)$", regex);
83895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;
83905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We want to call regcomp(&partial_regex_, ...) even if the
83915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // previous expression returns false.  Otherwise partial_regex_ may
83925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // not be properly initialized can may cause trouble when it's
83935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // freed.
83945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
83955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Some implementation of POSIX regex (e.g. on at least some
83965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // versions of Cygwin) doesn't accept the empty string as a valid
83975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // regex.  We change it to an equivalent form "()" to be safe.
83985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (is_valid_) {
83995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* const partial_regex = (*regex == '\0') ? "()" : regex;
84005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;
84015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
84025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  EXPECT_TRUE(is_valid_)
84035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "Regular expression \"" << regex
84045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << "\" is not a valid POSIX Extended regular expression.";
84055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  delete[] full_pattern;
84075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
84085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#elif GTEST_USES_SIMPLE_RE
84105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff ch appears anywhere in str (excluding the
84125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// terminating '\0' character).
84135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool IsInSet(char ch, const char* str) {
84145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ch != '\0' && strchr(str, ch) != NULL;
84155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
84165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff ch belongs to the given classification.  Unlike
84185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// similar functions in <ctype.h>, these aren't affected by the
84195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// current locale.
84205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }
84215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool IsAsciiPunct(char ch) {
84225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~");
84235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
84245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
84255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
84265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool IsAsciiWordChar(char ch) {
84275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||
84285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ('0' <= ch && ch <= '9') || ch == '_';
84295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
84305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff "\\c" is a supported escape sequence.
84325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool IsValidEscape(char c) {
84335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW"));
84345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
84355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff the given atom (specified by escaped and pattern)
84375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// matches ch.  The result is undefined if the atom is invalid.
84385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
84395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (escaped) {  // "\\p" where p is pattern_char.
84405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    switch (pattern_char) {
84415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case 'd': return IsAsciiDigit(ch);
84425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case 'D': return !IsAsciiDigit(ch);
84435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case 'f': return ch == '\f';
84445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case 'n': return ch == '\n';
84455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case 'r': return ch == '\r';
84465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case 's': return IsAsciiWhiteSpace(ch);
84475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case 'S': return !IsAsciiWhiteSpace(ch);
84485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case 't': return ch == '\t';
84495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case 'v': return ch == '\v';
84505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case 'w': return IsAsciiWordChar(ch);
84515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      case 'W': return !IsAsciiWordChar(ch);
84525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
84535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return IsAsciiPunct(pattern_char) && pattern_char == ch;
84545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
84555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return (pattern_char == '.' && ch != '\n') || pattern_char == ch;
84575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
84585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Helper function used by ValidateRegex() to format error messages.
84605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string FormatRegexSyntaxError(const char* regex, int index) {
84615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return (Message() << "Syntax error at index " << index
84625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          << " in simple regular expression \"" << regex << "\": ").GetString();
84635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
84645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Generates non-fatal failures and returns false if regex is invalid;
84665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// otherwise returns true.
84675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool ValidateRegex(const char* regex) {
84685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (regex == NULL) {
84695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // TODO(wan@google.com): fix the source file location in the
84705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // assertion failures to match where the regex is used in user
84715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // code.
84725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ADD_FAILURE() << "NULL is not a valid simple regular expression.";
84735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return false;
84745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
84755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool is_valid = true;
84775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // True iff ?, *, or + can follow the previous atom.
84795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool prev_repeatable = false;
84805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (int i = 0; regex[i]; i++) {
84815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (regex[i] == '\\') {  // An escape sequence
84825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      i++;
84835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (regex[i] == '\0') {
84845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
84855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      << "'\\' cannot appear at the end.";
84865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        return false;
84875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
84885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (!IsValidEscape(regex[i])) {
84905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
84915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      << "invalid escape sequence \"\\" << regex[i] << "\".";
84925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        is_valid = false;
84935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
84945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      prev_repeatable = true;
84955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {  // Not an escape sequence.
84965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      const char ch = regex[i];
84975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
84985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (ch == '^' && i > 0) {
84995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
85005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      << "'^' can only appear at the beginning.";
85015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        is_valid = false;
85025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      } else if (ch == '$' && regex[i + 1] != '\0') {
85035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
85045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      << "'$' can only appear at the end.";
85055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        is_valid = false;
85065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      } else if (IsInSet(ch, "()[]{}|")) {
85075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
85085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      << "'" << ch << "' is unsupported.";
85095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        is_valid = false;
85105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      } else if (IsRepeat(ch) && !prev_repeatable) {
85115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
85125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      << "'" << ch << "' can only follow a repeatable token.";
85135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        is_valid = false;
85145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
85155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
85165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      prev_repeatable = !IsInSet(ch, "^$?*+");
85175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
85185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
85195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
85205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return is_valid;
85215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
85225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
85235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Matches a repeated regex atom followed by a valid simple regular
85245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// expression.  The regex atom is defined as c if escaped is false,
85255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// or \c otherwise.  repeat is the repetition meta character (?, *,
85265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// or +).  The behavior is undefined if str contains too many
85275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// characters to be indexable by size_t, in which case the test will
85285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// probably time out anyway.  We are fine with this limitation as
85295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// std::string has it too.
85305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool MatchRepetitionAndRegexAtHead(
85315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bool escaped, char c, char repeat, const char* regex,
85325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* str) {
85335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const size_t min_count = (repeat == '+') ? 1 : 0;
85345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const size_t max_count = (repeat == '?') ? 1 :
85355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      static_cast<size_t>(-1) - 1;
85365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We cannot call numeric_limits::max() as it conflicts with the
85375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // max() macro on Windows.
85385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
85395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (size_t i = 0; i <= max_count; ++i) {
85405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // We know that the atom matches each of the first i characters in str.
85415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (i >= min_count && MatchRegexAtHead(regex, str + i)) {
85425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // We have enough matches at the head, and the tail matches too.
85435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Since we only care about *whether* the pattern matches str
85445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // (as opposed to *how* it matches), there is no need to find a
85455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // greedy match.
85465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return true;
85475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
85485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i]))
85495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return false;
85505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
85515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return false;
85525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
85535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
85545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff regex matches a prefix of str.  regex must be a
85555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// valid simple regular expression and not start with "^", or the
85565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// result is undefined.
85575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool MatchRegexAtHead(const char* regex, const char* str) {
85585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (*regex == '\0')  // An empty regex matches a prefix of anything.
85595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return true;
85605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
85615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // "$" only matches the end of a string.  Note that regex being
85625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // valid guarantees that there's nothing after "$" in it.
85635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (*regex == '$')
85645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *str == '\0';
85655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
85665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Is the first thing in regex an escape sequence?
85675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const bool escaped = *regex == '\\';
85685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (escaped)
85695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ++regex;
85705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (IsRepeat(regex[1])) {
85715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so
85725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // here's an indirect recursion.  It terminates as the regex gets
85735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // shorter in each recursion.
85745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return MatchRepetitionAndRegexAtHead(
85755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        escaped, regex[0], regex[1], regex + 2, str);
85765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
85775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // regex isn't empty, isn't "$", and doesn't start with a
85785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // repetition.  We match the first atom of regex with the first
85795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // character of str and recurse.
85805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) &&
85815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        MatchRegexAtHead(regex + 1, str + 1);
85825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
85835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
85845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
85855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff regex matches any substring of str.  regex must be
85865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// a valid simple regular expression, or the result is undefined.
85875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
85885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The algorithm is recursive, but the recursion depth doesn't exceed
85895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the regex length, so we won't need to worry about running out of
85905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// stack space normally.  In rare cases the time complexity can be
85915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// exponential with respect to the regex length + the string length,
85925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// but usually it's must faster (often close to linear).
85935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool MatchRegexAnywhere(const char* regex, const char* str) {
85945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (regex == NULL || str == NULL)
85955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return false;
85965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
85975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (*regex == '^')
85985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return MatchRegexAtHead(regex + 1, str);
85995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // A successful match can be anywhere in str.
86015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  do {
86025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (MatchRegexAtHead(regex, str))
86035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return true;
86045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } while (*str++ != '\0');
86055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return false;
86065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
86075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Implements the RE class.
86095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangRE::~RE() {
86115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  free(const_cast<char*>(pattern_));
86125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  free(const_cast<char*>(full_pattern_));
86135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
86145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff regular expression re matches the entire str.
86165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool RE::FullMatch(const char* str, const RE& re) {
86175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);
86185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
86195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true iff regular expression re matches a substring of str
86215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (including str itself).
86225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool RE::PartialMatch(const char* str, const RE& re) {
86235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);
86245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
86255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Initializes an RE from its string representation.
86275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid RE::Init(const char* regex) {
86285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  pattern_ = full_pattern_ = NULL;
86295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (regex != NULL) {
86305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    pattern_ = posix::StrDup(regex);
86315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
86325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  is_valid_ = ValidateRegex(regex);
86345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!is_valid_) {
86355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // No need to calculate the full pattern when the regex is invalid.
86365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return;
86375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
86385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const size_t len = strlen(regex);
86405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Reserves enough bytes to hold the regular expression used for a
86415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // full match: we need space to prepend a '^', append a '$', and
86425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // terminate the string with '\0'.
86435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char* buffer = static_cast<char*>(malloc(len + 3));
86445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  full_pattern_ = buffer;
86455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (*regex != '^')
86475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *buffer++ = '^';  // Makes sure full_pattern_ starts with '^'.
86485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // We don't use snprintf or strncpy, as they trigger a warning when
86505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // compiled with VC++ 8.0.
86515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  memcpy(buffer, regex, len);
86525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  buffer += len;
86535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (len == 0 || regex[len - 1] != '$')
86555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *buffer++ = '$';  // Makes sure full_pattern_ ends with '$'.
86565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *buffer = '\0';
86585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
86595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_USES_POSIX_RE
86615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char kUnknownFile[] = "unknown file";
86635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Formats a source file path and a line number as they would appear
86655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in an error message from the compiler used to compile this code.
86665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {
86675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string file_name(file == NULL ? kUnknownFile : file);
86685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (line < 0) {
86705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return file_name + ":";
86715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
86725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef _MSC_VER
86735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return file_name + "(" + StreamableToString(line) + "):";
86745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#else
86755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return file_name + ":" + StreamableToString(line) + ":";
86765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // _MSC_VER
86775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
86785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Formats a file location for compiler-independent XML output.
86805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Although this function is not platform dependent, we put it next to
86815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// FormatFileLocation in order to contrast the two functions.
86825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Note that FormatCompilerIndependentFileLocation() does NOT append colon
86835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// to the file location it produces, unlike FormatFileLocation().
86845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
86855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* file, int line) {
86865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string file_name(file == NULL ? kUnknownFile : file);
86875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (line < 0)
86895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return file_name;
86905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  else
86915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return file_name + ":" + StreamableToString(line);
86925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
86935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
86955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)
86965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : severity_(severity) {
86975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const marker =
86985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      severity == GTEST_INFO ?    "[  INFO ]" :
86995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      severity == GTEST_WARNING ? "[WARNING]" :
87005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      severity == GTEST_ERROR ?   "[ ERROR ]" : "[ FATAL ]";
87015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GetStream() << ::std::endl << marker << " "
87025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang              << FormatFileLocation(file, line).c_str() << ": ";
87035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
87045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
87065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangGTestLog::~GTestLog() {
87075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GetStream() << ::std::endl;
87085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (severity_ == GTEST_FATAL) {
87095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fflush(stderr);
87105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    posix::Abort();
87115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
87125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
87135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Disable Microsoft deprecation warnings for POSIX functions called from
87145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this class (creat, dup, dup2, and close)
87155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef _MSC_VER
87165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(push)
87175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# pragma warning(disable: 4996)
87185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // _MSC_VER
87195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_STREAM_REDIRECTION
87215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Object that captures an output stream (stdout/stderr).
87235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangclass CapturedStream {
87245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang public:
87255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The ctor redirects the stream to a temporary file.
87265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
87275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# if GTEST_OS_WINDOWS
87285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    char temp_dir_path[MAX_PATH + 1] = { '\0' };  // NOLINT
87295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    char temp_file_path[MAX_PATH + 1] = { '\0' };  // NOLINT
87305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);
87325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const UINT success = ::GetTempFileNameA(temp_dir_path,
87335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                            "gtest_redir",
87345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                            0,  // Generate unique file name.
87355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                            temp_file_path);
87365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CHECK_(success != 0)
87375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        << "Unable to create a temporary file in " << temp_dir_path;
87385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);
87395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file "
87405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                    << temp_file_path;
87415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    filename_ = temp_file_path;
87425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# else
87435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // There's no guarantee that a test has write access to the current
87445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // directory, so we create the temporary file in the /tmp directory
87455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // instead. We use /tmp on most systems, and /sdcard on Android.
87465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // That's because Android doesn't have /tmp.
87475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  if GTEST_OS_LINUX_ANDROID
87485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Note: Android applications are expected to call the framework's
87495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Context.getExternalStorageDirectory() method through JNI to get
87505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // the location of the world-writable SD Card directory. However,
87515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // this requires a Context handle, which cannot be retrieved
87525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // globally from native code. Doing so also precludes running the
87535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // code as part of a regular standalone executable, which doesn't
87545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // run in a Dalvik process (e.g. when running it through 'adb shell').
87555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    //
87565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // The location /sdcard is directly accessible from native code
87575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // and is the only location (unofficially) supported by the Android
87585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // team. It's generally a symlink to the real SD Card mount point
87595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // which can be /mnt/sdcard, /mnt/sdcard0, /system/media/sdcard, or
87605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // other OEM-customized locations. Never rely on these, and always
87615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // use /sdcard.
87625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    char name_template[] = "/sdcard/gtest_captured_stream.XXXXXX";
87635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  else
87645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    char name_template[] = "/tmp/captured_stream.XXXXXX";
87655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  endif  // GTEST_OS_LINUX_ANDROID
87665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int captured_fd = mkstemp(name_template);
87675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    filename_ = name_template;
87685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // GTEST_OS_WINDOWS
87695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fflush(NULL);
87705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    dup2(captured_fd, fd_);
87715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    close(captured_fd);
87725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
87735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ~CapturedStream() {
87755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    remove(filename_.c_str());
87765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
87775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  std::string GetCapturedString() {
87795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (uncaptured_fd_ != -1) {
87805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Restores the original stream.
87815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      fflush(NULL);
87825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      dup2(uncaptured_fd_, fd_);
87835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      close(uncaptured_fd_);
87845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      uncaptured_fd_ = -1;
87855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
87865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    FILE* const file = posix::FOpen(filename_.c_str(), "r");
87885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const std::string content = ReadEntireFile(file);
87895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    posix::FClose(file);
87905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return content;
87915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
87925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang private:
87945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Reads the entire content of a file as an std::string.
87955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static std::string ReadEntireFile(FILE* file);
87965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
87975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Returns the size (in bytes) of a file.
87985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  static size_t GetFileSize(FILE* file);
87995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const int fd_;  // A stream to capture.
88015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int uncaptured_fd_;
88025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Name of the temporary file holding the stderr output.
88035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::std::string filename_;
88045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);
88065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
88075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the size (in bytes) of a file.
88095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangsize_t CapturedStream::GetFileSize(FILE* file) {
88105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fseek(file, 0, SEEK_END);
88115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return static_cast<size_t>(ftell(file));
88125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
88135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Reads the entire content of a file as a string.
88155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string CapturedStream::ReadEntireFile(FILE* file) {
88165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const size_t file_size = GetFileSize(file);
88175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char* const buffer = new char[file_size];
88185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  size_t bytes_last_read = 0;  // # of bytes read in the last fread()
88205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  size_t bytes_read = 0;       // # of bytes read so far
88215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  fseek(file, 0, SEEK_SET);
88235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Keeps reading the file until we cannot read further or the
88255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // pre-determined file size is reached.
88265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  do {
88275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
88285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bytes_read += bytes_last_read;
88295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } while (bytes_last_read > 0 && bytes_read < file_size);
88305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string content(buffer, bytes_read);
88325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  delete[] buffer;
88335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return content;
88355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
88365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# ifdef _MSC_VER
88385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#  pragma warning(pop)
88395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang# endif  // _MSC_VER
88405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic CapturedStream* g_captured_stderr = NULL;
88425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic CapturedStream* g_captured_stdout = NULL;
88435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Starts capturing an output stream (stdout/stderr).
88455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid CaptureStream(int fd, const char* stream_name, CapturedStream** stream) {
88465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (*stream != NULL) {
88475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_LOG_(FATAL) << "Only one " << stream_name
88485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                      << " capturer can exist at a time.";
88495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
88505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *stream = new CapturedStream(fd);
88515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
88525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Stops capturing the output stream and returns the captured string.
88545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string GetCapturedStream(CapturedStream** captured_stream) {
88555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string content = (*captured_stream)->GetCapturedString();
88565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  delete *captured_stream;
88585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *captured_stream = NULL;
88595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return content;
88615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
88625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Starts capturing stdout.
88645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid CaptureStdout() {
88655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout);
88665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
88675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Starts capturing stderr.
88695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid CaptureStderr() {
88705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr);
88715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
88725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Stops capturing stdout and returns the captured string.
88745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string GetCapturedStdout() {
88755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return GetCapturedStream(&g_captured_stdout);
88765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
88775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Stops capturing stderr and returns the captured string.
88795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string GetCapturedStderr() {
88805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return GetCapturedStream(&g_captured_stderr);
88815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
88825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_STREAM_REDIRECTION
88845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_DEATH_TEST
88865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A copy of all command line arguments.  Set by InitGoogleTest().
88885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang::std::vector<testing::internal::string> g_argvs;
88895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const ::std::vector<testing::internal::string>* g_injected_test_argvs =
88915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                        NULL;  // Owned.
88925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid SetInjectableArgvs(const ::std::vector<testing::internal::string>* argvs) {
88945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (g_injected_test_argvs != argvs)
88955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    delete g_injected_test_argvs;
88965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  g_injected_test_argvs = argvs;
88975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
88985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
88995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst ::std::vector<testing::internal::string>& GetInjectableArgvs() {
89005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (g_injected_test_argvs != NULL) {
89015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return *g_injected_test_argvs;
89025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
89035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return g_argvs;
89045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
89055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_DEATH_TEST
89065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_OS_WINDOWS_MOBILE
89085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace posix {
89095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid Abort() {
89105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  DebugBreak();
89115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  TerminateProcess(GetCurrentProcess(), 1);
89125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
89135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace posix
89145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_OS_WINDOWS_MOBILE
89155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the name of the environment variable corresponding to the
89175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// given flag.  For example, FlagToEnvVar("foo") will return
89185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "GTEST_FOO" in the open-source version.
89195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic std::string FlagToEnvVar(const char* flag) {
89205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string full_flag =
89215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();
89225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message env_var;
89245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (size_t i = 0; i != full_flag.length(); i++) {
89255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    env_var << ToUpper(full_flag.c_str()[i]);
89265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
89275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return env_var.GetString();
89295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
89305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Parses 'str' for a 32-bit signed integer.  If successful, writes
89325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the result to *value and returns true; otherwise leaves *value
89335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// unchanged and returns false.
89345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool ParseInt32(const Message& src_text, const char* str, Int32* value) {
89355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Parses the environment variable as a decimal integer.
89365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char* end = NULL;
89375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const long long_value = strtol(str, &end, 10);  // NOLINT
89385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Has strtol() consumed all characters in the string?
89405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (*end != '\0') {
89415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // No - an invalid character was encountered.
89425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Message msg;
89435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    msg << "WARNING: " << src_text
89445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        << " is expected to be a 32-bit integer, but actually"
89455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        << " has value \"" << str << "\".\n";
89465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    printf("%s", msg.GetString().c_str());
89475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fflush(stdout);
89485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return false;
89495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
89505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Is the parsed value in the range of an Int32?
89525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const Int32 result = static_cast<Int32>(long_value);
89535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (long_value == LONG_MAX || long_value == LONG_MIN ||
89545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // The parsed value overflows as a long.  (strtol() returns
89555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // LONG_MAX or LONG_MIN when the input overflows.)
89565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      result != long_value
89575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // The parsed value overflows as an Int32.
89585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      ) {
89595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    Message msg;
89605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    msg << "WARNING: " << src_text
89615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        << " is expected to be a 32-bit integer, but actually"
89625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        << " has value " << str << ", which overflows.\n";
89635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    printf("%s", msg.GetString().c_str());
89645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fflush(stdout);
89655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return false;
89665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
89675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *value = result;
89695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return true;
89705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
89715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Reads and returns the Boolean environment variable corresponding to
89735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the given flag; if it's not set, returns default_value.
89745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
89755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The value is considered true iff it's not "0".
89765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangbool BoolFromGTestEnv(const char* flag, bool default_value) {
89775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string env_var = FlagToEnvVar(flag);
89785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const string_value = posix::GetEnv(env_var.c_str());
89795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return string_value == NULL ?
89805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      default_value : strcmp(string_value, "0") != 0;
89815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
89825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Reads and returns a 32-bit integer stored in the environment
89845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// variable corresponding to the given flag; if it isn't set or
89855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// doesn't represent a valid 32-bit integer, returns default_value.
89865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangInt32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
89875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string env_var = FlagToEnvVar(flag);
89885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const string_value = posix::GetEnv(env_var.c_str());
89895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (string_value == NULL) {
89905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // The environment variable is not set.
89915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return default_value;
89925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
89935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
89945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Int32 result = default_value;
89955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (!ParseInt32(Message() << "Environment variable " << env_var,
89965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                  string_value, &result)) {
89975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    printf("The default value %s is used.\n",
89985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang           (Message() << default_value).GetString().c_str());
89995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fflush(stdout);
90005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return default_value;
90015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
90025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return result;
90045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
90055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Reads and returns the string environment variable corresponding to
90075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// the given flag; if it's not set, returns default_value.
90085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char* StringFromGTestEnv(const char* flag, const char* default_value) {
90095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string env_var = FlagToEnvVar(flag);
90105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const value = posix::GetEnv(env_var.c_str());
90115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return value == NULL ? default_value : value;
90125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
90135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
90155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
90165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2007, Google Inc.
90175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
90185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
90195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
90205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
90215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
90225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
90235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
90245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
90255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
90265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
90275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
90285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
90295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
90305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
90315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
90325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
90335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
90345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
90355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
90365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
90375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
90385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
90395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
90405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
90415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
90425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
90435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
90445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
90455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: wan@google.com (Zhanyong Wan)
90465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Google Test - The Google C++ Testing Framework
90485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
90495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// This file implements a universal value printer that can print a
90505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// value of any type T:
90515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
90525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
90535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
90545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// It uses the << operator when possible, and prints the bytes in the
90555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// object otherwise.  A user can override its behavior for a class
90565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// type Foo by defining either operator<<(::std::ostream&, const Foo&)
90575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// or void PrintTo(const Foo&, ::std::ostream*) in the namespace that
90585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// defines Foo.
90595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <ctype.h>
90615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stdio.h>
90625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <ostream>  // NOLINT
90635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <string>
90645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
90665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace {
90685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangusing ::std::ostream;
90705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a segment of bytes in the given object.
90725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
90735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                size_t count, ostream* os) {
90745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  char text[5] = "";
90755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (size_t i = 0; i != count; i++) {
90765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const size_t j = start + i;
90775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (i != 0) {
90785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Organizes the bytes into groups of 2 for easy parsing by
90795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // human.
90805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if ((j % 2) == 0)
90815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        *os << ' ';
90825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      else
90835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        *os << '-';
90845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
90855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    GTEST_SNPRINTF_(text, sizeof(text), "%02X", obj_bytes[j]);
90865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *os << text;
90875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
90885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
90895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints the bytes in the given value to the given ostream.
90915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,
90925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                              ostream* os) {
90935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Tells the user how big the object is.
90945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *os << count << "-byte object <";
90955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
90965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const size_t kThreshold = 132;
90975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const size_t kChunkSize = 64;
90985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // If the object size is bigger than kThreshold, we'll have to omit
90995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // some details by printing only the first and the last kChunkSize
91005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // bytes.
91015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // TODO(wan): let the user control the threshold using a flag.
91025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (count < kThreshold) {
91035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);
91045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
91055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);
91065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *os << " ... ";
91075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Rounds up to 2-byte boundary.
91085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const size_t resume_pos = (count - kChunkSize + 1)/2*2;
91095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);
91105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
91115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *os << ">";
91125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
91135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace
91155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal2 {
91175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Delegates to PrintBytesInObjectToImpl() to print the bytes in the
91195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// given object.  The delegation simplifies the implementation, which
91205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// uses the << operator and thus is easier done outside of the
91215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// ::testing::internal namespace, which contains a << operator that
91225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// sometimes conflicts with the one in STL.
91235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,
91245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                          ostream* os) {
91255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintBytesInObjectToImpl(obj_bytes, count, os);
91265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
91275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal2
91295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
91315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Depending on the value of a char (or wchar_t), we print it in one
91335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// of three formats:
91345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   - as is if it's a printable ASCII (e.g. 'a', '2', ' '),
91355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   - as a hexidecimal escape sequence (e.g. '\x7F'), or
91365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//   - as a special escape sequence (e.g. '\r', '\n').
91375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangenum CharFormat {
91385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  kAsIs,
91395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  kHexEscape,
91405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  kSpecialEscape
91415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang};
91425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns true if c is a printable ASCII character.  We test the
91445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// value of c directly instead of calling isprint(), which is buggy on
91455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Windows Mobile.
91465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuanginline bool IsPrintableAscii(wchar_t c) {
91475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return 0x20 <= c && c <= 0x7E;
91485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
91495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a wide or narrow char c as a character literal without the
91515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// quotes, escaping it when necessary; returns how c was formatted.
91525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The template argument UnsignedChar is the unsigned version of Char,
91535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// which is the type of c.
91545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename UnsignedChar, typename Char>
91555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
91565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  switch (static_cast<wchar_t>(c)) {
91575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case L'\0':
91585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << "\\0";
91595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
91605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case L'\'':
91615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << "\\'";
91625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
91635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case L'\\':
91645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << "\\\\";
91655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
91665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case L'\a':
91675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << "\\a";
91685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
91695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case L'\b':
91705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << "\\b";
91715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
91725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case L'\f':
91735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << "\\f";
91745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
91755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case L'\n':
91765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << "\\n";
91775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
91785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case L'\r':
91795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << "\\r";
91805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
91815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case L'\t':
91825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << "\\t";
91835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
91845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case L'\v':
91855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << "\\v";
91865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      break;
91875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    default:
91885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (IsPrintableAscii(c)) {
91895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        *os << static_cast<char>(c);
91905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        return kAsIs;
91915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      } else {
91925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        *os << "\\x" + String::FormatHexInt(static_cast<UnsignedChar>(c));
91935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        return kHexEscape;
91945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
91955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
91965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return kSpecialEscape;
91975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
91985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
91995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a wchar_t c as if it's part of a string literal, escaping it when
92005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// necessary; returns how c was formatted.
92015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) {
92025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  switch (c) {
92035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case L'\'':
92045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << "'";
92055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return kAsIs;
92065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    case L'"':
92075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << "\\\"";
92085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return kSpecialEscape;
92095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    default:
92105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      return PrintAsCharLiteralTo<wchar_t>(c, os);
92115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
92125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
92135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
92145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a char c as if it's part of a string literal, escaping it when
92155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// necessary; returns how c was formatted.
92165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic CharFormat PrintAsStringLiteralTo(char c, ostream* os) {
92175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return PrintAsStringLiteralTo(
92185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      static_cast<wchar_t>(static_cast<unsigned char>(c)), os);
92195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
92205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
92215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a wide or narrow character c and its code.  '\0' is printed
92225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// as "'\\0'", other unprintable characters are also properly escaped
92235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// using the standard C++ escape sequence.  The template argument
92245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// UnsignedChar is the unsigned version of Char, which is the type of c.
92255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename UnsignedChar, typename Char>
92265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintCharAndCodeTo(Char c, ostream* os) {
92275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // First, print c as a literal in the most readable form we can find.
92285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *os << ((sizeof(c) > 1) ? "L'" : "'");
92295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os);
92305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *os << "'";
92315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
92325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // To aid user debugging, we also print c's code in decimal, unless
92335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // it's 0 (in which case c was printed as '\\0', making the code
92345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // obvious).
92355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (c == 0)
92365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return;
92375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *os << " (" << static_cast<int>(c);
92385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
92395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // For more convenience, we print c's code again in hexidecimal,
92405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // unless c was already printed in the form '\x##' or the code is in
92415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // [1, 9].
92425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (format == kHexEscape || (1 <= c && c <= 9)) {
92435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    // Do nothing.
92445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
92455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *os << ", 0x" << String::FormatHexInt(static_cast<UnsignedChar>(c));
92465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
92475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *os << ")";
92485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
92495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
92505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTo(unsigned char c, ::std::ostream* os) {
92515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintCharAndCodeTo<unsigned char>(c, os);
92525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
92535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTo(signed char c, ::std::ostream* os) {
92545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintCharAndCodeTo<unsigned char>(c, os);
92555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
92565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
92575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a wchar_t as a symbol if it is printable or as its internal
92585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// code otherwise and also as its code.  L'\0' is printed as "L'\\0'".
92595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTo(wchar_t wc, ostream* os) {
92605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintCharAndCodeTo<wchar_t>(wc, os);
92615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
92625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
92635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints the given array of characters to the ostream.  CharType must be either
92645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// char or wchar_t.
92655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The array starts at begin, the length is len, it may include '\0' characters
92665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// and may not be NUL-terminated.
92675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename CharType>
92685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void PrintCharsAsStringTo(
92695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const CharType* begin, size_t len, ostream* os) {
92705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const kQuoteBegin = sizeof(CharType) == 1 ? "\"" : "L\"";
92715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *os << kQuoteBegin;
92725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  bool is_previous_hex = false;
92735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (size_t index = 0; index < len; ++index) {
92745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const CharType cur = begin[index];
92755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (is_previous_hex && IsXDigit(cur)) {
92765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // Previous character is of '\x..' form and this character can be
92775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // interpreted as another hexadecimal digit in its number. Break string to
92785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      // disambiguate.
92795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      *os << "\" " << kQuoteBegin;
92805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
92815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape;
92825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
92835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *os << "\"";
92845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
92855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
92865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a (const) char/wchar_t array of 'len' elements, starting at address
92875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 'begin'.  CharType must be either char or wchar_t.
92885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtemplate <typename CharType>
92895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic void UniversalPrintCharArray(
92905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const CharType* begin, size_t len, ostream* os) {
92915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // The code
92925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //   const char kFoo[] = "foo";
92935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // generates an array of 4, not 3, elements, with the last one being '\0'.
92945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //
92955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Therefore when printing a char array, we don't print the last element if
92965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // it's '\0', such that the output matches the string literal as it's
92975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // written in the source code.
92985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (len > 0 && begin[len - 1] == '\0') {
92995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    PrintCharsAsStringTo(begin, len - 1, os);
93005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return;
93015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
93025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // If, however, the last element in the array is not '\0', e.g.
93045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  //    const char kFoo[] = { 'f', 'o', 'o' };
93055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // we must print the entire array.  We also print a message to indicate
93065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // that the array is not NUL-terminated.
93075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintCharsAsStringTo(begin, len, os);
93085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  *os << " (no terminating NUL)";
93095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
93105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a (const) char array of 'len' elements, starting at address 'begin'.
93125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UniversalPrintArray(const char* begin, size_t len, ostream* os) {
93135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  UniversalPrintCharArray(begin, len, os);
93145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
93155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a (const) wchar_t array of 'len' elements, starting at address
93175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// 'begin'.
93185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) {
93195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  UniversalPrintCharArray(begin, len, os);
93205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
93215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints the given C string to the ostream.
93235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTo(const char* s, ostream* os) {
93245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (s == NULL) {
93255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *os << "NULL";
93265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
93275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *os << ImplicitCast_<const void*>(s) << " pointing to ";
93285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    PrintCharsAsStringTo(s, strlen(s), os);
93295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
93305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
93315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// MSVC compiler can be configured to define whar_t as a typedef
93335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// of unsigned short. Defining an overload for const wchar_t* in that case
93345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// would cause pointers to unsigned shorts be printed as wide strings,
93355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// possibly accessing more memory than intended and causing invalid
93365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
93375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// wchar_t is implemented as a native type.
93385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
93395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints the given wide C string to the ostream.
93405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintTo(const wchar_t* s, ostream* os) {
93415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (s == NULL) {
93425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *os << "NULL";
93435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
93445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    *os << ImplicitCast_<const void*>(s) << " pointing to ";
93455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    PrintCharsAsStringTo(s, wcslen(s), os);
93465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
93475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
93485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // wchar_t is native
93495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a ::string object.
93515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_GLOBAL_STRING
93525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintStringTo(const ::string& s, ostream* os) {
93535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintCharsAsStringTo(s.data(), s.size(), os);
93545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
93555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_GLOBAL_STRING
93565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintStringTo(const ::std::string& s, ostream* os) {
93585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintCharsAsStringTo(s.data(), s.size(), os);
93595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
93605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a ::wstring object.
93625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_GLOBAL_WSTRING
93635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintWideStringTo(const ::wstring& s, ostream* os) {
93645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintCharsAsStringTo(s.data(), s.size(), os);
93655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
93665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_GLOBAL_WSTRING
93675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_STD_WSTRING
93695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid PrintWideStringTo(const ::std::wstring& s, ostream* os) {
93705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  PrintCharsAsStringTo(s.data(), s.size(), os);
93715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
93725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_STD_WSTRING
93735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
93755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
93765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
93775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2008, Google Inc.
93785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All rights reserved.
93795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
93805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
93815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
93825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
93835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
93845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
93855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
93865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
93875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
93885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
93895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
93905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
93915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
93925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
93935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
93945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
93955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
93965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
93975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
93985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
93995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
94005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
94015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
94025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
94035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
94045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
94055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
94065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: mheule@google.com (Markus Heule)
94075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
94085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// The Google C++ Testing Framework (Google Test)
94095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Indicates that this translation unit is part of Google Test's
94125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// implementation.  It must come before gtest-internal-inl.h is
94135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// included, or there will be a compiler error.  This trick is to
94145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// prevent a user from accidentally including gtest-internal-inl.h in
94155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// his code.
94165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define GTEST_IMPLEMENTATION_ 1
94175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#undef GTEST_IMPLEMENTATION_
94185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
94205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangusing internal::GetUnitTestImpl;
94225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Gets the summary of the failure message by omitting the stack trace
94245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in it.
94255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::string TestPartResult::ExtractSummary(const char* message) {
94265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const char* const stack_trace = strstr(message, internal::kStackTraceMarker);
94275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return stack_trace == NULL ? message :
94285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      std::string(message, stack_trace);
94295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
94305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Prints a TestPartResult object.
94325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstd::ostream& operator<<(std::ostream& os, const TestPartResult& result) {
94335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return os
94345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << result.file_name() << ":" << result.line_number() << ": "
94355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << (result.type() == TestPartResult::kSuccess ? "Success" :
94365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          result.type() == TestPartResult::kFatalFailure ? "Fatal failure" :
94375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang          "Non-fatal failure") << ":\n"
94385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      << result.message() << std::endl;
94395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
94405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Appends a TestPartResult to the array.
94425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid TestPartResultArray::Append(const TestPartResult& result) {
94435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  array_.push_back(result);
94445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
94455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the TestPartResult at the given index (0-based).
94475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {
94485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (index < 0 || index >= size()) {
94495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    printf("\nInvalid index (%d) into TestPartResultArray.\n", index);
94505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    internal::posix::Abort();
94515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
94525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return array_[index];
94545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
94555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Returns the number of TestPartResult objects in the array.
94575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint TestPartResultArray::size() const {
94585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return static_cast<int>(array_.size());
94595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
94605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
94625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangHasNewFatalFailureHelper::HasNewFatalFailureHelper()
94645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    : has_new_fatal_failure_(false),
94655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      original_reporter_(GetUnitTestImpl()->
94665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                         GetTestPartResultReporterForCurrentThread()) {
94675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);
94685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
94695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangHasNewFatalFailureHelper::~HasNewFatalFailureHelper() {
94715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(
94725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      original_reporter_);
94735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
94745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid HasNewFatalFailureHelper::ReportTestPartResult(
94765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const TestPartResult& result) {
94775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (result.fatally_failed())
94785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    has_new_fatal_failure_ = true;
94795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  original_reporter_->ReportTestPartResult(result);
94805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
94815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
94835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
94845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
94855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Copyright 2008 Google Inc.
94865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// All Rights Reserved.
94875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
94885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Redistribution and use in source and binary forms, with or without
94895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// modification, are permitted provided that the following conditions are
94905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// met:
94915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
94925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions of source code must retain the above copyright
94935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// notice, this list of conditions and the following disclaimer.
94945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Redistributions in binary form must reproduce the above
94955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// copyright notice, this list of conditions and the following disclaimer
94965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// in the documentation and/or other materials provided with the
94975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// distribution.
94985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//     * Neither the name of Google Inc. nor the names of its
94995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contributors may be used to endorse or promote products derived from
95005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// this software without specific prior written permission.
95015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
95025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
95035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
95045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
95055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
95065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
95075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
95085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
95095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
95105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
95115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
95125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
95135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang//
95145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Author: wan@google.com (Zhanyong Wan)
95155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace testing {
95185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangnamespace internal {
95195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#if GTEST_HAS_TYPED_TEST_P
95215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Skips to the first non-space char in str. Returns an empty string if str
95235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// contains only whitespace characters.
95245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic const char* SkipSpaces(const char* str) {
95255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  while (IsSpace(*str))
95265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    str++;
95275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return str;
95285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
95295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// Verifies that registered_tests match the test names in
95315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// defined_test_names_; returns registered_tests if successful, or
95325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang// aborts the program otherwise.
95335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char* TypedTestCasePState::VerifyRegisteredTestNames(
95345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const char* file, int line, const char* registered_tests) {
95355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  typedef ::std::set<const char*>::const_iterator DefinedTestIter;
95365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  registered_ = true;
95375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // Skip initial whitespace in registered_tests since some
95395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  // preprocessors prefix stringizied literals with whitespace.
95405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  registered_tests = SkipSpaces(registered_tests);
95415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  Message errors;
95435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ::std::set<std::string> tests;
95445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (const char* names = registered_tests; names != NULL;
95455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang       names = SkipComma(names)) {
95465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const std::string name = GetPrefixUntilComma(names);
95475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (tests.count(name) != 0) {
95485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      errors << "Test " << name << " is listed more than once.\n";
95495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      continue;
95505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
95515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    bool found = false;
95535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    for (DefinedTestIter it = defined_test_names_.begin();
95545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         it != defined_test_names_.end();
95555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang         ++it) {
95565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      if (name == *it) {
95575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        found = true;
95585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang        break;
95595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      }
95605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
95615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (found) {
95635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      tests.insert(name);
95645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    } else {
95655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      errors << "No test named " << name
95665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang             << " can be found in this test case.\n";
95675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
95685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
95695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  for (DefinedTestIter it = defined_test_names_.begin();
95715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang       it != defined_test_names_.end();
95725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang       ++it) {
95735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    if (tests.count(*it) == 0) {
95745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang      errors << "You forgot to list test " << *it << ".\n";
95755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    }
95765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
95775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  const std::string& errors_str = errors.GetString();
95795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (errors_str != "") {
95805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
95815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang            errors_str.c_str());
95825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    fflush(stderr);
95835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    posix::Abort();
95845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
95855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return registered_tests;
95875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
95885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif  // GTEST_HAS_TYPED_TEST_P
95905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
95915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace internal
95925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}  // namespace testing
9593