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 >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ 2205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang {\ 2215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ 2225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ::testing::ScopedFakeTestPartResultReporter:: \ 2235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang INTERCEPT_ONLY_CURRENT_THREAD, >est_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 >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ 2375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang {\ 2385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ 2395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ::testing::ScopedFakeTestPartResultReporter:: \ 2405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang INTERCEPT_ALL_THREADS, >est_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 >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ 2825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang (substr));\ 2835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang {\ 2845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ 2855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ::testing::ScopedFakeTestPartResultReporter:: \ 2865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang INTERCEPT_ONLY_CURRENT_THREAD, >est_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 >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ 2965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang (substr));\ 2975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang {\ 2985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ 2995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \ 3005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang >est_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 << "<"; 46325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang break; 46335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang case '>': 46345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang m << ">"; 46355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang break; 46365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang case '&': 46375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang m << "&"; 46385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang break; 46395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang case '\'': 46405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (is_attribute) 46415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang m << "'"; 46425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang else 46435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang m << '\''; 46445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang break; 46455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang case '"': 46465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (is_attribute) 46475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang m << """; 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 << "]]>]]><![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 >EST_FLAG(also_run_disabled_tests)) || 63855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ParseBoolFlag(arg, kBreakOnFailureFlag, 63865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang >EST_FLAG(break_on_failure)) || 63875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ParseBoolFlag(arg, kCatchExceptionsFlag, 63885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang >EST_FLAG(catch_exceptions)) || 63895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ParseStringFlag(arg, kColorFlag, >EST_FLAG(color)) || 63905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ParseStringFlag(arg, kDeathTestStyleFlag, 63915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang >EST_FLAG(death_test_style)) || 63925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ParseBoolFlag(arg, kDeathTestUseFork, 63935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang >EST_FLAG(death_test_use_fork)) || 63945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ParseStringFlag(arg, kFilterFlag, >EST_FLAG(filter)) || 63955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ParseStringFlag(arg, kInternalRunDeathTestFlag, 63965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang >EST_FLAG(internal_run_death_test)) || 63975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ParseBoolFlag(arg, kListTestsFlag, >EST_FLAG(list_tests)) || 63985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ParseStringFlag(arg, kOutputFlag, >EST_FLAG(output)) || 63995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ParseBoolFlag(arg, kPrintTimeFlag, >EST_FLAG(print_time)) || 64005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ParseInt32Flag(arg, kRandomSeedFlag, >EST_FLAG(random_seed)) || 64015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ParseInt32Flag(arg, kRepeatFlag, >EST_FLAG(repeat)) || 64025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ParseBoolFlag(arg, kShuffleFlag, >EST_FLAG(shuffle)) || 64035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ParseInt32Flag(arg, kStackTraceDepthFlag, 64045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang >EST_FLAG(stack_trace_depth)) || 64055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ParseStringFlag(arg, kStreamResultToFlag, 64065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang >EST_FLAG(stream_result_to)) || 64075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ParseBoolFlag(arg, kThrowOnFailureFlag, 64085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang >EST_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