10ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2008, Google Inc. 20ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// All rights reserved. 30ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 40ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without 50ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are 60ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// met: 70ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 80ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright 90ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// notice, this list of conditions and the following disclaimer. 100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above 110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// copyright notice, this list of conditions and the following disclaimer 120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the documentation and/or other materials provided with the 130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// distribution. 140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its 150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// contributors may be used to endorse or promote products derived from 160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this software without specific prior written permission. 170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Author: mheule@google.com (Markus Heule) 310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Google C++ Testing Framework (Google Test) 330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Sometimes it's desirable to build Google Test by compiling a single file. 350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This file serves this purpose. 360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This line ensures that gtest.h can be compiled on its own, even 380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// when it's fused. 390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "gtest/gtest.h" 400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The following lines pull in the real gtest *.cc files. 420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2005, Google Inc. 430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// All rights reserved. 440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without 460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are 470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// met: 480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright 500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// notice, this list of conditions and the following disclaimer. 510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above 520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// copyright notice, this list of conditions and the following disclaimer 530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the documentation and/or other materials provided with the 540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// distribution. 550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its 560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// contributors may be used to endorse or promote products derived from 570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this software without specific prior written permission. 580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Author: wan@google.com (Zhanyong Wan) 720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The Google C++ Testing Framework (Google Test) 740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2007, Google Inc. 760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// All rights reserved. 770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without 790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are 800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// met: 810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright 830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// notice, this list of conditions and the following disclaimer. 840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above 850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// copyright notice, this list of conditions and the following disclaimer 860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the documentation and/or other materials provided with the 870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// distribution. 880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its 890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// contributors may be used to endorse or promote products derived from 900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this software without specific prior written permission. 910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 1000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 1040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Author: wan@google.com (Zhanyong Wan) 1050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 1060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Utilities for testing Google Test itself and code that uses Google Test 1070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (e.g. frameworks built on top of Google Test). 1080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_ 1100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_ 1110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace testing { 1140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This helper class can be used to mock out Google Test failure reporting 1160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// so that we can test Google Test or code that builds on Google Test. 1170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 1180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// An object of this class appends a TestPartResult object to the 1190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TestPartResultArray object given in the constructor whenever a Google Test 1200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// failure is reported. It can either intercept only failures that are 1210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// generated in the same thread that created this object or it can intercept 1220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// all generated failures. The scope of this mock object can be controlled with 1230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the second argument to the two arguments constructor. 1240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass GTEST_API_ ScopedFakeTestPartResultReporter 1250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : public TestPartResultReporterInterface { 1260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 1270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The two possible mocking modes of this object. 1280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong enum InterceptMode { 1290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong INTERCEPT_ONLY_CURRENT_THREAD, // Intercepts only thread local failures. 1300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong INTERCEPT_ALL_THREADS // Intercepts all failures. 1310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong }; 1320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The c'tor sets this object as the test part result reporter used 1340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // by Google Test. The 'result' parameter specifies where to report the 1350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // results. This reporter will only catch failures generated in the current 1360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // thread. DEPRECATED 1370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result); 1380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Same as above, but you can choose the interception scope of this object. 1400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ScopedFakeTestPartResultReporter(InterceptMode intercept_mode, 1410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResultArray* result); 1420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The d'tor restores the previous test part result reporter. 1440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual ~ScopedFakeTestPartResultReporter(); 1450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Appends the TestPartResult object to the TestPartResultArray 1470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // received in the constructor. 1480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This method is from the TestPartResultReporterInterface 1500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // interface. 1510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void ReportTestPartResult(const TestPartResult& result); 1520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 1530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void Init(); 1540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const InterceptMode intercept_mode_; 1560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResultReporterInterface* old_reporter_; 1570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResultArray* const result_; 1580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter); 1600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 1610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 1630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A helper class for implementing EXPECT_FATAL_FAILURE() and 1650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// EXPECT_NONFATAL_FAILURE(). Its destructor verifies that the given 1660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TestPartResultArray contains exactly one failure that has the given 1670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// type and contains the given substring. If that's not the case, a 1680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// non-fatal failure will be generated. 1690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass GTEST_API_ SingleFailureChecker { 1700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 1710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The constructor remembers the arguments. 1720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SingleFailureChecker(const TestPartResultArray* results, 1730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResult::Type type, 1740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const string& substr); 1750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ~SingleFailureChecker(); 1760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 1770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestPartResultArray* const results_; 1780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestPartResult::Type type_; 1790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const string substr_; 1800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker); 1820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 1830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 1850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace testing 1870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A set of macros for testing Google Test assertions or code that's expected 1890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// to generate Google Test fatal failures. It verifies that the given 1900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// statement will cause exactly one fatal Google Test failure with 'substr' 1910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// being part of the failure message. 1920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 1930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// There are two different versions of this macro. EXPECT_FATAL_FAILURE only 1940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// affects and considers failures generated in the current thread and 1950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads. 1960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 1970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The verification of the assertion is done correctly even when the statement 1980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// throws an exception or aborts the current function. 1990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 2000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Known restrictions: 2010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// - 'statement' cannot reference local non-static variables or 2020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// non-static members of the current object. 2030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// - 'statement' cannot return a value. 2040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// - You cannot stream a failure message to this macro. 2050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 2060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Note that even though the implementations of the following two 2070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// macros are much alike, we cannot refactor them to use a common 2080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// helper macro, due to some peculiarity in how the preprocessor 2090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// works. The AcceptsMacroThatExpandsToUnprotectedComma test in 2100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// gtest_unittest.cc will fail to compile if we do that. 2110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define EXPECT_FATAL_FAILURE(statement, substr) \ 2120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong do { \ 2130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong class GTestExpectFatalFailureHelper {\ 2140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public:\ 2150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static void Execute() { statement; }\ 2160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong };\ 2170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::testing::TestPartResultArray gtest_failures;\ 2180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::testing::internal::SingleFailureChecker gtest_checker(\ 2190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ 2200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong {\ 2210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ 2220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::testing::ScopedFakeTestPartResultReporter:: \ 2230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ 2240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTestExpectFatalFailureHelper::Execute();\ 2250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong }\ 2260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } while (::testing::internal::AlwaysFalse()) 2270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ 2290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong do { \ 2300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong class GTestExpectFatalFailureHelper {\ 2310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public:\ 2320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static void Execute() { statement; }\ 2330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong };\ 2340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::testing::TestPartResultArray gtest_failures;\ 2350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::testing::internal::SingleFailureChecker gtest_checker(\ 2360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ 2370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong {\ 2380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ 2390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::testing::ScopedFakeTestPartResultReporter:: \ 2400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong INTERCEPT_ALL_THREADS, >est_failures);\ 2410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTestExpectFatalFailureHelper::Execute();\ 2420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong }\ 2430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } while (::testing::internal::AlwaysFalse()) 2440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A macro for testing Google Test assertions or code that's expected to 2460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// generate Google Test non-fatal failures. It asserts that the given 2470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// statement will cause exactly one non-fatal Google Test failure with 'substr' 2480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// being part of the failure message. 2490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 2500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only 2510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// affects and considers failures generated in the current thread and 2520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads. 2530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 2540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 'statement' is allowed to reference local variables and members of 2550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the current object. 2560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 2570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The verification of the assertion is done correctly even when the statement 2580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// throws an exception or aborts the current function. 2590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 2600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Known restrictions: 2610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// - You cannot stream a failure message to this macro. 2620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 2630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Note that even though the implementations of the following two 2640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// macros are much alike, we cannot refactor them to use a common 2650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// helper macro, due to some peculiarity in how the preprocessor 2660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// works. If we do that, the code won't compile when the user gives 2670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that 2680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// expands to code containing an unprotected comma. The 2690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc 2700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// catches that. 2710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 2720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// For the same reason, we have to write 2730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// if (::testing::internal::AlwaysTrue()) { statement; } 2740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// instead of 2750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) 2760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// to avoid an MSVC warning on unreachable code. 2770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define EXPECT_NONFATAL_FAILURE(statement, substr) \ 2780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong do {\ 2790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::testing::TestPartResultArray gtest_failures;\ 2800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::testing::internal::SingleFailureChecker gtest_checker(\ 2810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ 2820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (substr));\ 2830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong {\ 2840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ 2850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::testing::ScopedFakeTestPartResultReporter:: \ 2860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ 2870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (::testing::internal::AlwaysTrue()) { statement; }\ 2880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong }\ 2890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } while (::testing::internal::AlwaysFalse()) 2900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 2910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ 2920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong do {\ 2930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::testing::TestPartResultArray gtest_failures;\ 2940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::testing::internal::SingleFailureChecker gtest_checker(\ 2950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ 2960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (substr));\ 2970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong {\ 2980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ 2990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\ 3000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong >est_failures);\ 3010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (::testing::internal::AlwaysTrue()) { statement; }\ 3020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong }\ 3030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } while (::testing::internal::AlwaysFalse()) 3040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_ 3060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <ctype.h> 3080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <math.h> 3090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <stdarg.h> 3100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <stdio.h> 3110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <stdlib.h> 3120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <wchar.h> 3130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <wctype.h> 3140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <algorithm> 3160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <ostream> // NOLINT 3170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <sstream> 3180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <vector> 3190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_LINUX 3210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TODO(kenton@google.com): Use autoconf to detect availability of 3230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// gettimeofday(). 3240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# define GTEST_HAS_GETTIMEOFDAY_ 1 3250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <fcntl.h> // NOLINT 3270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <limits.h> // NOLINT 3280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <sched.h> // NOLINT 3290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Declares vsnprintf(). This header is not available on Windows. 3300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <strings.h> // NOLINT 3310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <sys/mman.h> // NOLINT 3320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <sys/time.h> // NOLINT 3330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <unistd.h> // NOLINT 3340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <string> 3350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#elif GTEST_OS_SYMBIAN 3370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# define GTEST_HAS_GETTIMEOFDAY_ 1 3380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <sys/time.h> // NOLINT 3390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#elif GTEST_OS_ZOS 3410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# define GTEST_HAS_GETTIMEOFDAY_ 1 3420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <sys/time.h> // NOLINT 3430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// On z/OS we additionally need strings.h for strcasecmp. 3450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <strings.h> // NOLINT 3460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#elif GTEST_OS_WINDOWS_MOBILE // We are on Windows CE. 3480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <windows.h> // NOLINT 3500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#elif GTEST_OS_WINDOWS // We are on Windows proper. 3520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <io.h> // NOLINT 3540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <sys/timeb.h> // NOLINT 3550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <sys/types.h> // NOLINT 3560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <sys/stat.h> // NOLINT 3570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if GTEST_OS_WINDOWS_MINGW 3590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// MinGW has gettimeofday() but not _ftime64(). 3600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TODO(kenton@google.com): Use autoconf to detect availability of 3610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// gettimeofday(). 3620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TODO(kenton@google.com): There are other ways to get the time on 3630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Windows, like GetTickCount() or GetSystemTimeAsFileTime(). MinGW 3640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// supports these. consider using them instead. 3650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# define GTEST_HAS_GETTIMEOFDAY_ 1 3660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <sys/time.h> // NOLINT 3670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // GTEST_OS_WINDOWS_MINGW 3680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// cpplint thinks that the header is already included, so we want to 3700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// silence it. 3710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <windows.h> // NOLINT 3720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 3740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Assume other platforms have gettimeofday(). 3760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TODO(kenton@google.com): Use autoconf to detect availability of 3770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// gettimeofday(). 3780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# define GTEST_HAS_GETTIMEOFDAY_ 1 3790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// cpplint thinks that the header is already included, so we want to 3810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// silence it. 3820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <sys/time.h> // NOLINT 3830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <unistd.h> // NOLINT 3840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_LINUX 3860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_EXCEPTIONS 3880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <stdexcept> 3890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 3900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_CAN_STREAM_RESULTS_ 3920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <arpa/inet.h> // NOLINT 3930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <netdb.h> // NOLINT 3940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 3950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 3960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Indicates that this translation unit is part of Google Test's 3970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// implementation. It must come before gtest-internal-inl.h is 3980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// included, or there will be a compiler error. This trick is to 3990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// prevent a user from accidentally including gtest-internal-inl.h in 4000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// his code. 4010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define GTEST_IMPLEMENTATION_ 1 4020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2005, Google Inc. 4030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// All rights reserved. 4040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 4050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without 4060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are 4070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// met: 4080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 4090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright 4100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// notice, this list of conditions and the following disclaimer. 4110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above 4120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// copyright notice, this list of conditions and the following disclaimer 4130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the documentation and/or other materials provided with the 4140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// distribution. 4150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its 4160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// contributors may be used to endorse or promote products derived from 4170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this software without specific prior written permission. 4180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 4190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 4200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 4210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 4220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 4230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 4240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 4250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 4260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 4270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 4280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 4290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 4300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Utility functions and classes used by the Google C++ testing framework. 4320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 4330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Author: wan@google.com (Zhanyong Wan) 4340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 4350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This file contains purely Google Test's internal implementation. Please 4360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// DO NOT #INCLUDE IT IN A USER PROGRAM. 4370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_ 4390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define GTEST_SRC_GTEST_INTERNAL_INL_H_ 4400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is 4420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// part of Google Test's implementation; otherwise it's undefined. 4430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if !GTEST_IMPLEMENTATION_ 4440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A user is trying to include this from his code - just say no. 4450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# error "gtest-internal-inl.h is part of Google Test's internal implementation." 4460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# error "It must not be included except by Google Test itself." 4470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_IMPLEMENTATION_ 4480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#ifndef _WIN32_WCE 4500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <errno.h> 4510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // !_WIN32_WCE 4520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <stddef.h> 4530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <stdlib.h> // For strtoll/_strtoul64/malloc/free. 4540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <string.h> // For memmove. 4550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <algorithm> 4570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <string> 4580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <vector> 4590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS 4620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <windows.h> // NOLINT 4630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS 4640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace testing { 4670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Declares the flags. 4690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 4700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// We don't want the users to modify this flag in the code, but want 4710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Google Test's own unit tests to be able to access it. Therefore we 4720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// declare it here as opposed to in gtest.h. 4730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DECLARE_bool_(death_test_use_fork); 4740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 4760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The value of GetTestTypeId() as seen from within the Google Test 4780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// library. This is solely for testing GetTestTypeId(). 4790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ extern const TypeId kTestTypeIdInGoogleTest; 4800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Names of the flags (needed for parsing Google Test flags). 4820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests"; 4830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kBreakOnFailureFlag[] = "break_on_failure"; 4840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kCatchExceptionsFlag[] = "catch_exceptions"; 4850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kColorFlag[] = "color"; 4860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kFilterFlag[] = "filter"; 4870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kListTestsFlag[] = "list_tests"; 4880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kOutputFlag[] = "output"; 4890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kPrintTimeFlag[] = "print_time"; 4900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kRandomSeedFlag[] = "random_seed"; 4910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kRepeatFlag[] = "repeat"; 4920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kShuffleFlag[] = "shuffle"; 4930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kStackTraceDepthFlag[] = "stack_trace_depth"; 4940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kStreamResultToFlag[] = "stream_result_to"; 4950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kThrowOnFailureFlag[] = "throw_on_failure"; 4960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 4970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A valid random seed must be in [1, kMaxRandomSeed]. 4980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst int kMaxRandomSeed = 99999; 4990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// g_help_flag is true iff the --help flag or an equivalent form is 5010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// specified on the command line. 5020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ extern bool g_help_flag; 5030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the current time in milliseconds. 5050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ TimeInMillis GetTimeInMillis(); 5060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff Google Test should use colors in the output. 5080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ bool ShouldUseColor(bool stdout_is_tty); 5090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Formats the given time in milliseconds as seconds. 5110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms); 5120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Parses a string for an Int32 flag, in the form of "--flag=value". 5140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 5150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// On success, stores the value of the flag in *value, and returns 5160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// true. On failure, returns false without changing *value. 5170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ bool ParseInt32Flag( 5180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* str, const char* flag, Int32* value); 5190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns a random seed in range [1, kMaxRandomSeed] based on the 5210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// given --gtest_random_seed flag value. 5220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Konginline int GetRandomSeedFromFlag(Int32 random_seed_flag) { 5230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const unsigned int raw_seed = (random_seed_flag == 0) ? 5240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static_cast<unsigned int>(GetTimeInMillis()) : 5250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static_cast<unsigned int>(random_seed_flag); 5260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Normalizes the actual seed to range [1, kMaxRandomSeed] such that 5280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // it's easy to type. 5290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int normalized_seed = 5300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static_cast<int>((raw_seed - 1U) % 5310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static_cast<unsigned int>(kMaxRandomSeed)) + 1; 5320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return normalized_seed; 5330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 5340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the first valid random seed after 'seed'. The behavior is 5360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// undefined if 'seed' is invalid. The seed after kMaxRandomSeed is 5370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// considered to be 1. 5380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Konginline int GetNextRandomSeed(int seed) { 5390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed) 5400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Invalid random seed " << seed << " - must be in [1, " 5410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << kMaxRandomSeed << "]."; 5420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int next_seed = seed + 1; 5430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (next_seed > kMaxRandomSeed) ? 1 : next_seed; 5440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 5450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This class saves the values of all Google Test flags in its c'tor, and 5470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// restores them in its d'tor. 5480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass GTestFlagSaver { 5490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 5500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The c'tor. 5510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTestFlagSaver() { 5520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests); 5530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break_on_failure_ = GTEST_FLAG(break_on_failure); 5540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong catch_exceptions_ = GTEST_FLAG(catch_exceptions); 5550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong color_ = GTEST_FLAG(color); 5560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong death_test_style_ = GTEST_FLAG(death_test_style); 5570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong death_test_use_fork_ = GTEST_FLAG(death_test_use_fork); 5580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong filter_ = GTEST_FLAG(filter); 5590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal_run_death_test_ = GTEST_FLAG(internal_run_death_test); 5600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong list_tests_ = GTEST_FLAG(list_tests); 5610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong output_ = GTEST_FLAG(output); 5620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong print_time_ = GTEST_FLAG(print_time); 5630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong random_seed_ = GTEST_FLAG(random_seed); 5640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong repeat_ = GTEST_FLAG(repeat); 5650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong shuffle_ = GTEST_FLAG(shuffle); 5660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong stack_trace_depth_ = GTEST_FLAG(stack_trace_depth); 5670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong stream_result_to_ = GTEST_FLAG(stream_result_to); 5680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong throw_on_failure_ = GTEST_FLAG(throw_on_failure); 5690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 5700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 5710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The d'tor is not virtual. DO NOT INHERIT FROM THIS CLASS. 5720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ~GTestFlagSaver() { 5730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_; 5740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(break_on_failure) = break_on_failure_; 5750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(catch_exceptions) = catch_exceptions_; 5760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(color) = color_; 5770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(death_test_style) = death_test_style_; 5780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(death_test_use_fork) = death_test_use_fork_; 5790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(filter) = filter_; 5800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(internal_run_death_test) = internal_run_death_test_; 5810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(list_tests) = list_tests_; 5820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(output) = output_; 5830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(print_time) = print_time_; 5840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(random_seed) = random_seed_; 5850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(repeat) = repeat_; 5860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(shuffle) = shuffle_; 5870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(stack_trace_depth) = stack_trace_depth_; 5880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(stream_result_to) = stream_result_to_; 5890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(throw_on_failure) = throw_on_failure_; 5900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 5910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 5920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Fields for saving the original values of flags. 5930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool also_run_disabled_tests_; 5940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool break_on_failure_; 5950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool catch_exceptions_; 5960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String color_; 5970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String death_test_style_; 5980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool death_test_use_fork_; 5990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String filter_; 6000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String internal_run_death_test_; 6010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool list_tests_; 6020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String output_; 6030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool print_time_; 6040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool pretty_; 6050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::Int32 random_seed_; 6060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::Int32 repeat_; 6070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool shuffle_; 6080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::Int32 stack_trace_depth_; 6090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String stream_result_to_; 6100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool throw_on_failure_; 6110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} GTEST_ATTRIBUTE_UNUSED_; 6120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Converts a Unicode code point to a narrow string in UTF-8 encoding. 6140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// code_point parameter is of type UInt32 because wchar_t may not be 6150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// wide enough to contain a code point. 6160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The output buffer str must containt at least 32 characters. 6170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The function returns the address of the output buffer. 6180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// If the code_point is not a valid Unicode code point 6190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output 6200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// as '(Invalid Unicode 0xXXXXXXXX)'. 6210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ char* CodePointToUtf8(UInt32 code_point, char* str); 6220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Converts a wide string to a narrow string in UTF-8 encoding. 6240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The wide string is assumed to have the following encoding: 6250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS) 6260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// UTF-32 if sizeof(wchar_t) == 4 (on Linux) 6270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Parameter str points to a null-terminated wide string. 6280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Parameter num_chars may additionally limit the number 6290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// of wchar_t characters processed. -1 is used when the entire string 6300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// should be processed. 6310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// If the string contains code points that are not valid Unicode code points 6320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output 6330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding 6340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// and contains invalid UTF-16 surrogate pairs, values in those pairs 6350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// will be encoded as individual Unicode characters from Basic Normal Plane. 6360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ String WideStringToUtf8(const wchar_t* str, int num_chars); 6370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file 6390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// if the variable is present. If a file already exists at this location, this 6400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// function will write over it. If the variable is present, but the file cannot 6410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// be created, prints an error and exits. 6420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid WriteToShardStatusFileIfNeeded(); 6430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Checks whether sharding is enabled by examining the relevant 6450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// environment variable values. If the variables are present, 6460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// but inconsistent (e.g., shard_index >= total_shards), prints 6470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// an error and exits. If in_subprocess_for_death_test, sharding is 6480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// disabled because it must only be applied to the original test 6490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// process. Otherwise, we could filter out death tests we intended to execute. 6500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ bool ShouldShard(const char* total_shards_str, 6510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* shard_index_str, 6520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool in_subprocess_for_death_test); 6530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Parses the environment variable var as an Int32. If it is unset, 6550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// returns default_val. If it is not an Int32, prints an error and 6560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// and aborts. 6570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val); 6580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Given the total number of shards, the shard index, and the test id, 6600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// returns true iff the test should be run on this shard. The test id is 6610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// some arbitrary but unique non-negative integer assigned to each test 6620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// method. Assumes that 0 <= shard_index < total_shards. 6630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ bool ShouldRunTestOnShard( 6640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int total_shards, int shard_index, int test_id); 6650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// STL container utilities. 6670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the number of elements in the given container that satisfy 6690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the given predicate. 6700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate <class Container, typename Predicate> 6710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Konginline int CountIf(const Container& c, Predicate predicate) { 6720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Implemented as an explicit loop since std::count_if() in libCstd on 6730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Solaris has a non-standard signature. 6740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int count = 0; 6750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) { 6760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (predicate(*it)) 6770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ++count; 6780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 6790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return count; 6800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 6810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Applies a function/functor to each element in the container. 6830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate <class Container, typename Functor> 6840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid ForEach(const Container& c, Functor functor) { 6850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::for_each(c.begin(), c.end(), functor); 6860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 6870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the i-th element of the vector, or default_value if i is not 6890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in range [0, v.size()). 6900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate <typename E> 6910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Konginline E GetElementOr(const std::vector<E>& v, int i, E default_value) { 6920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i]; 6930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 6940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 6950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Performs an in-place shuffle of a range of the vector's elements. 6960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 'begin' and 'end' are element indices as an STL-style range; 6970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// i.e. [begin, end) are shuffled, where 'end' == size() means to 6980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// shuffle to the end of the vector. 6990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate <typename E> 7000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid ShuffleRange(internal::Random* random, int begin, int end, 7010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::vector<E>* v) { 7020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int size = static_cast<int>(v->size()); 7030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_CHECK_(0 <= begin && begin <= size) 7040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Invalid shuffle range start " << begin << ": must be in range [0, " 7050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << size << "]."; 7060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_CHECK_(begin <= end && end <= size) 7070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Invalid shuffle range finish " << end << ": must be in range [" 7080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << begin << ", " << size << "]."; 7090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 7100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Fisher-Yates shuffle, from 7110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle 7120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int range_width = end - begin; range_width >= 2; range_width--) { 7130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int last_in_range = begin + range_width - 1; 7140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int selected = begin + random->Generate(range_width); 7150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::swap((*v)[selected], (*v)[last_in_range]); 7160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 7170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 7180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 7190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Performs an in-place shuffle of the vector's elements. 7200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate <typename E> 7210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Konginline void Shuffle(internal::Random* random, std::vector<E>* v) { 7220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ShuffleRange(random, 0, static_cast<int>(v->size()), v); 7230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 7240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 7250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A function for deleting an object. Handy for being used as a 7260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// functor. 7270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate <typename T> 7280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic void Delete(T* x) { 7290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong delete x; 7300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 7310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 7320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A predicate that checks the key of a TestProperty against a known key. 7330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 7340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TestPropertyKeyIs is copyable. 7350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass TestPropertyKeyIs { 7360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 7370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Constructor. 7380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 7390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TestPropertyKeyIs has NO default constructor. 7400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong explicit TestPropertyKeyIs(const char* key) 7410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : key_(key) {} 7420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 7430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns true iff the test name of test property matches on key_. 7440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool operator()(const TestProperty& test_property) const { 7450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return String(test_property.key()).Compare(key_) == 0; 7460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 7470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 7480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 7490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String key_; 7500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 7510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 7520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Class UnitTestOptions. 7530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 7540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This class contains functions for processing options the user 7550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// specifies when running the tests. It has only static members. 7560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 7570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// In most cases, the user can specify an option using either an 7580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// environment variable or a command line flag. E.g. you can set the 7590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// test filter using either GTEST_FILTER or --gtest_filter. If both 7600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the variable and the flag are present, the latter overrides the 7610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// former. 7620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass GTEST_API_ UnitTestOptions { 7630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 7640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Functions for processing the gtest_output flag. 7650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 7660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns the output format, or "" for normal printed output. 7670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static String GetOutputFormat(); 7680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 7690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns the absolute path of the requested output file, or the 7700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // default (test_detail.xml in the original working directory) if 7710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // none was explicitly specified. 7720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static String GetAbsolutePathToOutputFile(); 7730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 7740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Functions for processing the gtest_filter flag. 7750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 7760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns true iff the wildcard pattern matches the string. The 7770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // first ':' or '\0' character in pattern marks the end of it. 7780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 7790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This recursive algorithm isn't very efficient, but is clear and 7800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // works well enough for matching test names, which are short. 7810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static bool PatternMatchesString(const char *pattern, const char *str); 7820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 7830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns true iff the user-specified filter matches the test case 7840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // name and the test name. 7850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static bool FilterMatchesTest(const String &test_case_name, 7860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String &test_name); 7870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 7880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS 7890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Function for supporting the gtest_catch_exception flag. 7900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 7910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the 7920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise. 7930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This function is useful as an __except condition. 7940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static int GTestShouldProcessSEH(DWORD exception_code); 7950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS 7960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 7970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns true if "name" matches the ':' separated list of glob-style 7980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // filters in "filter". 7990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static bool MatchesFilter(const String& name, const char* filter); 8000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 8010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 8020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the current application's name, removing directory path if that 8030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// is present. Used by UnitTestOptions::GetOutputFile. 8040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ FilePath GetCurrentExecutableName(); 8050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 8060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The role interface for getting the OS stack trace as a string. 8070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass OsStackTraceGetterInterface { 8080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 8090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong OsStackTraceGetterInterface() {} 8100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual ~OsStackTraceGetterInterface() {} 8110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 8120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns the current OS stack trace as a String. Parameters: 8130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 8140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // max_depth - the maximum number of stack frames to be included 8150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // in the trace. 8160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // skip_count - the number of top frames to be skipped; doesn't count 8170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // against max_depth. 8180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual String CurrentStackTrace(int max_depth, int skip_count) = 0; 8190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 8200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // UponLeavingGTest() should be called immediately before Google Test calls 8210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // user code. It saves some information about the current stack that 8220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // CurrentStackTrace() will use to find and hide Google Test stack frames. 8230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void UponLeavingGTest() = 0; 8240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 8250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 8260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface); 8270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 8280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 8290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A working implementation of the OsStackTraceGetterInterface interface. 8300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass OsStackTraceGetter : public OsStackTraceGetterInterface { 8310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 8320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong OsStackTraceGetter() : caller_frame_(NULL) {} 8330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual String CurrentStackTrace(int max_depth, int skip_count); 8340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void UponLeavingGTest(); 8350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 8360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This string is inserted in place of stack frames that are part of 8370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Google Test's implementation. 8380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static const char* const kElidedFramesMarker; 8390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 8400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 8410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Mutex mutex_; // protects all internal state 8420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 8430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We save the stack frame below the frame that calls user code. 8440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We do this because the address of the frame immediately below 8450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the user code changes between the call to UponLeavingGTest() 8460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // and any calls to CurrentStackTrace() from within the user code. 8470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void* caller_frame_; 8480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 8490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter); 8500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 8510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 8520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Information about a Google Test trace point. 8530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstruct TraceInfo { 8540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* file; 8550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int line; 8560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String message; 8570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 8580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 8590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This is the default global test part result reporter used in UnitTestImpl. 8600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This class should only be used by UnitTestImpl. 8610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass DefaultGlobalTestPartResultReporter 8620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : public TestPartResultReporterInterface { 8630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 8640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test); 8650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Implements the TestPartResultReporterInterface. Reports the test part 8660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // result in the current test. 8670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void ReportTestPartResult(const TestPartResult& result); 8680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 8690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 8700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnitTestImpl* const unit_test_; 8710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 8720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter); 8730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 8740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 8750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This is the default per thread test part result reporter used in 8760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// UnitTestImpl. This class should only be used by UnitTestImpl. 8770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass DefaultPerThreadTestPartResultReporter 8780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : public TestPartResultReporterInterface { 8790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 8800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test); 8810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Implements the TestPartResultReporterInterface. The implementation just 8820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // delegates to the current global test part result reporter of *unit_test_. 8830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void ReportTestPartResult(const TestPartResult& result); 8840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 8850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 8860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnitTestImpl* const unit_test_; 8870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 8880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter); 8890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 8900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 8910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The private implementation of the UnitTest class. We don't protect 8920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the methods under a mutex, as this class is not accessible by a 8930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// user and the UnitTest class that delegates work to this class does 8940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// proper locking. 8950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass GTEST_API_ UnitTestImpl { 8960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 8970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong explicit UnitTestImpl(UnitTest* parent); 8980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual ~UnitTestImpl(); 8990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // There are two different ways to register your own TestPartResultReporter. 9010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // You can register your own repoter to listen either only for test results 9020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // from the current thread or for results from all threads. 9030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // By default, each per-thread test result repoter just passes a new 9040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TestPartResult to the global test result reporter, which registers the 9050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // test part result for the currently running test. 9060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns the global test part result reporter. 9080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResultReporterInterface* GetGlobalTestPartResultReporter(); 9090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Sets the global test part result reporter. 9110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void SetGlobalTestPartResultReporter( 9120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResultReporterInterface* reporter); 9130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns the test part result reporter for the current thread. 9150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread(); 9160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Sets the test part result reporter for the current thread. 9180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void SetTestPartResultReporterForCurrentThread( 9190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResultReporterInterface* reporter); 9200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the number of successful test cases. 9220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int successful_test_case_count() const; 9230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the number of failed test cases. 9250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int failed_test_case_count() const; 9260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the number of all test cases. 9280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int total_test_case_count() const; 9290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the number of all test cases that contain at least one test 9310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // that should run. 9320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int test_case_to_run_count() const; 9330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the number of successful tests. 9350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int successful_test_count() const; 9360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the number of failed tests. 9380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int failed_test_count() const; 9390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the number of disabled tests. 9410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int disabled_test_count() const; 9420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the number of all tests. 9440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int total_test_count() const; 9450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the number of tests that should run. 9470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int test_to_run_count() const; 9480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the elapsed time, in milliseconds. 9500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TimeInMillis elapsed_time() const { return elapsed_time_; } 9510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns true iff the unit test passed (i.e. all test cases passed). 9530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool Passed() const { return !Failed(); } 9540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns true iff the unit test failed (i.e. some test case failed 9560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // or something outside of all tests failed). 9570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool Failed() const { 9580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed(); 9590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 9600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the i-th test case among all the test cases. i can range from 0 to 9620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // total_test_case_count() - 1. If i is not in that range, returns NULL. 9630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestCase* GetTestCase(int i) const { 9640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int index = GetElementOr(test_case_indices_, i, -1); 9650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return index < 0 ? NULL : test_cases_[i]; 9660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 9670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the i-th test case among all the test cases. i can range from 0 to 9690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // total_test_case_count() - 1. If i is not in that range, returns NULL. 9700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestCase* GetMutableTestCase(int i) { 9710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int index = GetElementOr(test_case_indices_, i, -1); 9720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return index < 0 ? NULL : test_cases_[index]; 9730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 9740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Provides access to the event listener list. 9760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestEventListeners* listeners() { return &listeners_; } 9770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns the TestResult for the test that's currently running, or 9790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the TestResult for the ad hoc test if no test is running. 9800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestResult* current_test_result(); 9810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns the TestResult for the ad hoc test. 9830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; } 9840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Sets the OS stack trace getter. 9860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 9870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Does nothing if the input and the current OS stack trace getter 9880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // are the same; otherwise, deletes the old getter and makes the 9890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // input the current getter. 9900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter); 9910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns the current OS stack trace getter if it is not NULL; 9930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // otherwise, creates an OsStackTraceGetter, makes it the current 9940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // getter, and returns it. 9950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong OsStackTraceGetterInterface* os_stack_trace_getter(); 9960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 9970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns the current OS stack trace as a String. 9980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 9990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The maximum number of stack frames to be included is specified by 10000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the gtest_stack_trace_depth flag. The skip_count parameter 10010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // specifies the number of top frames to be skipped, which doesn't 10020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // count against the number of frames to be included. 10030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 10040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // For example, if Foo() calls Bar(), which in turn calls 10050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // CurrentOsStackTraceExceptTop(1), Foo() will be included in the 10060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // trace but Bar() and CurrentOsStackTraceExceptTop() won't. 10070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String CurrentOsStackTraceExceptTop(int skip_count); 10080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 10090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Finds and returns a TestCase with the given name. If one doesn't 10100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // exist, creates one and returns it. 10110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 10120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Arguments: 10130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 10140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // test_case_name: name of the test case 10150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // type_param: the name of the test's type parameter, or NULL if 10160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // this is not a typed or a type-parameterized test. 10170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // set_up_tc: pointer to the function that sets up the test case 10180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // tear_down_tc: pointer to the function that tears down the test case 10190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestCase* GetTestCase(const char* test_case_name, 10200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* type_param, 10210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Test::SetUpTestCaseFunc set_up_tc, 10220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Test::TearDownTestCaseFunc tear_down_tc); 10230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 10240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Adds a TestInfo to the unit test. 10250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 10260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Arguments: 10270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 10280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // set_up_tc: pointer to the function that sets up the test case 10290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // tear_down_tc: pointer to the function that tears down the test case 10300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // test_info: the TestInfo object 10310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc, 10320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Test::TearDownTestCaseFunc tear_down_tc, 10330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestInfo* test_info) { 10340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // In order to support thread-safe death tests, we need to 10350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // remember the original working directory when the test program 10360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // was first invoked. We cannot do this in RUN_ALL_TESTS(), as 10370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the user may have changed the current directory before calling 10380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // RUN_ALL_TESTS(). Therefore we capture the current directory in 10390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // AddTestInfo(), which is called to register a TEST or TEST_F 10400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // before main() is reached. 10410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (original_working_dir_.IsEmpty()) { 10420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong original_working_dir_.Set(FilePath::GetCurrentDir()); 10430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_CHECK_(!original_working_dir_.IsEmpty()) 10440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Failed to get the current working directory."; 10450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 10460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 10470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetTestCase(test_info->test_case_name(), 10480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_info->type_param(), 10490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_up_tc, 10500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong tear_down_tc)->AddTestInfo(test_info); 10510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 10520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 10530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_PARAM_TEST 10540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns ParameterizedTestCaseRegistry object used to keep track of 10550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // value-parameterized tests and instantiate and register them. 10560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::ParameterizedTestCaseRegistry& parameterized_test_registry() { 10570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return parameterized_test_registry_; 10580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 10590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_PARAM_TEST 10600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 10610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Sets the TestCase object for the test that's currently running. 10620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void set_current_test_case(TestCase* a_current_test_case) { 10630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong current_test_case_ = a_current_test_case; 10640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 10650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 10660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Sets the TestInfo object for the test that's currently running. If 10670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // current_test_info is NULL, the assertion results will be stored in 10680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // ad_hoc_test_result_. 10690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void set_current_test_info(TestInfo* a_current_test_info) { 10700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong current_test_info_ = a_current_test_info; 10710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 10720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 10730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Registers all parameterized tests defined using TEST_P and 10740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter 10750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // combination. This method can be called more then once; it has guards 10760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // protecting from registering the tests more then once. If 10770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // value-parameterized tests are disabled, RegisterParameterizedTests is 10780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // present but does nothing. 10790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void RegisterParameterizedTests(); 10800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 10810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Runs all tests in this UnitTest object, prints the result, and 10820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // returns true if all tests are successful. If any exception is 10830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // thrown during a test, this test is considered to be failed, but 10840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the rest of the tests will still be run. 10850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool RunAllTests(); 10860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 10870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Clears the results of all tests, except the ad hoc tests. 10880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void ClearNonAdHocTestResult() { 10890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ForEach(test_cases_, TestCase::ClearTestCaseResult); 10900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 10910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 10920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Clears the results of ad-hoc test assertions. 10930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void ClearAdHocTestResult() { 10940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ad_hoc_test_result_.Clear(); 10950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 10960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 10970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong enum ReactionToSharding { 10980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong HONOR_SHARDING_PROTOCOL, 10990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong IGNORE_SHARDING_PROTOCOL 11000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong }; 11010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Matches the full name of each test against the user-specified 11030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // filter to decide whether the test should run, then records the 11040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // result in each TestCase and TestInfo object. 11050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests 11060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // based on sharding variables in the environment. 11070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns the number of tests that should run. 11080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int FilterTests(ReactionToSharding shard_tests); 11090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Prints the names of the tests matching the user-specified filter flag. 11110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void ListTestsMatchingFilter(); 11120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestCase* current_test_case() const { return current_test_case_; } 11140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestInfo* current_test_info() { return current_test_info_; } 11150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestInfo* current_test_info() const { return current_test_info_; } 11160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns the vector of environments that need to be set-up/torn-down 11180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // before/after the tests are run. 11190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::vector<Environment*>& environments() { return environments_; } 11200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Getters for the per-thread Google Test trace stack. 11220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::vector<TraceInfo>& gtest_trace_stack() { 11230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return *(gtest_trace_stack_.pointer()); 11240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 11250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const std::vector<TraceInfo>& gtest_trace_stack() const { 11260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return gtest_trace_stack_.get(); 11270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 11280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_DEATH_TEST 11300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void InitDeathTestSubprocessControlInfo() { 11310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag()); 11320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 11330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns a pointer to the parsed --gtest_internal_run_death_test 11340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // flag, or NULL if that flag was not specified. 11350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This information is useful only in a death test child process. 11360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Must not be called before a call to InitGoogleTest. 11370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const InternalRunDeathTestFlag* internal_run_death_test_flag() const { 11380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return internal_run_death_test_flag_.get(); 11390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 11400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns a pointer to the current death test factory. 11420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::DeathTestFactory* death_test_factory() { 11430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return death_test_factory_.get(); 11440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 11450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void SuppressTestEventsIfInSubprocess(); 11470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong friend class ReplaceDeathTestFactory; 11490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_DEATH_TEST 11500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Initializes the event listener performing XML output as specified by 11520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // UnitTestOptions. Must not be called before InitGoogleTest. 11530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void ConfigureXmlOutput(); 11540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_CAN_STREAM_RESULTS_ 11560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Initializes the event listener for streaming test results to a socket. 11570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Must not be called before InitGoogleTest. 11580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void ConfigureStreamingOutput(); 11590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 11600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Performs initialization dependent upon flag values obtained in 11620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to 11630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest 11640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // this function is also called from RunAllTests. Since this function can be 11650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // called more than once, it has to be idempotent. 11660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void PostFlagParsingInit(); 11670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the random seed used at the start of the current test iteration. 11690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int random_seed() const { return random_seed_; } 11700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the random number generator. 11720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::Random* random() { return &random_; } 11730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Shuffles all test cases, and the tests within each test case, 11750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // making sure that death tests are still run first. 11760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void ShuffleTests(); 11770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Restores the test cases and tests to their order before the first shuffle. 11790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void UnshuffleTests(); 11800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns the value of GTEST_FLAG(catch_exceptions) at the moment 11820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // UnitTest::Run() starts. 11830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool catch_exceptions() const { return catch_exceptions_; } 11840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 11860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong friend class ::testing::UnitTest; 11870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Used by UnitTest::Run() to capture the state of 11890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // GTEST_FLAG(catch_exceptions) at the moment it starts. 11900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void set_catch_exceptions(bool value) { catch_exceptions_ = value; } 11910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The UnitTest object that owns this implementation object. 11930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnitTest* const parent_; 11940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The working directory when the first TEST() or TEST_F() was 11960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // executed. 11970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::FilePath original_working_dir_; 11980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 11990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The default test part result reporters. 12000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_; 12010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DefaultPerThreadTestPartResultReporter 12020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default_per_thread_test_part_result_reporter_; 12030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Points to (but doesn't own) the global test part result reporter. 12050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResultReporterInterface* global_test_part_result_repoter_; 12060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Protects read and write access to global_test_part_result_reporter_. 12080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::Mutex global_test_part_result_reporter_mutex_; 12090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Points to (but doesn't own) the per-thread test part result reporter. 12110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::ThreadLocal<TestPartResultReporterInterface*> 12120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong per_thread_test_part_result_reporter_; 12130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The vector of environments that need to be set-up/torn-down 12150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // before/after the tests are run. 12160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::vector<Environment*> environments_; 12170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The vector of TestCases in their original order. It owns the 12190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // elements in the vector. 12200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::vector<TestCase*> test_cases_; 12210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Provides a level of indirection for the test case list to allow 12230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // easy shuffling and restoring the test case order. The i-th 12240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // element of this vector is the index of the i-th test case in the 12250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // shuffled order. 12260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::vector<int> test_case_indices_; 12270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_PARAM_TEST 12290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // ParameterizedTestRegistry object used to register value-parameterized 12300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // tests. 12310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::ParameterizedTestCaseRegistry parameterized_test_registry_; 12320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Indicates whether RegisterParameterizedTests() has been called already. 12340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool parameterized_tests_registered_; 12350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_PARAM_TEST 12360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Index of the last death test case registered. Initially -1. 12380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int last_death_test_case_; 12390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This points to the TestCase for the currently running test. It 12410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // changes as Google Test goes through one test case after another. 12420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // When no test is running, this is set to NULL and Google Test 12430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // stores assertion results in ad_hoc_test_result_. Initially NULL. 12440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestCase* current_test_case_; 12450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This points to the TestInfo for the currently running test. It 12470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // changes as Google Test goes through one test after another. When 12480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // no test is running, this is set to NULL and Google Test stores 12490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // assertion results in ad_hoc_test_result_. Initially NULL. 12500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestInfo* current_test_info_; 12510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Normally, a user only writes assertions inside a TEST or TEST_F, 12530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // or inside a function called by a TEST or TEST_F. Since Google 12540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Test keeps track of which test is current running, it can 12550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // associate such an assertion with the test it belongs to. 12560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 12570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If an assertion is encountered when no TEST or TEST_F is running, 12580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Google Test attributes the assertion result to an imaginary "ad hoc" 12590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // test, and records the result in ad_hoc_test_result_. 12600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestResult ad_hoc_test_result_; 12610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The list of event listeners that can be used to track events inside 12630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Google Test. 12640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestEventListeners listeners_; 12650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The OS stack trace getter. Will be deleted when the UnitTest 12670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // object is destructed. By default, an OsStackTraceGetter is used, 12680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // but the user can set this field to use a custom getter if that is 12690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // desired. 12700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong OsStackTraceGetterInterface* os_stack_trace_getter_; 12710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // True iff PostFlagParsingInit() has been called. 12730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool post_flag_parse_init_performed_; 12740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The random number seed used at the beginning of the test run. 12760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int random_seed_; 12770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Our random number generator. 12790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::Random random_; 12800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // How long the test took to run, in milliseconds. 12820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TimeInMillis elapsed_time_; 12830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_DEATH_TEST 12850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The decomposed components of the gtest_internal_run_death_test flag, 12860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // parsed when RUN_ALL_TESTS is called. 12870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_; 12880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_; 12890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_DEATH_TEST 12900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // A per-thread stack of traces created by the SCOPED_TRACE() macro. 12920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_; 12930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests() 12950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // starts. 12960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool catch_exceptions_; 12970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 12980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl); 12990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; // class UnitTestImpl 13000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Convenience function for accessing the global UnitTest 13020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// implementation object. 13030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Konginline UnitTestImpl* GetUnitTestImpl() { 13040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return UnitTest::GetInstance()->impl(); 13050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 13060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_USES_SIMPLE_RE 13080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Internal helper functions for implementing the simple regular 13100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// expression matcher. 13110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ bool IsInSet(char ch, const char* str); 13120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ bool IsAsciiDigit(char ch); 13130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ bool IsAsciiPunct(char ch); 13140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ bool IsRepeat(char ch); 13150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ bool IsAsciiWhiteSpace(char ch); 13160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ bool IsAsciiWordChar(char ch); 13170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ bool IsValidEscape(char ch); 13180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch); 13190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ bool ValidateRegex(const char* regex); 13200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str); 13210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ bool MatchRepetitionAndRegexAtHead( 13220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool escaped, char ch, char repeat, const char* regex, const char* str); 13230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str); 13240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_USES_SIMPLE_RE 13260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Parses the command line for Google Test flags, without initializing 13280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// other parts of Google Test. 13290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv); 13300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv); 13310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_DEATH_TEST 13330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the message describing the last system error, regardless of the 13350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// platform. 13360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ String GetLastErrnoDescription(); 13370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if GTEST_OS_WINDOWS 13390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Provides leak-safe Windows kernel handle ownership. 13400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass AutoHandle { 13410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 13420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong AutoHandle() : handle_(INVALID_HANDLE_VALUE) {} 13430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong explicit AutoHandle(HANDLE handle) : handle_(handle) {} 13440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ~AutoHandle() { Reset(); } 13460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong HANDLE Get() const { return handle_; } 13480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void Reset() { Reset(INVALID_HANDLE_VALUE); } 13490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void Reset(HANDLE handle) { 13500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (handle != handle_) { 13510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (handle_ != INVALID_HANDLE_VALUE) 13520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::CloseHandle(handle_); 13530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong handle_ = handle; 13540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 13550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 13560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 13580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong HANDLE handle_; 13590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle); 13610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 13620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // GTEST_OS_WINDOWS 13630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Attempts to parse a string into a positive integer pointed to by the 13650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// number parameter. Returns true if that is possible. 13660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use 13670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// it here. 13680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate <typename Integer> 13690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool ParseNaturalNumber(const ::std::string& str, Integer* number) { 13700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Fail fast if the given string does not begin with a digit; 13710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // this bypasses strtoXXX's "optional leading whitespace and plus 13720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // or minus sign" semantics, which are undesirable here. 13730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (str.empty() || !IsDigit(str[0])) { 13740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 13750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 13760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong errno = 0; 13770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char* end; 13790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // BiggestConvertible is the largest integer type that system-provided 13800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // string-to-number conversion routines can return. 13810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if GTEST_OS_WINDOWS && !defined(__GNUC__) 13830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // MSVC and C++ Builder define __int64 instead of the standard long long. 13850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong typedef unsigned __int64 BiggestConvertible; 13860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10); 13870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# else 13890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong typedef unsigned long long BiggestConvertible; // NOLINT 13910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10); 13920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // GTEST_OS_WINDOWS && !defined(__GNUC__) 13940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool parse_success = *end == '\0' && errno == 0; 13960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 13970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TODO(vladl@google.com): Convert this to compile time assertion when it is 13980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // available. 13990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed)); 14000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const Integer result = static_cast<Integer>(parsed); 14020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (parse_success && static_cast<BiggestConvertible>(result) == parsed) { 14030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *number = result; 14040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 14050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 14060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 14070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 14080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_DEATH_TEST 14090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TestResult contains some private methods that should be hidden from 14110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Google Test user but are required for testing. This class allow our tests 14120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// to access them. 14130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 14140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This class is supplied only for the purpose of testing Google Test's own 14150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// constructs. Do not use it in user tests, either directly or indirectly. 14160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass TestResultAccessor { 14170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 14180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static void RecordProperty(TestResult* test_result, 14190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestProperty& property) { 14200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_result->RecordProperty(property); 14210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 14220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static void ClearTestPartResults(TestResult* test_result) { 14240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_result->ClearTestPartResults(); 14250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 14260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static const std::vector<testing::TestPartResult>& test_part_results( 14280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestResult& test_result) { 14290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return test_result.test_part_results(); 14300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 14310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 14320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 14340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace testing 14350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_SRC_GTEST_INTERNAL_INL_H_ 14370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#undef GTEST_IMPLEMENTATION_ 14380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS 14400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# define vsnprintf _vsnprintf 14410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS 14420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace testing { 14440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongusing internal::CountIf; 14460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongusing internal::ForEach; 14470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongusing internal::GetElementOr; 14480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongusing internal::Shuffle; 14490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Constants. 14510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A test whose test case name or test name matches this filter is 14530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// disabled and not run. 14540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*"; 14550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A test case whose name matches this filter is considered a death 14570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// test case and will be run before test cases whose name doesn't 14580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// match this filter. 14590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*"; 14600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A test filter that matches everything. 14620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic const char kUniversalFilter[] = "*"; 14630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The default output file for XML output. 14650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic const char kDefaultOutputFile[] = "test_detail.xml"; 14660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The environment variable name for the test shard index. 14680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic const char kTestShardIndex[] = "GTEST_SHARD_INDEX"; 14690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The environment variable name for the total number of test shards. 14700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS"; 14710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The environment variable name for the test shard status file. 14720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE"; 14730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 14750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The text used in failure messages to indicate the start of the 14770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// stack trace. 14780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kStackTraceMarker[] = "\nStack trace:\n"; 14790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// g_help_flag is true iff the --help flag or an equivalent form is 14810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// specified on the command line. 14820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool g_help_flag = false; 14830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 14850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_bool_( 14870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong also_run_disabled_tests, 14880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::BoolFromGTestEnv("also_run_disabled_tests", false), 14890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Run disabled tests too, in addition to the tests normally being run."); 14900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_bool_( 14920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break_on_failure, 14930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::BoolFromGTestEnv("break_on_failure", false), 14940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "True iff a failed assertion should be a debugger break-point."); 14950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 14960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_bool_( 14970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong catch_exceptions, 14980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::BoolFromGTestEnv("catch_exceptions", true), 14990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "True iff " GTEST_NAME_ 15000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong " should catch exceptions and treat them as test failures."); 15010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 15020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_string_( 15030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong color, 15040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::StringFromGTestEnv("color", "auto"), 15050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Whether to use colors in the output. Valid values: yes, no, " 15060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "and auto. 'auto' means to use colors if the output is " 15070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "being sent to a terminal and the TERM environment variable " 15080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "is set to xterm, xterm-color, xterm-256color, linux or cygwin."); 15090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 15100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_string_( 15110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong filter, 15120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::StringFromGTestEnv("filter", kUniversalFilter), 15130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "A colon-separated list of glob (not regex) patterns " 15140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "for filtering the tests to run, optionally followed by a " 15150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "'-' and a : separated list of negative patterns (tests to " 15160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "exclude). A test is run if it matches one of the positive " 15170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "patterns and does not match any of the negative patterns."); 15180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 15190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_bool_(list_tests, false, 15200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "List all tests without running them."); 15210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 15220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_string_( 15230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong output, 15240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::StringFromGTestEnv("output", ""), 15250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "A format (currently must be \"xml\"), optionally followed " 15260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "by a colon and an output file name or directory. A directory " 15270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "is indicated by a trailing pathname separator. " 15280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Examples: \"xml:filename.xml\", \"xml::directoryname/\". " 15290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "If a directory is specified, output files will be created " 15300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "within that directory, with file-names based on the test " 15310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "executable's name and, if necessary, made unique by adding " 15320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "digits."); 15330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 15340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_bool_( 15350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong print_time, 15360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::BoolFromGTestEnv("print_time", true), 15370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "True iff " GTEST_NAME_ 15380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong " should display elapsed time in text output."); 15390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 15400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_int32_( 15410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong random_seed, 15420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::Int32FromGTestEnv("random_seed", 0), 15430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Random number seed to use when shuffling test orders. Must be in range " 15440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "[1, 99999], or 0 to use a seed based on the current time."); 15450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 15460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_int32_( 15470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong repeat, 15480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::Int32FromGTestEnv("repeat", 1), 15490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "How many times to repeat each test. Specify a negative number " 15500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "for repeating forever. Useful for shaking out flaky tests."); 15510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 15520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_bool_( 15530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong show_internal_stack_frames, false, 15540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "True iff " GTEST_NAME_ " should include internal stack frames when " 15550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "printing test failure stack traces."); 15560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 15570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_bool_( 15580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong shuffle, 15590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::BoolFromGTestEnv("shuffle", false), 15600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "True iff " GTEST_NAME_ 15610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong " should randomize tests' order on every run."); 15620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 15630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_int32_( 15640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong stack_trace_depth, 15650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth), 15660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "The maximum number of stack frames to print when an " 15670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "assertion fails. The valid range is 0 through 100, inclusive."); 15680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 15690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_string_( 15700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong stream_result_to, 15710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::StringFromGTestEnv("stream_result_to", ""), 15720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "This flag specifies the host name and the port number on which to stream " 15730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "test results. Example: \"localhost:555\". The flag is effective only on " 15740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Linux."); 15750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 15760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_bool_( 15770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong throw_on_failure, 15780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::BoolFromGTestEnv("throw_on_failure", false), 15790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "When this flag is specified, a failed assertion will throw an exception " 15800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "if exceptions are enabled or exit the program with a non-zero code " 15810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "otherwise."); 15820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 15830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 15840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 15850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Generates a random number from [0, range), using a Linear 15860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Congruential Generator (LCG). Crashes if 'range' is 0 or greater 15870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// than kMaxRange. 15880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongUInt32 Random::Generate(UInt32 range) { 15890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // These constants are the same as are used in glibc's rand(3). 15900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong state_ = (1103515245U*state_ + 12345U) % kMaxRange; 15910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 15920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_CHECK_(range > 0) 15930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Cannot generate a number in the range [0, 0)."; 15940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_CHECK_(range <= kMaxRange) 15950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Generation of a number in [0, " << range << ") was requested, " 15960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "but this can only generate numbers in [0, " << kMaxRange << ")."; 15970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 15980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Converting via modulus introduces a bit of downward bias, but 15990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // it's simple, and a linear congruential generator isn't too good 16000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // to begin with. 16010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return state_ % range; 16020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 16030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 16040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// GTestIsInitialized() returns true iff the user has initialized 16050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Google Test. Useful for catching the user mistake of not initializing 16060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Google Test before calling RUN_ALL_TESTS(). 16070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 16080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A user must call testing::InitGoogleTest() to initialize Google 16090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Test. g_init_gtest_count is set to the number of times 16100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// InitGoogleTest() has been called. We don't protect this variable 16110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// under a mutex as it is only accessed in the main thread. 16120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint g_init_gtest_count = 0; 16130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic bool GTestIsInitialized() { return g_init_gtest_count != 0; } 16140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 16150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Iterates over a vector of TestCases, keeping a running sum of the 16160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// results of calling a given int-returning method on each. 16170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the sum. 16180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic int SumOverTestCaseList(const std::vector<TestCase*>& case_list, 16190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int (TestCase::*method)() const) { 16200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int sum = 0; 16210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t i = 0; i < case_list.size(); i++) { 16220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong sum += (case_list[i]->*method)(); 16230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 16240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return sum; 16250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 16260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 16270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff the test case passed. 16280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic bool TestCasePassed(const TestCase* test_case) { 16290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return test_case->should_run() && test_case->Passed(); 16300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 16310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 16320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff the test case failed. 16330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic bool TestCaseFailed(const TestCase* test_case) { 16340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return test_case->should_run() && test_case->Failed(); 16350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 16360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 16370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff test_case contains at least one test that should 16380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// run. 16390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic bool ShouldRunTestCase(const TestCase* test_case) { 16400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return test_case->should_run(); 16410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 16420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 16430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// AssertHelper constructor. 16440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertHelper::AssertHelper(TestPartResult::Type type, 16450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* file, 16460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int line, 16470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* message) 16480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : data_(new AssertHelperData(type, file, line, message)) { 16490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 16500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 16510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertHelper::~AssertHelper() { 16520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong delete data_; 16530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 16540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 16550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Message assignment, for assertion streaming support. 16560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid AssertHelper::operator=(const Message& message) const { 16570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnitTest::GetInstance()-> 16580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong AddTestPartResult(data_->type, data_->file, data_->line, 16590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong AppendUserMessage(data_->message, message), 16600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnitTest::GetInstance()->impl() 16610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ->CurrentOsStackTraceExceptTop(1) 16620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Skips the stack frame for this function itself. 16630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ); // NOLINT 16640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 16650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 16660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Mutex for linked pointers. 16670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex); 16680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 16690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Application pathname gotten in InitGoogleTest. 16700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString g_executable_path; 16710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 16720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the current application's name, removing directory path if that 16730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// is present. 16740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongFilePath GetCurrentExecutableName() { 16750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FilePath result; 16760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 16770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS 16780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result.Set(FilePath(g_executable_path).RemoveExtension("exe")); 16790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 16800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result.Set(FilePath(g_executable_path)); 16810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS 16820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 16830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return result.RemoveDirectoryName(); 16840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 16850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 16860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Functions for processing the gtest_output flag. 16870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 16880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the output format, or "" for normal printed output. 16890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString UnitTestOptions::GetOutputFormat() { 16900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const gtest_output_flag = GTEST_FLAG(output).c_str(); 16910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (gtest_output_flag == NULL) return String(""); 16920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 16930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const colon = strchr(gtest_output_flag, ':'); 16940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (colon == NULL) ? 16950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String(gtest_output_flag) : 16960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String(gtest_output_flag, colon - gtest_output_flag); 16970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 16980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 16990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the name of the requested output file, or the default if none 17000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// was explicitly specified. 17010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString UnitTestOptions::GetAbsolutePathToOutputFile() { 17020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const gtest_output_flag = GTEST_FLAG(output).c_str(); 17030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (gtest_output_flag == NULL) 17040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return String(""); 17050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 17060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const colon = strchr(gtest_output_flag, ':'); 17070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (colon == NULL) 17080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return String(internal::FilePath::ConcatPaths( 17090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::FilePath( 17100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnitTest::GetInstance()->original_working_dir()), 17110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::FilePath(kDefaultOutputFile)).ToString() ); 17120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 17130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::FilePath output_name(colon + 1); 17140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!output_name.IsAbsolutePath()) 17150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TODO(wan@google.com): on Windows \some\path is not an absolute 17160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // path (as its meaning depends on the current drive), yet the 17170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // following logic for turning it into an absolute path is wrong. 17180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Fix it. 17190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong output_name = internal::FilePath::ConcatPaths( 17200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::FilePath(UnitTest::GetInstance()->original_working_dir()), 17210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::FilePath(colon + 1)); 17220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 17230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!output_name.IsDirectory()) 17240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return output_name.ToString(); 17250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 17260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::FilePath result(internal::FilePath::GenerateUniqueFileName( 17270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong output_name, internal::GetCurrentExecutableName(), 17280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetOutputFormat().c_str())); 17290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return result.ToString(); 17300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 17310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 17320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff the wildcard pattern matches the string. The 17330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// first ':' or '\0' character in pattern marks the end of it. 17340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 17350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This recursive algorithm isn't very efficient, but is clear and 17360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// works well enough for matching test names, which are short. 17370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool UnitTestOptions::PatternMatchesString(const char *pattern, 17380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char *str) { 17390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong switch (*pattern) { 17400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case '\0': 17410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case ':': // Either ':' or '\0' marks the end of the pattern. 17420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return *str == '\0'; 17430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case '?': // Matches any single character. 17440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return *str != '\0' && PatternMatchesString(pattern + 1, str + 1); 17450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case '*': // Matches any string (possibly empty) of characters. 17460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (*str != '\0' && PatternMatchesString(pattern, str + 1)) || 17470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PatternMatchesString(pattern + 1, str); 17480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default: // Non-special character. Matches itself. 17490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return *pattern == *str && 17500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PatternMatchesString(pattern + 1, str + 1); 17510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 17520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 17530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 17540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool UnitTestOptions::MatchesFilter(const String& name, const char* filter) { 17550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char *cur_pattern = filter; 17560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (;;) { 17570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (PatternMatchesString(cur_pattern, name.c_str())) { 17580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 17590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 17600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 17610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Finds the next pattern in the filter. 17620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong cur_pattern = strchr(cur_pattern, ':'); 17630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 17640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns if no more pattern can be found. 17650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (cur_pattern == NULL) { 17660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 17670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 17680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 17690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Skips the pattern separater (the ':' character). 17700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong cur_pattern++; 17710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 17720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 17730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 17740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TODO(keithray): move String function implementations to gtest-string.cc. 17750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 17760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff the user-specified filter matches the test case 17770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// name and the test name. 17780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool UnitTestOptions::FilterMatchesTest(const String &test_case_name, 17790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String &test_name) { 17800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String& full_name = String::Format("%s.%s", 17810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_case_name.c_str(), 17820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_name.c_str()); 17830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 17840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Split --gtest_filter at '-', if there is one, to separate into 17850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // positive filter and negative filter portions 17860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const p = GTEST_FLAG(filter).c_str(); 17870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const dash = strchr(p, '-'); 17880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String positive; 17890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String negative; 17900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (dash == NULL) { 17910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong positive = GTEST_FLAG(filter).c_str(); // Whole string is a positive filter 17920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong negative = String(""); 17930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 17940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong positive = String(p, dash - p); // Everything up to the dash 17950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong negative = String(dash+1); // Everything after the dash 17960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (positive.empty()) { 17970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Treat '-test1' as the same as '*-test1' 17980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong positive = kUniversalFilter; 17990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 18000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 18010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 18020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // A filter is a colon-separated list of patterns. It matches a 18030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // test if any pattern in it matches the test. 18040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (MatchesFilter(full_name, positive.c_str()) && 18050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong !MatchesFilter(full_name, negative.c_str())); 18060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 18070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 18080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_SEH 18090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the 18100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise. 18110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This function is useful as an __except condition. 18120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) { 18130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Google Test should handle a SEH exception if: 18140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1. the user wants it to, AND 18150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2. this is not a breakpoint exception, AND 18160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 3. this is not a C++ exception (VC++ implements them via SEH, 18170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // apparently). 18180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 18190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // SEH exception code for C++ exceptions. 18200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // (see http://support.microsoft.com/kb/185294 for more information). 18210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const DWORD kCxxExceptionCode = 0xe06d7363; 18220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 18230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool should_handle = true; 18240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 18250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!GTEST_FLAG(catch_exceptions)) 18260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong should_handle = false; 18270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong else if (exception_code == EXCEPTION_BREAKPOINT) 18280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong should_handle = false; 18290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong else if (exception_code == kCxxExceptionCode) 18300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong should_handle = false; 18310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 18320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH; 18330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 18340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_SEH 18350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 18360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 18370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 18380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The c'tor sets this object as the test part result reporter used by 18390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Google Test. The 'result' parameter specifies where to report the 18400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// results. Intercepts only failures from the current thread. 18410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter( 18420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResultArray* result) 18430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD), 18440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result_(result) { 18450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Init(); 18460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 18470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 18480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The c'tor sets this object as the test part result reporter used by 18490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Google Test. The 'result' parameter specifies where to report the 18500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// results. 18510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter( 18520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong InterceptMode intercept_mode, TestPartResultArray* result) 18530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : intercept_mode_(intercept_mode), 18540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result_(result) { 18550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Init(); 18560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 18570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 18580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid ScopedFakeTestPartResultReporter::Init() { 18590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); 18600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (intercept_mode_ == INTERCEPT_ALL_THREADS) { 18610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong old_reporter_ = impl->GetGlobalTestPartResultReporter(); 18620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl->SetGlobalTestPartResultReporter(this); 18630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 18640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong old_reporter_ = impl->GetTestPartResultReporterForCurrentThread(); 18650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl->SetTestPartResultReporterForCurrentThread(this); 18660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 18670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 18680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 18690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The d'tor restores the test part result reporter used by Google Test 18700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// before. 18710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() { 18720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); 18730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (intercept_mode_ == INTERCEPT_ALL_THREADS) { 18740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl->SetGlobalTestPartResultReporter(old_reporter_); 18750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 18760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl->SetTestPartResultReporterForCurrentThread(old_reporter_); 18770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 18780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 18790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 18800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Increments the test part result count and remembers the result. 18810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This method is from the TestPartResultReporterInterface interface. 18820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid ScopedFakeTestPartResultReporter::ReportTestPartResult( 18830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestPartResult& result) { 18840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result_->Append(result); 18850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 18860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 18870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 18880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 18890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the type ID of ::testing::Test. We should always call this 18900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// instead of GetTypeId< ::testing::Test>() to get the type ID of 18910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// testing::Test. This is to work around a suspected linker bug when 18920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// using Google Test as a framework on Mac OS X. The bug causes 18930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// GetTypeId< ::testing::Test>() to return different values depending 18940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// on whether the call is from the Google Test framework itself or 18950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// from user test code. GetTestTypeId() is guaranteed to always 18960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// return the same value, as it always calls GetTypeId<>() from the 18970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// gtest.cc, which is within the Google Test framework. 18980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTypeId GetTestTypeId() { 18990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return GetTypeId<Test>(); 19000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 19010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 19020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The value of GetTestTypeId() as seen from within the Google Test 19030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// library. This is solely for testing GetTestTypeId(). 19040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongextern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId(); 19050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 19060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This predicate-formatter checks that 'results' contains a test part 19070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// failure of the given type and that the failure message contains the 19080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// given substring. 19090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult HasOneFailure(const char* /* results_expr */, 19100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* /* type_expr */, 19110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* /* substr_expr */, 19120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestPartResultArray& results, 19130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResult::Type type, 19140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const string& substr) { 19150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String expected(type == TestPartResult::kFatalFailure ? 19160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "1 fatal failure" : 19170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "1 non-fatal failure"); 19180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message msg; 19190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (results.size() != 1) { 19200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << "Expected: " << expected << "\n" 19210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " Actual: " << results.size() << " failures"; 19220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int i = 0; i < results.size(); i++) { 19230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << "\n" << results.GetTestPartResult(i); 19240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 19250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionFailure() << msg; 19260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 19270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 19280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestPartResult& r = results.GetTestPartResult(0); 19290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (r.type() != type) { 19300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionFailure() << "Expected: " << expected << "\n" 19310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " Actual:\n" 19320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << r; 19330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 19340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 19350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (strstr(r.message(), substr.c_str()) == NULL) { 19360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionFailure() << "Expected: " << expected << " containing \"" 19370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << substr << "\"\n" 19380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " Actual:\n" 19390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << r; 19400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 19410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 19420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionSuccess(); 19430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 19440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 19450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The constructor of SingleFailureChecker remembers where to look up 19460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// test part results, what type of failure we expect, and what 19470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// substring the failure message should contain. 19480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongSingleFailureChecker:: SingleFailureChecker( 19490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestPartResultArray* results, 19500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResult::Type type, 19510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const string& substr) 19520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : results_(results), 19530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong type_(type), 19540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong substr_(substr) {} 19550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 19560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The destructor of SingleFailureChecker verifies that the given 19570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TestPartResultArray contains exactly one failure that has the given 19580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// type and contains the given substring. If that's not the case, a 19590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// non-fatal failure will be generated. 19600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongSingleFailureChecker::~SingleFailureChecker() { 19610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_); 19620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 19630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 19640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongDefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter( 19650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnitTestImpl* unit_test) : unit_test_(unit_test) {} 19660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 19670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid DefaultGlobalTestPartResultReporter::ReportTestPartResult( 19680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestPartResult& result) { 19690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong unit_test_->current_test_result()->AddTestPartResult(result); 19700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong unit_test_->listeners()->repeater()->OnTestPartResult(result); 19710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 19720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 19730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongDefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter( 19740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnitTestImpl* unit_test) : unit_test_(unit_test) {} 19750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 19760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid DefaultPerThreadTestPartResultReporter::ReportTestPartResult( 19770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestPartResult& result) { 19780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result); 19790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 19800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 19810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the global test part result reporter. 19820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestPartResultReporterInterface* 19830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongUnitTestImpl::GetGlobalTestPartResultReporter() { 19840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::MutexLock lock(&global_test_part_result_reporter_mutex_); 19850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return global_test_part_result_repoter_; 19860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 19870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 19880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Sets the global test part result reporter. 19890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid UnitTestImpl::SetGlobalTestPartResultReporter( 19900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResultReporterInterface* reporter) { 19910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::MutexLock lock(&global_test_part_result_reporter_mutex_); 19920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong global_test_part_result_repoter_ = reporter; 19930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 19940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 19950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the test part result reporter for the current thread. 19960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestPartResultReporterInterface* 19970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongUnitTestImpl::GetTestPartResultReporterForCurrentThread() { 19980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return per_thread_test_part_result_reporter_.get(); 19990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 20000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 20010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Sets the test part result reporter for the current thread. 20020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid UnitTestImpl::SetTestPartResultReporterForCurrentThread( 20030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResultReporterInterface* reporter) { 20040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong per_thread_test_part_result_reporter_.set(reporter); 20050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 20060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 20070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of successful test cases. 20080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTestImpl::successful_test_case_count() const { 20090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return CountIf(test_cases_, TestCasePassed); 20100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 20110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 20120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of failed test cases. 20130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTestImpl::failed_test_case_count() const { 20140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return CountIf(test_cases_, TestCaseFailed); 20150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 20160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 20170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of all test cases. 20180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTestImpl::total_test_case_count() const { 20190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return static_cast<int>(test_cases_.size()); 20200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 20210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 20220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of all test cases that contain at least one test 20230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// that should run. 20240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTestImpl::test_case_to_run_count() const { 20250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return CountIf(test_cases_, ShouldRunTestCase); 20260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 20270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 20280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of successful tests. 20290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTestImpl::successful_test_count() const { 20300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count); 20310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 20320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 20330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of failed tests. 20340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTestImpl::failed_test_count() const { 20350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count); 20360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 20370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 20380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of disabled tests. 20390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTestImpl::disabled_test_count() const { 20400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count); 20410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 20420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 20430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of all tests. 20440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTestImpl::total_test_count() const { 20450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return SumOverTestCaseList(test_cases_, &TestCase::total_test_count); 20460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 20470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 20480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of tests that should run. 20490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTestImpl::test_to_run_count() const { 20500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count); 20510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 20520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 20530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the current OS stack trace as a String. 20540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 20550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The maximum number of stack frames to be included is specified by 20560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the gtest_stack_trace_depth flag. The skip_count parameter 20570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// specifies the number of top frames to be skipped, which doesn't 20580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// count against the number of frames to be included. 20590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 20600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// For example, if Foo() calls Bar(), which in turn calls 20610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// CurrentOsStackTraceExceptTop(1), Foo() will be included in the 20620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// trace but Bar() and CurrentOsStackTraceExceptTop() won't. 20630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) { 20640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (void)skip_count; 20650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return String(""); 20660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 20670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 20680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the current time in milliseconds. 20690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTimeInMillis GetTimeInMillis() { 20700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__) 20710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Difference between 1970-01-01 and 1601-01-01 in milliseconds. 20720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // http://analogous.blogspot.com/2005/04/epoch.html 20730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TimeInMillis kJavaEpochToWinFileTimeDelta = 20740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static_cast<TimeInMillis>(116444736UL) * 100000UL; 20750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const DWORD kTenthMicrosInMilliSecond = 10000; 20760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 20770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SYSTEMTIME now_systime; 20780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FILETIME now_filetime; 20790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ULARGE_INTEGER now_int64; 20800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TODO(kenton@google.com): Shouldn't this just use 20810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // GetSystemTimeAsFileTime()? 20820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetSystemTime(&now_systime); 20830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (SystemTimeToFileTime(&now_systime, &now_filetime)) { 20840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong now_int64.LowPart = now_filetime.dwLowDateTime; 20850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong now_int64.HighPart = now_filetime.dwHighDateTime; 20860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) - 20870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong kJavaEpochToWinFileTimeDelta; 20880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return now_int64.QuadPart; 20890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 20900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return 0; 20910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_ 20920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong __timeb64 now; 20930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 20940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# ifdef _MSC_VER 20950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 20960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996 20970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // (deprecated function) there. 20980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TODO(kenton@google.com): Use GetTickCount()? Or use 20990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // SystemTimeToFileTime() 21000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# pragma warning(push) // Saves the current warning state. 21010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# pragma warning(disable:4996) // Temporarily disables warning 4996. 21020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong _ftime64(&now); 21030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# pragma warning(pop) // Restores the warning state. 21040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# else 21050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 21060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong _ftime64(&now); 21070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 21080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // _MSC_VER 21090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 21100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm; 21110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#elif GTEST_HAS_GETTIMEOFDAY_ 21120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong struct timeval now; 21130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong gettimeofday(&now, NULL); 21140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000; 21150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 21160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# error "Don't know how to get the current time on your system." 21170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 21180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 21190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 21200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Utilities 21210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 21220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// class String 21230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 21240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the input enclosed in double quotes if it's not NULL; 21250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// otherwise returns "(null)". For example, "\"Hello\"" is returned 21260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// for input "Hello". 21270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 21280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This is useful for printing a C string in the syntax of a literal. 21290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 21300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Known issue: escape sequences are not handled yet. 21310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString String::ShowCStringQuoted(const char* c_str) { 21320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return c_str ? String::Format("\"%s\"", c_str) : String("(null)"); 21330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 21340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 21350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copies at most length characters from str into a newly-allocated 21360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// piece of memory of size length+1. The memory is allocated with new[]. 21370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A terminating null byte is written to the memory, and a pointer to it 21380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// is returned. If str is NULL, NULL is returned. 21390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic char* CloneString(const char* str, size_t length) { 21400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (str == NULL) { 21410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return NULL; 21420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 21430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char* const clone = new char[length + 1]; 21440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong posix::StrNCpy(clone, str, length); 21450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong clone[length] = '\0'; 21460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return clone; 21470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 21480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 21490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 21500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Clones a 0-terminated C string, allocating memory using new. The 21510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// caller is responsible for deleting[] the return value. Returns the 21520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// cloned string, or NULL if the input is NULL. 21530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char * String::CloneCString(const char* c_str) { 21540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (c_str == NULL) ? 21550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong NULL : CloneString(c_str, strlen(c_str)); 21560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 21570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 21580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS_MOBILE 21590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates a UTF-16 wide string from the given ANSI string, allocating 21600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// memory using new. The caller is responsible for deleting the return 21610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// value using delete[]. Returns the wide string, or NULL if the 21620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// input is NULL. 21630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongLPCWSTR String::AnsiToUtf16(const char* ansi) { 21640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!ansi) return NULL; 21650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int length = strlen(ansi); 21660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int unicode_length = 21670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MultiByteToWideChar(CP_ACP, 0, ansi, length, 21680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong NULL, 0); 21690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong WCHAR* unicode = new WCHAR[unicode_length + 1]; 21700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MultiByteToWideChar(CP_ACP, 0, ansi, length, 21710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong unicode, unicode_length); 21720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong unicode[unicode_length] = 0; 21730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return unicode; 21740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 21750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 21760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates an ANSI string from the given wide string, allocating 21770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// memory using new. The caller is responsible for deleting the return 21780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// value using delete[]. Returns the ANSI string, or NULL if the 21790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// input is NULL. 21800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char* String::Utf16ToAnsi(LPCWSTR utf16_str) { 21810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!utf16_str) return NULL; 21820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int ansi_length = 21830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, 21840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong NULL, 0, NULL, NULL); 21850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char* ansi = new char[ansi_length + 1]; 21860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, 21870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ansi, ansi_length, NULL, NULL); 21880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ansi[ansi_length] = 0; 21890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return ansi; 21900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 21910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 21920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS_MOBILE 21930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 21940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Compares two C strings. Returns true iff they have the same content. 21950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 21960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Unlike strcmp(), this function can handle NULL argument(s). A NULL 21970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// C string is considered different to any non-NULL C string, 21980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// including the empty string. 21990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool String::CStringEquals(const char * lhs, const char * rhs) { 22000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if ( lhs == NULL ) return rhs == NULL; 22010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 22020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if ( rhs == NULL ) return false; 22030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 22040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return strcmp(lhs, rhs) == 0; 22050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 22060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 22070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING 22080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 22090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Converts an array of wide chars to a narrow string using the UTF-8 22100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// encoding, and streams the result to the given Message object. 22110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic void StreamWideCharsToMessage(const wchar_t* wstr, size_t length, 22120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message* msg) { 22130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TODO(wan): consider allowing a testing::String object to 22140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // contain '\0'. This will make it behave more like std::string, 22150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // and will allow ToUtf8String() to return the correct encoding 22160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // for '\0' s.t. we can get rid of the conditional here (and in 22170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // several other places). 22180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t i = 0; i != length; ) { // NOLINT 22190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (wstr[i] != L'\0') { 22200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i)); 22210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong while (i != length && wstr[i] != L'\0') 22220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong i++; 22230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 22240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *msg << '\0'; 22250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong i++; 22260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 22270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 22280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 22290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 22300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING 22310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 22320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 22330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 22340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_STD_WSTRING 22350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Converts the given wide string to a narrow string using the UTF-8 22360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// encoding, and streams the result to this Message object. 22370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongMessage& Message::operator <<(const ::std::wstring& wstr) { 22380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this); 22390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return *this; 22400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 22410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_STD_WSTRING 22420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 22430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_GLOBAL_WSTRING 22440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Converts the given wide string to a narrow string using the UTF-8 22450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// encoding, and streams the result to this Message object. 22460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongMessage& Message::operator <<(const ::wstring& wstr) { 22470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this); 22480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return *this; 22490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 22500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_GLOBAL_WSTRING 22510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 22520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// AssertionResult constructors. 22530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Used in EXPECT_TRUE/FALSE(assertion_result). 22540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult::AssertionResult(const AssertionResult& other) 22550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : success_(other.success_), 22560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong message_(other.message_.get() != NULL ? 22570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong new ::std::string(*other.message_) : 22580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static_cast< ::std::string*>(NULL)) { 22590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 22600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 22610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE. 22620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult AssertionResult::operator!() const { 22630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong AssertionResult negation(!success_); 22640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (message_.get() != NULL) 22650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong negation << *message_; 22660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return negation; 22670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 22680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 22690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Makes a successful assertion result. 22700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult AssertionSuccess() { 22710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionResult(true); 22720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 22730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 22740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Makes a failed assertion result. 22750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult AssertionFailure() { 22760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionResult(false); 22770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 22780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 22790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Makes a failed assertion result with the given failure message. 22800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Deprecated; use AssertionFailure() << message. 22810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult AssertionFailure(const Message& message) { 22820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionFailure() << message; 22830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 22840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 22850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 22860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 22870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Constructs and returns the message for an equality assertion 22880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. 22890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 22900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The first four parameters are the expressions used in the assertion 22910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// and their values, as strings. For example, for ASSERT_EQ(foo, bar) 22920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// where foo is 5 and bar is 6, we have: 22930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 22940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// expected_expression: "foo" 22950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// actual_expression: "bar" 22960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// expected_value: "5" 22970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// actual_value: "6" 22980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 22990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The ignoring_case parameter is true iff the assertion is a 23000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will 23010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// be inserted into the message. 23020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult EqFailure(const char* expected_expression, 23030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* actual_expression, 23040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String& expected_value, 23050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String& actual_value, 23060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool ignoring_case) { 23070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message msg; 23080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << "Value of: " << actual_expression; 23090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (actual_value != actual_expression) { 23100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << "\n Actual: " << actual_value; 23110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 23120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 23130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << "\nExpected: " << expected_expression; 23140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (ignoring_case) { 23150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << " (ignoring case)"; 23160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 23170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (expected_value != expected_expression) { 23180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << "\nWhich is: " << expected_value; 23190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 23200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 23210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionFailure() << msg; 23220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 23230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 23240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Constructs a failure message for Boolean assertions such as EXPECT_TRUE. 23250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString GetBoolAssertionFailureMessage(const AssertionResult& assertion_result, 23260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* expression_text, 23270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* actual_predicate_value, 23280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* expected_predicate_value) { 23290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* actual_message = assertion_result.message(); 23300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message msg; 23310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << "Value of: " << expression_text 23320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "\n Actual: " << actual_predicate_value; 23330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (actual_message[0] != '\0') 23340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << " (" << actual_message << ")"; 23350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << "\nExpected: " << expected_predicate_value; 23360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return msg.GetString(); 23370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 23380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 23390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Helper function for implementing ASSERT_NEAR. 23400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult DoubleNearPredFormat(const char* expr1, 23410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* expr2, 23420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* abs_error_expr, 23430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double val1, 23440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double val2, 23450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double abs_error) { 23460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const double diff = fabs(val1 - val2); 23470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (diff <= abs_error) return AssertionSuccess(); 23480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 23490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TODO(wan): do not print the value of an expression if it's 23500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // already a literal. 23510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionFailure() 23520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "The difference between " << expr1 << " and " << expr2 23530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n" 23540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << expr1 << " evaluates to " << val1 << ",\n" 23550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << expr2 << " evaluates to " << val2 << ", and\n" 23560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << abs_error_expr << " evaluates to " << abs_error << "."; 23570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 23580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 23590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 23600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Helper template for implementing FloatLE() and DoubleLE(). 23610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate <typename RawType> 23620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult FloatingPointLE(const char* expr1, 23630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* expr2, 23640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong RawType val1, 23650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong RawType val2) { 23660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns success if val1 is less than val2, 23670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (val1 < val2) { 23680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionSuccess(); 23690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 23700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 23710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // or if val1 is almost equal to val2. 23720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const FloatingPoint<RawType> lhs(val1), rhs(val2); 23730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (lhs.AlmostEquals(rhs)) { 23740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionSuccess(); 23750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 23760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 23770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Note that the above two checks will both fail if either val1 or 23780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // val2 is NaN, as the IEEE floating-point standard requires that 23790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // any predicate involving a NaN must return false. 23800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 23810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::stringstream val1_ss; 23820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2) 23830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << val1; 23840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 23850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::stringstream val2_ss; 23860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2) 23870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << val2; 23880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 23890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionFailure() 23900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n" 23910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " Actual: " << StringStreamToString(&val1_ss) << " vs " 23920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << StringStreamToString(&val2_ss); 23930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 23940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 23950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 23960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 23970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Asserts that val1 is less than, or almost equal to, val2. Fails 23980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// otherwise. In particular, it fails if either val1 or val2 is NaN. 23990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult FloatLE(const char* expr1, const char* expr2, 24000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong float val1, float val2) { 24010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return internal::FloatingPointLE<float>(expr1, expr2, val1, val2); 24020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 24030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 24040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Asserts that val1 is less than, or almost equal to, val2. Fails 24050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// otherwise. In particular, it fails if either val1 or val2 is NaN. 24060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult DoubleLE(const char* expr1, const char* expr2, 24070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong double val1, double val2) { 24080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return internal::FloatingPointLE<double>(expr1, expr2, val1, val2); 24090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 24100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 24110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 24120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 24130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The helper function for {ASSERT|EXPECT}_EQ with int or enum 24140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// arguments. 24150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult CmpHelperEQ(const char* expected_expression, 24160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* actual_expression, 24170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong BiggestInt expected, 24180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong BiggestInt actual) { 24190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (expected == actual) { 24200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionSuccess(); 24210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 24220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 24230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return EqFailure(expected_expression, 24240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong actual_expression, 24250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FormatForComparisonFailureMessage(expected, actual), 24260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FormatForComparisonFailureMessage(actual, expected), 24270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong false); 24280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 24290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 24300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A macro for implementing the helper functions needed to implement 24310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// ASSERT_?? and EXPECT_?? with integer or enum arguments. It is here 24320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// just to avoid copy-and-paste of similar code. 24330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define GTEST_IMPL_CMP_HELPER_(op_name, op)\ 24340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ 24350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong BiggestInt val1, BiggestInt val2) {\ 24360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (val1 op val2) {\ 24370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionSuccess();\ 24380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else {\ 24390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionFailure() \ 24400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Expected: (" << expr1 << ") " #op " (" << expr2\ 24410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\ 24420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " vs " << FormatForComparisonFailureMessage(val2, val1);\ 24430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong }\ 24440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 24450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 24460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Implements the helper function for {ASSERT|EXPECT}_NE with int or 24470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// enum arguments. 24480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_IMPL_CMP_HELPER_(NE, !=) 24490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Implements the helper function for {ASSERT|EXPECT}_LE with int or 24500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// enum arguments. 24510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_IMPL_CMP_HELPER_(LE, <=) 24520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Implements the helper function for {ASSERT|EXPECT}_LT with int or 24530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// enum arguments. 24540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_IMPL_CMP_HELPER_(LT, < ) 24550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Implements the helper function for {ASSERT|EXPECT}_GE with int or 24560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// enum arguments. 24570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_IMPL_CMP_HELPER_(GE, >=) 24580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Implements the helper function for {ASSERT|EXPECT}_GT with int or 24590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// enum arguments. 24600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_IMPL_CMP_HELPER_(GT, > ) 24610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 24620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#undef GTEST_IMPL_CMP_HELPER_ 24630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 24640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The helper function for {ASSERT|EXPECT}_STREQ. 24650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult CmpHelperSTREQ(const char* expected_expression, 24660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* actual_expression, 24670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* expected, 24680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* actual) { 24690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (String::CStringEquals(expected, actual)) { 24700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionSuccess(); 24710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 24720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 24730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return EqFailure(expected_expression, 24740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong actual_expression, 24750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String::ShowCStringQuoted(expected), 24760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String::ShowCStringQuoted(actual), 24770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong false); 24780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 24790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 24800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The helper function for {ASSERT|EXPECT}_STRCASEEQ. 24810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult CmpHelperSTRCASEEQ(const char* expected_expression, 24820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* actual_expression, 24830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* expected, 24840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* actual) { 24850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (String::CaseInsensitiveCStringEquals(expected, actual)) { 24860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionSuccess(); 24870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 24880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 24890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return EqFailure(expected_expression, 24900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong actual_expression, 24910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String::ShowCStringQuoted(expected), 24920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String::ShowCStringQuoted(actual), 24930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong true); 24940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 24950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 24960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The helper function for {ASSERT|EXPECT}_STRNE. 24970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult CmpHelperSTRNE(const char* s1_expression, 24980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* s2_expression, 24990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* s1, 25000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* s2) { 25010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!String::CStringEquals(s1, s2)) { 25020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionSuccess(); 25030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 25040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionFailure() << "Expected: (" << s1_expression << ") != (" 25050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << s2_expression << "), actual: \"" 25060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << s1 << "\" vs \"" << s2 << "\""; 25070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 25080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 25090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 25100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The helper function for {ASSERT|EXPECT}_STRCASENE. 25110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult CmpHelperSTRCASENE(const char* s1_expression, 25120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* s2_expression, 25130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* s1, 25140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* s2) { 25150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!String::CaseInsensitiveCStringEquals(s1, s2)) { 25160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionSuccess(); 25170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 25180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionFailure() 25190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Expected: (" << s1_expression << ") != (" 25200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << s2_expression << ") (ignoring case), actual: \"" 25210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << s1 << "\" vs \"" << s2 << "\""; 25220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 25230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 25240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 25250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 25260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 25270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace { 25280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 25290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Helper functions for implementing IsSubString() and IsNotSubstring(). 25300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 25310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This group of overloaded functions return true iff needle is a 25320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// substring of haystack. NULL is considered a substring of itself 25330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// only. 25340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 25350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool IsSubstringPred(const char* needle, const char* haystack) { 25360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (needle == NULL || haystack == NULL) 25370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return needle == haystack; 25380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 25390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return strstr(haystack, needle) != NULL; 25400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 25410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 25420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) { 25430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (needle == NULL || haystack == NULL) 25440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return needle == haystack; 25450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 25460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return wcsstr(haystack, needle) != NULL; 25470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 25480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 25490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// StringType here can be either ::std::string or ::std::wstring. 25500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate <typename StringType> 25510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool IsSubstringPred(const StringType& needle, 25520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const StringType& haystack) { 25530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return haystack.find(needle) != StringType::npos; 25540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 25550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 25560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This function implements either IsSubstring() or IsNotSubstring(), 25570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// depending on the value of the expected_to_be_substring parameter. 25580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// StringType here can be const char*, const wchar_t*, ::std::string, 25590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// or ::std::wstring. 25600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate <typename StringType> 25610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult IsSubstringImpl( 25620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool expected_to_be_substring, 25630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* needle_expr, const char* haystack_expr, 25640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const StringType& needle, const StringType& haystack) { 25650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (IsSubstringPred(needle, haystack) == expected_to_be_substring) 25660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionSuccess(); 25670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 25680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool is_wide_string = sizeof(needle[0]) > 1; 25690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const begin_string_quote = is_wide_string ? "L\"" : "\""; 25700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionFailure() 25710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Value of: " << needle_expr << "\n" 25720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " Actual: " << begin_string_quote << needle << "\"\n" 25730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Expected: " << (expected_to_be_substring ? "" : "not ") 25740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "a substring of " << haystack_expr << "\n" 25750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Which is: " << begin_string_quote << haystack << "\""; 25760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 25770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 25780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace 25790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 25800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// IsSubstring() and IsNotSubstring() check whether needle is a 25810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// substring of haystack (NULL is considered a substring of itself 25820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// only), and return an appropriate error message when they fail. 25830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 25840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult IsSubstring( 25850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* needle_expr, const char* haystack_expr, 25860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* needle, const char* haystack) { 25870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); 25880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 25890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 25900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult IsSubstring( 25910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* needle_expr, const char* haystack_expr, 25920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const wchar_t* needle, const wchar_t* haystack) { 25930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); 25940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 25950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 25960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult IsNotSubstring( 25970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* needle_expr, const char* haystack_expr, 25980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* needle, const char* haystack) { 25990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); 26000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 26010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult IsNotSubstring( 26030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* needle_expr, const char* haystack_expr, 26040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const wchar_t* needle, const wchar_t* haystack) { 26050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); 26060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 26070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult IsSubstring( 26090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* needle_expr, const char* haystack_expr, 26100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const ::std::string& needle, const ::std::string& haystack) { 26110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); 26120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 26130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult IsNotSubstring( 26150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* needle_expr, const char* haystack_expr, 26160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const ::std::string& needle, const ::std::string& haystack) { 26170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); 26180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 26190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_STD_WSTRING 26210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult IsSubstring( 26220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* needle_expr, const char* haystack_expr, 26230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const ::std::wstring& needle, const ::std::wstring& haystack) { 26240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); 26250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 26260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult IsNotSubstring( 26280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* needle_expr, const char* haystack_expr, 26290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const ::std::wstring& needle, const ::std::wstring& haystack) { 26300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); 26310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 26320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_STD_WSTRING 26330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 26350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS 26370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace { 26390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Helper function for IsHRESULT{SuccessFailure} predicates 26410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult HRESULTFailureHelper(const char* expr, 26420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* expected, 26430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong long hr) { // NOLINT 26440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if GTEST_OS_WINDOWS_MOBILE 26450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Windows CE doesn't support FormatMessage. 26470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char error_text[] = ""; 26480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# else 26500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Looks up the human-readable system message for the HRESULT code 26520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // and since we're not passing any params to FormatMessage, we don't 26530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // want inserts expanded. 26540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM | 26550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FORMAT_MESSAGE_IGNORE_INSERTS; 26560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const DWORD kBufSize = 4096; // String::Format can't exceed this length. 26570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the system's human readable message string for this HRESULT. 26580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char error_text[kBufSize] = { '\0' }; 26590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DWORD message_length = ::FormatMessageA(kFlags, 26600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 0, // no source, we're asking system 26610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong hr, // the error 26620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 0, // no line width restrictions 26630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong error_text, // output buffer 26640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong kBufSize, // buf size 26650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong NULL); // no arguments for inserts 26660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Trims tailing white space (FormatMessage leaves a trailing cr-lf) 26670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (; message_length && IsSpace(error_text[message_length - 1]); 26680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong --message_length) { 26690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong error_text[message_length - 1] = '\0'; 26700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 26710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // GTEST_OS_WINDOWS_MOBILE 26730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String error_hex(String::Format("0x%08X ", hr)); 26750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return ::testing::AssertionFailure() 26760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Expected: " << expr << " " << expected << ".\n" 26770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " Actual: " << error_hex << error_text << "\n"; 26780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 26790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace 26810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult IsHRESULTSuccess(const char* expr, long hr) { // NOLINT 26830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (SUCCEEDED(hr)) { 26840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionSuccess(); 26850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 26860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return HRESULTFailureHelper(expr, "succeeds", hr); 26870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 26880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult IsHRESULTFailure(const char* expr, long hr) { // NOLINT 26900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (FAILED(hr)) { 26910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionSuccess(); 26920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 26930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return HRESULTFailureHelper(expr, "fails", hr); 26940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 26950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS 26970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 26980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Utility functions for encoding Unicode text (wide strings) in 26990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// UTF-8. 27000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 27010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8 27020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// like this: 27030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 27040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Code-point length Encoding 27050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 0 - 7 bits 0xxxxxxx 27060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 8 - 11 bits 110xxxxx 10xxxxxx 27070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 12 - 16 bits 1110xxxx 10xxxxxx 10xxxxxx 27080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 17 - 21 bits 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 27090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 27100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The maximum code-point a one-byte UTF-8 sequence can represent. 27110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) << 7) - 1; 27120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 27130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The maximum code-point a two-byte UTF-8 sequence can represent. 27140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1; 27150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 27160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The maximum code-point a three-byte UTF-8 sequence can represent. 27170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1; 27180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 27190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The maximum code-point a four-byte UTF-8 sequence can represent. 27200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1; 27210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 27220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Chops off the n lowest bits from a bit pattern. Returns the n 27230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// lowest bits. As a side effect, the original bit pattern will be 27240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// shifted to the right by n bits. 27250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Konginline UInt32 ChopLowBits(UInt32* bits, int n) { 27260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1); 27270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *bits >>= n; 27280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return low_bits; 27290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 27300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 27310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Converts a Unicode code point to a narrow string in UTF-8 encoding. 27320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// code_point parameter is of type UInt32 because wchar_t may not be 27330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// wide enough to contain a code point. 27340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The output buffer str must containt at least 32 characters. 27350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The function returns the address of the output buffer. 27360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// If the code_point is not a valid Unicode code point 27370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output 27380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// as '(Invalid Unicode 0xXXXXXXXX)'. 27390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongchar* CodePointToUtf8(UInt32 code_point, char* str) { 27400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (code_point <= kMaxCodePoint1) { 27410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str[1] = '\0'; 27420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str[0] = static_cast<char>(code_point); // 0xxxxxxx 27430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (code_point <= kMaxCodePoint2) { 27440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str[2] = '\0'; 27450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx 27460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str[0] = static_cast<char>(0xC0 | code_point); // 110xxxxx 27470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (code_point <= kMaxCodePoint3) { 27480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str[3] = '\0'; 27490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx 27500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx 27510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str[0] = static_cast<char>(0xE0 | code_point); // 1110xxxx 27520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (code_point <= kMaxCodePoint4) { 27530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str[4] = '\0'; 27540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx 27550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx 27560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx 27570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str[0] = static_cast<char>(0xF0 | code_point); // 11110xxx 27580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 27590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The longest string String::Format can produce when invoked 27600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // with these parameters is 28 character long (not including 27610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the terminating nul character). We are asking for 32 character 27620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // buffer just in case. This is also enough for strncpy to 27630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // null-terminate the destination string. 27640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong posix::StrNCpy( 27650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str, String::Format("(Invalid Unicode 0x%X)", code_point).c_str(), 32); 27660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str[31] = '\0'; // Makes sure no change in the format to strncpy leaves 27670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the result unterminated. 27680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 27690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return str; 27700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 27710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 27720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The following two functions only make sense if the the system 27730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// uses UTF-16 for wide string encoding. All supported systems 27740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16. 27750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 27760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Determines if the arguments constitute UTF-16 surrogate pair 27770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// and thus should be combined into a single Unicode code point 27780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// using CreateCodePointFromUtf16SurrogatePair. 27790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Konginline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) { 27800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return sizeof(wchar_t) == 2 && 27810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00; 27820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 27830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 27840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates a Unicode code point from UTF16 surrogate pair. 27850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Konginline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first, 27860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong wchar_t second) { 27870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const UInt32 mask = (1 << 10) - 1; 27880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (sizeof(wchar_t) == 2) ? 27890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (((first & mask) << 10) | (second & mask)) + 0x10000 : 27900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This function should not be called when the condition is 27910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // false, but we provide a sensible default in case it is. 27920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static_cast<UInt32>(first); 27930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 27940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 27950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Converts a wide string to a narrow string in UTF-8 encoding. 27960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The wide string is assumed to have the following encoding: 27970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS) 27980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// UTF-32 if sizeof(wchar_t) == 4 (on Linux) 27990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Parameter str points to a null-terminated wide string. 28000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Parameter num_chars may additionally limit the number 28010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// of wchar_t characters processed. -1 is used when the entire string 28020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// should be processed. 28030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// If the string contains code points that are not valid Unicode code points 28040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output 28050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding 28060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// and contains invalid UTF-16 surrogate pairs, values in those pairs 28070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// will be encoded as individual Unicode characters from Basic Normal Plane. 28080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString WideStringToUtf8(const wchar_t* str, int num_chars) { 28090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (num_chars == -1) 28100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong num_chars = static_cast<int>(wcslen(str)); 28110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 28120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::stringstream stream; 28130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int i = 0; i < num_chars; ++i) { 28140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UInt32 unicode_code_point; 28150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 28160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (str[i] == L'\0') { 28170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 28180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) { 28190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i], 28200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str[i + 1]); 28210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong i++; 28220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 28230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong unicode_code_point = static_cast<UInt32>(str[i]); 28240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 28250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 28260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char buffer[32]; // CodePointToUtf8 requires a buffer this big. 28270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong stream << CodePointToUtf8(unicode_code_point, buffer); 28280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 28290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return StringStreamToString(&stream); 28300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 28310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 28320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Converts a wide C string to a String using the UTF-8 encoding. 28330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// NULL will be converted to "(null)". 28340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString String::ShowWideCString(const wchar_t * wide_c_str) { 28350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (wide_c_str == NULL) return String("(null)"); 28360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 28370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return String(internal::WideStringToUtf8(wide_c_str, -1).c_str()); 28380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 28390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 28400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Similar to ShowWideCString(), except that this function encloses 28410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the converted string in double quotes. 28420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString String::ShowWideCStringQuoted(const wchar_t* wide_c_str) { 28430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (wide_c_str == NULL) return String("(null)"); 28440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 28450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return String::Format("L\"%s\"", 28460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String::ShowWideCString(wide_c_str).c_str()); 28470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 28480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 28490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Compares two wide C strings. Returns true iff they have the same 28500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// content. 28510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 28520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Unlike wcscmp(), this function can handle NULL argument(s). A NULL 28530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// C string is considered different to any non-NULL C string, 28540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// including the empty string. 28550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) { 28560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (lhs == NULL) return rhs == NULL; 28570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 28580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (rhs == NULL) return false; 28590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 28600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return wcscmp(lhs, rhs) == 0; 28610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 28620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 28630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Helper function for *_STREQ on wide strings. 28640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult CmpHelperSTREQ(const char* expected_expression, 28650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* actual_expression, 28660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const wchar_t* expected, 28670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const wchar_t* actual) { 28680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (String::WideCStringEquals(expected, actual)) { 28690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionSuccess(); 28700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 28710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 28720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return EqFailure(expected_expression, 28730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong actual_expression, 28740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String::ShowWideCStringQuoted(expected), 28750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String::ShowWideCStringQuoted(actual), 28760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong false); 28770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 28780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 28790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Helper function for *_STRNE on wide strings. 28800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongAssertionResult CmpHelperSTRNE(const char* s1_expression, 28810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* s2_expression, 28820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const wchar_t* s1, 28830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const wchar_t* s2) { 28840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!String::WideCStringEquals(s1, s2)) { 28850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionSuccess(); 28860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 28870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 28880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return AssertionFailure() << "Expected: (" << s1_expression << ") != (" 28890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << s2_expression << "), actual: " 28900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << String::ShowWideCStringQuoted(s1) 28910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " vs " << String::ShowWideCStringQuoted(s2); 28920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 28930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 28940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Compares two C strings, ignoring case. Returns true iff they have 28950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the same content. 28960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 28970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Unlike strcasecmp(), this function can handle NULL argument(s). A 28980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// NULL C string is considered different to any non-NULL C string, 28990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// including the empty string. 29000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) { 29010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (lhs == NULL) 29020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return rhs == NULL; 29030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (rhs == NULL) 29040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 29050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return posix::StrCaseCmp(lhs, rhs) == 0; 29060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 29070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 29080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Compares two wide C strings, ignoring case. Returns true iff they 29090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // have the same content. 29100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 29110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Unlike wcscasecmp(), this function can handle NULL argument(s). 29120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // A NULL C string is considered different to any non-NULL wide C string, 29130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // including the empty string. 29140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // NB: The implementations on different platforms slightly differ. 29150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // On windows, this method uses _wcsicmp which compares according to LC_CTYPE 29160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // environment variable. On GNU platform this method uses wcscasecmp 29170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // which compares according to LC_CTYPE category of the current locale. 29180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the 29190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // current locale. 29200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs, 29210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const wchar_t* rhs) { 29220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (lhs == NULL) return rhs == NULL; 29230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 29240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (rhs == NULL) return false; 29250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 29260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS 29270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return _wcsicmp(lhs, rhs) == 0; 29280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID 29290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return wcscasecmp(lhs, rhs) == 0; 29300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 29310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Android, Mac OS X and Cygwin don't define wcscasecmp. 29320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Other unknown OSes may not define it either. 29330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong wint_t left, right; 29340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong do { 29350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong left = towlower(*lhs++); 29360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong right = towlower(*rhs++); 29370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } while (left && left == right); 29380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return left == right; 29390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // OS selector 29400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 29410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 29420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Compares this with another String. 29430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0 29440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// if this is greater than rhs. 29450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint String::Compare(const String & rhs) const { 29460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const lhs_c_str = c_str(); 29470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const rhs_c_str = rhs.c_str(); 29480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 29490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (lhs_c_str == NULL) { 29500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return rhs_c_str == NULL ? 0 : -1; // NULL < anything except NULL 29510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (rhs_c_str == NULL) { 29520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return 1; 29530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 29540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 29550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t shorter_str_len = 29560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong length() <= rhs.length() ? length() : rhs.length(); 29570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t i = 0; i != shorter_str_len; i++) { 29580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (lhs_c_str[i] < rhs_c_str[i]) { 29590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return -1; 29600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (lhs_c_str[i] > rhs_c_str[i]) { 29610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return 1; 29620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 29630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 29640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (length() < rhs.length()) ? -1 : 29650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (length() > rhs.length()) ? 1 : 0; 29660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 29670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 29680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff this String ends with the given suffix. *Any* 29690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// String is considered to end with a NULL or empty suffix. 29700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool String::EndsWith(const char* suffix) const { 29710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (suffix == NULL || CStringEquals(suffix, "")) return true; 29720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 29730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (c_str() == NULL) return false; 29740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 29750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t this_len = strlen(c_str()); 29760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t suffix_len = strlen(suffix); 29770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (this_len >= suffix_len) && 29780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong CStringEquals(c_str() + this_len - suffix_len, suffix); 29790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 29800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 29810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff this String ends with the given suffix, ignoring case. 29820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Any String is considered to end with a NULL or empty suffix. 29830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool String::EndsWithCaseInsensitive(const char* suffix) const { 29840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (suffix == NULL || CStringEquals(suffix, "")) return true; 29850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 29860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (c_str() == NULL) return false; 29870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 29880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t this_len = strlen(c_str()); 29890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t suffix_len = strlen(suffix); 29900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (this_len >= suffix_len) && 29910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong CaseInsensitiveCStringEquals(c_str() + this_len - suffix_len, suffix); 29920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 29930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 29940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Formats a list of arguments to a String, using the same format 29950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// spec string as for printf. 29960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 29970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// We do not use the StringPrintf class as it is not universally 29980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// available. 29990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 30000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The result is limited to 4096 characters (including the tailing 0). 30010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// If 4096 characters are not enough to format the input, or if 30020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// there's an error, "<formatting error or buffer exceeded>" is 30030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// returned. 30040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString String::Format(const char * format, ...) { 30050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong va_list args; 30060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong va_start(args, format); 30070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 30080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char buffer[4096]; 30090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int kBufferSize = sizeof(buffer)/sizeof(buffer[0]); 30100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 30110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // MSVC 8 deprecates vsnprintf(), so we want to suppress warning 30120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 4996 (deprecated function) there. 30130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#ifdef _MSC_VER // We are using MSVC. 30140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# pragma warning(push) // Saves the current warning state. 30150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# pragma warning(disable:4996) // Temporarily disables warning 4996. 30160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 30170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int size = vsnprintf(buffer, kBufferSize, format, args); 30180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 30190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# pragma warning(pop) // Restores the warning state. 30200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else // We are not using MSVC. 30210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int size = vsnprintf(buffer, kBufferSize, format, args); 30220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // _MSC_VER 30230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong va_end(args); 30240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 30250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // vsnprintf()'s behavior is not portable. When the buffer is not 30260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // big enough, it returns a negative value in MSVC, and returns the 30270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // needed buffer size on Linux. When there is an output error, it 30280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // always returns a negative value. For simplicity, we lump the two 30290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // error cases together. 30300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (size < 0 || size >= kBufferSize) { 30310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return String("<formatting error or buffer exceeded>"); 30320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 30330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return String(buffer, size); 30340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 30350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 30360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 30370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Converts the buffer in a stringstream to a String, converting NUL 30380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// bytes to "\\0" along the way. 30390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString StringStreamToString(::std::stringstream* ss) { 30400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const ::std::string& str = ss->str(); 30410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const start = str.c_str(); 30420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const end = start + str.length(); 30430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 30440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We need to use a helper stringstream to do this transformation 30450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // because String doesn't support push_back(). 30460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::stringstream helper; 30470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (const char* ch = start; ch != end; ++ch) { 30480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (*ch == '\0') { 30490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong helper << "\\0"; // Replaces NUL with "\\0"; 30500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 30510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong helper.put(*ch); 30520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 30530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 30540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 30550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return String(helper.str().c_str()); 30560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 30570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 30580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Appends the user-supplied message to the Google-Test-generated message. 30590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString AppendUserMessage(const String& gtest_msg, 30600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const Message& user_msg) { 30610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Appends the user message if it's non-empty. 30620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String user_msg_string = user_msg.GetString(); 30630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (user_msg_string.empty()) { 30640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return gtest_msg; 30650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 30660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 30670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message msg; 30680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << gtest_msg << "\n" << user_msg_string; 30690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 30700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return msg.GetString(); 30710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 30720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 30730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 30740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 30750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// class TestResult 30760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 30770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates an empty TestResult. 30780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestResult::TestResult() 30790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : death_test_count_(0), 30800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong elapsed_time_(0) { 30810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 30820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 30830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// D'tor. 30840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestResult::~TestResult() { 30850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 30860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 30870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the i-th test part result among all the results. i can 30880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// range from 0 to total_part_count() - 1. If i is not in that range, 30890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// aborts the program. 30900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst TestPartResult& TestResult::GetTestPartResult(int i) const { 30910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (i < 0 || i >= total_part_count()) 30920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::posix::Abort(); 30930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return test_part_results_.at(i); 30940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 30950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 30960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the i-th test property. i can range from 0 to 30970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// test_property_count() - 1. If i is not in that range, aborts the 30980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// program. 30990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst TestProperty& TestResult::GetTestProperty(int i) const { 31000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (i < 0 || i >= test_property_count()) 31010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::posix::Abort(); 31020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return test_properties_.at(i); 31030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 31040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 31050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Clears the test part results. 31060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestResult::ClearTestPartResults() { 31070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_part_results_.clear(); 31080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 31090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 31100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Adds a test part result to the list. 31110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestResult::AddTestPartResult(const TestPartResult& test_part_result) { 31120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_part_results_.push_back(test_part_result); 31130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 31140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 31150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Adds a test property to the list. If a property with the same key as the 31160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// supplied property is already represented, the value of this test_property 31170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// replaces the old value for that key. 31180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestResult::RecordProperty(const TestProperty& test_property) { 31190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!ValidateTestProperty(test_property)) { 31200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return; 31210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 31220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::MutexLock lock(&test_properites_mutex_); 31230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const std::vector<TestProperty>::iterator property_with_matching_key = 31240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::find_if(test_properties_.begin(), test_properties_.end(), 31250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::TestPropertyKeyIs(test_property.key())); 31260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (property_with_matching_key == test_properties_.end()) { 31270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_properties_.push_back(test_property); 31280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return; 31290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 31300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong property_with_matching_key->SetValue(test_property.value()); 31310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 31320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 31330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Adds a failure if the key is a reserved attribute of Google Test 31340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// testcase tags. Returns true if the property is valid. 31350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool TestResult::ValidateTestProperty(const TestProperty& test_property) { 31360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::String key(test_property.key()); 31370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (key == "name" || key == "status" || key == "time" || key == "classname") { 31380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ADD_FAILURE() 31390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Reserved key used in RecordProperty(): " 31400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << key 31410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " ('name', 'status', 'time', and 'classname' are reserved by " 31420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << GTEST_NAME_ << ")"; 31430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 31440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 31450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 31460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 31470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 31480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Clears the object. 31490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestResult::Clear() { 31500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_part_results_.clear(); 31510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_properties_.clear(); 31520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong death_test_count_ = 0; 31530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong elapsed_time_ = 0; 31540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 31550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 31560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff the test failed. 31570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool TestResult::Failed() const { 31580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int i = 0; i < total_part_count(); ++i) { 31590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (GetTestPartResult(i).failed()) 31600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 31610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 31620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 31630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 31640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 31650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff the test part fatally failed. 31660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic bool TestPartFatallyFailed(const TestPartResult& result) { 31670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return result.fatally_failed(); 31680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 31690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 31700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff the test fatally failed. 31710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool TestResult::HasFatalFailure() const { 31720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return CountIf(test_part_results_, TestPartFatallyFailed) > 0; 31730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 31740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 31750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff the test part non-fatally failed. 31760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic bool TestPartNonfatallyFailed(const TestPartResult& result) { 31770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return result.nonfatally_failed(); 31780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 31790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 31800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff the test has a non-fatal failure. 31810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool TestResult::HasNonfatalFailure() const { 31820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0; 31830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 31840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 31850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of all test parts. This is the sum of the number 31860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// of successful test parts and the number of failed test parts. 31870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint TestResult::total_part_count() const { 31880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return static_cast<int>(test_part_results_.size()); 31890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 31900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 31910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the number of the test properties. 31920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint TestResult::test_property_count() const { 31930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return static_cast<int>(test_properties_.size()); 31940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 31950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 31960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// class Test 31970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 31980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates a Test object. 31990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 32000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The c'tor saves the values of all Google Test flags. 32010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTest::Test() 32020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : gtest_flag_saver_(new internal::GTestFlagSaver) { 32030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 32040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 32050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The d'tor restores the values of all Google Test flags. 32060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTest::~Test() { 32070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong delete gtest_flag_saver_; 32080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 32090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 32100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Sets up the test fixture. 32110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 32120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A sub-class may override this. 32130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Test::SetUp() { 32140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 32150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 32160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Tears down the test fixture. 32170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 32180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A sub-class may override this. 32190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Test::TearDown() { 32200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 32210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 32220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Allows user supplied key value pairs to be recorded for later output. 32230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Test::RecordProperty(const char* key, const char* value) { 32240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnitTest::GetInstance()->RecordPropertyForCurrentTest(key, value); 32250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 32260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 32270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Allows user supplied key value pairs to be recorded for later output. 32280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Test::RecordProperty(const char* key, int value) { 32290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message value_message; 32300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong value_message << value; 32310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong RecordProperty(key, value_message.GetString().c_str()); 32320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 32330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 32340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 32350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 32360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid ReportFailureInUnknownLocation(TestPartResult::Type result_type, 32370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String& message) { 32380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This function is a friend of UnitTest and as such has access to 32390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // AddTestPartResult. 32400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnitTest::GetInstance()->AddTestPartResult( 32410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result_type, 32420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong NULL, // No info about the source file where the exception occurred. 32430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong -1, // We have no info on which line caused the exception. 32440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong message, 32450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String()); // No stack trace, either. 32460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 32470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 32480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 32490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 32500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Google Test requires all tests in the same test case to use the same test 32510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// fixture class. This function checks if the current test has the 32520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// same fixture class as the first test in the current test case. If 32530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// yes, it returns true; otherwise it generates a Google Test failure and 32540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// returns false. 32550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool Test::HasSameFixtureClass() { 32560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); 32570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestCase* const test_case = impl->current_test_case(); 32580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 32590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Info about the first test in the current test case. 32600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestInfo* const first_test_info = test_case->test_info_list()[0]; 32610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_; 32620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const first_test_name = first_test_info->name(); 32630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 32640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Info about the current test. 32650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestInfo* const this_test_info = impl->current_test_info(); 32660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_; 32670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const this_test_name = this_test_info->name(); 32680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 32690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (this_fixture_id != first_fixture_id) { 32700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Is the first test defined using TEST? 32710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId(); 32720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Is this test defined using TEST? 32730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId(); 32740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 32750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (first_is_TEST || this_is_TEST) { 32760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The user mixed TEST and TEST_F in this test case - we'll tell 32770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // him/her how to fix it. 32780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 32790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the name of the TEST and the name of the TEST_F. Note 32800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // that first_is_TEST and this_is_TEST cannot both be true, as 32810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the fixture IDs are different for the two tests. 32820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const TEST_name = 32830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong first_is_TEST ? first_test_name : this_test_name; 32840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const TEST_F_name = 32850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong first_is_TEST ? this_test_name : first_test_name; 32860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 32870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ADD_FAILURE() 32880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "All tests in the same test case must use the same test fixture\n" 32890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "class, so mixing TEST_F and TEST in the same test case is\n" 32900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "illegal. In test case " << this_test_info->test_case_name() 32910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << ",\n" 32920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "test " << TEST_F_name << " is defined using TEST_F but\n" 32930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "test " << TEST_name << " is defined using TEST. You probably\n" 32940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "want to change the TEST to TEST_F or move it to another test\n" 32950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "case."; 32960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 32970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The user defined two fixture classes with the same name in 32980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // two namespaces - we'll tell him/her how to fix it. 32990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ADD_FAILURE() 33000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "All tests in the same test case must use the same test fixture\n" 33010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "class. However, in test case " 33020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << this_test_info->test_case_name() << ",\n" 33030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "you defined test " << first_test_name 33040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " and test " << this_test_name << "\n" 33050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "using two different test fixture classes. This can happen if\n" 33060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "the two classes are from different namespaces or translation\n" 33070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "units and have the same name. You should probably rename one\n" 33080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "of the classes to put the tests into different test cases."; 33090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 33100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 33110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 33120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 33130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 33140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 33150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 33160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_SEH 33170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 33180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Adds an "exception thrown" fatal failure to the current test. This 33190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// function returns its result via an output parameter pointer because VC++ 33200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// prohibits creation of objects with destructors on stack in functions 33210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// using __try (see error C2712). 33220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic internal::String* FormatSehExceptionMessage(DWORD exception_code, 33230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* location) { 33240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message message; 33250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong message << "SEH exception with code 0x" << std::setbase(16) << 33260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong exception_code << std::setbase(10) << " thrown in " << location << "."; 33270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 33280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return new internal::String(message.GetString()); 33290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 33300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 33310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_SEH 33320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 33330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_EXCEPTIONS 33340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 33350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Adds an "exception thrown" fatal failure to the current test. 33360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic internal::String FormatCxxExceptionMessage(const char* description, 33370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* location) { 33380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message message; 33390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (description != NULL) { 33400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong message << "C++ exception with description \"" << description << "\""; 33410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 33420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong message << "Unknown C++ exception"; 33430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 33440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong message << " thrown in " << location << "."; 33450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 33460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return message.GetString(); 33470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 33480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 33490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic internal::String PrintTestPartResultToString( 33500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestPartResult& test_part_result); 33510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 33520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A failed Google Test assertion will throw an exception of this type when 33530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// GTEST_FLAG(throw_on_failure) is true (if exceptions are enabled). We 33540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// derive it from std::runtime_error, which is for errors presumably 33550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// detectable only at run time. Since std::runtime_error inherits from 33560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// std::exception, many testing frameworks know how to extract and print the 33570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// message inside it. 33580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass GoogleTestFailureException : public ::std::runtime_error { 33590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 33600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong explicit GoogleTestFailureException(const TestPartResult& failure) 33610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {} 33620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 33630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_EXCEPTIONS 33640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 33650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 33660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// We put these helper functions in the internal namespace as IBM's xlC 33670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// compiler rejects the code if they were declared static. 33680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 33690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Runs the given method and handles SEH exceptions it throws, when 33700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SEH is supported; returns the 0-value for type Result in case of an 33710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SEH exception. (Microsoft compilers cannot handle SEH and C++ 33720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// exceptions in the same function. Therefore, we provide a separate 33730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// wrapper function for handling SEH exceptions.) 33740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate <class T, typename Result> 33750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongResult HandleSehExceptionsInMethodIfSupported( 33760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong T* object, Result (T::*method)(), const char* location) { 33770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_SEH 33780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong __try { 33790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (object->*method)(); 33800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } __except (internal::UnitTestOptions::GTestShouldProcessSEH( // NOLINT 33810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetExceptionCode())) { 33820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We create the exception message on the heap because VC++ prohibits 33830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // creation of objects with destructors on stack in functions using __try 33840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // (see error C2712). 33850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::String* exception_message = FormatSehExceptionMessage( 33860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetExceptionCode(), location); 33870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure, 33880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *exception_message); 33890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong delete exception_message; 33900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return static_cast<Result>(0); 33910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 33920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 33930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (void)location; 33940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (object->*method)(); 33950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_SEH 33960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 33970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 33980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Runs the given method and catches and reports C++ and/or SEH-style 33990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// exceptions, if they are supported; returns the 0-value for type 34000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Result in case of an SEH exception. 34010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate <class T, typename Result> 34020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongResult HandleExceptionsInMethodIfSupported( 34030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong T* object, Result (T::*method)(), const char* location) { 34040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // NOTE: The user code can affect the way in which Google Test handles 34050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // exceptions by setting GTEST_FLAG(catch_exceptions), but only before 34060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // RUN_ALL_TESTS() starts. It is technically possible to check the flag 34070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // after the exception is caught and either report or re-throw the 34080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // exception based on the flag's value: 34090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 34100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // try { 34110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // // Perform the test method. 34120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // } catch (...) { 34130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // if (GTEST_FLAG(catch_exceptions)) 34140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // // Report the exception as failure. 34150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // else 34160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // throw; // Re-throws the original exception. 34170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // } 34180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 34190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // However, the purpose of this flag is to allow the program to drop into 34200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the debugger when the exception is thrown. On most platforms, once the 34210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // control enters the catch block, the exception origin information is 34220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // lost and the debugger will stop the program at the point of the 34230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // re-throw in this function -- instead of at the point of the original 34240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // throw statement in the code under test. For this reason, we perform 34250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the check early, sacrificing the ability to affect Google Test's 34260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // exception handling in the method where the exception is thrown. 34270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (internal::GetUnitTestImpl()->catch_exceptions()) { 34280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_EXCEPTIONS 34290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong try { 34300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return HandleSehExceptionsInMethodIfSupported(object, method, location); 34310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } catch (const GoogleTestFailureException&) { // NOLINT 34320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This exception doesn't originate in code under test. It makes no 34330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // sense to report it as a test failure. 34340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong throw; 34350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } catch (const std::exception& e) { // NOLINT 34360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::ReportFailureInUnknownLocation( 34370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResult::kFatalFailure, 34380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FormatCxxExceptionMessage(e.what(), location)); 34390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } catch (...) { // NOLINT 34400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::ReportFailureInUnknownLocation( 34410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResult::kFatalFailure, 34420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FormatCxxExceptionMessage(NULL, location)); 34430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 34440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return static_cast<Result>(0); 34450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 34460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return HandleSehExceptionsInMethodIfSupported(object, method, location); 34470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_EXCEPTIONS 34480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 34490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (object->*method)(); 34500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 34510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 34520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 34530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 34540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 34550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Runs the test and updates the test result. 34560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Test::Run() { 34570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!HasSameFixtureClass()) return; 34580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 34590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); 34600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl->os_stack_trace_getter()->UponLeavingGTest(); 34610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()"); 34620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We will run the test only if SetUp() was successful. 34630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!HasFatalFailure()) { 34640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl->os_stack_trace_getter()->UponLeavingGTest(); 34650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::HandleExceptionsInMethodIfSupported( 34660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong this, &Test::TestBody, "the test body"); 34670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 34680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 34690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // However, we want to clean up as much as possible. Hence we will 34700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // always call TearDown(), even if SetUp() or the test body has 34710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // failed. 34720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl->os_stack_trace_getter()->UponLeavingGTest(); 34730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::HandleExceptionsInMethodIfSupported( 34740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong this, &Test::TearDown, "TearDown()"); 34750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 34760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 34770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff the current test has a fatal failure. 34780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool Test::HasFatalFailure() { 34790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure(); 34800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 34810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 34820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff the current test has a non-fatal failure. 34830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool Test::HasNonfatalFailure() { 34840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return internal::GetUnitTestImpl()->current_test_result()-> 34850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong HasNonfatalFailure(); 34860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 34870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 34880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// class TestInfo 34890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 34900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Constructs a TestInfo object. It assumes ownership of the test factory 34910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// object. 34920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TODO(vladl@google.com): Make a_test_case_name and a_name const string&'s 34930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// to signify they cannot be NULLs. 34940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestInfo::TestInfo(const char* a_test_case_name, 34950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* a_name, 34960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* a_type_param, 34970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* a_value_param, 34980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::TypeId fixture_class_id, 34990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::TestFactoryBase* factory) 35000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : test_case_name_(a_test_case_name), 35010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong name_(a_name), 35020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong type_param_(a_type_param ? new std::string(a_type_param) : NULL), 35030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong value_param_(a_value_param ? new std::string(a_value_param) : NULL), 35040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fixture_class_id_(fixture_class_id), 35050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong should_run_(false), 35060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong is_disabled_(false), 35070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong matches_filter_(false), 35080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong factory_(factory), 35090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result_() {} 35100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 35110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Destructs a TestInfo object. 35120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestInfo::~TestInfo() { delete factory_; } 35130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 35140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 35150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 35160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates a new TestInfo object and registers it with Google Test; 35170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// returns the created object. 35180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 35190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Arguments: 35200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 35210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// test_case_name: name of the test case 35220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// name: name of the test 35230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// type_param: the name of the test's type parameter, or NULL if 35240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this is not a typed or a type-parameterized test. 35250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// value_param: text representation of the test's value parameter, 35260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// or NULL if this is not a value-parameterized test. 35270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// fixture_class_id: ID of the test fixture class 35280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// set_up_tc: pointer to the function that sets up the test case 35290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// tear_down_tc: pointer to the function that tears down the test case 35300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// factory: pointer to the factory that creates a test object. 35310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The newly created TestInfo instance will assume 35320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// ownership of the factory object. 35330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestInfo* MakeAndRegisterTestInfo( 35340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* test_case_name, const char* name, 35350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* type_param, 35360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* value_param, 35370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TypeId fixture_class_id, 35380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SetUpTestCaseFunc set_up_tc, 35390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TearDownTestCaseFunc tear_down_tc, 35400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestFactoryBase* factory) { 35410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestInfo* const test_info = 35420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong new TestInfo(test_case_name, name, type_param, value_param, 35430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fixture_class_id, factory); 35440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info); 35450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return test_info; 35460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 35470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 35480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_PARAM_TEST 35490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid ReportInvalidTestCaseType(const char* test_case_name, 35500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* file, int line) { 35510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message errors; 35520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong errors 35530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Attempted redefinition of test case " << test_case_name << ".\n" 35540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "All tests in the same test case must use the same test fixture\n" 35550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "class. However, in test case " << test_case_name << ", you tried\n" 35560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "to define a test using a fixture class different from the one\n" 35570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "used earlier. This can happen if the two fixture classes are\n" 35580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "from different namespaces and have the same name. You should\n" 35590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "probably rename one of the classes to put the tests into different\n" 35600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "test cases."; 35610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 35620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(), 35630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong errors.GetString().c_str()); 35640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 35650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_PARAM_TEST 35660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 35670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 35680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 35690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace { 35700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 35710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A predicate that checks the test name of a TestInfo against a known 35720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// value. 35730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 35740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This is used for implementation of the TestCase class only. We put 35750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// it in the anonymous namespace to prevent polluting the outer 35760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// namespace. 35770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 35780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TestNameIs is copyable. 35790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass TestNameIs { 35800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 35810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Constructor. 35820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 35830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TestNameIs has NO default constructor. 35840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong explicit TestNameIs(const char* name) 35850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : name_(name) {} 35860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 35870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns true iff the test name of test_info matches name_. 35880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool operator()(const TestInfo * test_info) const { 35890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return test_info && internal::String(test_info->name()).Compare(name_) == 0; 35900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 35910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 35920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 35930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::String name_; 35940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 35950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 35960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace 35970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 35980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 35990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This method expands all parameterized tests registered with macros TEST_P 36010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// and INSTANTIATE_TEST_CASE_P into regular tests and registers those. 36020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This will be done just once during the program runtime. 36030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid UnitTestImpl::RegisterParameterizedTests() { 36040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_PARAM_TEST 36050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!parameterized_tests_registered_) { 36060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong parameterized_test_registry_.RegisterTests(); 36070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong parameterized_tests_registered_ = true; 36080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 36090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 36100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 36110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 36130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates the test object, runs it, records its result, and then 36150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// deletes it. 36160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestInfo::Run() { 36170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!should_run_) return; 36180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Tells UnitTest where to store test result. 36200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); 36210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl->set_current_test_info(this); 36220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); 36240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Notifies the unit test event listeners that a test is about to start. 36260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong repeater->OnTestStart(*this); 36270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TimeInMillis start = internal::GetTimeInMillis(); 36290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl->os_stack_trace_getter()->UponLeavingGTest(); 36310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Creates the test object. 36330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Test* const test = internal::HandleExceptionsInMethodIfSupported( 36340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong factory_, &internal::TestFactoryBase::CreateTest, 36350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "the test fixture's constructor"); 36360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Runs the test only if the test object was created and its 36380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // constructor didn't generate a fatal failure. 36390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if ((test != NULL) && !Test::HasFatalFailure()) { 36400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This doesn't throw as all user code that can throw are wrapped into 36410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // exception handling code. 36420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test->Run(); 36430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 36440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Deletes the test object. 36460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl->os_stack_trace_getter()->UponLeavingGTest(); 36470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::HandleExceptionsInMethodIfSupported( 36480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test, &Test::DeleteSelf_, "the test fixture's destructor"); 36490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result_.set_elapsed_time(internal::GetTimeInMillis() - start); 36510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Notifies the unit test event listener that a test has just finished. 36530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong repeater->OnTestEnd(*this); 36540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Tells UnitTest to stop associating assertion results to this 36560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // test. 36570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl->set_current_test_info(NULL); 36580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 36590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// class TestCase 36610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of successful tests in this test case. 36630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint TestCase::successful_test_count() const { 36640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return CountIf(test_info_list_, TestPassed); 36650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 36660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of failed tests in this test case. 36680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint TestCase::failed_test_count() const { 36690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return CountIf(test_info_list_, TestFailed); 36700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 36710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint TestCase::disabled_test_count() const { 36730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return CountIf(test_info_list_, TestDisabled); 36740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 36750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Get the number of tests in this test case that should run. 36770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint TestCase::test_to_run_count() const { 36780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return CountIf(test_info_list_, ShouldRunTest); 36790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 36800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of all tests. 36820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint TestCase::total_test_count() const { 36830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return static_cast<int>(test_info_list_.size()); 36840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 36850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 36860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates a TestCase with the given name. 36870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 36880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Arguments: 36890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 36900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// name: name of the test case 36910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// a_type_param: the name of the test case's type parameter, or NULL if 36920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this is not a typed or a type-parameterized test case. 36930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// set_up_tc: pointer to the function that sets up the test case 36940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// tear_down_tc: pointer to the function that tears down the test case 36950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestCase::TestCase(const char* a_name, const char* a_type_param, 36960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Test::SetUpTestCaseFunc set_up_tc, 36970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Test::TearDownTestCaseFunc tear_down_tc) 36980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : name_(a_name), 36990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong type_param_(a_type_param ? new std::string(a_type_param) : NULL), 37000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_up_tc_(set_up_tc), 37010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong tear_down_tc_(tear_down_tc), 37020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong should_run_(false), 37030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong elapsed_time_(0) { 37040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 37050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 37060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Destructor of TestCase. 37070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestCase::~TestCase() { 37080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Deletes every Test in the collection. 37090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ForEach(test_info_list_, internal::Delete<TestInfo>); 37100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 37110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 37120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the i-th test among all the tests. i can range from 0 to 37130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// total_test_count() - 1. If i is not in that range, returns NULL. 37140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst TestInfo* TestCase::GetTestInfo(int i) const { 37150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int index = GetElementOr(test_indices_, i, -1); 37160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return index < 0 ? NULL : test_info_list_[index]; 37170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 37180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 37190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the i-th test among all the tests. i can range from 0 to 37200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// total_test_count() - 1. If i is not in that range, returns NULL. 37210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestInfo* TestCase::GetMutableTestInfo(int i) { 37220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int index = GetElementOr(test_indices_, i, -1); 37230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return index < 0 ? NULL : test_info_list_[index]; 37240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 37250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 37260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Adds a test to this test case. Will delete the test upon 37270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// destruction of the TestCase object. 37280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestCase::AddTestInfo(TestInfo * test_info) { 37290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_info_list_.push_back(test_info); 37300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_indices_.push_back(static_cast<int>(test_indices_.size())); 37310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 37320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 37330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Runs every test in this TestCase. 37340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestCase::Run() { 37350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!should_run_) return; 37360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 37370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); 37380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl->set_current_test_case(this); 37390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 37400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); 37410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 37420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong repeater->OnTestCaseStart(*this); 37430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl->os_stack_trace_getter()->UponLeavingGTest(); 37440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::HandleExceptionsInMethodIfSupported( 37450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong this, &TestCase::RunSetUpTestCase, "SetUpTestCase()"); 37460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 37470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const internal::TimeInMillis start = internal::GetTimeInMillis(); 37480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int i = 0; i < total_test_count(); i++) { 37490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetMutableTestInfo(i)->Run(); 37500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 37510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong elapsed_time_ = internal::GetTimeInMillis() - start; 37520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 37530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl->os_stack_trace_getter()->UponLeavingGTest(); 37540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::HandleExceptionsInMethodIfSupported( 37550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong this, &TestCase::RunTearDownTestCase, "TearDownTestCase()"); 37560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 37570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong repeater->OnTestCaseEnd(*this); 37580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl->set_current_test_case(NULL); 37590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 37600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 37610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Clears the results of all tests in this test case. 37620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestCase::ClearResult() { 37630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ForEach(test_info_list_, TestInfo::ClearTestResult); 37640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 37650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 37660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Shuffles the tests in this test case. 37670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestCase::ShuffleTests(internal::Random* random) { 37680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Shuffle(random, &test_indices_); 37690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 37700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 37710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Restores the test order to before the first shuffle. 37720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestCase::UnshuffleTests() { 37730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t i = 0; i < test_indices_.size(); i++) { 37740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_indices_[i] = static_cast<int>(i); 37750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 37760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 37770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 37780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Formats a countable noun. Depending on its quantity, either the 37790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// singular form or the plural form is used. e.g. 37800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 37810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// FormatCountableNoun(1, "formula", "formuli") returns "1 formula". 37820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// FormatCountableNoun(5, "book", "books") returns "5 books". 37830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic internal::String FormatCountableNoun(int count, 37840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char * singular_form, 37850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char * plural_form) { 37860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return internal::String::Format("%d %s", count, 37870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong count == 1 ? singular_form : plural_form); 37880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 37890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 37900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Formats the count of tests. 37910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic internal::String FormatTestCount(int test_count) { 37920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return FormatCountableNoun(test_count, "test", "tests"); 37930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 37940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 37950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Formats the count of test cases. 37960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic internal::String FormatTestCaseCount(int test_case_count) { 37970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return FormatCountableNoun(test_case_count, "test case", "test cases"); 37980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 37990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 38000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Converts a TestPartResult::Type enum to human-friendly string 38010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// representation. Both kNonFatalFailure and kFatalFailure are translated 38020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// to "Failure", as the user usually doesn't care about the difference 38030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// between the two when viewing the test result. 38040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic const char * TestPartResultTypeToString(TestPartResult::Type type) { 38050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong switch (type) { 38060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case TestPartResult::kSuccess: 38070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return "Success"; 38080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 38090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case TestPartResult::kNonFatalFailure: 38100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case TestPartResult::kFatalFailure: 38110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#ifdef _MSC_VER 38120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return "error: "; 38130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 38140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return "Failure\n"; 38150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 38160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default: 38170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return "Unknown result type"; 38180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 38190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 38200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 38210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints a TestPartResult to a String. 38220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic internal::String PrintTestPartResultToString( 38230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestPartResult& test_part_result) { 38240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (Message() 38250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << internal::FormatFileLocation(test_part_result.file_name(), 38260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_part_result.line_number()) 38270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " " << TestPartResultTypeToString(test_part_result.type()) 38280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << test_part_result.message()).GetString(); 38290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 38300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 38310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints a TestPartResult. 38320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic void PrintTestPartResult(const TestPartResult& test_part_result) { 38330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const internal::String& result = 38340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintTestPartResultToString(test_part_result); 38350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("%s\n", result.c_str()); 38360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 38370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If the test program runs in Visual Studio or a debugger, the 38380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // following statements add the test part result message to the Output 38390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // window such that the user can double-click on it to jump to the 38400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // corresponding source code location; otherwise they do nothing. 38410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE 38420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We don't call OutputDebugString*() on Windows Mobile, as printing 38430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // to stdout is done by OutputDebugString() there already - we don't 38440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // want the same message printed twice. 38450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::OutputDebugStringA(result.c_str()); 38460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::OutputDebugStringA("\n"); 38470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 38480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 38490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 38500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// class PrettyUnitTestResultPrinter 38510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 38520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 38530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 38540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongenum GTestColor { 38550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong COLOR_DEFAULT, 38560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong COLOR_RED, 38570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong COLOR_GREEN, 38580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong COLOR_YELLOW 38590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 38600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 38610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE 38620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 38630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the character attribute for the given color. 38640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongWORD GetColorAttribute(GTestColor color) { 38650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong switch (color) { 38660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case COLOR_RED: return FOREGROUND_RED; 38670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case COLOR_GREEN: return FOREGROUND_GREEN; 38680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN; 38690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default: return 0; 38700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 38710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 38720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 38730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 38740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 38750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the ANSI color code for the given color. COLOR_DEFAULT is 38760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// an invalid input. 38770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char* GetAnsiColorCode(GTestColor color) { 38780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong switch (color) { 38790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case COLOR_RED: return "1"; 38800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case COLOR_GREEN: return "2"; 38810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case COLOR_YELLOW: return "3"; 38820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default: return NULL; 38830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong }; 38840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 38850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 38860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE 38870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 38880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff Google Test should use colors in the output. 38890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool ShouldUseColor(bool stdout_is_tty) { 38900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const gtest_color = GTEST_FLAG(color).c_str(); 38910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 38920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) { 38930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS 38940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // On Windows the TERM variable is usually not set, but the 38950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // console there does support colors. 38960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return stdout_is_tty; 38970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 38980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // On non-Windows platforms, we rely on the TERM variable. 38990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const term = posix::GetEnv("TERM"); 39000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool term_supports_color = 39010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String::CStringEquals(term, "xterm") || 39020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String::CStringEquals(term, "xterm-color") || 39030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String::CStringEquals(term, "xterm-256color") || 39040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String::CStringEquals(term, "screen") || 39050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String::CStringEquals(term, "linux") || 39060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String::CStringEquals(term, "cygwin"); 39070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return stdout_is_tty && term_supports_color; 39080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS 39090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 39100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 39110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return String::CaseInsensitiveCStringEquals(gtest_color, "yes") || 39120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String::CaseInsensitiveCStringEquals(gtest_color, "true") || 39130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String::CaseInsensitiveCStringEquals(gtest_color, "t") || 39140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String::CStringEquals(gtest_color, "1"); 39150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We take "yes", "true", "t", and "1" as meaning "yes". If the 39160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // value is neither one of these nor "auto", we treat it as "no" to 39170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // be conservative. 39180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 39190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 39200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Helpers for printing colored strings to stdout. Note that on Windows, we 39210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// cannot simply emit special characters and have the terminal change colors. 39220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This routine must actually emit the characters rather than return a string 39230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// that would be colored when printed, as can be done on Linux. 39240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid ColoredPrintf(GTestColor color, const char* fmt, ...) { 39250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong va_list args; 39260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong va_start(args, fmt); 39270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 39280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS 39290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool use_color = false; 39300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 39310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static const bool in_color_mode = 39320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0); 39330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool use_color = in_color_mode && (color != COLOR_DEFAULT); 39340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS 39350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The '!= 0' comparison is necessary to satisfy MSVC 7.1. 39360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 39370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!use_color) { 39380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong vprintf(fmt, args); 39390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong va_end(args); 39400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return; 39410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 39420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 39430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE 39440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE); 39450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 39460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the current text color. 39470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong CONSOLE_SCREEN_BUFFER_INFO buffer_info; 39480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetConsoleScreenBufferInfo(stdout_handle, &buffer_info); 39490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const WORD old_color_attrs = buffer_info.wAttributes; 39500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 39510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We need to flush the stream buffers into the console before each 39520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // SetConsoleTextAttribute call lest it affect the text that is already 39530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // printed but has not yet reached the console. 39540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 39550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SetConsoleTextAttribute(stdout_handle, 39560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetColorAttribute(color) | FOREGROUND_INTENSITY); 39570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong vprintf(fmt, args); 39580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 39590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 39600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Restores the text color. 39610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SetConsoleTextAttribute(stdout_handle, old_color_attrs); 39620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 39630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("\033[0;3%sm", GetAnsiColorCode(color)); 39640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong vprintf(fmt, args); 39650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("\033[m"); // Resets the terminal to default. 39660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE 39670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong va_end(args); 39680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 39690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 39700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrintFullTestCommentIfPresent(const TestInfo& test_info) { 39710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const type_param = test_info.type_param(); 39720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const value_param = test_info.value_param(); 39730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 39740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (type_param != NULL || value_param != NULL) { 39750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf(", where "); 39760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (type_param != NULL) { 39770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("TypeParam = %s", type_param); 39780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (value_param != NULL) 39790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf(" and "); 39800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 39810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (value_param != NULL) { 39820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("GetParam() = %s", value_param); 39830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 39840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 39850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 39860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 39870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This class implements the TestEventListener interface. 39880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 39890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Class PrettyUnitTestResultPrinter is copyable. 39900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass PrettyUnitTestResultPrinter : public TestEventListener { 39910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 39920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrettyUnitTestResultPrinter() {} 39930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static void PrintTestName(const char * test_case, const char * test) { 39940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("%s.%s", test_case, test); 39950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 39960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 39970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The following methods override what's in the TestEventListener class. 39980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {} 39990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration); 40000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test); 40010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {} 40020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestCaseStart(const TestCase& test_case); 40030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestStart(const TestInfo& test_info); 40040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestPartResult(const TestPartResult& result); 40050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestEnd(const TestInfo& test_info); 40060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestCaseEnd(const TestCase& test_case); 40070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test); 40080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {} 40090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration); 40100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {} 40110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 40120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 40130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static void PrintFailedTests(const UnitTest& unit_test); 40140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 40150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::String test_case_name_; 40160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 40170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 40180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Fired before each iteration of tests starts. 40190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrettyUnitTestResultPrinter::OnTestIterationStart( 40200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const UnitTest& unit_test, int iteration) { 40210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (GTEST_FLAG(repeat) != 1) 40220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1); 40230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 40240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const filter = GTEST_FLAG(filter).c_str(); 40250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 40260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Prints the filter if it's not *. This reminds the user that some 40270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // tests may be skipped. 40280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!internal::String::CStringEquals(filter, kUniversalFilter)) { 40290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_YELLOW, 40300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Note: %s filter = %s\n", GTEST_NAME_, filter); 40310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 40320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 40330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) { 40340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1); 40350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_YELLOW, 40360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Note: This is test shard %d of %s.\n", 40370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static_cast<int>(shard_index) + 1, 40380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::posix::GetEnv(kTestTotalShards)); 40390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 40400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 40410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (GTEST_FLAG(shuffle)) { 40420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_YELLOW, 40430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Note: Randomizing tests' orders with a seed of %d .\n", 40440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong unit_test.random_seed()); 40450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 40460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 40470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_GREEN, "[==========] "); 40480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("Running %s from %s.\n", 40490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FormatTestCount(unit_test.test_to_run_count()).c_str(), 40500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str()); 40510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 40520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 40530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 40540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart( 40550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const UnitTest& /*unit_test*/) { 40560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_GREEN, "[----------] "); 40570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("Global test environment set-up.\n"); 40580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 40590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 40600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 40610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) { 40620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_case_name_ = test_case.name(); 40630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const internal::String counts = 40640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FormatCountableNoun(test_case.test_to_run_count(), "test", "tests"); 40650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_GREEN, "[----------] "); 40660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("%s from %s", counts.c_str(), test_case_name_.c_str()); 40670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (test_case.type_param() == NULL) { 40680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("\n"); 40690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 40700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf(", where TypeParam = %s\n", test_case.type_param()); 40710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 40720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 40730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 40740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 40750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) { 40760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_GREEN, "[ RUN ] "); 40770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintTestName(test_case_name_.c_str(), test_info.name()); 40780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("\n"); 40790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 40800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 40810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 40820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Called after an assertion failure. 40830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrettyUnitTestResultPrinter::OnTestPartResult( 40840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestPartResult& result) { 40850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If the test part succeeded, we don't need to do anything. 40860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (result.type() == TestPartResult::kSuccess) 40870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return; 40880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 40890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Print failure message from the assertion (e.g. expected this and got that). 40900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintTestPartResult(result); 40910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 40920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 40930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 40940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) { 40950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (test_info.result()->Passed()) { 40960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_GREEN, "[ OK ] "); 40970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 40980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_RED, "[ FAILED ] "); 40990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 41000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintTestName(test_case_name_.c_str(), test_info.name()); 41010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (test_info.result()->Failed()) 41020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintFullTestCommentIfPresent(test_info); 41030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 41040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (GTEST_FLAG(print_time)) { 41050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf(" (%s ms)\n", internal::StreamableToString( 41060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_info.result()->elapsed_time()).c_str()); 41070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 41080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("\n"); 41090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 41100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 41110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 41120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 41130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) { 41140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!GTEST_FLAG(print_time)) return; 41150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 41160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_case_name_ = test_case.name(); 41170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const internal::String counts = 41180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FormatCountableNoun(test_case.test_to_run_count(), "test", "tests"); 41190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_GREEN, "[----------] "); 41200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("%s from %s (%s ms total)\n\n", 41210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong counts.c_str(), test_case_name_.c_str(), 41220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::StreamableToString(test_case.elapsed_time()).c_str()); 41230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 41240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 41250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 41260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart( 41270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const UnitTest& /*unit_test*/) { 41280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_GREEN, "[----------] "); 41290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("Global test environment tear-down\n"); 41300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 41310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 41320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 41330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Internal helper for printing the list of failed tests. 41340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) { 41350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int failed_test_count = unit_test.failed_test_count(); 41360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (failed_test_count == 0) { 41370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return; 41380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 41390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 41400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int i = 0; i < unit_test.total_test_case_count(); ++i) { 41410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestCase& test_case = *unit_test.GetTestCase(i); 41420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!test_case.should_run() || (test_case.failed_test_count() == 0)) { 41430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong continue; 41440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 41450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int j = 0; j < test_case.total_test_count(); ++j) { 41460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestInfo& test_info = *test_case.GetTestInfo(j); 41470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!test_info.should_run() || test_info.result()->Passed()) { 41480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong continue; 41490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 41500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_RED, "[ FAILED ] "); 41510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("%s.%s", test_case.name(), test_info.name()); 41520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintFullTestCommentIfPresent(test_info); 41530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("\n"); 41540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 41550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 41560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 41570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 41580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, 41590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int /*iteration*/) { 41600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_GREEN, "[==========] "); 41610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("%s from %s ran.", 41620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FormatTestCount(unit_test.test_to_run_count()).c_str(), 41630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str()); 41640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (GTEST_FLAG(print_time)) { 41650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf(" (%s ms total)", 41660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::StreamableToString(unit_test.elapsed_time()).c_str()); 41670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 41680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("\n"); 41690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_GREEN, "[ PASSED ] "); 41700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str()); 41710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 41720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_failures = unit_test.failed_test_count(); 41730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!unit_test.Passed()) { 41740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int failed_test_count = unit_test.failed_test_count(); 41750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_RED, "[ FAILED ] "); 41760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str()); 41770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintFailedTests(unit_test); 41780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("\n%2d FAILED %s\n", num_failures, 41790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong num_failures == 1 ? "TEST" : "TESTS"); 41800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 41810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 41820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_disabled = unit_test.disabled_test_count(); 41830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) { 41840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!num_failures) { 41850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("\n"); // Add a spacer if no FAILURE banner is displayed. 41860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 41870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_YELLOW, 41880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong " YOU HAVE %d DISABLED %s\n\n", 41890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong num_disabled, 41900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong num_disabled == 1 ? "TEST" : "TESTS"); 41910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 41920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Ensure that Google Test output is printed before, e.g., heapchecker output. 41930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 41940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 41950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 41960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// End PrettyUnitTestResultPrinter 41970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 41980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// class TestEventRepeater 41990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 42000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This class forwards events to other event listeners. 42010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass TestEventRepeater : public TestEventListener { 42020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 42030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestEventRepeater() : forwarding_enabled_(true) {} 42040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual ~TestEventRepeater(); 42050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void Append(TestEventListener *listener); 42060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestEventListener* Release(TestEventListener* listener); 42070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 42080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Controls whether events will be forwarded to listeners_. Set to false 42090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // in death test child processes. 42100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool forwarding_enabled() const { return forwarding_enabled_; } 42110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; } 42120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 42130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestProgramStart(const UnitTest& unit_test); 42140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration); 42150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test); 42160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test); 42170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestCaseStart(const TestCase& test_case); 42180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestStart(const TestInfo& test_info); 42190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestPartResult(const TestPartResult& result); 42200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestEnd(const TestInfo& test_info); 42210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestCaseEnd(const TestCase& test_case); 42220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test); 42230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test); 42240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration); 42250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestProgramEnd(const UnitTest& unit_test); 42260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 42270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 42280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Controls whether events will be forwarded to listeners_. Set to false 42290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // in death test child processes. 42300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool forwarding_enabled_; 42310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The list of listeners that receive events. 42320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::vector<TestEventListener*> listeners_; 42330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 42340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater); 42350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 42360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 42370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestEventRepeater::~TestEventRepeater() { 42380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ForEach(listeners_, Delete<TestEventListener>); 42390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 42400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 42410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestEventRepeater::Append(TestEventListener *listener) { 42420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong listeners_.push_back(listener); 42430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 42440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 42450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TODO(vladl@google.com): Factor the search functionality into Vector::Find. 42460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestEventListener* TestEventRepeater::Release(TestEventListener *listener) { 42470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t i = 0; i < listeners_.size(); ++i) { 42480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (listeners_[i] == listener) { 42490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong listeners_.erase(listeners_.begin() + i); 42500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return listener; 42510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 42520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 42530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 42540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return NULL; 42550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 42560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 42570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Since most methods are very similar, use macros to reduce boilerplate. 42580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This defines a member that forwards the call to all listeners. 42590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define GTEST_REPEATER_METHOD_(Name, Type) \ 42600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestEventRepeater::Name(const Type& parameter) { \ 42610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (forwarding_enabled_) { \ 42620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t i = 0; i < listeners_.size(); i++) { \ 42630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong listeners_[i]->Name(parameter); \ 42640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } \ 42650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } \ 42660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 42670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This defines a member that forwards the call to all listeners in reverse 42680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// order. 42690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \ 42700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestEventRepeater::Name(const Type& parameter) { \ 42710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (forwarding_enabled_) { \ 42720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \ 42730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong listeners_[i]->Name(parameter); \ 42740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } \ 42750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } \ 42760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 42770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 42780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest) 42790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest) 42800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase) 42810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_REPEATER_METHOD_(OnTestStart, TestInfo) 42820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult) 42830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest) 42840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest) 42850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest) 42860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo) 42870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase) 42880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest) 42890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 42900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#undef GTEST_REPEATER_METHOD_ 42910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#undef GTEST_REVERSE_REPEATER_METHOD_ 42920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 42930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test, 42940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int iteration) { 42950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (forwarding_enabled_) { 42960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t i = 0; i < listeners_.size(); i++) { 42970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong listeners_[i]->OnTestIterationStart(unit_test, iteration); 42980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 42990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 43000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 43010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test, 43030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int iteration) { 43040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (forwarding_enabled_) { 43050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { 43060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong listeners_[i]->OnTestIterationEnd(unit_test, iteration); 43070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 43080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 43090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 43100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// End TestEventRepeater 43120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This class generates an XML output file. 43140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass XmlUnitTestResultPrinter : public EmptyTestEventListener { 43150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 43160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong explicit XmlUnitTestResultPrinter(const char* output_file); 43170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration); 43190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 43210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Is c a whitespace character that is normalized to a space character 43220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // when it appears in an XML attribute value? 43230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static bool IsNormalizableWhitespace(char c) { 43240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return c == 0x9 || c == 0xA || c == 0xD; 43250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 43260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // May c appear in a well-formed XML document? 43280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static bool IsValidXmlCharacter(char c) { 43290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return IsNormalizableWhitespace(c) || c >= 0x20; 43300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 43310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns an XML-escaped copy of the input string str. If 43330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // is_attribute is true, the text is meant to appear as an attribute 43340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // value, and normalizable whitespace is preserved by replacing it 43350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // with character references. 43360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static String EscapeXml(const char* str, bool is_attribute); 43370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns the given string with all characters invalid in XML removed. 43390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static string RemoveInvalidXmlCharacters(const string& str); 43400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Convenience wrapper around EscapeXml when str is an attribute value. 43420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static String EscapeXmlAttribute(const char* str) { 43430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return EscapeXml(str, true); 43440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 43450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Convenience wrapper around EscapeXml when str is not an attribute value. 43470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static String EscapeXmlText(const char* str) { return EscapeXml(str, false); } 43480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Streams an XML CDATA section, escaping invalid CDATA sequences as needed. 43500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static void OutputXmlCDataSection(::std::ostream* stream, const char* data); 43510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Streams an XML representation of a TestInfo object. 43530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static void OutputXmlTestInfo(::std::ostream* stream, 43540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* test_case_name, 43550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestInfo& test_info); 43560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Prints an XML representation of a TestCase object 43580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static void PrintXmlTestCase(FILE* out, const TestCase& test_case); 43590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Prints an XML summary of unit_test to output stream out. 43610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static void PrintXmlUnitTest(FILE* out, const UnitTest& unit_test); 43620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Produces a string representing the test properties in a result as space 43640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // delimited XML attributes based on the property key="value" pairs. 43650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // When the String is not empty, it includes a space at the beginning, 43660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // to delimit this attribute from prior attributes. 43670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static String TestPropertiesAsXmlAttributes(const TestResult& result); 43680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The output file. 43700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String output_file_; 43710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter); 43730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 43740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates a new XmlUnitTestResultPrinter. 43760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongXmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file) 43770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : output_file_(output_file) { 43780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (output_file_.c_str() == NULL || output_file_.empty()) { 43790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fprintf(stderr, "XML output file may not be null\n"); 43800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stderr); 43810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong exit(EXIT_FAILURE); 43820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 43830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 43840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Called after the unit test ends. 43860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, 43870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int /*iteration*/) { 43880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FILE* xmlout = NULL; 43890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FilePath output_file(output_file_); 43900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FilePath output_dir(output_file.RemoveFileName()); 43910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 43920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (output_dir.CreateDirectoriesRecursively()) { 43930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong xmlout = posix::FOpen(output_file_.c_str(), "w"); 43940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 43950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (xmlout == NULL) { 43960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TODO(wan): report the reason of the failure. 43970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 43980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We don't do it for now as: 43990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 44000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 1. There is no urgent need for it. 44010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 2. It's a bit involved to make the errno variable thread-safe on 44020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // all three operating systems (Linux, Windows, and Mac OS). 44030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 3. To interpret the meaning of errno in a thread-safe way, 44040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // we need the strerror_r() function, which is not available on 44050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Windows. 44060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fprintf(stderr, 44070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Unable to open file \"%s\"\n", 44080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong output_file_.c_str()); 44090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stderr); 44100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong exit(EXIT_FAILURE); 44110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 44120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintXmlUnitTest(xmlout, unit_test); 44130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fclose(xmlout); 44140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 44150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 44160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns an XML-escaped copy of the input string str. If is_attribute 44170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// is true, the text is meant to appear as an attribute value, and 44180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// normalizable whitespace is preserved by replacing it with character 44190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// references. 44200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 44210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Invalid XML characters in str, if any, are stripped from the output. 44220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// It is expected that most, if not all, of the text processed by this 44230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// module will consist of ordinary English text. 44240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// If this module is ever modified to produce version 1.1 XML output, 44250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// most invalid characters can be retained using character references. 44260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TODO(wan): It might be nice to have a minimally invasive, human-readable 44270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// escaping scheme for invalid characters, rather than dropping them. 44280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString XmlUnitTestResultPrinter::EscapeXml(const char* str, bool is_attribute) { 44290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message m; 44300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 44310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (str != NULL) { 44320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (const char* src = str; *src; ++src) { 44330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong switch (*src) { 44340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case '<': 44350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong m << "<"; 44360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 44370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case '>': 44380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong m << ">"; 44390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 44400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case '&': 44410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong m << "&"; 44420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 44430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case '\'': 44440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (is_attribute) 44450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong m << "'"; 44460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong else 44470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong m << '\''; 44480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 44490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case '"': 44500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (is_attribute) 44510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong m << """; 44520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong else 44530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong m << '"'; 44540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 44550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default: 44560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (IsValidXmlCharacter(*src)) { 44570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (is_attribute && IsNormalizableWhitespace(*src)) 44580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong m << String::Format("&#x%02X;", unsigned(*src)); 44590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong else 44600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong m << *src; 44610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 44620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 44630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 44640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 44650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 44660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 44670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return m.GetString(); 44680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 44690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 44700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the given string with all characters invalid in XML removed. 44710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Currently invalid characters are dropped from the string. An 44720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// alternative is to replace them with certain characters such as . or ?. 44730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstring XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(const string& str) { 44740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong string output; 44750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong output.reserve(str.size()); 44760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (string::const_iterator it = str.begin(); it != str.end(); ++it) 44770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (IsValidXmlCharacter(*it)) 44780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong output.push_back(*it); 44790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 44800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return output; 44810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 44820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 44830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The following routines generate an XML representation of a UnitTest 44840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// object. 44850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 44860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This is how Google Test concepts map to the DTD: 44870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 44880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// <testsuites name="AllTests"> <-- corresponds to a UnitTest object 44890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// <testsuite name="testcase-name"> <-- corresponds to a TestCase object 44900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// <testcase name="test-name"> <-- corresponds to a TestInfo object 44910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// <failure message="...">...</failure> 44920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// <failure message="...">...</failure> 44930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// <failure message="...">...</failure> 44940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// <-- individual assertion failures 44950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// </testcase> 44960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// </testsuite> 44970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// </testsuites> 44980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 44990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Formats the given time in milliseconds as seconds. 45000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstd::string FormatTimeInMillisAsSeconds(TimeInMillis ms) { 45010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::stringstream ss; 45020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ss << ms/1000.0; 45030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return ss.str(); 45040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 45050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 45060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Streams an XML CDATA section, escaping invalid CDATA sequences as needed. 45070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream, 45080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* data) { 45090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* segment = data; 45100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *stream << "<![CDATA["; 45110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (;;) { 45120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const next_segment = strstr(segment, "]]>"); 45130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (next_segment != NULL) { 45140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong stream->write( 45150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong segment, static_cast<std::streamsize>(next_segment - segment)); 45160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *stream << "]]>]]><![CDATA["; 45170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong segment = next_segment + strlen("]]>"); 45180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 45190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *stream << segment; 45200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 45210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 45220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 45230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *stream << "]]>"; 45240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 45250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 45260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints an XML representation of a TestInfo object. 45270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TODO(wan): There is also value in printing properties with the plain printer. 45280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream, 45290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* test_case_name, 45300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestInfo& test_info) { 45310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestResult& result = *test_info.result(); 45320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *stream << " <testcase name=\"" 45330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << EscapeXmlAttribute(test_info.name()).c_str() << "\""; 45340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 45350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (test_info.value_param() != NULL) { 45360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *stream << " value_param=\"" << EscapeXmlAttribute(test_info.value_param()) 45370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "\""; 45380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 45390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (test_info.type_param() != NULL) { 45400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *stream << " type_param=\"" << EscapeXmlAttribute(test_info.type_param()) 45410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "\""; 45420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 45430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 45440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *stream << " status=\"" 45450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << (test_info.should_run() ? "run" : "notrun") 45460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "\" time=\"" 45470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << FormatTimeInMillisAsSeconds(result.elapsed_time()) 45480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "\" classname=\"" << EscapeXmlAttribute(test_case_name).c_str() 45490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "\"" << TestPropertiesAsXmlAttributes(result).c_str(); 45500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 45510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int failures = 0; 45520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int i = 0; i < result.total_part_count(); ++i) { 45530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestPartResult& part = result.GetTestPartResult(i); 45540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (part.failed()) { 45550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (++failures == 1) 45560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *stream << ">\n"; 45570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *stream << " <failure message=\"" 45580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << EscapeXmlAttribute(part.summary()).c_str() 45590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "\" type=\"\">"; 45600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const string location = internal::FormatCompilerIndependentFileLocation( 45610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong part.file_name(), part.line_number()); 45620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const string message = location + "\n" + part.message(); 45630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong OutputXmlCDataSection(stream, 45640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong RemoveInvalidXmlCharacters(message).c_str()); 45650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *stream << "</failure>\n"; 45660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 45670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 45680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 45690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (failures == 0) 45700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *stream << " />\n"; 45710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong else 45720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *stream << " </testcase>\n"; 45730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 45740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 45750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints an XML representation of a TestCase object 45760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid XmlUnitTestResultPrinter::PrintXmlTestCase(FILE* out, 45770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestCase& test_case) { 45780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fprintf(out, 45790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong " <testsuite name=\"%s\" tests=\"%d\" failures=\"%d\" " 45800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "disabled=\"%d\" ", 45810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong EscapeXmlAttribute(test_case.name()).c_str(), 45820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_case.total_test_count(), 45830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_case.failed_test_count(), 45840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_case.disabled_test_count()); 45850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fprintf(out, 45860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "errors=\"0\" time=\"%s\">\n", 45870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FormatTimeInMillisAsSeconds(test_case.elapsed_time()).c_str()); 45880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int i = 0; i < test_case.total_test_count(); ++i) { 45890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::stringstream stream; 45900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong OutputXmlTestInfo(&stream, test_case.name(), *test_case.GetTestInfo(i)); 45910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fprintf(out, "%s", StringStreamToString(&stream).c_str()); 45920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 45930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fprintf(out, " </testsuite>\n"); 45940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 45950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 45960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints an XML summary of unit_test to output stream out. 45970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid XmlUnitTestResultPrinter::PrintXmlUnitTest(FILE* out, 45980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const UnitTest& unit_test) { 45990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); 46000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fprintf(out, 46010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "<testsuites tests=\"%d\" failures=\"%d\" disabled=\"%d\" " 46020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "errors=\"0\" time=\"%s\" ", 46030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong unit_test.total_test_count(), 46040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong unit_test.failed_test_count(), 46050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong unit_test.disabled_test_count(), 46060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FormatTimeInMillisAsSeconds(unit_test.elapsed_time()).c_str()); 46070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (GTEST_FLAG(shuffle)) { 46080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fprintf(out, "random_seed=\"%d\" ", unit_test.random_seed()); 46090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 46100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fprintf(out, "name=\"AllTests\">\n"); 46110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int i = 0; i < unit_test.total_test_case_count(); ++i) 46120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintXmlTestCase(out, *unit_test.GetTestCase(i)); 46130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fprintf(out, "</testsuites>\n"); 46140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 46150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 46160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Produces a string representing the test properties in a result as space 46170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// delimited XML attributes based on the property key="value" pairs. 46180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes( 46190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestResult& result) { 46200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message attributes; 46210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int i = 0; i < result.test_property_count(); ++i) { 46220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestProperty& property = result.GetTestProperty(i); 46230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong attributes << " " << property.key() << "=" 46240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "\"" << EscapeXmlAttribute(property.value()) << "\""; 46250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 46260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return attributes.GetString(); 46270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 46280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 46290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// End XmlUnitTestResultPrinter 46300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 46310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_CAN_STREAM_RESULTS_ 46320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 46330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Streams test results to the given port on the given host machine. 46340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass StreamingListener : public EmptyTestEventListener { 46350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 46360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Escapes '=', '&', '%', and '\n' characters in str as "%xx". 46370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static string UrlEncode(const char* str); 46380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 46390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong StreamingListener(const string& host, const string& port) 46400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : sockfd_(-1), host_name_(host), port_num_(port) { 46410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MakeConnection(); 46420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Send("gtest_streaming_protocol_version=1.0\n"); 46430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 46440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 46450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual ~StreamingListener() { 46460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (sockfd_ != -1) 46470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong CloseConnection(); 46480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 46490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 46500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void OnTestProgramStart(const UnitTest& /* unit_test */) { 46510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Send("event=TestProgramStart\n"); 46520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 46530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 46540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void OnTestProgramEnd(const UnitTest& unit_test) { 46550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Note that Google Test current only report elapsed time for each 46560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // test iteration, not for the entire test program. 46570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Send(String::Format("event=TestProgramEnd&passed=%d\n", 46580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong unit_test.Passed())); 46590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 46600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Notify the streaming server to stop. 46610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong CloseConnection(); 46620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 46630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 46640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) { 46650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Send(String::Format("event=TestIterationStart&iteration=%d\n", 46660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong iteration)); 46670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 46680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 46690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) { 46700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Send(String::Format("event=TestIterationEnd&passed=%d&elapsed_time=%sms\n", 46710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong unit_test.Passed(), 46720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong StreamableToString(unit_test.elapsed_time()).c_str())); 46730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 46740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 46750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void OnTestCaseStart(const TestCase& test_case) { 46760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Send(String::Format("event=TestCaseStart&name=%s\n", test_case.name())); 46770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 46780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 46790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void OnTestCaseEnd(const TestCase& test_case) { 46800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Send(String::Format("event=TestCaseEnd&passed=%d&elapsed_time=%sms\n", 46810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_case.Passed(), 46820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong StreamableToString(test_case.elapsed_time()).c_str())); 46830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 46840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 46850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void OnTestStart(const TestInfo& test_info) { 46860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Send(String::Format("event=TestStart&name=%s\n", test_info.name())); 46870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 46880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 46890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void OnTestEnd(const TestInfo& test_info) { 46900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Send(String::Format( 46910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "event=TestEnd&passed=%d&elapsed_time=%sms\n", 46920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (test_info.result())->Passed(), 46930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong StreamableToString((test_info.result())->elapsed_time()).c_str())); 46940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 46950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 46960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void OnTestPartResult(const TestPartResult& test_part_result) { 46970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* file_name = test_part_result.file_name(); 46980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (file_name == NULL) 46990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong file_name = ""; 47000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Send(String::Format("event=TestPartResult&file=%s&line=%d&message=", 47010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UrlEncode(file_name).c_str(), 47020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_part_result.line_number())); 47030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Send(UrlEncode(test_part_result.message()) + "\n"); 47040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 47050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 47060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 47070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Creates a client socket and connects to the server. 47080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void MakeConnection(); 47090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 47100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Closes the socket. 47110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void CloseConnection() { 47120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_CHECK_(sockfd_ != -1) 47130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "CloseConnection() can be called only when there is a connection."; 47140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 47150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong close(sockfd_); 47160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong sockfd_ = -1; 47170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 47180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 47190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Sends a string to the socket. 47200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void Send(const string& message) { 47210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_CHECK_(sockfd_ != -1) 47220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Send() can be called only when there is a connection."; 47230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 47240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int len = static_cast<int>(message.length()); 47250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (write(sockfd_, message.c_str(), len) != len) { 47260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_LOG_(WARNING) 47270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "stream_result_to: failed to stream to " 47280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << host_name_ << ":" << port_num_; 47290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 47300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 47310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 47320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int sockfd_; // socket file descriptor 47330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const string host_name_; 47340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const string port_num_; 47350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 47360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener); 47370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; // class StreamingListener 47380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 47390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Checks if str contains '=', '&', '%' or '\n' characters. If yes, 47400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// replaces them by "%xx" where xx is their hexadecimal value. For 47410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// example, replaces "=" with "%3D". This algorithm is O(strlen(str)) 47420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in both time and space -- important as the input str may contain an 47430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// arbitrarily long test failure message and stack trace. 47440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstring StreamingListener::UrlEncode(const char* str) { 47450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong string result; 47460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result.reserve(strlen(str) + 1); 47470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (char ch = *str; ch != '\0'; ch = *++str) { 47480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong switch (ch) { 47490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case '%': 47500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case '=': 47510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case '&': 47520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case '\n': 47530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result.append(String::Format("%%%02x", static_cast<unsigned char>(ch))); 47540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 47550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default: 47560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result.push_back(ch); 47570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 47580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 47590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 47600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return result; 47610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 47620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 47630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid StreamingListener::MakeConnection() { 47640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_CHECK_(sockfd_ == -1) 47650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "MakeConnection() can't be called when there is already a connection."; 47660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 47670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong addrinfo hints; 47680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong memset(&hints, 0, sizeof(hints)); 47690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong hints.ai_family = AF_UNSPEC; // To allow both IPv4 and IPv6 addresses. 47700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong hints.ai_socktype = SOCK_STREAM; 47710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong addrinfo* servinfo = NULL; 47720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 47730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Use the getaddrinfo() to get a linked list of IP addresses for 47740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the given host name. 47750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int error_num = getaddrinfo( 47760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong host_name_.c_str(), port_num_.c_str(), &hints, &servinfo); 47770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (error_num != 0) { 47780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: " 47790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << gai_strerror(error_num); 47800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 47810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 47820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Loop through all the results and connect to the first we can. 47830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL; 47840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong cur_addr = cur_addr->ai_next) { 47850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong sockfd_ = socket( 47860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol); 47870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (sockfd_ != -1) { 47880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Connect the client socket to the server socket. 47890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) { 47900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong close(sockfd_); 47910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong sockfd_ = -1; 47920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 47930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 47940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 47950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 47960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong freeaddrinfo(servinfo); // all done with this structure 47970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 47980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (sockfd_ == -1) { 47990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to " 48000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << host_name_ << ":" << port_num_; 48010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 48020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 48030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 48040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// End of class Streaming Listener 48050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_CAN_STREAM_RESULTS__ 48060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 48070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Class ScopedTrace 48080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 48090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Pushes the given source file location and message onto a per-thread 48100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// trace stack maintained by Google Test. 48110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < UnitTest::mutex_ 48120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongScopedTrace::ScopedTrace(const char* file, int line, const Message& message) { 48130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TraceInfo trace; 48140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong trace.file = file; 48150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong trace.line = line; 48160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong trace.message = message.GetString(); 48170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 48180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnitTest::GetInstance()->PushGTestTrace(trace); 48190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 48200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 48210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Pops the info pushed by the c'tor. 48220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < UnitTest::mutex_ 48230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongScopedTrace::~ScopedTrace() { 48240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnitTest::GetInstance()->PopGTestTrace(); 48250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 48260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 48270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 48280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// class OsStackTraceGetter 48290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 48300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the current OS stack trace as a String. Parameters: 48310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 48320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// max_depth - the maximum number of stack frames to be included 48330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the trace. 48340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// skip_count - the number of top frames to be skipped; doesn't count 48350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// against max_depth. 48360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 48370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < mutex_ 48380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// We use "L < mutex_" to denote that the function may acquire mutex_. 48390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString OsStackTraceGetter::CurrentStackTrace(int, int) { 48400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return String(""); 48410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 48420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 48430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < mutex_ 48440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid OsStackTraceGetter::UponLeavingGTest() { 48450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 48460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 48470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char* const 48480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongOsStackTraceGetter::kElidedFramesMarker = 48490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "... " GTEST_NAME_ " internal frames ..."; 48500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 48510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 48520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 48530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// class TestEventListeners 48540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 48550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestEventListeners::TestEventListeners() 48560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : repeater_(new internal::TestEventRepeater()), 48570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default_result_printer_(NULL), 48580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default_xml_generator_(NULL) { 48590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 48600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 48610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestEventListeners::~TestEventListeners() { delete repeater_; } 48620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 48630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the standard listener responsible for the default console 48640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// output. Can be removed from the listeners list to shut down default 48650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// console output. Note that removing this object from the listener list 48660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// with Release transfers its ownership to the user. 48670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestEventListeners::Append(TestEventListener* listener) { 48680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong repeater_->Append(listener); 48690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 48700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 48710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Removes the given event listener from the list and returns it. It then 48720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// becomes the caller's responsibility to delete the listener. Returns 48730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// NULL if the listener is not found in the list. 48740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestEventListener* TestEventListeners::Release(TestEventListener* listener) { 48750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (listener == default_result_printer_) 48760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default_result_printer_ = NULL; 48770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong else if (listener == default_xml_generator_) 48780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default_xml_generator_ = NULL; 48790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return repeater_->Release(listener); 48800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 48810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 48820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns repeater that broadcasts the TestEventListener events to all 48830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// subscribers. 48840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestEventListener* TestEventListeners::repeater() { return repeater_; } 48850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 48860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Sets the default_result_printer attribute to the provided listener. 48870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The listener is also added to the listener list and previous 48880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// default_result_printer is removed from it and deleted. The listener can 48890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// also be NULL in which case it will not be added to the list. Does 48900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// nothing if the previous and the current listener objects are the same. 48910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) { 48920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (default_result_printer_ != listener) { 48930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // It is an error to pass this method a listener that is already in the 48940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // list. 48950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong delete Release(default_result_printer_); 48960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default_result_printer_ = listener; 48970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (listener != NULL) 48980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Append(listener); 48990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 49000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 49010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 49020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Sets the default_xml_generator attribute to the provided listener. The 49030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// listener is also added to the listener list and previous 49040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// default_xml_generator is removed from it and deleted. The listener can 49050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// also be NULL in which case it will not be added to the list. Does 49060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// nothing if the previous and the current listener objects are the same. 49070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) { 49080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (default_xml_generator_ != listener) { 49090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // It is an error to pass this method a listener that is already in the 49100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // list. 49110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong delete Release(default_xml_generator_); 49120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default_xml_generator_ = listener; 49130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (listener != NULL) 49140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Append(listener); 49150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 49160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 49170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 49180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Controls whether events will be forwarded by the repeater to the 49190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// listeners in the list. 49200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool TestEventListeners::EventForwardingEnabled() const { 49210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return repeater_->forwarding_enabled(); 49220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 49230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 49240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestEventListeners::SuppressEventForwarding() { 49250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong repeater_->set_forwarding_enabled(false); 49260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 49270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 49280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// class UnitTest 49290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 49300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the singleton UnitTest object. The first time this method is 49310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// called, a UnitTest object is constructed and returned. Consecutive 49320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// calls will return the same object. 49330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 49340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// We don't protect this under mutex_ as a user is not supposed to 49350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// call this before main() starts, from which point on the return 49360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// value will never change. 49370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongUnitTest * UnitTest::GetInstance() { 49380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // When compiled with MSVC 7.1 in optimized mode, destroying the 49390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // UnitTest object upon exiting the program messes up the exit code, 49400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // causing successful tests to appear failed. We have to use a 49410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // different implementation in this case to bypass the compiler bug. 49420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This implementation makes the compiler happy, at the cost of 49430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // leaking the UnitTest object. 49440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 49450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // CodeGear C++Builder insists on a public destructor for the 49460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // default implementation. Use this implementation to keep good OO 49470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // design with private destructor. 49480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 49490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__) 49500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static UnitTest* const instance = new UnitTest; 49510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return instance; 49520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 49530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static UnitTest instance; 49540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return &instance; 49550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__) 49560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 49570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 49580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of successful test cases. 49590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTest::successful_test_case_count() const { 49600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return impl()->successful_test_case_count(); 49610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 49620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 49630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of failed test cases. 49640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTest::failed_test_case_count() const { 49650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return impl()->failed_test_case_count(); 49660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 49670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 49680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of all test cases. 49690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTest::total_test_case_count() const { 49700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return impl()->total_test_case_count(); 49710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 49720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 49730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of all test cases that contain at least one test 49740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// that should run. 49750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTest::test_case_to_run_count() const { 49760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return impl()->test_case_to_run_count(); 49770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 49780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 49790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of successful tests. 49800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTest::successful_test_count() const { 49810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return impl()->successful_test_count(); 49820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 49830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 49840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of failed tests. 49850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTest::failed_test_count() const { return impl()->failed_test_count(); } 49860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 49870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of disabled tests. 49880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTest::disabled_test_count() const { 49890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return impl()->disabled_test_count(); 49900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 49910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 49920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of all tests. 49930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTest::total_test_count() const { return impl()->total_test_count(); } 49940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 49950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the number of tests that should run. 49960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); } 49970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 49980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the elapsed time, in milliseconds. 49990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Konginternal::TimeInMillis UnitTest::elapsed_time() const { 50000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return impl()->elapsed_time(); 50010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 50020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 50030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff the unit test passed (i.e. all test cases passed). 50040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool UnitTest::Passed() const { return impl()->Passed(); } 50050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 50060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff the unit test failed (i.e. some test case failed 50070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// or something outside of all tests failed). 50080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool UnitTest::Failed() const { return impl()->Failed(); } 50090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 50100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the i-th test case among all the test cases. i can range from 0 to 50110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// total_test_case_count() - 1. If i is not in that range, returns NULL. 50120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst TestCase* UnitTest::GetTestCase(int i) const { 50130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return impl()->GetTestCase(i); 50140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 50150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 50160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the i-th test case among all the test cases. i can range from 0 to 50170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// total_test_case_count() - 1. If i is not in that range, returns NULL. 50180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestCase* UnitTest::GetMutableTestCase(int i) { 50190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return impl()->GetMutableTestCase(i); 50200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 50210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 50220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the list of event listeners that can be used to track events 50230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// inside Google Test. 50240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestEventListeners& UnitTest::listeners() { 50250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return *impl()->listeners(); 50260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 50270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 50280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Registers and returns a global test environment. When a test 50290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// program is run, all global test environments will be set-up in the 50300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// order they were registered. After all tests in the program have 50310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// finished, all global test environments will be torn-down in the 50320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// *reverse* order they were registered. 50330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 50340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The UnitTest object takes ownership of the given environment. 50350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 50360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// We don't protect this under mutex_, as we only support calling it 50370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// from the main thread. 50380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongEnvironment* UnitTest::AddEnvironment(Environment* env) { 50390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (env == NULL) { 50400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return NULL; 50410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 50420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 50430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl_->environments().push_back(env); 50440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return env; 50450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 50460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 50470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Adds a TestPartResult to the current TestResult object. All Google Test 50480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call 50490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this to report their results. The user code should use the 50500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// assertion macros instead of calling this directly. 50510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < mutex_ 50520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid UnitTest::AddTestPartResult(TestPartResult::Type result_type, 50530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* file_name, 50540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int line_number, 50550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const internal::String& message, 50560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const internal::String& os_stack_trace) { 50570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message msg; 50580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << message; 50590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 50600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::MutexLock lock(&mutex_); 50610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (impl_->gtest_trace_stack().size() > 0) { 50620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << "\n" << GTEST_NAME_ << " trace:"; 50630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 50640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int i = static_cast<int>(impl_->gtest_trace_stack().size()); 50650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong i > 0; --i) { 50660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1]; 50670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << "\n" << internal::FormatFileLocation(trace.file, trace.line) 50680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " " << trace.message; 50690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 50700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 50710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 50720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) { 50730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << internal::kStackTraceMarker << os_stack_trace; 50740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 50750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 50760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestPartResult result = 50770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResult(result_type, file_name, line_number, 50780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg.GetString().c_str()); 50790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl_->GetTestPartResultReporterForCurrentThread()-> 50800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ReportTestPartResult(result); 50810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 50820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (result_type != TestPartResult::kSuccess) { 50830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // gtest_break_on_failure takes precedence over 50840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // gtest_throw_on_failure. This allows a user to set the latter 50850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // in the code (perhaps in order to use Google Test assertions 50860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // with another testing framework) and specify the former on the 50870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // command line for debugging. 50880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (GTEST_FLAG(break_on_failure)) { 50890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS 50900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Using DebugBreak on Windows allows gtest to still break into a debugger 50910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // when a failure happens and both the --gtest_break_on_failure and 50920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the --gtest_catch_exceptions flags are specified. 50930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DebugBreak(); 50940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 50950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Dereference NULL through a volatile pointer to prevent the compiler 50960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // from removing. We use this rather than abort() or __builtin_trap() for 50970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // portability: Symbian doesn't implement abort() well, and some debuggers 50980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // don't correctly trap abort(). 50990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *static_cast<volatile int*>(NULL) = 1; 51000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS 51010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (GTEST_FLAG(throw_on_failure)) { 51020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_EXCEPTIONS 51030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong throw GoogleTestFailureException(result); 51040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 51050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We cannot call abort() as it generates a pop-up in debug mode 51060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // that cannot be suppressed in VC 7.1 or below. 51070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong exit(1); 51080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 51090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 51100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 51110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 51120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 51130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates and adds a property to the current TestResult. If a property matching 51140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the supplied value already exists, updates its value instead. 51150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid UnitTest::RecordPropertyForCurrentTest(const char* key, 51160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* value) { 51170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestProperty test_property(key, value); 51180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl_->current_test_result()->RecordProperty(test_property); 51190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 51200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 51210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Runs all tests in this UnitTest object and prints the result. 51220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns 0 if successful, or 1 otherwise. 51230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 51240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// We don't protect this under mutex_, as we only support calling it 51250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// from the main thread. 51260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTest::Run() { 51270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Captures the value of GTEST_FLAG(catch_exceptions). This value will be 51280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // used for the duration of the program. 51290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions)); 51300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 51310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_SEH 51320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool in_death_test_child_process = 51330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::GTEST_FLAG(internal_run_death_test).length() > 0; 51340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 51350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Either the user wants Google Test to catch exceptions thrown by the 51360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // tests or this is executing in the context of death test child 51370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // process. In either case the user does not want to see pop-up dialogs 51380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // about crashes - they are expected. 51390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (impl()->catch_exceptions() || in_death_test_child_process) { 51400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 51410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if !GTEST_OS_WINDOWS_MOBILE 51420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // SetErrorMode doesn't exist on CE. 51430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT | 51440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); 51450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // !GTEST_OS_WINDOWS_MOBILE 51460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 51470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE 51480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Death test children can be terminated with _abort(). On Windows, 51490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // _abort() can show a dialog with a warning message. This forces the 51500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // abort message to go to stderr instead. 51510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong _set_error_mode(_OUT_TO_STDERR); 51520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif 51530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 51540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE 51550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // In the debug version, Visual Studio pops up a separate dialog 51560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // offering a choice to debug the aborted program. We need to suppress 51570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement 51580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // executed. Google Test will notify the user of any unexpected 51590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // failure via stderr. 51600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 51610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // VC++ doesn't define _set_abort_behavior() prior to the version 8.0. 51620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Users of prior VC versions shall suffer the agony and pain of 51630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // clicking through the countless debug dialogs. 51640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TODO(vladl@google.com): find a way to suppress the abort dialog() in the 51650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // debug mode when compiled with VC 7.1 or lower. 51660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!GTEST_FLAG(break_on_failure)) 51670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong _set_abort_behavior( 51680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 0x0, // Clear the following flags: 51690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong _WRITE_ABORT_MSG | _CALL_REPORTFAULT); // pop-up window, core dump. 51700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif 51710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 51720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 51730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_SEH 51740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 51750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return internal::HandleExceptionsInMethodIfSupported( 51760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl(), 51770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong &internal::UnitTestImpl::RunAllTests, 51780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "auxiliary test code (environments or event listeners)") ? 0 : 1; 51790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 51800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 51810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the working directory when the first TEST() or TEST_F() was 51820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// executed. 51830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char* UnitTest::original_working_dir() const { 51840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return impl_->original_working_dir_.c_str(); 51850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 51860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 51870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the TestCase object for the test that's currently running, 51880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// or NULL if no test is running. 51890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < mutex_ 51900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst TestCase* UnitTest::current_test_case() const { 51910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::MutexLock lock(&mutex_); 51920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return impl_->current_test_case(); 51930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 51940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 51950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the TestInfo object for the test that's currently running, 51960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// or NULL if no test is running. 51970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < mutex_ 51980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst TestInfo* UnitTest::current_test_info() const { 51990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::MutexLock lock(&mutex_); 52000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return impl_->current_test_info(); 52010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 52020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 52030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the random seed used at the start of the current test run. 52040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTest::random_seed() const { return impl_->random_seed(); } 52050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 52060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_PARAM_TEST 52070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns ParameterizedTestCaseRegistry object used to keep track of 52080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// value-parameterized tests and instantiate and register them. 52090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < mutex_ 52100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Konginternal::ParameterizedTestCaseRegistry& 52110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnitTest::parameterized_test_registry() { 52120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return impl_->parameterized_test_registry(); 52130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 52140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_PARAM_TEST 52150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 52160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates an empty UnitTest. 52170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongUnitTest::UnitTest() { 52180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl_ = new internal::UnitTestImpl(this); 52190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 52200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 52210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Destructor of UnitTest. 52220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongUnitTest::~UnitTest() { 52230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong delete impl_; 52240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 52250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 52260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Pushes a trace defined by SCOPED_TRACE() on to the per-thread 52270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Google Test trace stack. 52280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < mutex_ 52290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid UnitTest::PushGTestTrace(const internal::TraceInfo& trace) { 52300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::MutexLock lock(&mutex_); 52310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl_->gtest_trace_stack().push_back(trace); 52320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 52330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 52340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Pops a trace from the per-thread Google Test trace stack. 52350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < mutex_ 52360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid UnitTest::PopGTestTrace() { 52370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::MutexLock lock(&mutex_); 52380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl_->gtest_trace_stack().pop_back(); 52390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 52400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 52410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 52420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 52430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongUnitTestImpl::UnitTestImpl(UnitTest* parent) 52440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : parent_(parent), 52450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#ifdef _MSC_VER 52460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# pragma warning(push) // Saves the current warning state. 52470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# pragma warning(disable:4355) // Temporarily disables warning 4355 52480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // (using this in initializer). 52490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default_global_test_part_result_reporter_(this), 52500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default_per_thread_test_part_result_reporter_(this), 52510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# pragma warning(pop) // Restores the warning state again. 52520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 52530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default_global_test_part_result_reporter_(this), 52540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default_per_thread_test_part_result_reporter_(this), 52550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // _MSC_VER 52560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong global_test_part_result_repoter_( 52570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong &default_global_test_part_result_reporter_), 52580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong per_thread_test_part_result_reporter_( 52590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong &default_per_thread_test_part_result_reporter_), 52600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_PARAM_TEST 52610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong parameterized_test_registry_(), 52620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong parameterized_tests_registered_(false), 52630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_PARAM_TEST 52640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong last_death_test_case_(-1), 52650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong current_test_case_(NULL), 52660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong current_test_info_(NULL), 52670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ad_hoc_test_result_(), 52680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong os_stack_trace_getter_(NULL), 52690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong post_flag_parse_init_performed_(false), 52700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong random_seed_(0), // Will be overridden by the flag before first use. 52710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong random_(0), // Will be reseeded before first use. 52720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong elapsed_time_(0), 52730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_DEATH_TEST 52740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal_run_death_test_flag_(NULL), 52750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong death_test_factory_(new DefaultDeathTestFactory), 52760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 52770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Will be overridden by the flag before first use. 52780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong catch_exceptions_(false) { 52790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter); 52800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 52810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 52820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongUnitTestImpl::~UnitTestImpl() { 52830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Deletes every TestCase. 52840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ForEach(test_cases_, internal::Delete<TestCase>); 52850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 52860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Deletes every Environment. 52870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ForEach(environments_, internal::Delete<Environment>); 52880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 52890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong delete os_stack_trace_getter_; 52900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 52910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 52920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_DEATH_TEST 52930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Disables event forwarding if the control is currently in a death test 52940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// subprocess. Must not be called before InitGoogleTest. 52950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid UnitTestImpl::SuppressTestEventsIfInSubprocess() { 52960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (internal_run_death_test_flag_.get() != NULL) 52970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong listeners()->SuppressEventForwarding(); 52980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 52990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_DEATH_TEST 53000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 53010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Initializes event listeners performing XML output as specified by 53020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// UnitTestOptions. Must not be called before InitGoogleTest. 53030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid UnitTestImpl::ConfigureXmlOutput() { 53040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String& output_format = UnitTestOptions::GetOutputFormat(); 53050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (output_format == "xml") { 53060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter( 53070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnitTestOptions::GetAbsolutePathToOutputFile().c_str())); 53080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (output_format != "") { 53090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("WARNING: unrecognized output format \"%s\" ignored.\n", 53100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong output_format.c_str()); 53110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 53120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 53130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 53140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 53150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_CAN_STREAM_RESULTS_ 53160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Initializes event listeners for streaming test results in String form. 53170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Must not be called before InitGoogleTest. 53180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid UnitTestImpl::ConfigureStreamingOutput() { 53190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const string& target = GTEST_FLAG(stream_result_to); 53200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!target.empty()) { 53210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t pos = target.find(':'); 53220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (pos != string::npos) { 53230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong listeners()->Append(new StreamingListener(target.substr(0, pos), 53240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong target.substr(pos+1))); 53250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 53260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("WARNING: unrecognized streaming target \"%s\" ignored.\n", 53270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong target.c_str()); 53280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 53290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 53300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 53310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 53320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_CAN_STREAM_RESULTS_ 53330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 53340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Performs initialization dependent upon flag values obtained in 53350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to 53360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest 53370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this function is also called from RunAllTests. Since this function can be 53380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// called more than once, it has to be idempotent. 53390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid UnitTestImpl::PostFlagParsingInit() { 53400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Ensures that this function does not execute more than once. 53410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!post_flag_parse_init_performed_) { 53420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong post_flag_parse_init_performed_ = true; 53430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 53440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_DEATH_TEST 53450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong InitDeathTestSubprocessControlInfo(); 53460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SuppressTestEventsIfInSubprocess(); 53470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_DEATH_TEST 53480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 53490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Registers parameterized tests. This makes parameterized tests 53500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // available to the UnitTest reflection API without running 53510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // RUN_ALL_TESTS. 53520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong RegisterParameterizedTests(); 53530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 53540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Configures listeners for XML output. This makes it possible for users 53550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // to shut down the default XML output before invoking RUN_ALL_TESTS. 53560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ConfigureXmlOutput(); 53570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 53580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_CAN_STREAM_RESULTS_ 53590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Configures listeners for streaming test results to the specified server. 53600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ConfigureStreamingOutput(); 53610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_CAN_STREAM_RESULTS_ 53620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 53630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 53640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 53650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A predicate that checks the name of a TestCase against a known 53660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// value. 53670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 53680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This is used for implementation of the UnitTest class only. We put 53690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// it in the anonymous namespace to prevent polluting the outer 53700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// namespace. 53710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 53720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TestCaseNameIs is copyable. 53730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass TestCaseNameIs { 53740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 53750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Constructor. 53760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong explicit TestCaseNameIs(const String& name) 53770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : name_(name) {} 53780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 53790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns true iff the name of test_case matches name_. 53800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool operator()(const TestCase* test_case) const { 53810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0; 53820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 53830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 53840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 53850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String name_; 53860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 53870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 53880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Finds and returns a TestCase with the given name. If one doesn't 53890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// exist, creates one and returns it. It's the CALLER'S 53900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// RESPONSIBILITY to ensure that this function is only called WHEN THE 53910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TESTS ARE NOT SHUFFLED. 53920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 53930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Arguments: 53940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 53950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// test_case_name: name of the test case 53960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// type_param: the name of the test case's type parameter, or NULL if 53970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this is not a typed or a type-parameterized test case. 53980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// set_up_tc: pointer to the function that sets up the test case 53990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// tear_down_tc: pointer to the function that tears down the test case 54000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestCase* UnitTestImpl::GetTestCase(const char* test_case_name, 54010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* type_param, 54020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Test::SetUpTestCaseFunc set_up_tc, 54030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Test::TearDownTestCaseFunc tear_down_tc) { 54040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Can we find a TestCase with the given name? 54050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const std::vector<TestCase*>::const_iterator test_case = 54060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::find_if(test_cases_.begin(), test_cases_.end(), 54070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestCaseNameIs(test_case_name)); 54080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 54090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (test_case != test_cases_.end()) 54100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return *test_case; 54110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 54120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // No. Let's create one. 54130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestCase* const new_test_case = 54140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc); 54150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 54160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Is this a death test case? 54170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (internal::UnitTestOptions::MatchesFilter(String(test_case_name), 54180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong kDeathTestCaseFilter)) { 54190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Yes. Inserts the test case after the last death test case 54200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // defined so far. This only works when the test cases haven't 54210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // been shuffled. Otherwise we may end up running a death test 54220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // after a non-death test. 54230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ++last_death_test_case_; 54240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_cases_.insert(test_cases_.begin() + last_death_test_case_, 54250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong new_test_case); 54260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 54270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // No. Appends to the end of the list. 54280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_cases_.push_back(new_test_case); 54290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 54300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 54310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_case_indices_.push_back(static_cast<int>(test_case_indices_.size())); 54320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return new_test_case; 54330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 54340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 54350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Helpers for setting up / tearing down the given environment. They 54360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// are for use in the ForEach() function. 54370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic void SetUpEnvironment(Environment* env) { env->SetUp(); } 54380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic void TearDownEnvironment(Environment* env) { env->TearDown(); } 54390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 54400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Runs all tests in this UnitTest object, prints the result, and 54410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// returns true if all tests are successful. If any exception is 54420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// thrown during a test, the test is considered to be failed, but the 54430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// rest of the tests will still be run. 54440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 54450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// When parameterized tests are enabled, it expands and registers 54460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// parameterized tests first in RegisterParameterizedTests(). 54470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// All other functions called from RunAllTests() may safely assume that 54480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// parameterized tests are ready to be counted and run. 54490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool UnitTestImpl::RunAllTests() { 54500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Makes sure InitGoogleTest() was called. 54510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!GTestIsInitialized()) { 54520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("%s", 54530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "\nThis test program did NOT call ::testing::InitGoogleTest " 54540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "before calling RUN_ALL_TESTS(). Please fix it.\n"); 54550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 54560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 54570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 54580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Do not run any test if the --help flag was specified. 54590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (g_help_flag) 54600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 54610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 54620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Repeats the call to the post-flag parsing initialization in case the 54630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // user didn't call InitGoogleTest. 54640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PostFlagParsingInit(); 54650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 54660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Even if sharding is not on, test runners may want to use the 54670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding 54680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // protocol. 54690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::WriteToShardStatusFileIfNeeded(); 54700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 54710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // True iff we are in a subprocess for running a thread-safe-style 54720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // death test. 54730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool in_subprocess_for_death_test = false; 54740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 54750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_DEATH_TEST 54760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL); 54770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_DEATH_TEST 54780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 54790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex, 54800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong in_subprocess_for_death_test); 54810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 54820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Compares the full test names with the filter to decide which 54830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // tests to run. 54840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool has_tests_to_run = FilterTests(should_shard 54850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ? HONOR_SHARDING_PROTOCOL 54860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : IGNORE_SHARDING_PROTOCOL) > 0; 54870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 54880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Lists the tests and exits if the --gtest_list_tests flag was specified. 54890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (GTEST_FLAG(list_tests)) { 54900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This must be called *after* FilterTests() has been called. 54910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ListTestsMatchingFilter(); 54920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 54930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 54940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 54950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong random_seed_ = GTEST_FLAG(shuffle) ? 54960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0; 54970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 54980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // True iff at least one test has failed. 54990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool failed = false; 55000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 55010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestEventListener* repeater = listeners()->repeater(); 55020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 55030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong repeater->OnTestProgramStart(*parent_); 55040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 55050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // How many times to repeat the tests? We don't want to repeat them 55060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // when we are inside the subprocess of a death test. 55070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat); 55080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Repeats forever if the repeat count is negative. 55090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool forever = repeat < 0; 55100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int i = 0; forever || i != repeat; i++) { 55110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We want to preserve failures generated by ad-hoc test 55120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // assertions executed before RUN_ALL_TESTS(). 55130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ClearNonAdHocTestResult(); 55140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 55150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TimeInMillis start = GetTimeInMillis(); 55160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 55170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Shuffles test cases and tests if requested. 55180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (has_tests_to_run && GTEST_FLAG(shuffle)) { 55190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong random()->Reseed(random_seed_); 55200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This should be done before calling OnTestIterationStart(), 55210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // such that a test event listener can see the actual test order 55220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // in the event. 55230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ShuffleTests(); 55240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 55250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 55260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Tells the unit test event listeners that the tests are about to start. 55270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong repeater->OnTestIterationStart(*parent_, i); 55280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 55290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Runs each test case if there is at least one test to run. 55300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (has_tests_to_run) { 55310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Sets up all environments beforehand. 55320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong repeater->OnEnvironmentsSetUpStart(*parent_); 55330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ForEach(environments_, SetUpEnvironment); 55340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong repeater->OnEnvironmentsSetUpEnd(*parent_); 55350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 55360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Runs the tests only if there was no fatal failure during global 55370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // set-up. 55380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!Test::HasFatalFailure()) { 55390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int test_index = 0; test_index < total_test_case_count(); 55400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_index++) { 55410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetMutableTestCase(test_index)->Run(); 55420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 55430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 55440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 55450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Tears down all environments in reverse order afterwards. 55460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong repeater->OnEnvironmentsTearDownStart(*parent_); 55470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::for_each(environments_.rbegin(), environments_.rend(), 55480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TearDownEnvironment); 55490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong repeater->OnEnvironmentsTearDownEnd(*parent_); 55500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 55510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 55520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong elapsed_time_ = GetTimeInMillis() - start; 55530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 55540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Tells the unit test event listener that the tests have just finished. 55550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong repeater->OnTestIterationEnd(*parent_, i); 55560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 55570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the result and clears it. 55580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!Passed()) { 55590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong failed = true; 55600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 55610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 55620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Restores the original test order after the iteration. This 55630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // allows the user to quickly repro a failure that happens in the 55640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // N-th iteration without repeating the first (N - 1) iterations. 55650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in 55660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // case the user somehow changes the value of the flag somewhere 55670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // (it's always safe to unshuffle the tests). 55680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnshuffleTests(); 55690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 55700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (GTEST_FLAG(shuffle)) { 55710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Picks a new random seed for each iteration. 55720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong random_seed_ = GetNextRandomSeed(random_seed_); 55730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 55740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 55750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 55760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong repeater->OnTestProgramEnd(*parent_); 55770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 55780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return !failed; 55790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 55800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 55810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file 55820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// if the variable is present. If a file already exists at this location, this 55830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// function will write over it. If the variable is present, but the file cannot 55840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// be created, prints an error and exits. 55850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid WriteToShardStatusFileIfNeeded() { 55860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile); 55870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (test_shard_file != NULL) { 55880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FILE* const file = posix::FOpen(test_shard_file, "w"); 55890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (file == NULL) { 55900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_RED, 55910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Could not write to the test shard status file \"%s\" " 55920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "specified by the %s environment variable.\n", 55930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_shard_file, kTestShardStatusFile); 55940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 55950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong exit(EXIT_FAILURE); 55960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 55970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fclose(file); 55980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 55990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 56000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 56010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Checks whether sharding is enabled by examining the relevant 56020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// environment variable values. If the variables are present, 56030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// but inconsistent (i.e., shard_index >= total_shards), prints 56040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// an error and exits. If in_subprocess_for_death_test, sharding is 56050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// disabled because it must only be applied to the original test 56060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// process. Otherwise, we could filter out death tests we intended to execute. 56070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool ShouldShard(const char* total_shards_env, 56080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* shard_index_env, 56090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool in_subprocess_for_death_test) { 56100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (in_subprocess_for_death_test) { 56110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 56120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 56130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 56140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1); 56150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1); 56160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 56170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (total_shards == -1 && shard_index == -1) { 56180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 56190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (total_shards == -1 && shard_index != -1) { 56200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const Message msg = Message() 56210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Invalid environment variables: you have " 56220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << kTestShardIndex << " = " << shard_index 56230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << ", but have left " << kTestTotalShards << " unset.\n"; 56240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_RED, msg.GetString().c_str()); 56250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 56260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong exit(EXIT_FAILURE); 56270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (total_shards != -1 && shard_index == -1) { 56280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const Message msg = Message() 56290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Invalid environment variables: you have " 56300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << kTestTotalShards << " = " << total_shards 56310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << ", but have left " << kTestShardIndex << " unset.\n"; 56320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_RED, msg.GetString().c_str()); 56330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 56340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong exit(EXIT_FAILURE); 56350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (shard_index < 0 || shard_index >= total_shards) { 56360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const Message msg = Message() 56370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Invalid environment variables: we require 0 <= " 56380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << kTestShardIndex << " < " << kTestTotalShards 56390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << ", but you have " << kTestShardIndex << "=" << shard_index 56400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << ", " << kTestTotalShards << "=" << total_shards << ".\n"; 56410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(COLOR_RED, msg.GetString().c_str()); 56420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 56430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong exit(EXIT_FAILURE); 56440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 56450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 56460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return total_shards > 1; 56470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 56480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 56490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Parses the environment variable var as an Int32. If it is unset, 56500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// returns default_val. If it is not an Int32, prints an error 56510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// and aborts. 56520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongInt32 Int32FromEnvOrDie(const char* var, Int32 default_val) { 56530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* str_val = posix::GetEnv(var); 56540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (str_val == NULL) { 56550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return default_val; 56560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 56570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 56580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Int32 result; 56590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!ParseInt32(Message() << "The value of environment variable " << var, 56600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str_val, &result)) { 56610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong exit(EXIT_FAILURE); 56620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 56630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return result; 56640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 56650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 56660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Given the total number of shards, the shard index, and the test id, 56670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// returns true iff the test should be run on this shard. The test id is 56680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// some arbitrary but unique non-negative integer assigned to each test 56690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// method. Assumes that 0 <= shard_index < total_shards. 56700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) { 56710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (test_id % total_shards) == shard_index; 56720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 56730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 56740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Compares the name of each test with the user-specified filter to 56750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// decide whether the test should be run, then records the result in 56760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// each TestCase and TestInfo object. 56770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// If shard_tests == true, further filters tests based on sharding 56780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// variables in the environment - see 56790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide. 56800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the number of tests that should run. 56810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint UnitTestImpl::FilterTests(ReactionToSharding shard_tests) { 56820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ? 56830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Int32FromEnvOrDie(kTestTotalShards, -1) : -1; 56840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ? 56850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Int32FromEnvOrDie(kTestShardIndex, -1) : -1; 56860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 56870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // num_runnable_tests are the number of tests that will 56880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // run across all shards (i.e., match filter and are not disabled). 56890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // num_selected_tests are the number of tests to be run on 56900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // this shard. 56910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_runnable_tests = 0; 56920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_selected_tests = 0; 56930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t i = 0; i < test_cases_.size(); i++) { 56940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestCase* const test_case = test_cases_[i]; 56950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String &test_case_name = test_case->name(); 56960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_case->set_should_run(false); 56970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 56980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t j = 0; j < test_case->test_info_list().size(); j++) { 56990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestInfo* const test_info = test_case->test_info_list()[j]; 57000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String test_name(test_info->name()); 57010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // A test is disabled if test case name or test name matches 57020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // kDisableTestFilter. 57030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool is_disabled = 57040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::UnitTestOptions::MatchesFilter(test_case_name, 57050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong kDisableTestFilter) || 57060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::UnitTestOptions::MatchesFilter(test_name, 57070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong kDisableTestFilter); 57080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_info->is_disabled_ = is_disabled; 57090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 57100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool matches_filter = 57110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::UnitTestOptions::FilterMatchesTest(test_case_name, 57120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_name); 57130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_info->matches_filter_ = matches_filter; 57140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 57150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool is_runnable = 57160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) && 57170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong matches_filter; 57180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 57190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool is_selected = is_runnable && 57200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (shard_tests == IGNORE_SHARDING_PROTOCOL || 57210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ShouldRunTestOnShard(total_shards, shard_index, 57220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong num_runnable_tests)); 57230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 57240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong num_runnable_tests += is_runnable; 57250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong num_selected_tests += is_selected; 57260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 57270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_info->should_run_ = is_selected; 57280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_case->set_should_run(test_case->should_run() || is_selected); 57290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 57300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 57310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return num_selected_tests; 57320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 57330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 57340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints the names of the tests matching the user-specified filter flag. 57350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid UnitTestImpl::ListTestsMatchingFilter() { 57360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t i = 0; i < test_cases_.size(); i++) { 57370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestCase* const test_case = test_cases_[i]; 57380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool printed_test_case_name = false; 57390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 57400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t j = 0; j < test_case->test_info_list().size(); j++) { 57410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestInfo* const test_info = 57420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_case->test_info_list()[j]; 57430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (test_info->matches_filter_) { 57440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!printed_test_case_name) { 57450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printed_test_case_name = true; 57460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("%s.\n", test_case->name()); 57470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 57480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf(" %s\n", test_info->name()); 57490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 57500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 57510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 57520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 57530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 57540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 57550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Sets the OS stack trace getter. 57560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 57570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Does nothing if the input and the current OS stack trace getter are 57580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the same; otherwise, deletes the old getter and makes the input the 57590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// current getter. 57600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid UnitTestImpl::set_os_stack_trace_getter( 57610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong OsStackTraceGetterInterface* getter) { 57620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (os_stack_trace_getter_ != getter) { 57630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong delete os_stack_trace_getter_; 57640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong os_stack_trace_getter_ = getter; 57650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 57660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 57670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 57680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the current OS stack trace getter if it is not NULL; 57690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// otherwise, creates an OsStackTraceGetter, makes it the current 57700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// getter, and returns it. 57710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongOsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() { 57720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (os_stack_trace_getter_ == NULL) { 57730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong os_stack_trace_getter_ = new OsStackTraceGetter; 57740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 57750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 57760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return os_stack_trace_getter_; 57770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 57780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 57790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the TestResult for the test that's currently running, or 57800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the TestResult for the ad hoc test if no test is running. 57810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongTestResult* UnitTestImpl::current_test_result() { 57820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return current_test_info_ ? 57830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong &(current_test_info_->result_) : &ad_hoc_test_result_; 57840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 57850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 57860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Shuffles all test cases, and the tests within each test case, 57870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// making sure that death tests are still run first. 57880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid UnitTestImpl::ShuffleTests() { 57890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Shuffles the death test cases. 57900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_); 57910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 57920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Shuffles the non-death test cases. 57930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ShuffleRange(random(), last_death_test_case_ + 1, 57940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static_cast<int>(test_cases_.size()), &test_case_indices_); 57950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 57960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Shuffles the tests inside each test case. 57970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t i = 0; i < test_cases_.size(); i++) { 57980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_cases_[i]->ShuffleTests(random()); 57990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 58000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 58010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 58020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Restores the test cases and tests to their order before the first shuffle. 58030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid UnitTestImpl::UnshuffleTests() { 58040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t i = 0; i < test_cases_.size(); i++) { 58050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Unshuffles the tests in each test case. 58060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_cases_[i]->UnshuffleTests(); 58070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Resets the index of each test case. 58080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong test_case_indices_[i] = static_cast<int>(i); 58090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 58100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 58110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 58120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the current OS stack trace as a String. 58130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 58140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The maximum number of stack frames to be included is specified by 58150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the gtest_stack_trace_depth flag. The skip_count parameter 58160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// specifies the number of top frames to be skipped, which doesn't 58170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// count against the number of frames to be included. 58180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 58190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// For example, if Foo() calls Bar(), which in turn calls 58200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in 58210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't. 58220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/, 58230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int skip_count) { 58240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We pass skip_count + 1 to skip this wrapper function in addition 58250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // to what the user really wants to skip. 58260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1); 58270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 58280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 58290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to 58300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// suppress unreachable code warnings. 58310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace { 58320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass ClassUniqueToAlwaysTrue {}; 58330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 58340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 58350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool IsTrue(bool condition) { return condition; } 58360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 58370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool AlwaysTrue() { 58380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_EXCEPTIONS 58390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This condition is always false so AlwaysTrue() never actually throws, 58400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // but it makes the compiler think that it may throw. 58410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (IsTrue(false)) 58420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong throw ClassUniqueToAlwaysTrue(); 58430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_EXCEPTIONS 58440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 58450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 58460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 58470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// If *pstr starts with the given prefix, modifies *pstr to be right 58480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// past the prefix and returns true; otherwise leaves *pstr unchanged 58490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// and returns false. None of pstr, *pstr, and prefix can be NULL. 58500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool SkipPrefix(const char* prefix, const char** pstr) { 58510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t prefix_len = strlen(prefix); 58520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (strncmp(*pstr, prefix, prefix_len) == 0) { 58530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *pstr += prefix_len; 58540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 58550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 58560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 58570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 58580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 58590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Parses a string as a command line flag. The string should have 58600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the format "--flag=value". When def_optional is true, the "=value" 58610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// part can be omitted. 58620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 58630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the value of the flag, or NULL if the parsing failed. 58640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char* ParseFlagValue(const char* str, 58650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* flag, 58660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool def_optional) { 58670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // str and flag must not be NULL. 58680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (str == NULL || flag == NULL) return NULL; 58690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 58700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The flag must start with "--" followed by GTEST_FLAG_PREFIX_. 58710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String flag_str = String::Format("--%s%s", GTEST_FLAG_PREFIX_, flag); 58720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t flag_len = flag_str.length(); 58730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL; 58740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 58750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Skips the flag name. 58760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* flag_end = str + flag_len; 58770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 58780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // When def_optional is true, it's OK to not have a "=value" part. 58790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (def_optional && (flag_end[0] == '\0')) { 58800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return flag_end; 58810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 58820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 58830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If def_optional is true and there are more characters after the 58840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // flag name, or if def_optional is false, there must be a '=' after 58850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the flag name. 58860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (flag_end[0] != '=') return NULL; 58870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 58880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns the string after "=". 58890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return flag_end + 1; 58900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 58910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 58920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Parses a string for a bool flag, in the form of either 58930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "--flag=value" or "--flag". 58940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 58950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// In the former case, the value is taken as true as long as it does 58960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// not start with '0', 'f', or 'F'. 58970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 58980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// In the latter case, the value is taken as true. 58990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 59000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// On success, stores the value of the flag in *value, and returns 59010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// true. On failure, returns false without changing *value. 59020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool ParseBoolFlag(const char* str, const char* flag, bool* value) { 59030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the value of the flag as a string. 59040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const value_str = ParseFlagValue(str, flag, true); 59050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 59060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Aborts if the parsing failed. 59070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (value_str == NULL) return false; 59080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 59090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Converts the string value to a bool. 59100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F'); 59110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 59120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 59130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 59140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Parses a string for an Int32 flag, in the form of 59150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "--flag=value". 59160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 59170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// On success, stores the value of the flag in *value, and returns 59180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// true. On failure, returns false without changing *value. 59190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool ParseInt32Flag(const char* str, const char* flag, Int32* value) { 59200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the value of the flag as a string. 59210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const value_str = ParseFlagValue(str, flag, false); 59220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 59230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Aborts if the parsing failed. 59240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (value_str == NULL) return false; 59250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 59260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Sets *value to the value of the flag. 59270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return ParseInt32(Message() << "The value of flag --" << flag, 59280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong value_str, value); 59290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 59300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 59310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Parses a string for a string flag, in the form of 59320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "--flag=value". 59330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 59340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// On success, stores the value of the flag in *value, and returns 59350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// true. On failure, returns false without changing *value. 59360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool ParseStringFlag(const char* str, const char* flag, String* value) { 59370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the value of the flag as a string. 59380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const value_str = ParseFlagValue(str, flag, false); 59390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 59400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Aborts if the parsing failed. 59410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (value_str == NULL) return false; 59420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 59430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Sets *value to the value of the flag. 59440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *value = value_str; 59450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 59460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 59470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 59480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Determines whether a string has a prefix that Google Test uses for its 59490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_. 59500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// If Google Test detects that a command line flag has its prefix but is not 59510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// recognized, it will print its help message. Flags starting with 59520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test 59530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// internal flags and do not trigger the help message. 59540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic bool HasGoogleTestFlagPrefix(const char* str) { 59550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (SkipPrefix("--", &str) || 59560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SkipPrefix("-", &str) || 59570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SkipPrefix("/", &str)) && 59580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) && 59590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (SkipPrefix(GTEST_FLAG_PREFIX_, &str) || 59600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str)); 59610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 59620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 59630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints a string containing code-encoded text. The following escape 59640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// sequences can be used in the string to control the text color: 59650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 59660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// @@ prints a single '@' character. 59670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// @R changes the color to red. 59680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// @G changes the color to green. 59690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// @Y changes the color to yellow. 59700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// @D changes to the default terminal text color. 59710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 59720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TODO(wan@google.com): Write tests for this once we add stdout 59730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// capturing to Google Test. 59740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic void PrintColorEncoded(const char* str) { 59750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTestColor color = COLOR_DEFAULT; // The current color. 59760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 59770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Conceptually, we split the string into segments divided by escape 59780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // sequences. Then we print one segment at a time. At the end of 59790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // each iteration, the str pointer advances to the beginning of the 59800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // next segment. 59810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (;;) { 59820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* p = strchr(str, '@'); 59830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (p == NULL) { 59840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(color, "%s", str); 59850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return; 59860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 59870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 59880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(color, "%s", String(str, p - str).c_str()); 59890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 59900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char ch = p[1]; 59910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str = p + 2; 59920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (ch == '@') { 59930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ColoredPrintf(color, "@"); 59940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (ch == 'D') { 59950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong color = COLOR_DEFAULT; 59960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (ch == 'R') { 59970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong color = COLOR_RED; 59980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (ch == 'G') { 59990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong color = COLOR_GREEN; 60000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (ch == 'Y') { 60010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong color = COLOR_YELLOW; 60020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 60030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong --str; 60040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 60050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 60060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 60070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 60080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic const char kColorEncodedHelpMessage[] = 60090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"This program contains tests written using " GTEST_NAME_ ". You can use the\n" 60100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"following command line flags to control its behavior:\n" 60110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"\n" 60120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"Test Selection:\n" 60130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" @G--" GTEST_FLAG_PREFIX_ "list_tests@D\n" 60140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" List the names of all tests instead of running them. The name of\n" 60150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" TEST(Foo, Bar) is \"Foo.Bar\".\n" 60160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS" 60170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "[@G-@YNEGATIVE_PATTERNS]@D\n" 60180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" Run only the tests whose name matches one of the positive patterns but\n" 60190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" none of the negative patterns. '?' matches any single character; '*'\n" 60200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" matches any substring; ':' separates two patterns.\n" 60210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests@D\n" 60220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" Run all disabled tests too.\n" 60230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"\n" 60240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"Test Execution:\n" 60250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n" 60260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" Run the tests repeatedly; use a negative count to repeat forever.\n" 60270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" @G--" GTEST_FLAG_PREFIX_ "shuffle@D\n" 60280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" Randomize tests' orders on every iteration.\n" 60290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n" 60300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" Random number seed to use for shuffling test orders (between 1 and\n" 60310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" 99999, or 0 to use a seed based on the current time).\n" 60320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"\n" 60330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"Test Output:\n" 60340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\n" 60350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" Enable/disable colored output. The default is @Gauto@D.\n" 60360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" -@G-" GTEST_FLAG_PREFIX_ "print_time=0@D\n" 60370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" Don't print the elapsed time of each test.\n" 60380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" @G--" GTEST_FLAG_PREFIX_ "output=xml@Y[@G:@YDIRECTORY_PATH@G" 60390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n" 60400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" Generate an XML report in the given directory or with the given file\n" 60410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" name. @YFILE_PATH@D defaults to @Gtest_details.xml@D.\n" 60420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_CAN_STREAM_RESULTS_ 60430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST@G:@YPORT@D\n" 60440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" Stream test results to the given server.\n" 60450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_CAN_STREAM_RESULTS_ 60460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"\n" 60470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"Assertion Behavior:\n" 60480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS 60490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\n" 60500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" Set the default death test style.\n" 60510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS 60520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" @G--" GTEST_FLAG_PREFIX_ "break_on_failure@D\n" 60530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" Turn assertion failures into debugger break-points.\n" 60540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" @G--" GTEST_FLAG_PREFIX_ "throw_on_failure@D\n" 60550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" Turn assertion failures into C++ exceptions.\n" 60560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0@D\n" 60570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" Do not report exceptions as test failures. Instead, allow them\n" 60580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong" to crash the program or throw a pop-up (on Windows).\n" 60590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"\n" 60600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests@D, you can alternatively set " 60610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "the corresponding\n" 60620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"environment variable of a flag (all letters in upper-case). For example, to\n" 60630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_ 60640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "color=no@D or set\n" 60650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR@D environment variable to @Gno@D.\n" 60660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"\n" 60670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"For more information, please read the " GTEST_NAME_ " documentation at\n" 60680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n" 60690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"(not one in your own code or tests), please report it to\n" 60700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong"@G<" GTEST_DEV_EMAIL_ ">@D.\n"; 60710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 60720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Parses the command line for Google Test flags, without initializing 60730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// other parts of Google Test. The type parameter CharType can be 60740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// instantiated to either char or wchar_t. 60750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate <typename CharType> 60760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) { 60770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int i = 1; i < *argc; i++) { 60780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String arg_string = StreamableToString(argv[i]); 60790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const arg = arg_string.c_str(); 60800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 60810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong using internal::ParseBoolFlag; 60820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong using internal::ParseInt32Flag; 60830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong using internal::ParseStringFlag; 60840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 60850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Do we see a Google Test flag? 60860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag, 60870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong >EST_FLAG(also_run_disabled_tests)) || 60880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseBoolFlag(arg, kBreakOnFailureFlag, 60890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong >EST_FLAG(break_on_failure)) || 60900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseBoolFlag(arg, kCatchExceptionsFlag, 60910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong >EST_FLAG(catch_exceptions)) || 60920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseStringFlag(arg, kColorFlag, >EST_FLAG(color)) || 60930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseStringFlag(arg, kDeathTestStyleFlag, 60940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong >EST_FLAG(death_test_style)) || 60950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseBoolFlag(arg, kDeathTestUseFork, 60960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong >EST_FLAG(death_test_use_fork)) || 60970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseStringFlag(arg, kFilterFlag, >EST_FLAG(filter)) || 60980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseStringFlag(arg, kInternalRunDeathTestFlag, 60990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong >EST_FLAG(internal_run_death_test)) || 61000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseBoolFlag(arg, kListTestsFlag, >EST_FLAG(list_tests)) || 61010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseStringFlag(arg, kOutputFlag, >EST_FLAG(output)) || 61020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseBoolFlag(arg, kPrintTimeFlag, >EST_FLAG(print_time)) || 61030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseInt32Flag(arg, kRandomSeedFlag, >EST_FLAG(random_seed)) || 61040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseInt32Flag(arg, kRepeatFlag, >EST_FLAG(repeat)) || 61050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseBoolFlag(arg, kShuffleFlag, >EST_FLAG(shuffle)) || 61060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseInt32Flag(arg, kStackTraceDepthFlag, 61070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong >EST_FLAG(stack_trace_depth)) || 61080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseStringFlag(arg, kStreamResultToFlag, 61090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong >EST_FLAG(stream_result_to)) || 61100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseBoolFlag(arg, kThrowOnFailureFlag, 61110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong >EST_FLAG(throw_on_failure)) 61120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ) { 61130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Yes. Shift the remainder of the argv list left by one. Note 61140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // that argv has (*argc + 1) elements, the last one always being 61150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // NULL. The following loop moves the trailing NULL element as 61160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // well. 61170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int j = i; j != *argc; j++) { 61180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong argv[j] = argv[j + 1]; 61190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 61200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 61210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Decrements the argument count. 61220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (*argc)--; 61230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 61240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We also need to decrement the iterator as we just removed 61250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // an element. 61260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong i--; 61270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (arg_string == "--help" || arg_string == "-h" || 61280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong arg_string == "-?" || arg_string == "/?" || 61290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong HasGoogleTestFlagPrefix(arg)) { 61300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Both help flag and unrecognized Google Test flags (excluding 61310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // internal ones) trigger help display. 61320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong g_help_flag = true; 61330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 61340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 61350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 61360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (g_help_flag) { 61370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We print the help here instead of in RUN_ALL_TESTS(), as the 61380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // latter may not be called at all if the user is using Google 61390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Test with another testing framework. 61400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintColorEncoded(kColorEncodedHelpMessage); 61410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 61420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 61430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 61440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Parses the command line for Google Test flags, without initializing 61450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// other parts of Google Test. 61460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid ParseGoogleTestFlagsOnly(int* argc, char** argv) { 61470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseGoogleTestFlagsOnlyImpl(argc, argv); 61480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 61490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) { 61500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseGoogleTestFlagsOnlyImpl(argc, argv); 61510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 61520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 61530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The internal implementation of InitGoogleTest(). 61540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 61550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The type parameter CharType can be instantiated to either char or 61560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// wchar_t. 61570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate <typename CharType> 61580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid InitGoogleTestImpl(int* argc, CharType** argv) { 61590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong g_init_gtest_count++; 61600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 61610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We don't want to run the initialization code twice. 61620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (g_init_gtest_count != 1) return; 61630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 61640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (*argc <= 0) return; 61650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 61660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::g_executable_path = internal::StreamableToString(argv[0]); 61670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 61680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_DEATH_TEST 61690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 61700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong g_argvs.clear(); 61710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int i = 0; i != *argc; i++) { 61720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong g_argvs.push_back(StreamableToString(argv[i])); 61730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 61740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 61750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_DEATH_TEST 61760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 61770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseGoogleTestFlagsOnly(argc, argv); 61780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetUnitTestImpl()->PostFlagParsingInit(); 61790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 61800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 61810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 61820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 61830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Initializes Google Test. This must be called before calling 61840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// RUN_ALL_TESTS(). In particular, it parses a command line for the 61850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// flags that Google Test recognizes. Whenever a Google Test flag is 61860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// seen, it is removed from argv, and *argc is decremented. 61870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 61880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// No value is returned. Instead, the Google Test flag variables are 61890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// updated. 61900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 61910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Calling the function for the second time has no user-visible effect. 61920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid InitGoogleTest(int* argc, char** argv) { 61930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::InitGoogleTestImpl(argc, argv); 61940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 61950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 61960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This overloaded version can be used in Windows programs compiled in 61970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// UNICODE mode. 61980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid InitGoogleTest(int* argc, wchar_t** argv) { 61990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::InitGoogleTestImpl(argc, argv); 62000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 62010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 62020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace testing 62030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2005, Google Inc. 62040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// All rights reserved. 62050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 62060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without 62070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are 62080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// met: 62090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 62100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright 62110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// notice, this list of conditions and the following disclaimer. 62120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above 62130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// copyright notice, this list of conditions and the following disclaimer 62140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the documentation and/or other materials provided with the 62150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// distribution. 62160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its 62170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// contributors may be used to endorse or promote products derived from 62180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this software without specific prior written permission. 62190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 62200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 62210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 62220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 62230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 62240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 62250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 62260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 62270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 62280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 62290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 62300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 62310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 62320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Author: wan@google.com (Zhanyong Wan), vladl@google.com (Vlad Losev) 62330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 62340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This file implements death tests. 62350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 62360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 62370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_DEATH_TEST 62380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 62390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if GTEST_OS_MAC 62400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <crt_externs.h> 62410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // GTEST_OS_MAC 62420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 62430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <errno.h> 62440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <fcntl.h> 62450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <limits.h> 62460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <stdarg.h> 62470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 62480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if GTEST_OS_WINDOWS 62490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <windows.h> 62500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# else 62510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <sys/mman.h> 62520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <sys/wait.h> 62530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // GTEST_OS_WINDOWS 62540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 62550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_DEATH_TEST 62560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 62570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 62580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Indicates that this translation unit is part of Google Test's 62590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// implementation. It must come before gtest-internal-inl.h is 62600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// included, or there will be a compiler error. This trick is to 62610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// prevent a user from accidentally including gtest-internal-inl.h in 62620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// his code. 62630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define GTEST_IMPLEMENTATION_ 1 62640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#undef GTEST_IMPLEMENTATION_ 62650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 62660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace testing { 62670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 62680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Constants. 62690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 62700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The default death test style. 62710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic const char kDefaultDeathTestStyle[] = "fast"; 62720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 62730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_string_( 62740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong death_test_style, 62750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle), 62760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Indicates how to run a death test in a forked child process: " 62770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "\"threadsafe\" (child process re-executes the test binary " 62780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "from the beginning, running only the specific death test) or " 62790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "\"fast\" (child process runs the death test immediately " 62800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "after forking)."); 62810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 62820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_bool_( 62830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong death_test_use_fork, 62840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::BoolFromGTestEnv("death_test_use_fork", false), 62850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Instructs to use fork()/_exit() instead of clone() in death tests. " 62860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Ignored and always uses fork() on POSIX systems where clone() is not " 62870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "implemented. Useful when running under valgrind or similar tools if " 62880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "those do not support clone(). Valgrind 3.3.1 will just fail if " 62890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "it sees an unsupported combination of clone() flags. " 62900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "It is not recommended to use this flag w/o valgrind though it will " 62910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "work in 99% of the cases. Once valgrind is fixed, this flag will " 62920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "most likely be removed."); 62930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 62940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 62950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_string_( 62960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal_run_death_test, "", 62970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Indicates the file, line number, temporal index of " 62980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "the single death test to run, and a file descriptor to " 62990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "which a success code may be sent, all separated by " 63000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "colons. This flag is specified if and only if the current " 63010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "process is a sub-process launched for running a thread-safe " 63020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "death test. FOR INTERNAL USE ONLY."); 63030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 63040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_DEATH_TEST 63060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// ExitedWithCode constructor. 63080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) { 63090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 63100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// ExitedWithCode function-call operator. 63120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool ExitedWithCode::operator()(int exit_status) const { 63130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if GTEST_OS_WINDOWS 63140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return exit_status == exit_code_; 63160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# else 63180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_; 63200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // GTEST_OS_WINDOWS 63220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 63230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if !GTEST_OS_WINDOWS 63250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// KilledBySignal constructor. 63260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongKilledBySignal::KilledBySignal(int signum) : signum_(signum) { 63270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 63280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// KilledBySignal function-call operator. 63300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool KilledBySignal::operator()(int exit_status) const { 63310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_; 63320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 63330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // !GTEST_OS_WINDOWS 63340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 63360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Utilities needed for death tests. 63380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Generates a textual description of a given exit code, in the format 63400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// specified by wait(2). 63410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic String ExitSummary(int exit_code) { 63420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message m; 63430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if GTEST_OS_WINDOWS 63450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong m << "Exited with exit status " << exit_code; 63470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# else 63490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (WIFEXITED(exit_code)) { 63510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong m << "Exited with exit status " << WEXITSTATUS(exit_code); 63520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (WIFSIGNALED(exit_code)) { 63530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong m << "Terminated by signal " << WTERMSIG(exit_code); 63540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 63550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# ifdef WCOREDUMP 63560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (WCOREDUMP(exit_code)) { 63570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong m << " (core dumped)"; 63580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 63590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif 63600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // GTEST_OS_WINDOWS 63610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return m.GetString(); 63630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 63640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true if exit_status describes a process that was terminated 63660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// by a signal, or exited normally with a nonzero exit code. 63670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool ExitedUnsuccessfully(int exit_status) { 63680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return !ExitedWithCode(0)(exit_status); 63690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 63700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if !GTEST_OS_WINDOWS 63720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Generates a textual failure message when a death test finds more than 63730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// one thread running, or cannot determine the number of threads, prior 63740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// to executing the given statement. It is the responsibility of the 63750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// caller not to pass a thread_count of 1. 63760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic String DeathTestThreadWarning(size_t thread_count) { 63770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message msg; 63780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << "Death tests use fork(), which is unsafe particularly" 63790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " in a threaded context. For this test, " << GTEST_NAME_ << " "; 63800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (thread_count == 0) 63810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << "couldn't detect the number of threads."; 63820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong else 63830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << "detected " << thread_count << " threads."; 63840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return msg.GetString(); 63850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 63860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // !GTEST_OS_WINDOWS 63870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Flag characters for reporting a death test that did not die. 63890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic const char kDeathTestLived = 'L'; 63900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic const char kDeathTestReturned = 'R'; 63910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic const char kDeathTestThrew = 'T'; 63920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic const char kDeathTestInternalError = 'I'; 63930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 63940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// An enumeration describing all of the possible ways that a death test can 63950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// conclude. DIED means that the process died while executing the test 63960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// code; LIVED means that process lived beyond the end of the test code; 63970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// RETURNED means that the test statement attempted to execute a return 63980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// statement, which is not allowed; THREW means that the test statement 63990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// returned control by throwing an exception. IN_PROGRESS means the test 64000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// has not yet concluded. 64010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TODO(vladl@google.com): Unify names and possibly values for 64020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// AbortReason, DeathTestOutcome, and flag characters above. 64030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongenum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW }; 64040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 64050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Routine for aborting the program which is safe to call from an 64060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// exec-style death test child process, in which case the error 64070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// message is propagated back to the parent process. Otherwise, the 64080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// message is simply printed to stderr. In either case, the program 64090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// then exits with status 1. 64100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid DeathTestAbort(const String& message) { 64110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // On a POSIX system, this function may be called from a threadsafe-style 64120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // death test child process, which operates on a very small stack. Use 64130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the heap for any additional non-minuscule memory requirements. 64140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const InternalRunDeathTestFlag* const flag = 64150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetUnitTestImpl()->internal_run_death_test_flag(); 64160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (flag != NULL) { 64170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FILE* parent = posix::FDOpen(flag->write_fd(), "w"); 64180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fputc(kDeathTestInternalError, parent); 64190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fprintf(parent, "%s", message.c_str()); 64200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(parent); 64210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong _exit(1); 64220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 64230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fprintf(stderr, "%s", message.c_str()); 64240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stderr); 64250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong posix::Abort(); 64260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 64270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 64280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 64290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A replacement for CHECK that calls DeathTestAbort if the assertion 64300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// fails. 64310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# define GTEST_DEATH_TEST_CHECK_(expression) \ 64320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong do { \ 64330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!::testing::internal::IsTrue(expression)) { \ 64340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTestAbort(::testing::internal::String::Format( \ 64350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "CHECK failed: File %s, line %d: %s", \ 64360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong __FILE__, __LINE__, #expression)); \ 64370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } \ 64380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } while (::testing::internal::AlwaysFalse()) 64390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 64400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for 64410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// evaluating any system call that fulfills two conditions: it must return 64420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// -1 on failure, and set errno to EINTR when it is interrupted and 64430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// should be tried again. The macro expands to a loop that repeatedly 64440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// evaluates the expression as long as it evaluates to -1 and sets 64450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// errno to EINTR. If the expression evaluates to -1 but errno is 64460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// something other than EINTR, DeathTestAbort is called. 64470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \ 64480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong do { \ 64490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int gtest_retval; \ 64500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong do { \ 64510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong gtest_retval = (expression); \ 64520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } while (gtest_retval == -1 && errno == EINTR); \ 64530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (gtest_retval == -1) { \ 64540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTestAbort(::testing::internal::String::Format( \ 64550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "CHECK failed: File %s, line %d: %s != -1", \ 64560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong __FILE__, __LINE__, #expression)); \ 64570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } \ 64580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } while (::testing::internal::AlwaysFalse()) 64590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 64600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the message describing the last system error in errno. 64610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString GetLastErrnoDescription() { 64620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return String(errno == 0 ? "" : posix::StrError(errno)); 64630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 64640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 64650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This is called from a death test parent process to read a failure 64660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// message from the death test child process and log it with the FATAL 64670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// severity. On Windows, the message is read from a pipe handle. On other 64680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// platforms, it is read from a file descriptor. 64690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic void FailFromInternalError(int fd) { 64700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message error; 64710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char buffer[256]; 64720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int num_read; 64730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 64740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong do { 64750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong while ((num_read = posix::Read(fd, buffer, 255)) > 0) { 64760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong buffer[num_read] = '\0'; 64770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong error << buffer; 64780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 64790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } while (num_read == -1 && errno == EINTR); 64800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 64810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (num_read == 0) { 64820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_LOG_(FATAL) << error.GetString(); 64830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 64840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int last_error = errno; 64850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_LOG_(FATAL) << "Error while reading death test internal: " 64860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << GetLastErrnoDescription() << " [" << last_error << "]"; 64870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 64880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 64890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 64900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Death test constructor. Increments the running death test count 64910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// for the current test. 64920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongDeathTest::DeathTest() { 64930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestInfo* const info = GetUnitTestImpl()->current_test_info(); 64940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (info == NULL) { 64950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTestAbort("Cannot run a death test outside of a TEST or " 64960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "TEST_F construct"); 64970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 64980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 64990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 65000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates and returns a death test by dispatching to the current 65010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// death test factory. 65020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool DeathTest::Create(const char* statement, const RE* regex, 65030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* file, int line, DeathTest** test) { 65040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return GetUnitTestImpl()->death_test_factory()->Create( 65050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong statement, regex, file, line, test); 65060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 65070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 65080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char* DeathTest::LastMessage() { 65090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return last_death_test_message_.c_str(); 65100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 65110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 65120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid DeathTest::set_last_death_test_message(const String& message) { 65130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong last_death_test_message_ = message; 65140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 65150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 65160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString DeathTest::last_death_test_message_; 65170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 65180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Provides cross platform implementation for some death functionality. 65190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass DeathTestImpl : public DeathTest { 65200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong protected: 65210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTestImpl(const char* a_statement, const RE* a_regex) 65220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : statement_(a_statement), 65230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong regex_(a_regex), 65240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong spawned_(false), 65250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong status_(-1), 65260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong outcome_(IN_PROGRESS), 65270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong read_fd_(-1), 65280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong write_fd_(-1) {} 65290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 65300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // read_fd_ is expected to be closed and cleared by a derived class. 65310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); } 65320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 65330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void Abort(AbortReason reason); 65340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual bool Passed(bool status_ok); 65350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 65360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* statement() const { return statement_; } 65370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const RE* regex() const { return regex_; } 65380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool spawned() const { return spawned_; } 65390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void set_spawned(bool is_spawned) { spawned_ = is_spawned; } 65400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int status() const { return status_; } 65410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void set_status(int a_status) { status_ = a_status; } 65420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTestOutcome outcome() const { return outcome_; } 65430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; } 65440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int read_fd() const { return read_fd_; } 65450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void set_read_fd(int fd) { read_fd_ = fd; } 65460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int write_fd() const { return write_fd_; } 65470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void set_write_fd(int fd) { write_fd_ = fd; } 65480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 65490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Called in the parent process only. Reads the result code of the death 65500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // test child process via a pipe, interprets it to set the outcome_ 65510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // member, and closes read_fd_. Outputs diagnostics and terminates in 65520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // case of unexpected codes. 65530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void ReadAndInterpretStatusByte(); 65540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 65550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 65560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The textual content of the code this object is testing. This class 65570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // doesn't own this string and should not attempt to delete it. 65580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const statement_; 65590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The regular expression which test output must match. DeathTestImpl 65600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // doesn't own this object and should not attempt to delete it. 65610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const RE* const regex_; 65620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // True if the death test child process has been successfully spawned. 65630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool spawned_; 65640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The exit status of the child process. 65650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int status_; 65660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // How the death test concluded. 65670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTestOutcome outcome_; 65680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Descriptor to the read end of the pipe to the child process. It is 65690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // always -1 in the child process. The child keeps its write end of the 65700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // pipe in write_fd_. 65710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int read_fd_; 65720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Descriptor to the child's write end of the pipe to the parent process. 65730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // It is always -1 in the parent process. The parent keeps its end of the 65740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // pipe in read_fd_. 65750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int write_fd_; 65760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 65770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 65780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Called in the parent process only. Reads the result code of the death 65790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// test child process via a pipe, interprets it to set the outcome_ 65800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// member, and closes read_fd_. Outputs diagnostics and terminates in 65810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// case of unexpected codes. 65820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid DeathTestImpl::ReadAndInterpretStatusByte() { 65830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char flag; 65840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int bytes_read; 65850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 65860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The read() here blocks until data is available (signifying the 65870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // failure of the death test) or until the pipe is closed (signifying 65880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // its success), so it's okay to call this in the parent before 65890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the child process has exited. 65900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong do { 65910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bytes_read = posix::Read(read_fd(), &flag, 1); 65920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } while (bytes_read == -1 && errno == EINTR); 65930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 65940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (bytes_read == 0) { 65950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_outcome(DIED); 65960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (bytes_read == 1) { 65970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong switch (flag) { 65980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case kDeathTestReturned: 65990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_outcome(RETURNED); 66000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 66010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case kDeathTestThrew: 66020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_outcome(THREW); 66030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 66040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case kDeathTestLived: 66050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_outcome(LIVED); 66060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 66070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case kDeathTestInternalError: 66080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FailFromInternalError(read_fd()); // Does not return. 66090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 66100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default: 66110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_LOG_(FATAL) << "Death test child process reported " 66120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "unexpected status byte (" 66130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << static_cast<unsigned int>(flag) << ")"; 66140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 66150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 66160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_LOG_(FATAL) << "Read from death test child process failed: " 66170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << GetLastErrnoDescription(); 66180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 66190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd())); 66200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_read_fd(-1); 66210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 66220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 66230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Signals that the death test code which should have exited, didn't. 66240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Should be called only in a death test child process. 66250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Writes a status byte to the child's status file descriptor, then 66260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// calls _exit(1). 66270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid DeathTestImpl::Abort(AbortReason reason) { 66280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The parent process considers the death test to be a failure if 66290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // it finds any data in our pipe. So, here we write a single flag byte 66300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // to the pipe, then exit. 66310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char status_ch = 66320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong reason == TEST_DID_NOT_DIE ? kDeathTestLived : 66330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned; 66340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 66350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1)); 66360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We are leaking the descriptor here because on some platforms (i.e., 66370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // when built as Windows DLL), destructors of global objects will still 66380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // run after calling _exit(). On such systems, write_fd_ will be 66390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // indirectly closed from the destructor of UnitTestImpl, causing double 66400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // close if it is also closed here. On debug configurations, double close 66410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // may assert. As there are no in-process buffers to flush here, we are 66420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // relying on the OS to close the descriptor after the process terminates 66430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // when the destructors are not run. 66440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong _exit(1); // Exits w/o any normal exit hooks (we were supposed to crash) 66450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 66460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 66470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns an indented copy of stderr output for a death test. 66480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This makes distinguishing death test output lines from regular log lines 66490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// much easier. 66500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic ::std::string FormatDeathTestOutput(const ::std::string& output) { 66510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::string ret; 66520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t at = 0; ; ) { 66530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t line_end = output.find('\n', at); 66540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ret += "[ DEATH ] "; 66550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (line_end == ::std::string::npos) { 66560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ret += output.substr(at); 66570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 66580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 66590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ret += output.substr(at, line_end + 1 - at); 66600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong at = line_end + 1; 66610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 66620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return ret; 66630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 66640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 66650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Assesses the success or failure of a death test, using both private 66660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// members which have previously been set, and one argument: 66670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 66680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Private data members: 66690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// outcome: An enumeration describing how the death test 66700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// concluded: DIED, LIVED, THREW, or RETURNED. The death test 66710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// fails in the latter three cases. 66720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// status: The exit status of the child process. On *nix, it is in the 66730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the format specified by wait(2). On Windows, this is the 66740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// value supplied to the ExitProcess() API or a numeric code 66750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// of the exception that terminated the program. 66760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// regex: A regular expression object to be applied to 66770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the test's captured standard error output; the death test 66780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// fails if it does not match. 66790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 66800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Argument: 66810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// status_ok: true if exit_status is acceptable in the context of 66820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this particular death test, which fails if it is false 66830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 66840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff all of the above conditions are met. Otherwise, the 66850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// first failing condition, in the order given above, is the one that is 66860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// reported. Also sets the last death test message string. 66870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool DeathTestImpl::Passed(bool status_ok) { 66880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!spawned()) 66890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 66900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 66910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String error_message = GetCapturedStderr(); 66920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 66930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool success = false; 66940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message buffer; 66950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 66960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong buffer << "Death test: " << statement() << "\n"; 66970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong switch (outcome()) { 66980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case LIVED: 66990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong buffer << " Result: failed to die.\n" 67000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " Error msg:\n" << FormatDeathTestOutput(error_message); 67010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 67020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case THREW: 67030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong buffer << " Result: threw an exception.\n" 67040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " Error msg:\n" << FormatDeathTestOutput(error_message); 67050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 67060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case RETURNED: 67070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong buffer << " Result: illegal return in test statement.\n" 67080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " Error msg:\n" << FormatDeathTestOutput(error_message); 67090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 67100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case DIED: 67110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (status_ok) { 67120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool matched = RE::PartialMatch(error_message.c_str(), *regex()); 67130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (matched) { 67140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong success = true; 67150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 67160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong buffer << " Result: died but not with expected error.\n" 67170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " Expected: " << regex()->pattern() << "\n" 67180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Actual msg:\n" << FormatDeathTestOutput(error_message); 67190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 67200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 67210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong buffer << " Result: died but not with expected exit code:\n" 67220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " " << ExitSummary(status()) << "\n" 67230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Actual msg:\n" << FormatDeathTestOutput(error_message); 67240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 67250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 67260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case IN_PROGRESS: 67270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default: 67280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_LOG_(FATAL) 67290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "DeathTest::Passed somehow called before conclusion of test"; 67300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 67310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 67320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTest::set_last_death_test_message(buffer.GetString()); 67330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return success; 67340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 67350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 67360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if GTEST_OS_WINDOWS 67370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// WindowsDeathTest implements death tests on Windows. Due to the 67380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// specifics of starting new processes on Windows, death tests there are 67390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// always threadsafe, and Google Test considers the 67400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// --gtest_death_test_style=fast setting to be equivalent to 67410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// --gtest_death_test_style=threadsafe there. 67420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 67430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A few implementation notes: Like the Linux version, the Windows 67440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// implementation uses pipes for child-to-parent communication. But due to 67450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the specifics of pipes on Windows, some extra steps are required: 67460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 67470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 1. The parent creates a communication pipe and stores handles to both 67480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// ends of it. 67490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 2. The parent starts the child and provides it with the information 67500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// necessary to acquire the handle to the write end of the pipe. 67510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 3. The child acquires the write end of the pipe and signals the parent 67520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// using a Windows event. 67530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 4. Now the parent can release the write end of the pipe on its side. If 67540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this is done before step 3, the object's reference count goes down to 67550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 0 and it is destroyed, preventing the child from acquiring it. The 67560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// parent now has to release it, or read operations on the read end of 67570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the pipe will not return when the child terminates. 67580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 5. The parent reads child's output through the pipe (outcome code and 67590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// any possible error messages) from the pipe, and its stderr and then 67600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// determines whether to fail the test. 67610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 67620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Note: to distinguish Win32 API calls from the local method and function 67630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// calls, the former are explicitly resolved in the global namespace. 67640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 67650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass WindowsDeathTest : public DeathTestImpl { 67660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 67670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong WindowsDeathTest(const char* a_statement, 67680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const RE* a_regex, 67690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* file, 67700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int line) 67710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {} 67720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 67730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // All of these virtual functions are inherited from DeathTest. 67740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual int Wait(); 67750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual TestRole AssumeRole(); 67760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 67770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 67780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The name of the file in which the death test is located. 67790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const file_; 67800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The line number on which the death test is located. 67810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int line_; 67820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Handle to the write end of the pipe to the child process. 67830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong AutoHandle write_handle_; 67840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Child process handle. 67850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong AutoHandle child_handle_; 67860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Event the child process uses to signal the parent that it has 67870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // acquired the handle to the write end of the pipe. After seeing this 67880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // event the parent can release its own handles to make sure its 67890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // ReadFile() calls return when the child terminates. 67900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong AutoHandle event_handle_; 67910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 67920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 67930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Waits for the child in a death test to exit, returning its exit 67940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// status, or 0 if no child process exists. As a side effect, sets the 67950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// outcome data member. 67960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint WindowsDeathTest::Wait() { 67970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!spawned()) 67980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return 0; 67990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 68000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Wait until the child either signals that it has acquired the write end 68010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // of the pipe or it dies. 68020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() }; 68030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong switch (::WaitForMultipleObjects(2, 68040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong wait_handles, 68050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FALSE, // Waits for any of the handles. 68060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong INFINITE)) { 68070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case WAIT_OBJECT_0: 68080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case WAIT_OBJECT_0 + 1: 68090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 68100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default: 68110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_(false); // Should not get here. 68120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 68130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 68140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The child has acquired the write end of the pipe or exited. 68150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We release the handle on our side and continue. 68160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong write_handle_.Reset(); 68170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong event_handle_.Reset(); 68180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 68190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ReadAndInterpretStatusByte(); 68200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 68210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Waits for the child process to exit if it haven't already. This 68220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // returns immediately if the child has already exited, regardless of 68230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // whether previous calls to WaitForMultipleObjects synchronized on this 68240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // handle or not. 68250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_( 68260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(), 68270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong INFINITE)); 68280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DWORD status_code; 68290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_( 68300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE); 68310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong child_handle_.Reset(); 68320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_status(static_cast<int>(status_code)); 68330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return status(); 68340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 68350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 68360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The AssumeRole process for a Windows death test. It creates a child 68370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// process with the same executable as the current process to run the 68380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// death test. The child process is given the --gtest_filter and 68390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// --gtest_internal_run_death_test flags such that it knows to run the 68400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// current death test only. 68410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongDeathTest::TestRole WindowsDeathTest::AssumeRole() { 68420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const UnitTestImpl* const impl = GetUnitTestImpl(); 68430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const InternalRunDeathTestFlag* const flag = 68440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl->internal_run_death_test_flag(); 68450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestInfo* const info = impl->current_test_info(); 68460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int death_test_index = info->result()->death_test_count(); 68470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 68480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (flag != NULL) { 68490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // ParseInternalRunDeathTestFlag() has performed all the necessary 68500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // processing. 68510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_write_fd(flag->write_fd()); 68520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return EXECUTE_TEST; 68530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 68540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 68550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // WindowsDeathTest uses an anonymous pipe to communicate results of 68560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // a death test. 68570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SECURITY_ATTRIBUTES handles_are_inheritable = { 68580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong sizeof(SECURITY_ATTRIBUTES), NULL, TRUE }; 68590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong HANDLE read_handle, write_handle; 68600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_( 68610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable, 68620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 0) // Default buffer size. 68630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong != FALSE); 68640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle), 68650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong O_RDONLY)); 68660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong write_handle_.Reset(write_handle); 68670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong event_handle_.Reset(::CreateEvent( 68680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong &handles_are_inheritable, 68690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TRUE, // The event will automatically reset to non-signaled state. 68700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FALSE, // The initial state is non-signalled. 68710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong NULL)); // The even is unnamed. 68720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL); 68730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String filter_flag = String::Format("--%s%s=%s.%s", 68740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG_PREFIX_, kFilterFlag, 68750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong info->test_case_name(), 68760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong info->name()); 68770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String internal_flag = String::Format( 68780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "--%s%s=%s|%d|%d|%u|%Iu|%Iu", 68790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG_PREFIX_, 68800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong kInternalRunDeathTestFlag, 68810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong file_, line_, 68820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong death_test_index, 68830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static_cast<unsigned int>(::GetCurrentProcessId()), 68840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // size_t has the same with as pointers on both 32-bit and 64-bit 68850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Windows platforms. 68860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx. 68870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong reinterpret_cast<size_t>(write_handle), 68880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong reinterpret_cast<size_t>(event_handle_.Get())); 68890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 68900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char executable_path[_MAX_PATH + 1]; // NOLINT 68910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_( 68920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong _MAX_PATH + 1 != ::GetModuleFileNameA(NULL, 68930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong executable_path, 68940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong _MAX_PATH)); 68950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 68960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String command_line = String::Format("%s %s \"%s\"", 68970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::GetCommandLineA(), 68980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong filter_flag.c_str(), 68990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal_flag.c_str()); 69000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 69010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTest::set_last_death_test_message(""); 69020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 69030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong CaptureStderr(); 69040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Flush the log buffers since the log streams are shared with the child. 69050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FlushInfoLog(); 69060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 69070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The child process will share the standard handles with the parent. 69080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong STARTUPINFOA startup_info; 69090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong memset(&startup_info, 0, sizeof(STARTUPINFO)); 69100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong startup_info.dwFlags = STARTF_USESTDHANDLES; 69110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE); 69120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE); 69130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE); 69140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 69150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PROCESS_INFORMATION process_info; 69160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_(::CreateProcessA( 69170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong executable_path, 69180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const_cast<char*>(command_line.c_str()), 69190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong NULL, // Retuned process handle is not inheritable. 69200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong NULL, // Retuned thread handle is not inheritable. 69210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TRUE, // Child inherits all inheritable handles (for write_handle_). 69220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 0x0, // Default creation flags. 69230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong NULL, // Inherit the parent's environment. 69240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnitTest::GetInstance()->original_working_dir(), 69250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong &startup_info, 69260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong &process_info) != FALSE); 69270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong child_handle_.Reset(process_info.hProcess); 69280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::CloseHandle(process_info.hThread); 69290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_spawned(true); 69300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return OVERSEE_TEST; 69310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 69320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# else // We are not on Windows. 69330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 69340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// ForkingDeathTest provides implementations for most of the abstract 69350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// methods of the DeathTest interface. Only the AssumeRole method is 69360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// left undefined. 69370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass ForkingDeathTest : public DeathTestImpl { 69380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 69390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ForkingDeathTest(const char* statement, const RE* regex); 69400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 69410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // All of these virtual functions are inherited from DeathTest. 69420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual int Wait(); 69430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 69440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong protected: 69450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; } 69460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 69470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 69480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // PID of child process during death test; 0 in the child process itself. 69490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong pid_t child_pid_; 69500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 69510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 69520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Constructs a ForkingDeathTest. 69530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex) 69540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : DeathTestImpl(a_statement, a_regex), 69550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong child_pid_(-1) {} 69560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 69570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Waits for the child in a death test to exit, returning its exit 69580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// status, or 0 if no child process exists. As a side effect, sets the 69590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// outcome data member. 69600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint ForkingDeathTest::Wait() { 69610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!spawned()) 69620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return 0; 69630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 69640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ReadAndInterpretStatusByte(); 69650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 69660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int status_value; 69670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0)); 69680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_status(status_value); 69690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return status_value; 69700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 69710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 69720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A concrete death test class that forks, then immediately runs the test 69730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the child process. 69740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass NoExecDeathTest : public ForkingDeathTest { 69750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 69760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong NoExecDeathTest(const char* a_statement, const RE* a_regex) : 69770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ForkingDeathTest(a_statement, a_regex) { } 69780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual TestRole AssumeRole(); 69790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 69800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 69810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The AssumeRole process for a fork-and-run death test. It implements a 69820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// straightforward fork, with a simple pipe to transmit the status byte. 69830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongDeathTest::TestRole NoExecDeathTest::AssumeRole() { 69840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t thread_count = GetThreadCount(); 69850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (thread_count != 1) { 69860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count); 69870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 69880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 69890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int pipe_fd[2]; 69900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1); 69910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 69920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTest::set_last_death_test_message(""); 69930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong CaptureStderr(); 69940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // When we fork the process below, the log file buffers are copied, but the 69950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // file descriptors are shared. We flush all log files here so that closing 69960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the file descriptors in the child process doesn't throw off the 69970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // synchronization between descriptors and buffers in the parent process. 69980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This is as close to the fork as possible to avoid a race condition in case 69990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // there are multiple threads running before the death test, and another 70000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // thread writes to the log file. 70010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FlushInfoLog(); 70020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 70030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const pid_t child_pid = fork(); 70040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_(child_pid != -1); 70050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_child_pid(child_pid); 70060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (child_pid == 0) { 70070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0])); 70080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_write_fd(pipe_fd[1]); 70090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Redirects all logging to stderr in the child process to prevent 70100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // concurrent writes to the log files. We capture stderr in the parent 70110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // process and append the child process' output to a log. 70120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong LogToStderr(); 70130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Event forwarding to the listeners of event listener API mush be shut 70140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // down in death test subprocesses. 70150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetUnitTestImpl()->listeners()->SuppressEventForwarding(); 70160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return EXECUTE_TEST; 70170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 70180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1])); 70190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_read_fd(pipe_fd[0]); 70200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_spawned(true); 70210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return OVERSEE_TEST; 70220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 70230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 70240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 70250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A concrete death test class that forks and re-executes the main 70260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// program from the beginning, with command-line flags set that cause 70270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// only this specific death test to be run. 70280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass ExecDeathTest : public ForkingDeathTest { 70290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 70300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ExecDeathTest(const char* a_statement, const RE* a_regex, 70310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* file, int line) : 70320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { } 70330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual TestRole AssumeRole(); 70340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 70350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The name of the file in which the death test is located. 70360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const file_; 70370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The line number on which the death test is located. 70380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int line_; 70390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 70400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 70410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Utility class for accumulating command-line arguments. 70420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass Arguments { 70430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 70440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Arguments() { 70450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong args_.push_back(NULL); 70460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 70470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 70480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ~Arguments() { 70490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (std::vector<char*>::iterator i = args_.begin(); i != args_.end(); 70500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ++i) { 70510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong free(*i); 70520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 70530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 70540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void AddArgument(const char* argument) { 70550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong args_.insert(args_.end() - 1, posix::StrDup(argument)); 70560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 70570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 70580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong template <typename Str> 70590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void AddArguments(const ::std::vector<Str>& arguments) { 70600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (typename ::std::vector<Str>::const_iterator i = arguments.begin(); 70610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong i != arguments.end(); 70620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ++i) { 70630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong args_.insert(args_.end() - 1, posix::StrDup(i->c_str())); 70640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 70650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 70660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char* const* Argv() { 70670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return &args_[0]; 70680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 70690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 70700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::vector<char*> args_; 70710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 70720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 70730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A struct that encompasses the arguments to the child process of a 70740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// threadsafe-style death test process. 70750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstruct ExecDeathTestArgs { 70760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char* const* argv; // Command-line arguments for the child's call to exec 70770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int close_fd; // File descriptor to close; the read end of a pipe 70780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 70790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 70800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if GTEST_OS_MAC 70810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Konginline char** GetEnviron() { 70820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // When Google Test is built as a framework on MacOS X, the environ variable 70830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // is unavailable. Apple's documentation (man environ) recommends using 70840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // _NSGetEnviron() instead. 70850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return *_NSGetEnviron(); 70860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 70870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# else 70880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Some POSIX platforms expect you to declare environ. extern "C" makes 70890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// it reside in the global namespace. 70900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongextern "C" char** environ; 70910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Konginline char** GetEnviron() { return environ; } 70920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // GTEST_OS_MAC 70930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 70940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The main function for a threadsafe-style death test child process. 70950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This function is called in a clone()-ed process and thus must avoid 70960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// any potentially unsafe operations like malloc or libc functions. 70970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic int ExecDeathTestChildMain(void* child_arg) { 70980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg); 70990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd)); 71000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 71010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We need to execute the test program in the same environment where 71020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // it was originally invoked. Therefore we change to the original 71030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // working directory first. 71040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const original_dir = 71050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnitTest::GetInstance()->original_working_dir(); 71060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We can safely call chdir() as it's a direct system call. 71070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (chdir(original_dir) != 0) { 71080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTestAbort(String::Format("chdir(\"%s\") failed: %s", 71090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong original_dir, 71100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetLastErrnoDescription().c_str())); 71110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return EXIT_FAILURE; 71120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 71130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 71140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We can safely call execve() as it's a direct system call. We 71150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // cannot use execvp() as it's a libc function and thus potentially 71160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // unsafe. Since execve() doesn't search the PATH, the user must 71170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // invoke the test program via a valid path that contains at least 71180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // one path separator. 71190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong execve(args->argv[0], args->argv, GetEnviron()); 71200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTestAbort(String::Format("execve(%s, ...) in %s failed: %s", 71210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong args->argv[0], 71220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong original_dir, 71230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetLastErrnoDescription().c_str())); 71240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return EXIT_FAILURE; 71250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 71260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 71270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Two utility routines that together determine the direction the stack 71280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// grows. 71290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This could be accomplished more elegantly by a single recursive 71300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// function, but we want to guard against the unlikely possibility of 71310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// a smart compiler optimizing the recursion away. 71320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 71330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining 71340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// StackLowerThanAddress into StackGrowsDown, which then doesn't give 71350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// correct answer. 71360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool StackLowerThanAddress(const void* ptr) GTEST_NO_INLINE_; 71370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool StackLowerThanAddress(const void* ptr) { 71380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int dummy; 71390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return &dummy < ptr; 71400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 71410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 71420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool StackGrowsDown() { 71430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int dummy; 71440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return StackLowerThanAddress(&dummy); 71450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 71460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 71470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A threadsafe implementation of fork(2) for threadsafe-style death tests 71480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// that uses clone(2). It dies with an error message if anything goes 71490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// wrong. 71500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic pid_t ExecDeathTestFork(char* const* argv, int close_fd) { 71510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ExecDeathTestArgs args = { argv, close_fd }; 71520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong pid_t child_pid = -1; 71530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 71540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if GTEST_HAS_CLONE 71550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool use_fork = GTEST_FLAG(death_test_use_fork); 71560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 71570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!use_fork) { 71580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static const bool stack_grows_down = StackGrowsDown(); 71590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t stack_size = getpagesize(); 71600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead. 71610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE, 71620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MAP_ANON | MAP_PRIVATE, -1, 0); 71630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED); 71640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void* const stack_top = 71650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static_cast<char*>(stack) + (stack_grows_down ? stack_size : 0); 71660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 71670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args); 71680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 71690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1); 71700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 71710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# else 71720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool use_fork = true; 71730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // GTEST_HAS_CLONE 71740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 71750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (use_fork && (child_pid = fork()) == 0) { 71760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ExecDeathTestChildMain(&args); 71770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong _exit(0); 71780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 71790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 71800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_(child_pid != -1); 71810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return child_pid; 71820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 71830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 71840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The AssumeRole process for a fork-and-exec death test. It re-executes the 71850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// main program from the beginning, setting the --gtest_filter 71860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// and --gtest_internal_run_death_test flags to cause only the current 71870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// death test to be re-run. 71880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongDeathTest::TestRole ExecDeathTest::AssumeRole() { 71890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const UnitTestImpl* const impl = GetUnitTestImpl(); 71900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const InternalRunDeathTestFlag* const flag = 71910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl->internal_run_death_test_flag(); 71920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestInfo* const info = impl->current_test_info(); 71930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int death_test_index = info->result()->death_test_count(); 71940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 71950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (flag != NULL) { 71960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_write_fd(flag->write_fd()); 71970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return EXECUTE_TEST; 71980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 71990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 72000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int pipe_fd[2]; 72010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1); 72020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Clear the close-on-exec flag on the write end of the pipe, lest 72030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // it be closed when the child process does an exec: 72040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1); 72050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 72060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String filter_flag = 72070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String::Format("--%s%s=%s.%s", 72080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG_PREFIX_, kFilterFlag, 72090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong info->test_case_name(), info->name()); 72100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String internal_flag = 72110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String::Format("--%s%s=%s|%d|%d|%d", 72120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG_PREFIX_, kInternalRunDeathTestFlag, 72130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong file_, line_, death_test_index, pipe_fd[1]); 72140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Arguments args; 72150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong args.AddArguments(GetArgvs()); 72160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong args.AddArgument(filter_flag.c_str()); 72170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong args.AddArgument(internal_flag.c_str()); 72180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 72190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTest::set_last_death_test_message(""); 72200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 72210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong CaptureStderr(); 72220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // See the comment in NoExecDeathTest::AssumeRole for why the next line 72230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // is necessary. 72240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FlushInfoLog(); 72250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 72260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const pid_t child_pid = ExecDeathTestFork(args.Argv(), pipe_fd[0]); 72270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1])); 72280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_child_pid(child_pid); 72290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_read_fd(pipe_fd[0]); 72300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong set_spawned(true); 72310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return OVERSEE_TEST; 72320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 72330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 72340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // !GTEST_OS_WINDOWS 72350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 72360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates a concrete DeathTest-derived class that depends on the 72370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// --gtest_death_test_style flag, and sets the pointer pointed to 72380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// by the "test" argument to its address. If the test should be 72390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// skipped, sets that pointer to NULL. Returns true, unless the 72400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// flag is set to an invalid value. 72410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool DefaultDeathTestFactory::Create(const char* statement, const RE* regex, 72420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* file, int line, 72430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTest** test) { 72440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnitTestImpl* const impl = GetUnitTestImpl(); 72450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const InternalRunDeathTestFlag* const flag = 72460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong impl->internal_run_death_test_flag(); 72470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int death_test_index = impl->current_test_info() 72480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ->increment_death_test_count(); 72490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 72500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (flag != NULL) { 72510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (death_test_index > flag->index()) { 72520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTest::set_last_death_test_message(String::Format( 72530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Death test count (%d) somehow exceeded expected maximum (%d)", 72540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong death_test_index, flag->index())); 72550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 72560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 72570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 72580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!(flag->file() == file && flag->line() == line && 72590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong flag->index() == death_test_index)) { 72600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *test = NULL; 72610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 72620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 72630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 72640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 72650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if GTEST_OS_WINDOWS 72660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 72670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (GTEST_FLAG(death_test_style) == "threadsafe" || 72680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(death_test_style) == "fast") { 72690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *test = new WindowsDeathTest(statement, regex, file, line); 72700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 72710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 72720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# else 72730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 72740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (GTEST_FLAG(death_test_style) == "threadsafe") { 72750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *test = new ExecDeathTest(statement, regex, file, line); 72760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (GTEST_FLAG(death_test_style) == "fast") { 72770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *test = new NoExecDeathTest(statement, regex); 72780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 72790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 72800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // GTEST_OS_WINDOWS 72810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 72820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong else { // NOLINT - this is more readable than unbalanced brackets inside #if. 72830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTest::set_last_death_test_message(String::Format( 72840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Unknown death test style \"%s\" encountered", 72850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(death_test_style).c_str())); 72860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 72870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 72880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 72890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 72900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 72910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 72920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Splits a given string on a given delimiter, populating a given 72930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// vector with the fields. GTEST_HAS_DEATH_TEST implies that we have 72940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// ::std::string, so we can use it here. 72950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic void SplitString(const ::std::string& str, char delimiter, 72960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::vector< ::std::string>* dest) { 72970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::vector< ::std::string> parsed; 72980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::string::size_type pos = 0; 72990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong while (::testing::internal::AlwaysTrue()) { 73000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const ::std::string::size_type colon = str.find(delimiter, pos); 73010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (colon == ::std::string::npos) { 73020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong parsed.push_back(str.substr(pos)); 73030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 73040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 73050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong parsed.push_back(str.substr(pos, colon - pos)); 73060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong pos = colon + 1; 73070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 73080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 73090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong dest->swap(parsed); 73100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 73110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 73120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if GTEST_OS_WINDOWS 73130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Recreates the pipe and event handles from the provided parameters, 73140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// signals the event, and returns a file descriptor wrapped around the pipe 73150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// handle. This function is called in the child process only. 73160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint GetStatusFileDescriptor(unsigned int parent_process_id, 73170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong size_t write_handle_as_size_t, 73180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong size_t event_handle_as_size_t) { 73190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE, 73200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FALSE, // Non-inheritable. 73210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong parent_process_id)); 73220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) { 73230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTestAbort(String::Format("Unable to open parent process %u", 73240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong parent_process_id)); 73250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 73260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 73270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TODO(vladl@google.com): Replace the following check with a 73280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // compile-time assertion when available. 73290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t)); 73300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 73310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const HANDLE write_handle = 73320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong reinterpret_cast<HANDLE>(write_handle_as_size_t); 73330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong HANDLE dup_write_handle; 73340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 73350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The newly initialized handle is accessible only in in the parent 73360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // process. To obtain one accessible within the child, we need to use 73370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // DuplicateHandle. 73380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!::DuplicateHandle(parent_process_handle.Get(), write_handle, 73390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::GetCurrentProcess(), &dup_write_handle, 73400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 0x0, // Requested privileges ignored since 73410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // DUPLICATE_SAME_ACCESS is used. 73420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FALSE, // Request non-inheritable handler. 73430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DUPLICATE_SAME_ACCESS)) { 73440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTestAbort(String::Format( 73450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Unable to duplicate the pipe handle %Iu from the parent process %u", 73460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong write_handle_as_size_t, parent_process_id)); 73470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 73480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 73490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t); 73500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong HANDLE dup_event_handle; 73510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 73520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!::DuplicateHandle(parent_process_handle.Get(), event_handle, 73530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::GetCurrentProcess(), &dup_event_handle, 73540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 0x0, 73550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FALSE, 73560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DUPLICATE_SAME_ACCESS)) { 73570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTestAbort(String::Format( 73580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Unable to duplicate the event handle %Iu from the parent process %u", 73590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong event_handle_as_size_t, parent_process_id)); 73600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 73610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 73620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int write_fd = 73630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND); 73640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (write_fd == -1) { 73650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTestAbort(String::Format( 73660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Unable to convert pipe handle %Iu to a file descriptor", 73670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong write_handle_as_size_t)); 73680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 73690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 73700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Signals the parent that the write end of the pipe has been acquired 73710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // so the parent can release its own write end. 73720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::SetEvent(dup_event_handle); 73730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 73740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return write_fd; 73750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 73760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // GTEST_OS_WINDOWS 73770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 73780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns a newly created InternalRunDeathTestFlag object with fields 73790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// initialized from the GTEST_FLAG(internal_run_death_test) flag if 73800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the flag is specified; otherwise returns NULL. 73810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongInternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() { 73820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (GTEST_FLAG(internal_run_death_test) == "") return NULL; 73830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 73840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we 73850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // can use it here. 73860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int line = -1; 73870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int index = -1; 73880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::vector< ::std::string> fields; 73890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields); 73900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int write_fd = -1; 73910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 73920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if GTEST_OS_WINDOWS 73930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 73940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong unsigned int parent_process_id = 0; 73950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong size_t write_handle_as_size_t = 0; 73960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong size_t event_handle_as_size_t = 0; 73970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 73980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (fields.size() != 6 73990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong || !ParseNaturalNumber(fields[1], &line) 74000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong || !ParseNaturalNumber(fields[2], &index) 74010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong || !ParseNaturalNumber(fields[3], &parent_process_id) 74020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong || !ParseNaturalNumber(fields[4], &write_handle_as_size_t) 74030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) { 74040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTestAbort(String::Format( 74050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Bad --gtest_internal_run_death_test flag: %s", 74060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(internal_run_death_test).c_str())); 74070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 74080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong write_fd = GetStatusFileDescriptor(parent_process_id, 74090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong write_handle_as_size_t, 74100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong event_handle_as_size_t); 74110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# else 74120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 74130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (fields.size() != 4 74140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong || !ParseNaturalNumber(fields[1], &line) 74150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong || !ParseNaturalNumber(fields[2], &index) 74160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong || !ParseNaturalNumber(fields[3], &write_fd)) { 74170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DeathTestAbort(String::Format( 74180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Bad --gtest_internal_run_death_test flag: %s", 74190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_FLAG(internal_run_death_test).c_str())); 74200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 74210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 74220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // GTEST_OS_WINDOWS 74230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 74240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return new InternalRunDeathTestFlag(fields[0], line, index, write_fd); 74250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 74260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 74270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 74280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 74290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_DEATH_TEST 74300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 74310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace testing 74320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2008, Google Inc. 74330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// All rights reserved. 74340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 74350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without 74360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are 74370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// met: 74380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 74390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright 74400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// notice, this list of conditions and the following disclaimer. 74410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above 74420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// copyright notice, this list of conditions and the following disclaimer 74430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the documentation and/or other materials provided with the 74440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// distribution. 74450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its 74460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// contributors may be used to endorse or promote products derived from 74470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this software without specific prior written permission. 74480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 74490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 74500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 74510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 74520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 74530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 74540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 74550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 74560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 74570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 74580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 74590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 74600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 74610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Authors: keith.ray@gmail.com (Keith Ray) 74620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 74630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 74640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <stdlib.h> 74650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 74660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS_MOBILE 74670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <windows.h> 74680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#elif GTEST_OS_WINDOWS 74690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <direct.h> 74700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <io.h> 74710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#elif GTEST_OS_SYMBIAN || GTEST_OS_NACL 74720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Symbian OpenC and NaCl have PATH_MAX in sys/syslimits.h 74730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <sys/syslimits.h> 74740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 74750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <limits.h> 74760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <climits> // Some Linux distributions define PATH_MAX here. 74770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS_MOBILE 74780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 74790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS 74800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# define GTEST_PATH_MAX_ _MAX_PATH 74810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#elif defined(PATH_MAX) 74820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# define GTEST_PATH_MAX_ PATH_MAX 74830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#elif defined(_XOPEN_PATH_MAX) 74840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# define GTEST_PATH_MAX_ _XOPEN_PATH_MAX 74850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 74860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# define GTEST_PATH_MAX_ _POSIX_PATH_MAX 74870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS 74880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 74890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 74900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace testing { 74910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 74920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 74930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS 74940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// On Windows, '\\' is the standard path separator, but many tools and the 74950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Windows API also accept '/' as an alternate path separator. Unless otherwise 74960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// noted, a file path can contain either kind of path separators, or a mixture 74970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// of them. 74980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kPathSeparator = '\\'; 74990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kAlternatePathSeparator = '/'; 75000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kPathSeparatorString[] = "\\"; 75010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kAlternatePathSeparatorString[] = "/"; 75020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if GTEST_OS_WINDOWS_MOBILE 75030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Windows CE doesn't have a current directory. You should not use 75040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the current directory in tests on Windows CE, but this at least 75050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// provides a reasonable fallback. 75060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kCurrentDirectoryString[] = "\\"; 75070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Windows CE doesn't define INVALID_FILE_ATTRIBUTES 75080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst DWORD kInvalidFileAttributes = 0xffffffff; 75090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# else 75100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kCurrentDirectoryString[] = ".\\"; 75110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // GTEST_OS_WINDOWS_MOBILE 75120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 75130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kPathSeparator = '/'; 75140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kPathSeparatorString[] = "/"; 75150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kCurrentDirectoryString[] = "./"; 75160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS 75170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 75180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns whether the given character is a valid path separator. 75190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic bool IsPathSeparator(char c) { 75200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_ALT_PATH_SEP_ 75210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (c == kPathSeparator) || (c == kAlternatePathSeparator); 75220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 75230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return c == kPathSeparator; 75240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 75250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 75260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 75270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the current working directory, or "" if unsuccessful. 75280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongFilePath FilePath::GetCurrentDir() { 75290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS_MOBILE 75300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Windows CE doesn't have a current directory, so we just return 75310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // something reasonable. 75320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return FilePath(kCurrentDirectoryString); 75330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#elif GTEST_OS_WINDOWS 75340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char cwd[GTEST_PATH_MAX_ + 1] = { '\0' }; 75350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd); 75360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 75370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char cwd[GTEST_PATH_MAX_ + 1] = { '\0' }; 75380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd); 75390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS_MOBILE 75400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 75410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 75420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns a copy of the FilePath with the case-insensitive extension removed. 75430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns 75440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// FilePath("dir/file"). If a case-insensitive extension is not 75450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// found, returns a copy of the original FilePath. 75460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongFilePath FilePath::RemoveExtension(const char* extension) const { 75470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String dot_extension(String::Format(".%s", extension)); 75480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (pathname_.EndsWithCaseInsensitive(dot_extension.c_str())) { 75490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return FilePath(String(pathname_.c_str(), pathname_.length() - 4)); 75500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 75510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return *this; 75520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 75530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 75540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns a pointer to the last occurence of a valid path separator in 75550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the FilePath. On Windows, for example, both '/' and '\' are valid path 75560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// separators. Returns NULL if no path separator was found. 75570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char* FilePath::FindLastPathSeparator() const { 75580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const last_sep = strrchr(c_str(), kPathSeparator); 75590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_ALT_PATH_SEP_ 75600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator); 75610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Comparing two pointers of which only one is NULL is undefined. 75620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (last_alt_sep != NULL && 75630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (last_sep == NULL || last_alt_sep > last_sep)) { 75640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return last_alt_sep; 75650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 75660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 75670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return last_sep; 75680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 75690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 75700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns a copy of the FilePath with the directory part removed. 75710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Example: FilePath("path/to/file").RemoveDirectoryName() returns 75720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// FilePath("file"). If there is no directory part ("just_a_file"), it returns 75730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the FilePath unmodified. If there is no file part ("just_a_dir/") it 75740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// returns an empty FilePath (""). 75750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// On Windows platform, '\' is the path separator, otherwise it is '/'. 75760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongFilePath FilePath::RemoveDirectoryName() const { 75770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const last_sep = FindLastPathSeparator(); 75780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return last_sep ? FilePath(String(last_sep + 1)) : *this; 75790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 75800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 75810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// RemoveFileName returns the directory path with the filename removed. 75820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/". 75830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// If the FilePath is "a_file" or "/a_file", RemoveFileName returns 75840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does 75850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// not have a file, like "just/a/dir/", it returns the FilePath unmodified. 75860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// On Windows platform, '\' is the path separator, otherwise it is '/'. 75870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongFilePath FilePath::RemoveFileName() const { 75880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const last_sep = FindLastPathSeparator(); 75890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String dir; 75900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (last_sep) { 75910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong dir = String(c_str(), last_sep + 1 - c_str()); 75920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 75930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong dir = kCurrentDirectoryString; 75940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 75950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return FilePath(dir); 75960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 75970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 75980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Helper functions for naming files in a directory for xml output. 75990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 76000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Given directory = "dir", base_name = "test", number = 0, 76010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// extension = "xml", returns "dir/test.xml". If number is greater 76020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// than zero (e.g., 12), returns "dir/test_12.xml". 76030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// On Windows platform, uses \ as the separator rather than /. 76040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongFilePath FilePath::MakeFileName(const FilePath& directory, 76050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const FilePath& base_name, 76060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int number, 76070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* extension) { 76080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String file; 76090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (number == 0) { 76100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong file = String::Format("%s.%s", base_name.c_str(), extension); 76110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 76120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong file = String::Format("%s_%d.%s", base_name.c_str(), number, extension); 76130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 76140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return ConcatPaths(directory, FilePath(file)); 76150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 76160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 76170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml". 76180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// On Windows, uses \ as the separator rather than /. 76190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongFilePath FilePath::ConcatPaths(const FilePath& directory, 76200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const FilePath& relative_path) { 76210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (directory.IsEmpty()) 76220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return relative_path; 76230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const FilePath dir(directory.RemoveTrailingPathSeparator()); 76240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return FilePath(String::Format("%s%c%s", dir.c_str(), kPathSeparator, 76250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong relative_path.c_str())); 76260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 76270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 76280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true if pathname describes something findable in the file-system, 76290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// either a file, directory, or whatever. 76300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool FilePath::FileOrDirectoryExists() const { 76310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS_MOBILE 76320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str()); 76330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const DWORD attributes = GetFileAttributes(unicode); 76340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong delete [] unicode; 76350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return attributes != kInvalidFileAttributes; 76360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 76370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong posix::StatStruct file_stat; 76380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return posix::Stat(pathname_.c_str(), &file_stat) == 0; 76390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS_MOBILE 76400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 76410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 76420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true if pathname describes a directory in the file-system 76430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// that exists. 76440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool FilePath::DirectoryExists() const { 76450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool result = false; 76460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS 76470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Don't strip off trailing separator if path is a root directory on 76480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Windows (like "C:\\"). 76490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const FilePath& path(IsRootDirectory() ? *this : 76500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong RemoveTrailingPathSeparator()); 76510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 76520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const FilePath& path(*this); 76530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 76540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 76550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS_MOBILE 76560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong LPCWSTR unicode = String::AnsiToUtf16(path.c_str()); 76570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const DWORD attributes = GetFileAttributes(unicode); 76580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong delete [] unicode; 76590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if ((attributes != kInvalidFileAttributes) && 76600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (attributes & FILE_ATTRIBUTE_DIRECTORY)) { 76610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result = true; 76620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 76630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 76640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong posix::StatStruct file_stat; 76650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result = posix::Stat(path.c_str(), &file_stat) == 0 && 76660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong posix::IsDir(file_stat); 76670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS_MOBILE 76680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 76690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return result; 76700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 76710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 76720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true if pathname describes a root directory. (Windows has one 76730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// root directory per disk drive.) 76740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool FilePath::IsRootDirectory() const { 76750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS 76760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TODO(wan@google.com): on Windows a network share like 76770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // \\server\share can be a root directory, although it cannot be the 76780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // current directory. Handle this properly. 76790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return pathname_.length() == 3 && IsAbsolutePath(); 76800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 76810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]); 76820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 76830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 76840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 76850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true if pathname describes an absolute path. 76860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool FilePath::IsAbsolutePath() const { 76870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const name = pathname_.c_str(); 76880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS 76890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return pathname_.length() >= 3 && 76900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ((name[0] >= 'a' && name[0] <= 'z') || 76910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (name[0] >= 'A' && name[0] <= 'Z')) && 76920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong name[1] == ':' && 76930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong IsPathSeparator(name[2]); 76940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 76950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return IsPathSeparator(name[0]); 76960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 76970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 76980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 76990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns a pathname for a file that does not currently exist. The pathname 77000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// will be directory/base_name.extension or 77010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// directory/base_name_<number>.extension if directory/base_name.extension 77020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// already exists. The number will be incremented until a pathname is found 77030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// that does not already exist. 77040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'. 77050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// There could be a race condition if two or more processes are calling this 77060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// function at the same time -- they could both pick the same filename. 77070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongFilePath FilePath::GenerateUniqueFileName(const FilePath& directory, 77080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const FilePath& base_name, 77090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* extension) { 77100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FilePath full_pathname; 77110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int number = 0; 77120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong do { 77130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong full_pathname.Set(MakeFileName(directory, base_name, number++, extension)); 77140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } while (full_pathname.FileOrDirectoryExists()); 77150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return full_pathname; 77160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 77170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 77180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true if FilePath ends with a path separator, which indicates that 77190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// it is intended to represent a directory. Returns false otherwise. 77200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This does NOT check that a directory (or file) actually exists. 77210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool FilePath::IsDirectory() const { 77220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return !pathname_.empty() && 77230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]); 77240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 77250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 77260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Create directories so that path exists. Returns true if successful or if 77270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the directories already exist; returns false if unable to create directories 77280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// for any reason. 77290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool FilePath::CreateDirectoriesRecursively() const { 77300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!this->IsDirectory()) { 77310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 77320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 77330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 77340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (pathname_.length() == 0 || this->DirectoryExists()) { 77350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 77360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 77370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 77380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName()); 77390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return parent.CreateDirectoriesRecursively() && this->CreateFolder(); 77400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 77410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 77420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Create the directory so that path exists. Returns true if successful or 77430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// if the directory already exists; returns false if unable to create the 77440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// directory for any reason, including if the parent directory does not 77450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// exist. Not named "CreateDirectory" because that's a macro on Windows. 77460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool FilePath::CreateFolder() const { 77470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS_MOBILE 77480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FilePath removed_sep(this->RemoveTrailingPathSeparator()); 77490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str()); 77500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int result = CreateDirectory(unicode, NULL) ? 0 : -1; 77510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong delete [] unicode; 77520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#elif GTEST_OS_WINDOWS 77530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int result = _mkdir(pathname_.c_str()); 77540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 77550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int result = mkdir(pathname_.c_str(), 0777); 77560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS_MOBILE 77570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 77580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (result == -1) { 77590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return this->DirectoryExists(); // An error is OK if the directory exists. 77600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 77610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; // No error. 77620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 77630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 77640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// If input name has a trailing separator character, remove it and return the 77650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// name, otherwise return the name string unmodified. 77660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// On Windows platform, uses \ as the separator, other platforms use /. 77670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongFilePath FilePath::RemoveTrailingPathSeparator() const { 77680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return IsDirectory() 77690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ? FilePath(String(pathname_.c_str(), pathname_.length() - 1)) 77700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : *this; 77710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 77720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 77730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Removes any redundant separators that might be in the pathname. 77740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// For example, "bar///foo" becomes "bar/foo". Does not eliminate other 77750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// redundancies that might be in a pathname involving "." or "..". 77760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TODO(wan@google.com): handle Windows network shares (e.g. \\server\share). 77770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid FilePath::Normalize() { 77780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (pathname_.c_str() == NULL) { 77790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong pathname_ = ""; 77800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return; 77810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 77820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* src = pathname_.c_str(); 77830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char* const dest = new char[pathname_.length() + 1]; 77840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char* dest_ptr = dest; 77850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong memset(dest_ptr, 0, pathname_.length() + 1); 77860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 77870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong while (*src != '\0') { 77880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *dest_ptr = *src; 77890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!IsPathSeparator(*src)) { 77900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong src++; 77910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 77920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_ALT_PATH_SEP_ 77930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (*dest_ptr == kAlternatePathSeparator) { 77940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *dest_ptr = kPathSeparator; 77950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 77960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 77970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong while (IsPathSeparator(*src)) 77980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong src++; 77990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 78000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong dest_ptr++; 78010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 78020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *dest_ptr = '\0'; 78030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong pathname_ = dest; 78040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong delete[] dest; 78050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 78060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 78070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 78080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace testing 78090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2008, Google Inc. 78100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// All rights reserved. 78110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 78120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without 78130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are 78140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// met: 78150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 78160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright 78170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// notice, this list of conditions and the following disclaimer. 78180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above 78190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// copyright notice, this list of conditions and the following disclaimer 78200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the documentation and/or other materials provided with the 78210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// distribution. 78220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its 78230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// contributors may be used to endorse or promote products derived from 78240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this software without specific prior written permission. 78250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 78260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 78270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 78280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 78290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 78300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 78310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 78320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 78330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 78340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 78350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 78360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 78370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 78380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Author: wan@google.com (Zhanyong Wan) 78390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 78400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 78410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <limits.h> 78420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <stdlib.h> 78430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <stdio.h> 78440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <string.h> 78450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 78460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS_MOBILE 78470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <windows.h> // For TerminateProcess() 78480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#elif GTEST_OS_WINDOWS 78490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <io.h> 78500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <sys/stat.h> 78510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 78520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <unistd.h> 78530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS_MOBILE 78540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 78550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_MAC 78560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <mach/mach_init.h> 78570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <mach/task.h> 78580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <mach/vm_map.h> 78590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_MAC 78600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 78610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 78620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Indicates that this translation unit is part of Google Test's 78630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// implementation. It must come before gtest-internal-inl.h is 78640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// included, or there will be a compiler error. This trick is to 78650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// prevent a user from accidentally including gtest-internal-inl.h in 78660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// his code. 78670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define GTEST_IMPLEMENTATION_ 1 78680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#undef GTEST_IMPLEMENTATION_ 78690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 78700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace testing { 78710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 78720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 78730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if defined(_MSC_VER) || defined(__BORLANDC__) 78740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// MSVC and C++Builder do not provide a definition of STDERR_FILENO. 78750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst int kStdOutFileno = 1; 78760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst int kStdErrFileno = 2; 78770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 78780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst int kStdOutFileno = STDOUT_FILENO; 78790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst int kStdErrFileno = STDERR_FILENO; 78800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // _MSC_VER 78810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 78820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_MAC 78830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 78840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the number of threads running in the process, or 0 to indicate that 78850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// we cannot detect it. 78860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongsize_t GetThreadCount() { 78870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const task_t task = mach_task_self(); 78880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong mach_msg_type_number_t thread_count; 78890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong thread_act_array_t thread_list; 78900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const kern_return_t status = task_threads(task, &thread_list, &thread_count); 78910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (status == KERN_SUCCESS) { 78920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // task_threads allocates resources in thread_list and we need to free them 78930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // to avoid leaks. 78940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong vm_deallocate(task, 78950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong reinterpret_cast<vm_address_t>(thread_list), 78960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong sizeof(thread_t) * thread_count); 78970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return static_cast<size_t>(thread_count); 78980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 78990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return 0; 79000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 79010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 79020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 79030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 79040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 79050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongsize_t GetThreadCount() { 79060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // There's no portable way to detect the number of threads, so we just 79070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // return 0 to indicate that we cannot detect it. 79080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return 0; 79090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 79100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 79110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_MAC 79120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 79130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_USES_POSIX_RE 79140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 79150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Implements RE. Currently only needed for death tests. 79160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 79170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongRE::~RE() { 79180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (is_valid_) { 79190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // regfree'ing an invalid regex might crash because the content 79200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // of the regex is undefined. Since the regex's are essentially 79210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the same, one cannot be valid (or invalid) without the other 79220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // being so too. 79230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong regfree(&partial_regex_); 79240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong regfree(&full_regex_); 79250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 79260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong free(const_cast<char*>(pattern_)); 79270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 79280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 79290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff regular expression re matches the entire str. 79300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool RE::FullMatch(const char* str, const RE& re) { 79310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!re.is_valid_) return false; 79320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 79330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong regmatch_t match; 79340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return regexec(&re.full_regex_, str, 1, &match, 0) == 0; 79350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 79360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 79370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff regular expression re matches a substring of str 79380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (including str itself). 79390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool RE::PartialMatch(const char* str, const RE& re) { 79400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!re.is_valid_) return false; 79410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 79420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong regmatch_t match; 79430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return regexec(&re.partial_regex_, str, 1, &match, 0) == 0; 79440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 79450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 79460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Initializes an RE from its string representation. 79470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid RE::Init(const char* regex) { 79480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong pattern_ = posix::StrDup(regex); 79490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 79500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Reserves enough bytes to hold the regular expression used for a 79510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // full match. 79520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t full_regex_len = strlen(regex) + 10; 79530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char* const full_pattern = new char[full_regex_len]; 79540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 79550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong snprintf(full_pattern, full_regex_len, "^(%s)$", regex); 79560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0; 79570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We want to call regcomp(&partial_regex_, ...) even if the 79580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // previous expression returns false. Otherwise partial_regex_ may 79590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // not be properly initialized can may cause trouble when it's 79600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // freed. 79610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 79620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Some implementation of POSIX regex (e.g. on at least some 79630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // versions of Cygwin) doesn't accept the empty string as a valid 79640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // regex. We change it to an equivalent form "()" to be safe. 79650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (is_valid_) { 79660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const partial_regex = (*regex == '\0') ? "()" : regex; 79670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0; 79680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 79690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong EXPECT_TRUE(is_valid_) 79700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Regular expression \"" << regex 79710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "\" is not a valid POSIX Extended regular expression."; 79720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 79730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong delete[] full_pattern; 79740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 79750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 79760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#elif GTEST_USES_SIMPLE_RE 79770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 79780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff ch appears anywhere in str (excluding the 79790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// terminating '\0' character). 79800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool IsInSet(char ch, const char* str) { 79810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return ch != '\0' && strchr(str, ch) != NULL; 79820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 79830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 79840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff ch belongs to the given classification. Unlike 79850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// similar functions in <ctype.h>, these aren't affected by the 79860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// current locale. 79870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; } 79880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool IsAsciiPunct(char ch) { 79890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~"); 79900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 79910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool IsRepeat(char ch) { return IsInSet(ch, "?*+"); } 79920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); } 79930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool IsAsciiWordChar(char ch) { 79940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || 79950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ('0' <= ch && ch <= '9') || ch == '_'; 79960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 79970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 79980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff "\\c" is a supported escape sequence. 79990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool IsValidEscape(char c) { 80000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW")); 80010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 80020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 80030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff the given atom (specified by escaped and pattern) 80040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// matches ch. The result is undefined if the atom is invalid. 80050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool AtomMatchesChar(bool escaped, char pattern_char, char ch) { 80060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (escaped) { // "\\p" where p is pattern_char. 80070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong switch (pattern_char) { 80080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case 'd': return IsAsciiDigit(ch); 80090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case 'D': return !IsAsciiDigit(ch); 80100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case 'f': return ch == '\f'; 80110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case 'n': return ch == '\n'; 80120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case 'r': return ch == '\r'; 80130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case 's': return IsAsciiWhiteSpace(ch); 80140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case 'S': return !IsAsciiWhiteSpace(ch); 80150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case 't': return ch == '\t'; 80160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case 'v': return ch == '\v'; 80170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case 'w': return IsAsciiWordChar(ch); 80180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case 'W': return !IsAsciiWordChar(ch); 80190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 80200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return IsAsciiPunct(pattern_char) && pattern_char == ch; 80210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 80220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 80230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (pattern_char == '.' && ch != '\n') || pattern_char == ch; 80240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 80250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 80260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Helper function used by ValidateRegex() to format error messages. 80270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString FormatRegexSyntaxError(const char* regex, int index) { 80280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (Message() << "Syntax error at index " << index 80290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " in simple regular expression \"" << regex << "\": ").GetString(); 80300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 80310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 80320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Generates non-fatal failures and returns false if regex is invalid; 80330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// otherwise returns true. 80340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool ValidateRegex(const char* regex) { 80350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (regex == NULL) { 80360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TODO(wan@google.com): fix the source file location in the 80370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // assertion failures to match where the regex is used in user 80380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // code. 80390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ADD_FAILURE() << "NULL is not a valid simple regular expression."; 80400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 80410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 80420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 80430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool is_valid = true; 80440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 80450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // True iff ?, *, or + can follow the previous atom. 80460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool prev_repeatable = false; 80470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int i = 0; regex[i]; i++) { 80480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (regex[i] == '\\') { // An escape sequence 80490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong i++; 80500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (regex[i] == '\0') { 80510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1) 80520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "'\\' cannot appear at the end."; 80530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 80540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 80550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 80560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!IsValidEscape(regex[i])) { 80570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1) 80580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "invalid escape sequence \"\\" << regex[i] << "\"."; 80590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong is_valid = false; 80600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 80610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong prev_repeatable = true; 80620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { // Not an escape sequence. 80630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char ch = regex[i]; 80640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 80650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (ch == '^' && i > 0) { 80660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ADD_FAILURE() << FormatRegexSyntaxError(regex, i) 80670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "'^' can only appear at the beginning."; 80680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong is_valid = false; 80690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (ch == '$' && regex[i + 1] != '\0') { 80700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ADD_FAILURE() << FormatRegexSyntaxError(regex, i) 80710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "'$' can only appear at the end."; 80720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong is_valid = false; 80730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (IsInSet(ch, "()[]{}|")) { 80740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ADD_FAILURE() << FormatRegexSyntaxError(regex, i) 80750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "'" << ch << "' is unsupported."; 80760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong is_valid = false; 80770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (IsRepeat(ch) && !prev_repeatable) { 80780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ADD_FAILURE() << FormatRegexSyntaxError(regex, i) 80790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "'" << ch << "' can only follow a repeatable token."; 80800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong is_valid = false; 80810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 80820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 80830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong prev_repeatable = !IsInSet(ch, "^$?*+"); 80840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 80850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 80860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 80870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return is_valid; 80880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 80890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 80900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Matches a repeated regex atom followed by a valid simple regular 80910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// expression. The regex atom is defined as c if escaped is false, 80920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// or \c otherwise. repeat is the repetition meta character (?, *, 80930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// or +). The behavior is undefined if str contains too many 80940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// characters to be indexable by size_t, in which case the test will 80950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// probably time out anyway. We are fine with this limitation as 80960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// std::string has it too. 80970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool MatchRepetitionAndRegexAtHead( 80980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool escaped, char c, char repeat, const char* regex, 80990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* str) { 81000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t min_count = (repeat == '+') ? 1 : 0; 81010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t max_count = (repeat == '?') ? 1 : 81020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static_cast<size_t>(-1) - 1; 81030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We cannot call numeric_limits::max() as it conflicts with the 81040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // max() macro on Windows. 81050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 81060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t i = 0; i <= max_count; ++i) { 81070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We know that the atom matches each of the first i characters in str. 81080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (i >= min_count && MatchRegexAtHead(regex, str + i)) { 81090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We have enough matches at the head, and the tail matches too. 81100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Since we only care about *whether* the pattern matches str 81110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // (as opposed to *how* it matches), there is no need to find a 81120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // greedy match. 81130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 81140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 81150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i])) 81160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 81170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 81180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 81190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 81200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 81210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff regex matches a prefix of str. regex must be a 81220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// valid simple regular expression and not start with "^", or the 81230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// result is undefined. 81240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool MatchRegexAtHead(const char* regex, const char* str) { 81250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (*regex == '\0') // An empty regex matches a prefix of anything. 81260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 81270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 81280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // "$" only matches the end of a string. Note that regex being 81290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // valid guarantees that there's nothing after "$" in it. 81300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (*regex == '$') 81310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return *str == '\0'; 81320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 81330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Is the first thing in regex an escape sequence? 81340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool escaped = *regex == '\\'; 81350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (escaped) 81360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ++regex; 81370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (IsRepeat(regex[1])) { 81380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so 81390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // here's an indirect recursion. It terminates as the regex gets 81400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // shorter in each recursion. 81410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return MatchRepetitionAndRegexAtHead( 81420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong escaped, regex[0], regex[1], regex + 2, str); 81430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 81440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // regex isn't empty, isn't "$", and doesn't start with a 81450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // repetition. We match the first atom of regex with the first 81460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // character of str and recurse. 81470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) && 81480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MatchRegexAtHead(regex + 1, str + 1); 81490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 81500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 81510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 81520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff regex matches any substring of str. regex must be 81530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// a valid simple regular expression, or the result is undefined. 81540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 81550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The algorithm is recursive, but the recursion depth doesn't exceed 81560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the regex length, so we won't need to worry about running out of 81570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// stack space normally. In rare cases the time complexity can be 81580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// exponential with respect to the regex length + the string length, 81590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// but usually it's must faster (often close to linear). 81600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool MatchRegexAnywhere(const char* regex, const char* str) { 81610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (regex == NULL || str == NULL) 81620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 81630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 81640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (*regex == '^') 81650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return MatchRegexAtHead(regex + 1, str); 81660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 81670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // A successful match can be anywhere in str. 81680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong do { 81690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (MatchRegexAtHead(regex, str)) 81700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 81710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } while (*str++ != '\0'); 81720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 81730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 81740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 81750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Implements the RE class. 81760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 81770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongRE::~RE() { 81780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong free(const_cast<char*>(pattern_)); 81790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong free(const_cast<char*>(full_pattern_)); 81800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 81810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 81820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff regular expression re matches the entire str. 81830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool RE::FullMatch(const char* str, const RE& re) { 81840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str); 81850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 81860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 81870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff regular expression re matches a substring of str 81880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (including str itself). 81890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool RE::PartialMatch(const char* str, const RE& re) { 81900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str); 81910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 81920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 81930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Initializes an RE from its string representation. 81940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid RE::Init(const char* regex) { 81950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong pattern_ = full_pattern_ = NULL; 81960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (regex != NULL) { 81970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong pattern_ = posix::StrDup(regex); 81980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 81990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong is_valid_ = ValidateRegex(regex); 82010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!is_valid_) { 82020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // No need to calculate the full pattern when the regex is invalid. 82030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return; 82040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 82050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t len = strlen(regex); 82070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Reserves enough bytes to hold the regular expression used for a 82080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // full match: we need space to prepend a '^', append a '$', and 82090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // terminate the string with '\0'. 82100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char* buffer = static_cast<char*>(malloc(len + 3)); 82110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong full_pattern_ = buffer; 82120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (*regex != '^') 82140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *buffer++ = '^'; // Makes sure full_pattern_ starts with '^'. 82150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We don't use snprintf or strncpy, as they trigger a warning when 82170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // compiled with VC++ 8.0. 82180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong memcpy(buffer, regex, len); 82190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong buffer += len; 82200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (len == 0 || regex[len - 1] != '$') 82220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *buffer++ = '$'; // Makes sure full_pattern_ ends with '$'. 82230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *buffer = '\0'; 82250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 82260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_USES_POSIX_RE 82280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char kUnknownFile[] = "unknown file"; 82300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Formats a source file path and a line number as they would appear 82320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in an error message from the compiler used to compile this code. 82330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ ::std::string FormatFileLocation(const char* file, int line) { 82340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const file_name = file == NULL ? kUnknownFile : file; 82350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (line < 0) { 82370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return String::Format("%s:", file_name).c_str(); 82380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 82390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#ifdef _MSC_VER 82400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return String::Format("%s(%d):", file_name, line).c_str(); 82410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 82420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return String::Format("%s:%d:", file_name, line).c_str(); 82430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // _MSC_VER 82440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 82450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Formats a file location for compiler-independent XML output. 82470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Although this function is not platform dependent, we put it next to 82480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// FormatFileLocation in order to contrast the two functions. 82490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Note that FormatCompilerIndependentFileLocation() does NOT append colon 82500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// to the file location it produces, unlike FormatFileLocation(). 82510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_API_ ::std::string FormatCompilerIndependentFileLocation( 82520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* file, int line) { 82530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const file_name = file == NULL ? kUnknownFile : file; 82540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (line < 0) 82560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return file_name; 82570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong else 82580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return String::Format("%s:%d", file_name, line).c_str(); 82590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 82600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line) 82630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : severity_(severity) { 82640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const marker = 82650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong severity == GTEST_INFO ? "[ INFO ]" : 82660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong severity == GTEST_WARNING ? "[WARNING]" : 82670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong severity == GTEST_ERROR ? "[ ERROR ]" : "[ FATAL ]"; 82680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetStream() << ::std::endl << marker << " " 82690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << FormatFileLocation(file, line).c_str() << ": "; 82700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 82710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program. 82730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTestLog::~GTestLog() { 82740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetStream() << ::std::endl; 82750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (severity_ == GTEST_FATAL) { 82760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stderr); 82770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong posix::Abort(); 82780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 82790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 82800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Disable Microsoft deprecation warnings for POSIX functions called from 82810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this class (creat, dup, dup2, and close) 82820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#ifdef _MSC_VER 82830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# pragma warning(push) 82840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# pragma warning(disable: 4996) 82850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // _MSC_VER 82860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_STREAM_REDIRECTION 82880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Object that captures an output stream (stdout/stderr). 82900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass CapturedStream { 82910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 82920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The ctor redirects the stream to a temporary file. 82930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) { 82940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# if GTEST_OS_WINDOWS 82960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char temp_dir_path[MAX_PATH + 1] = { '\0' }; // NOLINT 82970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char temp_file_path[MAX_PATH + 1] = { '\0' }; // NOLINT 82980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 82990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path); 83000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const UINT success = ::GetTempFileNameA(temp_dir_path, 83010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "gtest_redir", 83020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 0, // Generate unique file name. 83030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong temp_file_path); 83040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_CHECK_(success != 0) 83050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Unable to create a temporary file in " << temp_dir_path; 83060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE); 83070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file " 83080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << temp_file_path; 83090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong filename_ = temp_file_path; 83100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# else 83110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // There's no guarantee that a test has write access to the 83120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // current directory, so we create the temporary file in the /tmp 83130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // directory instead. 83140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char name_template[] = "/tmp/captured_stream.XXXXXX"; 83150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int captured_fd = mkstemp(name_template); 83160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong filename_ = name_template; 83170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // GTEST_OS_WINDOWS 83180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(NULL); 83190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong dup2(captured_fd, fd_); 83200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong close(captured_fd); 83210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 83220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 83230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ~CapturedStream() { 83240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong remove(filename_.c_str()); 83250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 83260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 83270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String GetCapturedString() { 83280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (uncaptured_fd_ != -1) { 83290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Restores the original stream. 83300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(NULL); 83310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong dup2(uncaptured_fd_, fd_); 83320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong close(uncaptured_fd_); 83330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong uncaptured_fd_ = -1; 83340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 83350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 83360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FILE* const file = posix::FOpen(filename_.c_str(), "r"); 83370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String content = ReadEntireFile(file); 83380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong posix::FClose(file); 83390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return content; 83400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 83410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 83420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 83430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Reads the entire content of a file as a String. 83440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static String ReadEntireFile(FILE* file); 83450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 83460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns the size (in bytes) of a file. 83470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static size_t GetFileSize(FILE* file); 83480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 83490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int fd_; // A stream to capture. 83500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int uncaptured_fd_; 83510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Name of the temporary file holding the stderr output. 83520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::string filename_; 83530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 83540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream); 83550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 83560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 83570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the size (in bytes) of a file. 83580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongsize_t CapturedStream::GetFileSize(FILE* file) { 83590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fseek(file, 0, SEEK_END); 83600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return static_cast<size_t>(ftell(file)); 83610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 83620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 83630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Reads the entire content of a file as a string. 83640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString CapturedStream::ReadEntireFile(FILE* file) { 83650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t file_size = GetFileSize(file); 83660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char* const buffer = new char[file_size]; 83670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 83680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong size_t bytes_last_read = 0; // # of bytes read in the last fread() 83690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong size_t bytes_read = 0; // # of bytes read so far 83700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 83710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fseek(file, 0, SEEK_SET); 83720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 83730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Keeps reading the file until we cannot read further or the 83740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // pre-determined file size is reached. 83750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong do { 83760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file); 83770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bytes_read += bytes_last_read; 83780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } while (bytes_last_read > 0 && bytes_read < file_size); 83790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 83800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String content(buffer, bytes_read); 83810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong delete[] buffer; 83820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 83830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return content; 83840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 83850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 83860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# ifdef _MSC_VER 83870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# pragma warning(pop) 83880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# endif // _MSC_VER 83890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 83900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic CapturedStream* g_captured_stderr = NULL; 83910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic CapturedStream* g_captured_stdout = NULL; 83920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 83930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Starts capturing an output stream (stdout/stderr). 83940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid CaptureStream(int fd, const char* stream_name, CapturedStream** stream) { 83950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (*stream != NULL) { 83960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_LOG_(FATAL) << "Only one " << stream_name 83970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " capturer can exist at a time."; 83980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 83990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *stream = new CapturedStream(fd); 84000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 84010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Stops capturing the output stream and returns the captured string. 84030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString GetCapturedStream(CapturedStream** captured_stream) { 84040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String content = (*captured_stream)->GetCapturedString(); 84050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong delete *captured_stream; 84070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *captured_stream = NULL; 84080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return content; 84100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 84110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Starts capturing stdout. 84130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid CaptureStdout() { 84140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout); 84150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 84160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Starts capturing stderr. 84180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid CaptureStderr() { 84190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr); 84200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 84210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Stops capturing stdout and returns the captured string. 84230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString GetCapturedStdout() { return GetCapturedStream(&g_captured_stdout); } 84240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Stops capturing stderr and returns the captured string. 84260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongString GetCapturedStderr() { return GetCapturedStream(&g_captured_stderr); } 84270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_STREAM_REDIRECTION 84290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_DEATH_TEST 84310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A copy of all command line arguments. Set by InitGoogleTest(). 84330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong::std::vector<String> g_argvs; 84340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the command line as a vector of strings. 84360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst ::std::vector<String>& GetArgvs() { return g_argvs; } 84370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_DEATH_TEST 84390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS_MOBILE 84410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace posix { 84420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Abort() { 84430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DebugBreak(); 84440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TerminateProcess(GetCurrentProcess(), 1); 84450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 84460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace posix 84470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS_MOBILE 84480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the name of the environment variable corresponding to the 84500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// given flag. For example, FlagToEnvVar("foo") will return 84510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "GTEST_FOO" in the open-source version. 84520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic String FlagToEnvVar(const char* flag) { 84530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String full_flag = 84540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (Message() << GTEST_FLAG_PREFIX_ << flag).GetString(); 84550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message env_var; 84570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t i = 0; i != full_flag.length(); i++) { 84580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong env_var << ToUpper(full_flag.c_str()[i]); 84590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 84600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return env_var.GetString(); 84620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 84630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Parses 'str' for a 32-bit signed integer. If successful, writes 84650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the result to *value and returns true; otherwise leaves *value 84660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// unchanged and returns false. 84670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool ParseInt32(const Message& src_text, const char* str, Int32* value) { 84680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Parses the environment variable as a decimal integer. 84690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char* end = NULL; 84700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const long long_value = strtol(str, &end, 10); // NOLINT 84710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Has strtol() consumed all characters in the string? 84730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (*end != '\0') { 84740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // No - an invalid character was encountered. 84750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message msg; 84760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << "WARNING: " << src_text 84770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " is expected to be a 32-bit integer, but actually" 84780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " has value \"" << str << "\".\n"; 84790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("%s", msg.GetString().c_str()); 84800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 84810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 84820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 84830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 84840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Is the parsed value in the range of an Int32? 84850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const Int32 result = static_cast<Int32>(long_value); 84860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (long_value == LONG_MAX || long_value == LONG_MIN || 84870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The parsed value overflows as a long. (strtol() returns 84880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // LONG_MAX or LONG_MIN when the input overflows.) 84890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result != long_value 84900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The parsed value overflows as an Int32. 84910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ) { 84920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message msg; 84930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong msg << "WARNING: " << src_text 84940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " is expected to be a 32-bit integer, but actually" 84950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " has value " << str << ", which overflows.\n"; 84960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("%s", msg.GetString().c_str()); 84970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 84980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 84990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 85000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 85010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *value = result; 85020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 85030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 85040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 85050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Reads and returns the Boolean environment variable corresponding to 85060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the given flag; if it's not set, returns default_value. 85070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 85080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The value is considered true iff it's not "0". 85090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool BoolFromGTestEnv(const char* flag, bool default_value) { 85100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String env_var = FlagToEnvVar(flag); 85110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const string_value = posix::GetEnv(env_var.c_str()); 85120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return string_value == NULL ? 85130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default_value : strcmp(string_value, "0") != 0; 85140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 85150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 85160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Reads and returns a 32-bit integer stored in the environment 85170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// variable corresponding to the given flag; if it isn't set or 85180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// doesn't represent a valid 32-bit integer, returns default_value. 85190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongInt32 Int32FromGTestEnv(const char* flag, Int32 default_value) { 85200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String env_var = FlagToEnvVar(flag); 85210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const string_value = posix::GetEnv(env_var.c_str()); 85220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (string_value == NULL) { 85230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The environment variable is not set. 85240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return default_value; 85250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 85260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 85270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Int32 result = default_value; 85280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!ParseInt32(Message() << "Environment variable " << env_var, 85290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong string_value, &result)) { 85300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("The default value %s is used.\n", 85310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (Message() << default_value).GetString().c_str()); 85320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stdout); 85330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return default_value; 85340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 85350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 85360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return result; 85370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 85380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 85390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Reads and returns the string environment variable corresponding to 85400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the given flag; if it's not set, returns default_value. 85410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char* StringFromGTestEnv(const char* flag, const char* default_value) { 85420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String env_var = FlagToEnvVar(flag); 85430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const value = posix::GetEnv(env_var.c_str()); 85440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return value == NULL ? default_value : value; 85450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 85460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 85470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 85480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace testing 85490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2007, Google Inc. 85500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// All rights reserved. 85510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 85520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without 85530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are 85540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// met: 85550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 85560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright 85570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// notice, this list of conditions and the following disclaimer. 85580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above 85590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// copyright notice, this list of conditions and the following disclaimer 85600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the documentation and/or other materials provided with the 85610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// distribution. 85620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its 85630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// contributors may be used to endorse or promote products derived from 85640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this software without specific prior written permission. 85650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 85660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 85670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 85680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 85690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 85700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 85710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 85720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 85730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 85740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 85750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 85760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 85770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 85780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Author: wan@google.com (Zhanyong Wan) 85790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 85800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Google Test - The Google C++ Testing Framework 85810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 85820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This file implements a universal value printer that can print a 85830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// value of any type T: 85840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 85850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr); 85860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 85870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// It uses the << operator when possible, and prints the bytes in the 85880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// object otherwise. A user can override its behavior for a class 85890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// type Foo by defining either operator<<(::std::ostream&, const Foo&) 85900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// or void PrintTo(const Foo&, ::std::ostream*) in the namespace that 85910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// defines Foo. 85920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 85930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <ctype.h> 85940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <stdio.h> 85950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <ostream> // NOLINT 85960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <string> 85970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 85980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace testing { 85990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 86000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace { 86010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 86020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongusing ::std::ostream; 86030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 86040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_WINDOWS_MOBILE // Windows CE does not define _snprintf_s. 86050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# define snprintf _snprintf 86060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#elif _MSC_VER >= 1400 // VC 8.0 and later deprecate snprintf and _snprintf. 86070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# define snprintf _snprintf_s 86080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#elif _MSC_VER 86090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# define snprintf _snprintf 86100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_OS_WINDOWS_MOBILE 86110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 86120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints a segment of bytes in the given object. 86130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start, 86140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong size_t count, ostream* os) { 86150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char text[5] = ""; 86160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t i = 0; i != count; i++) { 86170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t j = start + i; 86180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (i != 0) { 86190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Organizes the bytes into groups of 2 for easy parsing by 86200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // human. 86210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if ((j % 2) == 0) 86220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << ' '; 86230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong else 86240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << '-'; 86250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 86260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong snprintf(text, sizeof(text), "%02X", obj_bytes[j]); 86270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << text; 86280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 86290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 86300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 86310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints the bytes in the given value to the given ostream. 86320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count, 86330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ostream* os) { 86340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Tells the user how big the object is. 86350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << count << "-byte object <"; 86360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 86370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t kThreshold = 132; 86380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t kChunkSize = 64; 86390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If the object size is bigger than kThreshold, we'll have to omit 86400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // some details by printing only the first and the last kChunkSize 86410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // bytes. 86420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TODO(wan): let the user control the threshold using a flag. 86430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (count < kThreshold) { 86440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintByteSegmentInObjectTo(obj_bytes, 0, count, os); 86450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 86460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os); 86470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << " ... "; 86480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Rounds up to 2-byte boundary. 86490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t resume_pos = (count - kChunkSize + 1)/2*2; 86500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os); 86510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 86520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << ">"; 86530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 86540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 86550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace 86560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 86570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal2 { 86580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 86590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Delegates to PrintBytesInObjectToImpl() to print the bytes in the 86600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// given object. The delegation simplifies the implementation, which 86610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// uses the << operator and thus is easier done outside of the 86620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// ::testing::internal namespace, which contains a << operator that 86630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// sometimes conflicts with the one in STL. 86640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count, 86650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ostream* os) { 86660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintBytesInObjectToImpl(obj_bytes, count, os); 86670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 86680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 86690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal2 86700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 86710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 86720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 86730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Depending on the value of a char (or wchar_t), we print it in one 86740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// of three formats: 86750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// - as is if it's a printable ASCII (e.g. 'a', '2', ' '), 86760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// - as a hexidecimal escape sequence (e.g. '\x7F'), or 86770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// - as a special escape sequence (e.g. '\r', '\n'). 86780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongenum CharFormat { 86790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong kAsIs, 86800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong kHexEscape, 86810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong kSpecialEscape 86820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 86830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 86840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true if c is a printable ASCII character. We test the 86850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// value of c directly instead of calling isprint(), which is buggy on 86860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Windows Mobile. 86870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Konginline bool IsPrintableAscii(wchar_t c) { 86880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return 0x20 <= c && c <= 0x7E; 86890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 86900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 86910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints a wide or narrow char c as a character literal without the 86920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// quotes, escaping it when necessary; returns how c was formatted. 86930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The template argument UnsignedChar is the unsigned version of Char, 86940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// which is the type of c. 86950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate <typename UnsignedChar, typename Char> 86960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic CharFormat PrintAsCharLiteralTo(Char c, ostream* os) { 86970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong switch (static_cast<wchar_t>(c)) { 86980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case L'\0': 86990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "\\0"; 87000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 87010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case L'\'': 87020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "\\'"; 87030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 87040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case L'\\': 87050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "\\\\"; 87060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 87070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case L'\a': 87080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "\\a"; 87090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 87100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case L'\b': 87110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "\\b"; 87120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 87130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case L'\f': 87140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "\\f"; 87150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 87160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case L'\n': 87170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "\\n"; 87180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 87190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case L'\r': 87200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "\\r"; 87210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 87220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case L'\t': 87230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "\\t"; 87240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 87250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case L'\v': 87260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "\\v"; 87270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 87280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default: 87290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (IsPrintableAscii(c)) { 87300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << static_cast<char>(c); 87310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return kAsIs; 87320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 87330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << String::Format("\\x%X", static_cast<UnsignedChar>(c)); 87340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return kHexEscape; 87350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 87360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 87370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return kSpecialEscape; 87380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 87390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 87400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints a char c as if it's part of a string literal, escaping it when 87410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// necessary; returns how c was formatted. 87420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic CharFormat PrintAsWideStringLiteralTo(wchar_t c, ostream* os) { 87430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong switch (c) { 87440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case L'\'': 87450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "'"; 87460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return kAsIs; 87470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case L'"': 87480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "\\\""; 87490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return kSpecialEscape; 87500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default: 87510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return PrintAsCharLiteralTo<wchar_t>(c, os); 87520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 87530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 87540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 87550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints a char c as if it's part of a string literal, escaping it when 87560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// necessary; returns how c was formatted. 87570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic CharFormat PrintAsNarrowStringLiteralTo(char c, ostream* os) { 87580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return PrintAsWideStringLiteralTo(static_cast<unsigned char>(c), os); 87590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 87600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 87610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints a wide or narrow character c and its code. '\0' is printed 87620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// as "'\\0'", other unprintable characters are also properly escaped 87630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// using the standard C++ escape sequence. The template argument 87640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// UnsignedChar is the unsigned version of Char, which is the type of c. 87650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate <typename UnsignedChar, typename Char> 87660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrintCharAndCodeTo(Char c, ostream* os) { 87670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // First, print c as a literal in the most readable form we can find. 87680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << ((sizeof(c) > 1) ? "L'" : "'"); 87690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os); 87700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "'"; 87710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 87720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // To aid user debugging, we also print c's code in decimal, unless 87730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // it's 0 (in which case c was printed as '\\0', making the code 87740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // obvious). 87750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (c == 0) 87760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return; 87770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << " (" << String::Format("%d", c).c_str(); 87780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 87790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // For more convenience, we print c's code again in hexidecimal, 87800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // unless c was already printed in the form '\x##' or the code is in 87810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // [1, 9]. 87820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (format == kHexEscape || (1 <= c && c <= 9)) { 87830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Do nothing. 87840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 87850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << String::Format(", 0x%X", 87860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static_cast<UnsignedChar>(c)).c_str(); 87870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 87880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << ")"; 87890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 87900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 87910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrintTo(unsigned char c, ::std::ostream* os) { 87920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintCharAndCodeTo<unsigned char>(c, os); 87930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 87940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrintTo(signed char c, ::std::ostream* os) { 87950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintCharAndCodeTo<unsigned char>(c, os); 87960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 87970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 87980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints a wchar_t as a symbol if it is printable or as its internal 87990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// code otherwise and also as its code. L'\0' is printed as "L'\\0'". 88000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrintTo(wchar_t wc, ostream* os) { 88010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintCharAndCodeTo<wchar_t>(wc, os); 88020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 88030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 88040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints the given array of characters to the ostream. 88050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The array starts at *begin, the length is len, it may include '\0' characters 88060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// and may not be null-terminated. 88070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic void PrintCharsAsStringTo(const char* begin, size_t len, ostream* os) { 88080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "\""; 88090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool is_previous_hex = false; 88100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t index = 0; index < len; ++index) { 88110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char cur = begin[index]; 88120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (is_previous_hex && IsXDigit(cur)) { 88130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Previous character is of '\x..' form and this character can be 88140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // interpreted as another hexadecimal digit in its number. Break string to 88150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // disambiguate. 88160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "\" \""; 88170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 88180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong is_previous_hex = PrintAsNarrowStringLiteralTo(cur, os) == kHexEscape; 88190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 88200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "\""; 88210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 88220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 88230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints a (const) char array of 'len' elements, starting at address 'begin'. 88240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid UniversalPrintArray(const char* begin, size_t len, ostream* os) { 88250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintCharsAsStringTo(begin, len, os); 88260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 88270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 88280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints the given array of wide characters to the ostream. 88290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The array starts at *begin, the length is len, it may include L'\0' 88300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// characters and may not be null-terminated. 88310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic void PrintWideCharsAsStringTo(const wchar_t* begin, size_t len, 88320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ostream* os) { 88330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "L\""; 88340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool is_previous_hex = false; 88350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t index = 0; index < len; ++index) { 88360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const wchar_t cur = begin[index]; 88370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (is_previous_hex && isascii(cur) && IsXDigit(static_cast<char>(cur))) { 88380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Previous character is of '\x..' form and this character can be 88390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // interpreted as another hexadecimal digit in its number. Break string to 88400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // disambiguate. 88410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "\" L\""; 88420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 88430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong is_previous_hex = PrintAsWideStringLiteralTo(cur, os) == kHexEscape; 88440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 88450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "\""; 88460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 88470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 88480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints the given C string to the ostream. 88490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrintTo(const char* s, ostream* os) { 88500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (s == NULL) { 88510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "NULL"; 88520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 88530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << ImplicitCast_<const void*>(s) << " pointing to "; 88540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintCharsAsStringTo(s, strlen(s), os); 88550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 88560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 88570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 88580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// MSVC compiler can be configured to define whar_t as a typedef 88590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// of unsigned short. Defining an overload for const wchar_t* in that case 88600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// would cause pointers to unsigned shorts be printed as wide strings, 88610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// possibly accessing more memory than intended and causing invalid 88620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when 88630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// wchar_t is implemented as a native type. 88640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) 88650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints the given wide C string to the ostream. 88660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrintTo(const wchar_t* s, ostream* os) { 88670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (s == NULL) { 88680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "NULL"; 88690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 88700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << ImplicitCast_<const void*>(s) << " pointing to "; 88710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintWideCharsAsStringTo(s, wcslen(s), os); 88720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 88730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 88740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // wchar_t is native 88750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 88760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints a ::string object. 88770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_GLOBAL_STRING 88780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrintStringTo(const ::string& s, ostream* os) { 88790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintCharsAsStringTo(s.data(), s.size(), os); 88800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 88810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_GLOBAL_STRING 88820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 88830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrintStringTo(const ::std::string& s, ostream* os) { 88840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintCharsAsStringTo(s.data(), s.size(), os); 88850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 88860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 88870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints a ::wstring object. 88880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_GLOBAL_WSTRING 88890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrintWideStringTo(const ::wstring& s, ostream* os) { 88900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintWideCharsAsStringTo(s.data(), s.size(), os); 88910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 88920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_GLOBAL_WSTRING 88930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 88940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_STD_WSTRING 88950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid PrintWideStringTo(const ::std::wstring& s, ostream* os) { 88960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong PrintWideCharsAsStringTo(s.data(), s.size(), os); 88970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 88980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_STD_WSTRING 88990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 89000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 89010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 89020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace testing 89030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2008, Google Inc. 89040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// All rights reserved. 89050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 89060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without 89070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are 89080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// met: 89090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 89100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright 89110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// notice, this list of conditions and the following disclaimer. 89120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above 89130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// copyright notice, this list of conditions and the following disclaimer 89140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the documentation and/or other materials provided with the 89150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// distribution. 89160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its 89170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// contributors may be used to endorse or promote products derived from 89180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this software without specific prior written permission. 89190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 89200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 89210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 89220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 89230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 89240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 89250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 89260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 89270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 89280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 89290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 89300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 89310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 89320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Author: mheule@google.com (Markus Heule) 89330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 89340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The Google C++ Testing Framework (Google Test) 89350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 89360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 89370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Indicates that this translation unit is part of Google Test's 89380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// implementation. It must come before gtest-internal-inl.h is 89390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// included, or there will be a compiler error. This trick is to 89400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// prevent a user from accidentally including gtest-internal-inl.h in 89410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// his code. 89420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define GTEST_IMPLEMENTATION_ 1 89430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#undef GTEST_IMPLEMENTATION_ 89440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 89450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace testing { 89460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 89470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongusing internal::GetUnitTestImpl; 89480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 89490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Gets the summary of the failure message by omitting the stack trace 89500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in it. 89510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Konginternal::String TestPartResult::ExtractSummary(const char* message) { 89520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const stack_trace = strstr(message, internal::kStackTraceMarker); 89530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return stack_trace == NULL ? internal::String(message) : 89540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::String(message, stack_trace - message); 89550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 89560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 89570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints a TestPartResult object. 89580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstd::ostream& operator<<(std::ostream& os, const TestPartResult& result) { 89590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return os 89600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << result.file_name() << ":" << result.line_number() << ": " 89610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << (result.type() == TestPartResult::kSuccess ? "Success" : 89620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result.type() == TestPartResult::kFatalFailure ? "Fatal failure" : 89630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Non-fatal failure") << ":\n" 89640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << result.message() << std::endl; 89650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 89660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 89670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Appends a TestPartResult to the array. 89680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid TestPartResultArray::Append(const TestPartResult& result) { 89690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong array_.push_back(result); 89700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 89710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 89720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the TestPartResult at the given index (0-based). 89730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst TestPartResult& TestPartResultArray::GetTestPartResult(int index) const { 89740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (index < 0 || index >= size()) { 89750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong printf("\nInvalid index (%d) into TestPartResultArray.\n", index); 89760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::posix::Abort(); 89770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 89780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 89790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return array_[index]; 89800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 89810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 89820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the number of TestPartResult objects in the array. 89830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongint TestPartResultArray::size() const { 89840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return static_cast<int>(array_.size()); 89850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 89860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 89870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 89880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 89890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongHasNewFatalFailureHelper::HasNewFatalFailureHelper() 89900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : has_new_fatal_failure_(false), 89910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong original_reporter_(GetUnitTestImpl()-> 89920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetTestPartResultReporterForCurrentThread()) { 89930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this); 89940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 89950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 89960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongHasNewFatalFailureHelper::~HasNewFatalFailureHelper() { 89970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread( 89980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong original_reporter_); 89990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 90000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 90010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid HasNewFatalFailureHelper::ReportTestPartResult( 90020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestPartResult& result) { 90030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (result.fatally_failed()) 90040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong has_new_fatal_failure_ = true; 90050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong original_reporter_->ReportTestPartResult(result); 90060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 90070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 90080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 90090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 90100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace testing 90110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2008 Google Inc. 90120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// All Rights Reserved. 90130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 90140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without 90150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are 90160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// met: 90170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 90180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright 90190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// notice, this list of conditions and the following disclaimer. 90200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above 90210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// copyright notice, this list of conditions and the following disclaimer 90220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the documentation and/or other materials provided with the 90230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// distribution. 90240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its 90250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// contributors may be used to endorse or promote products derived from 90260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this software without specific prior written permission. 90270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 90280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 90290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 90300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 90310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 90320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 90330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 90340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 90350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 90360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 90370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 90380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 90390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 90400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Author: wan@google.com (Zhanyong Wan) 90410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 90420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 90430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace testing { 90440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 90450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 90460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_HAS_TYPED_TEST_P 90470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 90480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Skips to the first non-space char in str. Returns an empty string if str 90490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// contains only whitespace characters. 90500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic const char* SkipSpaces(const char* str) { 90510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong while (IsSpace(*str)) 90520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong str++; 90530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return str; 90540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 90550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 90560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Verifies that registered_tests match the test names in 90570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// defined_test_names_; returns registered_tests if successful, or 90580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// aborts the program otherwise. 90590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char* TypedTestCasePState::VerifyRegisteredTestNames( 90600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* file, int line, const char* registered_tests) { 90610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong typedef ::std::set<const char*>::const_iterator DefinedTestIter; 90620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong registered_ = true; 90630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 90640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Skip initial whitespace in registered_tests since some 90650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // preprocessors prefix stringizied literals with whitespace. 90660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong registered_tests = SkipSpaces(registered_tests); 90670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 90680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Message errors; 90690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::set<String> tests; 90700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (const char* names = registered_tests; names != NULL; 90710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong names = SkipComma(names)) { 90720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String name = GetPrefixUntilComma(names); 90730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (tests.count(name) != 0) { 90740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong errors << "Test " << name << " is listed more than once.\n"; 90750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong continue; 90760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 90770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 90780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool found = false; 90790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (DefinedTestIter it = defined_test_names_.begin(); 90800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong it != defined_test_names_.end(); 90810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ++it) { 90820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (name == *it) { 90830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong found = true; 90840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 90850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 90860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 90870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 90880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (found) { 90890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong tests.insert(name); 90900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 90910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong errors << "No test named " << name 90920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " can be found in this test case.\n"; 90930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 90940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 90950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 90960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (DefinedTestIter it = defined_test_names_.begin(); 90970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong it != defined_test_names_.end(); 90980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ++it) { 90990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (tests.count(*it) == 0) { 91000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong errors << "You forgot to list test " << *it << ".\n"; 91010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 91020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 91030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 91040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String& errors_str = errors.GetString(); 91050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (errors_str != "") { 91060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(), 91070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong errors_str.c_str()); 91080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong fflush(stderr); 91090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong posix::Abort(); 91100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 91110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 91120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return registered_tests; 91130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 91140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 91150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // GTEST_HAS_TYPED_TEST_P 91160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 91170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 91180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace testing 91190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2008, Google Inc. 91200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// All rights reserved. 91210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 91220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without 91230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are 91240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// met: 91250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 91260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright 91270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// notice, this list of conditions and the following disclaimer. 91280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above 91290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// copyright notice, this list of conditions and the following disclaimer 91300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the documentation and/or other materials provided with the 91310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// distribution. 91320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its 91330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// contributors may be used to endorse or promote products derived from 91340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this software without specific prior written permission. 91350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 91360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 91370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 91380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 91390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 91400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 91410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 91420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 91430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 91440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 91450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 91460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 91470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 91480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Author: wan@google.com (Zhanyong Wan) 91490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 91500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Google C++ Mocking Framework (Google Mock) 91510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 91520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This file #includes all Google Mock implementation .cc files. The 91530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// purpose is to allow a user to build Google Mock by compiling this 91540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// file alone. 91550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 91560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This line ensures that gmock.h can be compiled on its own, even 91570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// when it's fused. 91580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "gmock/gmock.h" 91590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 91600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The following lines pull in the real gmock *.cc files. 91610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2007, Google Inc. 91620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// All rights reserved. 91630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 91640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without 91650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are 91660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// met: 91670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 91680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright 91690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// notice, this list of conditions and the following disclaimer. 91700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above 91710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// copyright notice, this list of conditions and the following disclaimer 91720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the documentation and/or other materials provided with the 91730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// distribution. 91740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its 91750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// contributors may be used to endorse or promote products derived from 91760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this software without specific prior written permission. 91770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 91780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 91790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 91800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 91810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 91820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 91830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 91840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 91850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 91860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 91870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 91880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 91890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 91900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Author: wan@google.com (Zhanyong Wan) 91910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 91920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Google Mock - a framework for writing C++ mock classes. 91930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 91940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This file implements cardinalities. 91950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 91960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 91970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <limits.h> 91980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <ostream> // NOLINT 91990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <sstream> 92000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <string> 92010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 92020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace testing { 92030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 92040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace { 92050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 92060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Implements the Between(m, n) cardinality. 92070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass BetweenCardinalityImpl : public CardinalityInterface { 92080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 92090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong BetweenCardinalityImpl(int min, int max) 92100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : min_(min >= 0 ? min : 0), 92110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong max_(max >= min_ ? max : min_) { 92120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::stringstream ss; 92130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (min < 0) { 92140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ss << "The invocation lower bound must be >= 0, " 92150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "but is actually " << min << "."; 92160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::Expect(false, __FILE__, __LINE__, ss.str()); 92170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (max < 0) { 92180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ss << "The invocation upper bound must be >= 0, " 92190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "but is actually " << max << "."; 92200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::Expect(false, __FILE__, __LINE__, ss.str()); 92210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (min > max) { 92220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ss << "The invocation upper bound (" << max 92230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << ") must be >= the invocation lower bound (" << min 92240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << ")."; 92250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::Expect(false, __FILE__, __LINE__, ss.str()); 92260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 92270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 92280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 92290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Conservative estimate on the lower/upper bound of the number of 92300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // calls allowed. 92310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual int ConservativeLowerBound() const { return min_; } 92320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual int ConservativeUpperBound() const { return max_; } 92330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 92340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual bool IsSatisfiedByCallCount(int call_count) const { 92350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return min_ <= call_count && call_count <= max_ ; 92360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 92370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 92380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual bool IsSaturatedByCallCount(int call_count) const { 92390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return call_count >= max_; 92400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 92410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 92420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void DescribeTo(::std::ostream* os) const; 92430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 92440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int min_; 92450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int max_; 92460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 92470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GTEST_DISALLOW_COPY_AND_ASSIGN_(BetweenCardinalityImpl); 92480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 92490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 92500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Formats "n times" in a human-friendly way. 92510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Konginline internal::string FormatTimes(int n) { 92520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (n == 1) { 92530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return "once"; 92540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (n == 2) { 92550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return "twice"; 92560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 92570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::stringstream ss; 92580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ss << n << " times"; 92590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return ss.str(); 92600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 92610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 92620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 92630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Describes the Between(m, n) cardinality in human-friendly text. 92640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid BetweenCardinalityImpl::DescribeTo(::std::ostream* os) const { 92650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (min_ == 0) { 92660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (max_ == 0) { 92670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "never called"; 92680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (max_ == INT_MAX) { 92690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "called any number of times"; 92700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 92710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "called at most " << FormatTimes(max_); 92720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 92730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (min_ == max_) { 92740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "called " << FormatTimes(min_); 92750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (max_ == INT_MAX) { 92760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "called at least " << FormatTimes(min_); 92770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 92780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // 0 < min_ < max_ < INT_MAX 92790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "called between " << min_ << " and " << max_ << " times"; 92800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 92810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 92820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 92830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // Unnamed namespace 92840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 92850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Describes the given call count to an ostream. 92860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Cardinality::DescribeActualCallCountTo(int actual_call_count, 92870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::ostream* os) { 92880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (actual_call_count > 0) { 92890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "called " << FormatTimes(actual_call_count); 92900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 92910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "never called"; 92920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 92930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 92940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 92950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates a cardinality that allows at least n calls. 92960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongCardinality AtLeast(int n) { return Between(n, INT_MAX); } 92970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 92980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates a cardinality that allows at most n calls. 92990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongCardinality AtMost(int n) { return Between(0, n); } 93000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 93010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates a cardinality that allows any number of calls. 93020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongCardinality AnyNumber() { return AtLeast(0); } 93030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 93040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates a cardinality that allows between min and max calls. 93050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongCardinality Between(int min, int max) { 93060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return Cardinality(new BetweenCardinalityImpl(min, max)); 93070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 93080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 93090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates a cardinality that allows exactly n calls. 93100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongCardinality Exactly(int n) { return Between(n, n); } 93110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 93120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace testing 93130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2007, Google Inc. 93140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// All rights reserved. 93150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 93160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without 93170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are 93180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// met: 93190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 93200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright 93210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// notice, this list of conditions and the following disclaimer. 93220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above 93230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// copyright notice, this list of conditions and the following disclaimer 93240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the documentation and/or other materials provided with the 93250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// distribution. 93260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its 93270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// contributors may be used to endorse or promote products derived from 93280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this software without specific prior written permission. 93290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 93300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 93310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 93320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 93330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 93340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 93350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 93360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 93370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 93380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 93390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 93400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 93410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 93420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Author: wan@google.com (Zhanyong Wan) 93430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 93440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Google Mock - a framework for writing C++ mock classes. 93450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 93460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This file defines some utilities useful for implementing Google 93470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Mock. They are subject to change without notice, so please DO NOT 93480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// USE THEM IN USER CODE. 93490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 93500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 93510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <ctype.h> 93520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <ostream> // NOLINT 93530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <string> 93540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 93550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace testing { 93560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 93570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 93580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Converts an identifier name to a space-separated list of lower-case 93590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// words. Each maximum substring of the form [A-Za-z][a-z]*|\d+ is 93600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// treated as one word. For example, both "FooBar123" and 93610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "foo_bar_123" are converted to "foo bar 123". 93620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstring ConvertIdentifierNameToWords(const char* id_name) { 93630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong string result; 93640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong char prev_char = '\0'; 93650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (const char* p = id_name; *p != '\0'; prev_char = *(p++)) { 93660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We don't care about the current locale as the input is 93670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // guaranteed to be a valid C++ identifier name. 93680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool starts_new_word = IsUpper(*p) || 93690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (!IsAlpha(prev_char) && IsLower(*p)) || 93700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (!IsDigit(prev_char) && IsDigit(*p)); 93710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 93720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (IsAlNum(*p)) { 93730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (starts_new_word && result != "") 93740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result += ' '; 93750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result += ToLower(*p); 93760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 93770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 93780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return result; 93790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 93800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 93810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This class reports Google Mock failures as Google Test failures. A 93820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// user can define another class in a similar fashion if he intends to 93830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// use Google Mock with a testing framework other than Google Test. 93840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass GoogleTestFailureReporter : public FailureReporterInterface { 93850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 93860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual void ReportFailure(FailureType type, const char* file, int line, 93870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const string& message) { 93880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong AssertHelper(type == FATAL ? 93890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResult::kFatalFailure : 93900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong TestPartResult::kNonFatalFailure, 93910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong file, 93920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong line, 93930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong message.c_str()) = Message(); 93940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (type == FATAL) { 93950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong posix::Abort(); 93960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 93970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 93980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 93990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 94000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the global failure reporter. Will create a 94010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// GoogleTestFailureReporter and return it the first time called. 94020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongFailureReporterInterface* GetFailureReporter() { 94030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Points to the global failure reporter used by Google Mock. gcc 94040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // guarantees that the following use of failure_reporter is 94050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // thread-safe. We may need to add additional synchronization to 94060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // protect failure_reporter if we port Google Mock to other 94070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // compilers. 94080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static FailureReporterInterface* const failure_reporter = 94090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong new GoogleTestFailureReporter(); 94100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return failure_reporter; 94110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 94120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 94130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Protects global resources (stdout in particular) used by Log(). 94140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic GTEST_DEFINE_STATIC_MUTEX_(g_log_mutex); 94150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 94160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff a log with the given severity is visible according 94170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// to the --gmock_verbose flag. 94180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool LogIsVisible(LogSeverity severity) { 94190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (GMOCK_FLAG(verbose) == kInfoVerbosity) { 94200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Always show the log if --gmock_verbose=info. 94210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 94220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (GMOCK_FLAG(verbose) == kErrorVerbosity) { 94230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Always hide it if --gmock_verbose=error. 94240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 94250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 94260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If --gmock_verbose is neither "info" nor "error", we treat it 94270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // as "warning" (its default value). 94280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return severity == WARNING; 94290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 94300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 94310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 94320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Prints the given message to stdout iff 'severity' >= the level 94330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// specified by the --gmock_verbose flag. If stack_frames_to_skip >= 94340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 0, also prints the stack trace excluding the top 94350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// stack_frames_to_skip frames. In opt mode, any positive 94360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// stack_frames_to_skip is treated as 0, since we don't know which 94370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// function calls will be inlined by the compiler and need to be 94380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// conservative. 94390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Log(LogSeverity severity, const string& message, 94400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int stack_frames_to_skip) { 94410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!LogIsVisible(severity)) 94420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return; 94430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 94440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Ensures that logs from different threads don't interleave. 94450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MutexLock l(&g_log_mutex); 94460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 94470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // "using ::std::cout;" doesn't work with Symbian's STLport, where cout is a 94480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // macro. 94490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 94500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (severity == WARNING) { 94510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Prints a GMOCK WARNING marker to make the warnings easily searchable. 94520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::cout << "\nGMOCK WARNING:"; 94530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 94540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Pre-pends a new-line to message if it doesn't start with one. 94550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (message.empty() || message[0] != '\n') { 94560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::cout << "\n"; 94570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 94580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::cout << message; 94590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (stack_frames_to_skip >= 0) { 94600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#ifdef NDEBUG 94610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // In opt mode, we have to be conservative and skip no stack frame. 94620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int actual_to_skip = 0; 94630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#else 94640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // In dbg mode, we can do what the caller tell us to do (plus one 94650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // for skipping this function's stack frame). 94660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int actual_to_skip = stack_frames_to_skip + 1; 94670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif // NDEBUG 94680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 94690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Appends a new-line to message if it doesn't end with one. 94700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!message.empty() && *message.rbegin() != '\n') { 94710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::cout << "\n"; 94720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 94730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::cout << "Stack trace:\n" 94740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << ::testing::internal::GetCurrentOsStackTraceExceptTop( 94750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::testing::UnitTest::GetInstance(), actual_to_skip); 94760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 94770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::cout << ::std::flush; 94780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 94790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 94800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 94810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace testing 94820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2007, Google Inc. 94830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// All rights reserved. 94840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 94850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without 94860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are 94870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// met: 94880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 94890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright 94900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// notice, this list of conditions and the following disclaimer. 94910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above 94920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// copyright notice, this list of conditions and the following disclaimer 94930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the documentation and/or other materials provided with the 94940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// distribution. 94950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its 94960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// contributors may be used to endorse or promote products derived from 94970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this software without specific prior written permission. 94980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 94990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 95000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 95010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 95020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 95030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 95040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 95050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 95060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 95070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 95080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 95090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 95100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 95110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Author: wan@google.com (Zhanyong Wan) 95120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 95130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Google Mock - a framework for writing C++ mock classes. 95140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 95150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This file implements Matcher<const string&>, Matcher<string>, and 95160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// utilities for defining matchers. 95170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 95180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 95190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <string.h> 95200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <sstream> 95210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <string> 95220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 95230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace testing { 95240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 95250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Constructs a matcher that matches a const string& whose value is 95260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// equal to s. 95270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongMatcher<const internal::string&>::Matcher(const internal::string& s) { 95280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *this = Eq(s); 95290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 95300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 95310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Constructs a matcher that matches a const string& whose value is 95320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// equal to s. 95330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongMatcher<const internal::string&>::Matcher(const char* s) { 95340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *this = Eq(internal::string(s)); 95350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 95360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 95370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Constructs a matcher that matches a string whose value is equal to s. 95380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongMatcher<internal::string>::Matcher(const internal::string& s) { *this = Eq(s); } 95390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 95400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Constructs a matcher that matches a string whose value is equal to s. 95410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongMatcher<internal::string>::Matcher(const char* s) { 95420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *this = Eq(internal::string(s)); 95430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 95440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 95450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 95460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 95470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Joins a vector of strings as if they are fields of a tuple; returns 95480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the joined string. 95490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstring JoinAsTuple(const Strings& fields) { 95500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong switch (fields.size()) { 95510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case 0: 95520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return ""; 95530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case 1: 95540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return fields[0]; 95550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default: 95560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong string result = "(" + fields[0]; 95570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (size_t i = 1; i < fields.size(); i++) { 95580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result += ", "; 95590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result += fields[i]; 95600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 95610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result += ")"; 95620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return result; 95630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 95640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 95650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 95660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the description for a matcher defined using the MATCHER*() 95670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// macro where the user-supplied description string is "", if 95680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 'negation' is false; otherwise returns the description of the 95690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// negation of the matcher. 'param_values' contains a list of strings 95700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// that are the print-out of the matcher's parameters. 95710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstring FormatMatcherDescription(bool negation, const char* matcher_name, 95720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const Strings& param_values) { 95730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong string result = ConvertIdentifierNameToWords(matcher_name); 95740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (param_values.size() >= 1) 95750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result += " " + JoinAsTuple(param_values); 95760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return negation ? "not (" + result + ")" : result; 95770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 95780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 95790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 95800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace testing 95810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2007, Google Inc. 95820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// All rights reserved. 95830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 95840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without 95850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are 95860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// met: 95870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 95880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright 95890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// notice, this list of conditions and the following disclaimer. 95900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above 95910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// copyright notice, this list of conditions and the following disclaimer 95920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the documentation and/or other materials provided with the 95930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// distribution. 95940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its 95950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// contributors may be used to endorse or promote products derived from 95960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this software without specific prior written permission. 95970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 95980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 95990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 96000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 96010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 96020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 96030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 96040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 96050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 96060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 96070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 96080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 96090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 96100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Author: wan@google.com (Zhanyong Wan) 96110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 96120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Google Mock - a framework for writing C++ mock classes. 96130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 96140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This file implements the spec builder syntax (ON_CALL and 96150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// EXPECT_CALL). 96160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 96170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 96180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <stdlib.h> 96190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <iostream> // NOLINT 96200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <map> 96210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <set> 96220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include <string> 96230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 96240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC 96250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong# include <unistd.h> // NOLINT 96260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 96270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 96280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace testing { 96290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 96300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 96310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Protects the mock object registry (in class Mock), all function 96320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// mockers, and all expectations. 96330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGTEST_DEFINE_STATIC_MUTEX_(g_gmock_mutex); 96340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 96350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Logs a message including file and line number information. 96360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid LogWithLocation(testing::internal::LogSeverity severity, 96370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* file, int line, 96380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const string& message) { 96390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::ostringstream s; 96400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong s << file << ":" << line << ": " << message << ::std::endl; 96410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Log(severity, s.str(), 0); 96420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 96430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 96440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Constructs an ExpectationBase object. 96450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongExpectationBase::ExpectationBase(const char* a_file, 96460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int a_line, 96470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const string& a_source_text) 96480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : file_(a_file), 96490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong line_(a_line), 96500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong source_text_(a_source_text), 96510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong cardinality_specified_(false), 96520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong cardinality_(Exactly(1)), 96530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong call_count_(0), 96540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong retired_(false), 96550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong extra_matcher_specified_(false), 96560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong repeated_action_specified_(false), 96570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong retires_on_saturation_(false), 96580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong last_clause_(kNone), 96590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong action_count_checked_(false) {} 96600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 96610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Destructs an ExpectationBase object. 96620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongExpectationBase::~ExpectationBase() {} 96630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 96640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Explicitly specifies the cardinality of this expectation. Used by 96650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the subclasses to implement the .Times() clause. 96660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid ExpectationBase::SpecifyCardinality(const Cardinality& a_cardinality) { 96670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong cardinality_specified_ = true; 96680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong cardinality_ = a_cardinality; 96690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 96700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 96710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Retires all pre-requisites of this expectation. 96720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid ExpectationBase::RetireAllPreRequisites() { 96730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (is_retired()) { 96740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We can take this short-cut as we never retire an expectation 96750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // until we have retired all its pre-requisites. 96760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return; 96770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 96780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 96790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin(); 96800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong it != immediate_prerequisites_.end(); ++it) { 96810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ExpectationBase* const prerequisite = it->expectation_base().get(); 96820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!prerequisite->is_retired()) { 96830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong prerequisite->RetireAllPreRequisites(); 96840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong prerequisite->Retire(); 96850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 96860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 96870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 96880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 96890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns true iff all pre-requisites of this expectation have been 96900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// satisfied. 96910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L >= g_gmock_mutex 96920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool ExpectationBase::AllPrerequisitesAreSatisfied() const { 96930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong g_gmock_mutex.AssertHeld(); 96940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin(); 96950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong it != immediate_prerequisites_.end(); ++it) { 96960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!(it->expectation_base()->IsSatisfied()) || 96970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong !(it->expectation_base()->AllPrerequisitesAreSatisfied())) 96980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return false; 96990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 97000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 97010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 97020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 97030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Adds unsatisfied pre-requisites of this expectation to 'result'. 97040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L >= g_gmock_mutex 97050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid ExpectationBase::FindUnsatisfiedPrerequisites( 97060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ExpectationSet* result) const { 97070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong g_gmock_mutex.AssertHeld(); 97080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (ExpectationSet::const_iterator it = immediate_prerequisites_.begin(); 97090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong it != immediate_prerequisites_.end(); ++it) { 97100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (it->expectation_base()->IsSatisfied()) { 97110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If *it is satisfied and has a call count of 0, some of its 97120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // pre-requisites may not be satisfied yet. 97130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (it->expectation_base()->call_count_ == 0) { 97140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong it->expectation_base()->FindUnsatisfiedPrerequisites(result); 97150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 97160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 97170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Now that we know *it is unsatisfied, we are not so interested 97180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // in whether its pre-requisites are satisfied. Therefore we 97190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // don't recursively call FindUnsatisfiedPrerequisites() here. 97200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *result += *it; 97210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 97220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 97230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 97240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 97250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Describes how many times a function call matching this 97260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// expectation has occurred. 97270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L >= g_gmock_mutex 97280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid ExpectationBase::DescribeCallCountTo(::std::ostream* os) const { 97290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong g_gmock_mutex.AssertHeld(); 97300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 97310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Describes how many times the function is expected to be called. 97320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << " Expected: to be "; 97330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong cardinality().DescribeTo(os); 97340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << "\n Actual: "; 97350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Cardinality::DescribeActualCallCountTo(call_count(), os); 97360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 97370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Describes the state of the expectation (e.g. is it satisfied? 97380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // is it active?). 97390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *os << " - " << (IsOverSaturated() ? "over-saturated" : 97400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong IsSaturated() ? "saturated" : 97410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong IsSatisfied() ? "satisfied" : "unsatisfied") 97420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " and " 97430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << (is_retired() ? "retired" : "active"); 97440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 97450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 97460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Checks the action count (i.e. the number of WillOnce() and 97470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// WillRepeatedly() clauses) against the cardinality if this hasn't 97480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// been done before. Prints a warning if there are too many or too 97490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// few actions. 97500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < mutex_ 97510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid ExpectationBase::CheckActionCountIfNotDone() const { 97520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool should_check = false; 97530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong { 97540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MutexLock l(&mutex_); 97550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!action_count_checked_) { 97560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong action_count_checked_ = true; 97570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong should_check = true; 97580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 97590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 97600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 97610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (should_check) { 97620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!cardinality_specified_) { 97630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The cardinality was inferred - no need to check the action 97640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // count against it. 97650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return; 97660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 97670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 97680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The cardinality was explicitly specified. 97690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int action_count = static_cast<int>(untyped_actions_.size()); 97700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int upper_bound = cardinality().ConservativeUpperBound(); 97710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const int lower_bound = cardinality().ConservativeLowerBound(); 97720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool too_many; // True if there are too many actions, or false 97730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // if there are too few. 97740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (action_count > upper_bound || 97750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (action_count == upper_bound && repeated_action_specified_)) { 97760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong too_many = true; 97770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (0 < action_count && action_count < lower_bound && 97780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong !repeated_action_specified_) { 97790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong too_many = false; 97800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 97810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return; 97820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 97830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 97840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::stringstream ss; 97850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DescribeLocationTo(&ss); 97860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ss << "Too " << (too_many ? "many" : "few") 97870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " actions specified in " << source_text() << "...\n" 97880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << "Expected to be "; 97890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong cardinality().DescribeTo(&ss); 97900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ss << ", but has " << (too_many ? "" : "only ") 97910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << action_count << " WillOnce()" 97920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << (action_count == 1 ? "" : "s"); 97930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (repeated_action_specified_) { 97940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ss << " and a WillRepeatedly()"; 97950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 97960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ss << "."; 97970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Log(WARNING, ss.str(), -1); // -1 means "don't print stack trace". 97980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 97990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 98000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 98010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Implements the .Times() clause. 98020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid ExpectationBase::UntypedTimes(const Cardinality& a_cardinality) { 98030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (last_clause_ == kTimes) { 98040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ExpectSpecProperty(false, 98050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ".Times() cannot appear " 98060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "more than once in an EXPECT_CALL()."); 98070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 98080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ExpectSpecProperty(last_clause_ < kTimes, 98090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ".Times() cannot appear after " 98100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ".InSequence(), .WillOnce(), .WillRepeatedly(), " 98110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "or .RetiresOnSaturation()."); 98120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 98130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong last_clause_ = kTimes; 98140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 98150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SpecifyCardinality(a_cardinality); 98160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 98170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 98180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Points to the implicit sequence introduced by a living InSequence 98190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// object (if any) in the current thread or NULL. 98200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongThreadLocal<Sequence*> g_gmock_implicit_sequence; 98210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 98220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Reports an uninteresting call (whose description is in msg) in the 98230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// manner specified by 'reaction'. 98240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid ReportUninterestingCall(CallReaction reaction, const string& msg) { 98250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong switch (reaction) { 98260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case ALLOW: 98270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Log(INFO, msg, 3); 98280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 98290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong case WARN: 98300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Log(WARNING, msg, 3); 98310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong break; 98320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong default: // FAIL 98330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Expect(false, NULL, -1, msg); 98340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 98350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 98360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 98370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongUntypedFunctionMockerBase::UntypedFunctionMockerBase() 98380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : mock_obj_(NULL), name_("") {} 98390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 98400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongUntypedFunctionMockerBase::~UntypedFunctionMockerBase() {} 98410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 98420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Sets the mock object this mock method belongs to, and registers 98430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this information in the global mock registry. Will be called 98440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// whenever an EXPECT_CALL() or ON_CALL() is executed on this mock 98450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// method. 98460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < g_gmock_mutex 98470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid UntypedFunctionMockerBase::RegisterOwner(const void* mock_obj) { 98480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong { 98490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MutexLock l(&g_gmock_mutex); 98500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong mock_obj_ = mock_obj; 98510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 98520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Mock::Register(mock_obj, this); 98530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 98540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 98550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Sets the mock object this mock method belongs to, and sets the name 98560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// of the mock function. Will be called upon each invocation of this 98570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// mock function. 98580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < g_gmock_mutex 98590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid UntypedFunctionMockerBase::SetOwnerAndName( 98600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const void* mock_obj, const char* name) { 98610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We protect name_ under g_gmock_mutex in case this mock function 98620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // is called from two threads concurrently. 98630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MutexLock l(&g_gmock_mutex); 98640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong mock_obj_ = mock_obj; 98650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong name_ = name; 98660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 98670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 98680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the name of the function being mocked. Must be called 98690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// after RegisterOwner() or SetOwnerAndName() has been called. 98700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < g_gmock_mutex 98710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst void* UntypedFunctionMockerBase::MockObject() const { 98720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const void* mock_obj; 98730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong { 98740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We protect mock_obj_ under g_gmock_mutex in case this mock 98750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // function is called from two threads concurrently. 98760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MutexLock l(&g_gmock_mutex); 98770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Assert(mock_obj_ != NULL, __FILE__, __LINE__, 98780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "MockObject() must not be called before RegisterOwner() or " 98790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "SetOwnerAndName() has been called."); 98800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong mock_obj = mock_obj_; 98810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 98820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return mock_obj; 98830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 98840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 98850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the name of this mock method. Must be called after 98860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SetOwnerAndName() has been called. 98870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < g_gmock_mutex 98880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst char* UntypedFunctionMockerBase::Name() const { 98890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* name; 98900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong { 98910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We protect name_ under g_gmock_mutex in case this mock 98920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // function is called from two threads concurrently. 98930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MutexLock l(&g_gmock_mutex); 98940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Assert(name_ != NULL, __FILE__, __LINE__, 98950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Name() must not be called before SetOwnerAndName() has " 98960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "been called."); 98970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong name = name_; 98980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 98990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return name; 99000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 99010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 99020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Calculates the result of invoking this mock function with the given 99030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// arguments, prints it, and returns it. The caller is responsible 99040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// for deleting the result. 99050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < g_gmock_mutex 99060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst UntypedActionResultHolderBase* 99070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongUntypedFunctionMockerBase::UntypedInvokeWith(const void* const untyped_args) { 99080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (untyped_expectations_.size() == 0) { 99090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // No expectation is set on this mock method - we have an 99100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // uninteresting call. 99110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 99120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We must get Google Mock's reaction on uninteresting calls 99130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // made on this mock object BEFORE performing the action, 99140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // because the action may DELETE the mock object and make the 99150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // following expression meaningless. 99160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const CallReaction reaction = 99170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Mock::GetReactionOnUninterestingCalls(MockObject()); 99180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 99190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // True iff we need to print this call's arguments and return 99200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // value. This definition must be kept in sync with 99210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the behavior of ReportUninterestingCall(). 99220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool need_to_report_uninteresting_call = 99230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If the user allows this uninteresting call, we print it 99240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // only when he wants informational messages. 99250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong reaction == ALLOW ? LogIsVisible(INFO) : 99260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If the user wants this to be a warning, we print it only 99270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // when he wants to see warnings. 99280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong reaction == WARN ? LogIsVisible(WARNING) : 99290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Otherwise, the user wants this to be an error, and we 99300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // should always print detailed information in the error. 99310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong true; 99320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 99330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!need_to_report_uninteresting_call) { 99340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Perform the action without printing the call information. 99350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return this->UntypedPerformDefaultAction(untyped_args, ""); 99360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 99370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 99380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Warns about the uninteresting call. 99390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::stringstream ss; 99400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong this->UntypedDescribeUninterestingCall(untyped_args, &ss); 99410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 99420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Calculates the function result. 99430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const UntypedActionResultHolderBase* const result = 99440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong this->UntypedPerformDefaultAction(untyped_args, ss.str()); 99450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 99460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Prints the function result. 99470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (result != NULL) 99480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result->PrintAsActionResult(&ss); 99490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 99500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ReportUninterestingCall(reaction, ss.str()); 99510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return result; 99520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 99530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 99540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool is_excessive = false; 99550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::stringstream ss; 99560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::stringstream why; 99570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::stringstream loc; 99580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const void* untyped_action = NULL; 99590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 99600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The UntypedFindMatchingExpectation() function acquires and 99610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // releases g_gmock_mutex. 99620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const ExpectationBase* const untyped_expectation = 99630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong this->UntypedFindMatchingExpectation( 99640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong untyped_args, &untyped_action, &is_excessive, 99650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong &ss, &why); 99660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool found = untyped_expectation != NULL; 99670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 99680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // True iff we need to print the call's arguments and return value. 99690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This definition must be kept in sync with the uses of Expect() 99700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // and Log() in this function. 99710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const bool need_to_report_call = !found || is_excessive || LogIsVisible(INFO); 99720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!need_to_report_call) { 99730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Perform the action without printing the call information. 99740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return 99750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong untyped_action == NULL ? 99760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong this->UntypedPerformDefaultAction(untyped_args, "") : 99770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong this->UntypedPerformAction(untyped_action, untyped_args); 99780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 99790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 99800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ss << " Function call: " << Name(); 99810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong this->UntypedPrintArgs(untyped_args, &ss); 99820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 99830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // In case the action deletes a piece of the expectation, we 99840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // generate the message beforehand. 99850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (found && !is_excessive) { 99860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong untyped_expectation->DescribeLocationTo(&loc); 99870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 99880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 99890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const UntypedActionResultHolderBase* const result = 99900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong untyped_action == NULL ? 99910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong this->UntypedPerformDefaultAction(untyped_args, ss.str()) : 99920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong this->UntypedPerformAction(untyped_action, untyped_args); 99930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (result != NULL) 99940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong result->PrintAsActionResult(&ss); 99950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ss << "\n" << why.str(); 99960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 99970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!found) { 99980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // No expectation matches this call - reports a failure. 99990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Expect(false, NULL, -1, ss.str()); 100000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (is_excessive) { 100010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We had an upper-bound violation and the failure message is in ss. 100020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Expect(false, untyped_expectation->file(), 100030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong untyped_expectation->line(), ss.str()); 100040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 100050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We had an expected call and the matching expectation is 100060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // described in ss. 100070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Log(INFO, loc.str() + ss.str(), 2); 100080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 100090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 100100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return result; 100110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 100120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 100130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns an Expectation object that references and co-owns exp, 100140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// which must be an expectation on this mock function. 100150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongExpectation UntypedFunctionMockerBase::GetHandleOf(ExpectationBase* exp) { 100160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (UntypedExpectations::const_iterator it = 100170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong untyped_expectations_.begin(); 100180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong it != untyped_expectations_.end(); ++it) { 100190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (it->get() == exp) { 100200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return Expectation(*it); 100210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 100220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 100230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 100240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Assert(false, __FILE__, __LINE__, "Cannot find expectation."); 100250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return Expectation(); 100260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The above statement is just to make the code compile, and will 100270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // never be executed. 100280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 100290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 100300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Verifies that all expectations on this mock function have been 100310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// satisfied. Reports one or more Google Test non-fatal failures 100320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// and returns false if not. 100330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L >= g_gmock_mutex 100340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool UntypedFunctionMockerBase::VerifyAndClearExpectationsLocked() { 100350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong g_gmock_mutex.AssertHeld(); 100360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool expectations_met = true; 100370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (UntypedExpectations::const_iterator it = 100380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong untyped_expectations_.begin(); 100390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong it != untyped_expectations_.end(); ++it) { 100400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ExpectationBase* const untyped_expectation = it->get(); 100410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (untyped_expectation->IsOverSaturated()) { 100420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // There was an upper-bound violation. Since the error was 100430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // already reported when it occurred, there is no need to do 100440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // anything here. 100450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong expectations_met = false; 100460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else if (!untyped_expectation->IsSatisfied()) { 100470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong expectations_met = false; 100480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::stringstream ss; 100490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ss << "Actual function call count doesn't match " 100500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << untyped_expectation->source_text() << "...\n"; 100510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // No need to show the source file location of the expectation 100520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // in the description, as the Expect() call that follows already 100530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // takes care of it. 100540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong untyped_expectation->MaybeDescribeExtraMatcherTo(&ss); 100550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong untyped_expectation->DescribeCallCountTo(&ss); 100560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Expect(false, untyped_expectation->file(), 100570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong untyped_expectation->line(), ss.str()); 100580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 100590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 100600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong untyped_expectations_.clear(); 100610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return expectations_met; 100620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 100630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 100640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 100650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 100660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Class Mock. 100670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 100680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace { 100690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 100700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtypedef std::set<internal::UntypedFunctionMockerBase*> FunctionMockers; 100710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 100720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The current state of a mock object. Such information is needed for 100730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// detecting leaked mock objects and explicitly verifying a mock's 100740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// expectations. 100750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstruct MockObjectState { 100760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MockObjectState() 100770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : first_used_file(NULL), first_used_line(-1), leakable(false) {} 100780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 100790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Where in the source file an ON_CALL or EXPECT_CALL is first 100800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // invoked on this mock object. 100810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* first_used_file; 100820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int first_used_line; 100830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::string first_used_test_case; 100840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::string first_used_test; 100850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool leakable; // true iff it's OK to leak the object. 100860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FunctionMockers function_mockers; // All registered methods of the object. 100870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 100880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 100890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A global registry holding the state of all mock objects that are 100900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// alive. A mock object is added to this registry the first time 100910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Mock::AllowLeak(), ON_CALL(), or EXPECT_CALL() is called on it. It 100920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// is removed from the registry in the mock object's destructor. 100930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongclass MockObjectRegistry { 100940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 100950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Maps a mock object (identified by its address) to its state. 100960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong typedef std::map<const void*, MockObjectState> StateMap; 100970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 100980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This destructor will be called when a program exits, after all 100990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // tests in it have been run. By then, there should be no mock 101000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // object alive. Therefore we report any living object as test 101010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // failure, unless the user explicitly asked us to ignore it. 101020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ~MockObjectRegistry() { 101030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // "using ::std::cout;" doesn't work with Symbian's STLport, where cout is 101040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // a macro. 101050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 101060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!GMOCK_FLAG(catch_leaked_mocks)) 101070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return; 101080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 101090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int leaked_count = 0; 101100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (StateMap::const_iterator it = states_.begin(); it != states_.end(); 101110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ++it) { 101120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (it->second.leakable) // The user said it's fine to leak this object. 101130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong continue; 101140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 101150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TODO(wan@google.com): Print the type of the leaked object. 101160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // This can help the user identify the leaked object. 101170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::cout << "\n"; 101180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const MockObjectState& state = it->second; 101190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::cout << internal::FormatFileLocation(state.first_used_file, 101200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong state.first_used_line); 101210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::cout << " ERROR: this mock object"; 101220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (state.first_used_test != "") { 101230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::cout << " (used in test " << state.first_used_test_case << "." 101240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << state.first_used_test << ")"; 101250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 101260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::cout << " should be deleted but never is. Its address is @" 101270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << it->first << "."; 101280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong leaked_count++; 101290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 101300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (leaked_count > 0) { 101310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::cout << "\nERROR: " << leaked_count 101320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " leaked mock " << (leaked_count == 1 ? "object" : "objects") 101330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong << " found at program exit.\n"; 101340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong std::cout.flush(); 101350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ::std::cerr.flush(); 101360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // RUN_ALL_TESTS() has already returned when this destructor is 101370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // called. Therefore we cannot use the normal Google Test 101380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // failure reporting mechanism. 101390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong _exit(1); // We cannot call exit() as it is not reentrant and 101400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // may already have been called. 101410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 101420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 101430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 101440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong StateMap& states() { return states_; } 101450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong private: 101460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong StateMap states_; 101470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong}; 101480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 101490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Protected by g_gmock_mutex. 101500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongMockObjectRegistry g_mock_object_registry; 101510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 101520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Maps a mock object to the reaction Google Mock should have when an 101530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// uninteresting method is called. Protected by g_gmock_mutex. 101540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstd::map<const void*, internal::CallReaction> g_uninteresting_call_reaction; 101550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 101560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Sets the reaction Google Mock should have when an uninteresting 101570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// method of the given mock object is called. 101580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < g_gmock_mutex 101590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid SetReactionOnUninterestingCalls(const void* mock_obj, 101600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::CallReaction reaction) { 101610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::MutexLock l(&internal::g_gmock_mutex); 101620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong g_uninteresting_call_reaction[mock_obj] = reaction; 101630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 101640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 101650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace 101660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 101670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Tells Google Mock to allow uninteresting calls on the given mock 101680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// object. 101690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < g_gmock_mutex 101700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Mock::AllowUninterestingCalls(const void* mock_obj) { 101710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SetReactionOnUninterestingCalls(mock_obj, internal::ALLOW); 101720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 101730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 101740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Tells Google Mock to warn the user about uninteresting calls on the 101750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// given mock object. 101760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < g_gmock_mutex 101770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Mock::WarnUninterestingCalls(const void* mock_obj) { 101780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SetReactionOnUninterestingCalls(mock_obj, internal::WARN); 101790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 101800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 101810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Tells Google Mock to fail uninteresting calls on the given mock 101820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// object. 101830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < g_gmock_mutex 101840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Mock::FailUninterestingCalls(const void* mock_obj) { 101850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SetReactionOnUninterestingCalls(mock_obj, internal::FAIL); 101860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 101870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 101880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Tells Google Mock the given mock object is being destroyed and its 101890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// entry in the call-reaction table should be removed. 101900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < g_gmock_mutex 101910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Mock::UnregisterCallReaction(const void* mock_obj) { 101920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::MutexLock l(&internal::g_gmock_mutex); 101930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong g_uninteresting_call_reaction.erase(mock_obj); 101940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 101950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 101960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the reaction Google Mock will have on uninteresting calls 101970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// made on the given mock object. 101980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < g_gmock_mutex 101990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Konginternal::CallReaction Mock::GetReactionOnUninterestingCalls( 102000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const void* mock_obj) { 102010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::MutexLock l(&internal::g_gmock_mutex); 102020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return (g_uninteresting_call_reaction.count(mock_obj) == 0) ? 102030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::WARN : g_uninteresting_call_reaction[mock_obj]; 102040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 102050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 102060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Tells Google Mock to ignore mock_obj when checking for leaked mock 102070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// objects. 102080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < g_gmock_mutex 102090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Mock::AllowLeak(const void* mock_obj) { 102100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::MutexLock l(&internal::g_gmock_mutex); 102110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong g_mock_object_registry.states()[mock_obj].leakable = true; 102120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 102130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 102140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Verifies and clears all expectations on the given mock object. If 102150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the expectations aren't satisfied, generates one or more Google 102160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Test non-fatal failures and returns false. 102170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < g_gmock_mutex 102180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool Mock::VerifyAndClearExpectations(void* mock_obj) { 102190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::MutexLock l(&internal::g_gmock_mutex); 102200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return VerifyAndClearExpectationsLocked(mock_obj); 102210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 102220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 102230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Verifies all expectations on the given mock object and clears its 102240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// default actions and expectations. Returns true iff the 102250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// verification was successful. 102260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < g_gmock_mutex 102270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool Mock::VerifyAndClear(void* mock_obj) { 102280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::MutexLock l(&internal::g_gmock_mutex); 102290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ClearDefaultActionsLocked(mock_obj); 102300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return VerifyAndClearExpectationsLocked(mock_obj); 102310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 102320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 102330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Verifies and clears all expectations on the given mock object. If 102340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// the expectations aren't satisfied, generates one or more Google 102350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Test non-fatal failures and returns false. 102360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L >= g_gmock_mutex 102370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongbool Mock::VerifyAndClearExpectationsLocked(void* mock_obj) { 102380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::g_gmock_mutex.AssertHeld(); 102390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (g_mock_object_registry.states().count(mock_obj) == 0) { 102400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // No EXPECT_CALL() was set on the given mock object. 102410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 102420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 102430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 102440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Verifies and clears the expectations on each mock method in the 102450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // given mock object. 102460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool expectations_met = true; 102470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FunctionMockers& mockers = 102480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong g_mock_object_registry.states()[mock_obj].function_mockers; 102490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (FunctionMockers::const_iterator it = mockers.begin(); 102500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong it != mockers.end(); ++it) { 102510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (!(*it)->VerifyAndClearExpectationsLocked()) { 102520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong expectations_met = false; 102530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 102540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 102550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 102560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We don't clear the content of mockers, as they may still be 102570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // needed by ClearDefaultActionsLocked(). 102580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return expectations_met; 102590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 102600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 102610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Registers a mock object and a mock method it owns. 102620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < g_gmock_mutex 102630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Mock::Register(const void* mock_obj, 102640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::UntypedFunctionMockerBase* mocker) { 102650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::MutexLock l(&internal::g_gmock_mutex); 102660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong g_mock_object_registry.states()[mock_obj].function_mockers.insert(mocker); 102670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 102680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 102690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Tells Google Mock where in the source code mock_obj is used in an 102700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// ON_CALL or EXPECT_CALL. In case mock_obj is leaked, this 102710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// information helps the user identify which object it is. 102720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L < g_gmock_mutex 102730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Mock::RegisterUseByOnCallOrExpectCall( 102740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const void* mock_obj, const char* file, int line) { 102750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::MutexLock l(&internal::g_gmock_mutex); 102760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MockObjectState& state = g_mock_object_registry.states()[mock_obj]; 102770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (state.first_used_file == NULL) { 102780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong state.first_used_file = file; 102790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong state.first_used_line = line; 102800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TestInfo* const test_info = 102810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong UnitTest::GetInstance()->current_test_info(); 102820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (test_info != NULL) { 102830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TODO(wan@google.com): record the test case name when the 102840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // ON_CALL or EXPECT_CALL is invoked from SetUpTestCase() or 102850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // TearDownTestCase(). 102860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong state.first_used_test_case = test_info->test_case_name(); 102870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong state.first_used_test = test_info->name(); 102880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 102890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 102900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 102910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 102920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Unregisters a mock method; removes the owning mock object from the 102930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// registry when the last mock method associated with it has been 102940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// unregistered. This is called only in the destructor of 102950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// FunctionMockerBase. 102960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L >= g_gmock_mutex 102970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Mock::UnregisterLocked(internal::UntypedFunctionMockerBase* mocker) { 102980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::g_gmock_mutex.AssertHeld(); 102990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (MockObjectRegistry::StateMap::iterator it = 103000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong g_mock_object_registry.states().begin(); 103010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong it != g_mock_object_registry.states().end(); ++it) { 103020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FunctionMockers& mockers = it->second.function_mockers; 103030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (mockers.erase(mocker) > 0) { 103040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // mocker was in mockers and has been just removed. 103050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (mockers.empty()) { 103060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong g_mock_object_registry.states().erase(it); 103070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 103080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return; 103090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 103100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 103110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 103120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 103130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Clears all ON_CALL()s set on the given mock object. 103140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// L >= g_gmock_mutex 103150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Mock::ClearDefaultActionsLocked(void* mock_obj) { 103160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::g_gmock_mutex.AssertHeld(); 103170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 103180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (g_mock_object_registry.states().count(mock_obj) == 0) { 103190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // No ON_CALL() was set on the given mock object. 103200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return; 103210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 103220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 103230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Clears the default actions for each mock method in the given mock 103240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // object. 103250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong FunctionMockers& mockers = 103260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong g_mock_object_registry.states()[mock_obj].function_mockers; 103270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (FunctionMockers::const_iterator it = mockers.begin(); 103280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong it != mockers.end(); ++it) { 103290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (*it)->ClearDefaultActionsLocked(); 103300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 103310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 103320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We don't clear the content of mockers, as they may still be 103330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // needed by VerifyAndClearExpectationsLocked(). 103340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 103350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 103360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongExpectation::Expectation() {} 103370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 103380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongExpectation::Expectation( 103390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const internal::linked_ptr<internal::ExpectationBase>& an_expectation_base) 103400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : expectation_base_(an_expectation_base) {} 103410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 103420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongExpectation::~Expectation() {} 103430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 103440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Adds an expectation to a sequence. 103450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid Sequence::AddExpectation(const Expectation& expectation) const { 103460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (*last_expectation_ != expectation) { 103470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (last_expectation_->expectation_base() != NULL) { 103480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong expectation.expectation_base()->immediate_prerequisites_ 103490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong += *last_expectation_; 103500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 103510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *last_expectation_ = expectation; 103520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 103530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 103540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 103550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Creates the implicit sequence if there isn't one. 103560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongInSequence::InSequence() { 103570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (internal::g_gmock_implicit_sequence.get() == NULL) { 103580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::g_gmock_implicit_sequence.set(new Sequence); 103590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong sequence_created_ = true; 103600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 103610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong sequence_created_ = false; 103620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 103630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 103640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 103650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Deletes the implicit sequence if it was created by the constructor 103660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// of this object. 103670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongInSequence::~InSequence() { 103680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (sequence_created_) { 103690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong delete internal::g_gmock_implicit_sequence.get(); 103700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::g_gmock_implicit_sequence.set(NULL); 103710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 103720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 103730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 103740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace testing 103750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Copyright 2008, Google Inc. 103760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// All rights reserved. 103770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 103780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Redistribution and use in source and binary forms, with or without 103790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// modification, are permitted provided that the following conditions are 103800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// met: 103810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 103820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions of source code must retain the above copyright 103830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// notice, this list of conditions and the following disclaimer. 103840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Redistributions in binary form must reproduce the above 103850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// copyright notice, this list of conditions and the following disclaimer 103860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// in the documentation and/or other materials provided with the 103870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// distribution. 103880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// * Neither the name of Google Inc. nor the names of its 103890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// contributors may be used to endorse or promote products derived from 103900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// this software without specific prior written permission. 103910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 103920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 103930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 103940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 103950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 103960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 103970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 103980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 103990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 104000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 104010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 104020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 104030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 104040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Author: wan@google.com (Zhanyong Wan) 104050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace testing { 104080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// TODO(wan@google.com): support using environment variables to 104100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// control the flag values, like what Google Test does. 104110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGMOCK_DEFINE_bool_(catch_leaked_mocks, true, 104130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "true iff Google Mock should report leaked mock objects " 104140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "as failures."); 104150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongGMOCK_DEFINE_string_(verbose, internal::kWarningVerbosity, 104170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong "Controls how verbose Google Mock's output is." 104180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong " Valid values:\n" 104190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong " info - prints all messages.\n" 104200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong " warning - prints warnings and errors.\n" 104210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong " error - prints errors only."); 104220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace internal { 104240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Parses a string as a command line flag. The string should have the 104260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// format "--gmock_flag=value". When def_optional is true, the 104270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "=value" part can be omitted. 104280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 104290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Returns the value of the flag, or NULL if the parsing failed. 104300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic const char* ParseGoogleMockFlagValue(const char* str, 104310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* flag, 104320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool def_optional) { 104330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // str and flag must not be NULL. 104340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (str == NULL || flag == NULL) return NULL; 104350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // The flag must start with "--gmock_". 104370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String flag_str = String::Format("--gmock_%s", flag); 104380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const size_t flag_len = flag_str.length(); 104390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL; 104400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Skips the flag name. 104420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* flag_end = str + flag_len; 104430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // When def_optional is true, it's OK to not have a "=value" part. 104450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (def_optional && (flag_end[0] == '\0')) { 104460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return flag_end; 104470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 104480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If def_optional is true and there are more characters after the 104500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // flag name, or if def_optional is false, there must be a '=' after 104510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // the flag name. 104520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (flag_end[0] != '=') return NULL; 104530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Returns the string after "=". 104550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return flag_end + 1; 104560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 104570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Parses a string for a Google Mock bool flag, in the form of 104590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "--gmock_flag=value". 104600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 104610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// On success, stores the value of the flag in *value, and returns 104620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// true. On failure, returns false without changing *value. 104630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic bool ParseGoogleMockBoolFlag(const char* str, const char* flag, 104640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong bool* value) { 104650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the value of the flag as a string. 104660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const value_str = ParseGoogleMockFlagValue(str, flag, true); 104670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Aborts if the parsing failed. 104690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (value_str == NULL) return false; 104700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Converts the string value to a bool. 104720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F'); 104730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 104740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 104750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Parses a string for a Google Mock string flag, in the form of 104770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// "--gmock_flag=value". 104780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 104790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// On success, stores the value of the flag in *value, and returns 104800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// true. On failure, returns false without changing *value. 104810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongstatic bool ParseGoogleMockStringFlag(const char* str, const char* flag, 104820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong String* value) { 104830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Gets the value of the flag as a string. 104840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const value_str = ParseGoogleMockFlagValue(str, flag, false); 104850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Aborts if the parsing failed. 104870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (value_str == NULL) return false; 104880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Sets *value to the value of the flag. 104900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong *value = value_str; 104910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return true; 104920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 104930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 104940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The internal implementation of InitGoogleMock(). 104950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 104960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The type parameter CharType can be instantiated to either char or 104970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// wchar_t. 104980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongtemplate <typename CharType> 104990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid InitGoogleMockImpl(int* argc, CharType** argv) { 105000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Makes sure Google Test is initialized. InitGoogleTest() is 105010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // idempotent, so it's fine if the user has already called it. 105020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong InitGoogleTest(argc, argv); 105030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (*argc <= 0) return; 105040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 105050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int i = 1; i != *argc; i++) { 105060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const String arg_string = StreamableToString(argv[i]); 105070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const char* const arg = arg_string.c_str(); 105080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 105090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Do we see a Google Mock flag? 105100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (ParseGoogleMockBoolFlag(arg, "catch_leaked_mocks", 105110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong &GMOCK_FLAG(catch_leaked_mocks)) || 105120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ParseGoogleMockStringFlag(arg, "verbose", &GMOCK_FLAG(verbose))) { 105130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Yes. Shift the remainder of the argv list left by one. Note 105140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // that argv has (*argc + 1) elements, the last one always being 105150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // NULL. The following loop moves the trailing NULL element as 105160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // well. 105170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong for (int j = i; j != *argc; j++) { 105180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong argv[j] = argv[j + 1]; 105190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 105200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 105210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Decrements the argument count. 105220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong (*argc)--; 105230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 105240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // We also need to decrement the iterator as we just removed 105250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // an element. 105260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong i--; 105270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 105280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 105290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 105300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 105310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace internal 105320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 105330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Initializes Google Mock. This must be called before running the 105340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// tests. In particular, it parses a command line for the flags that 105350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Google Mock recognizes. Whenever a Google Mock flag is seen, it is 105360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// removed from argv, and *argc is decremented. 105370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 105380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// No value is returned. Instead, the Google Mock flag variables are 105390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// updated. 105400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 105410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// Since Google Test is needed for Google Mock to work, this function 105420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// also initializes Google Test and parses its flags, if that hasn't 105430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// been done. 105440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid InitGoogleMock(int* argc, char** argv) { 105450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::InitGoogleMockImpl(argc, argv); 105460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 105470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 105480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This overloaded version can be used in Windows programs compiled in 105490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// UNICODE mode. 105500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid InitGoogleMock(int* argc, wchar_t** argv) { 105510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong internal::InitGoogleMockImpl(argc, argv); 105520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 105530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 105540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} // namespace testing 10555