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