14b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Copyright 2005, Google Inc. 24b6829f0d28990dd645e16386eb226d0f10c8731shiqian// All rights reserved. 34b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 44b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Redistribution and use in source and binary forms, with or without 54b6829f0d28990dd645e16386eb226d0f10c8731shiqian// modification, are permitted provided that the following conditions are 64b6829f0d28990dd645e16386eb226d0f10c8731shiqian// met: 74b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 84b6829f0d28990dd645e16386eb226d0f10c8731shiqian// * Redistributions of source code must retain the above copyright 94b6829f0d28990dd645e16386eb226d0f10c8731shiqian// notice, this list of conditions and the following disclaimer. 104b6829f0d28990dd645e16386eb226d0f10c8731shiqian// * Redistributions in binary form must reproduce the above 114b6829f0d28990dd645e16386eb226d0f10c8731shiqian// copyright notice, this list of conditions and the following disclaimer 124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// in the documentation and/or other materials provided with the 134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// distribution. 144b6829f0d28990dd645e16386eb226d0f10c8731shiqian// * Neither the name of Google Inc. nor the names of its 154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// contributors may be used to endorse or promote products derived from 164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// this software without specific prior written permission. 174b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 194b6829f0d28990dd645e16386eb226d0f10c8731shiqian// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 234b6829f0d28990dd645e16386eb226d0f10c8731shiqian// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 254b6829f0d28990dd645e16386eb226d0f10c8731shiqian// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 264b6829f0d28990dd645e16386eb226d0f10c8731shiqian// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 274b6829f0d28990dd645e16386eb226d0f10c8731shiqian// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 304b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Author: wan@google.com (Zhanyong Wan) 314b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 324b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The Google C++ Testing Framework (Google Test) 334b6829f0d28990dd645e16386eb226d0f10c8731shiqian 342620c79810d4741922e9fa89050c0af564994f24zhanyong.wan#include "gtest/gtest.h" 352620c79810d4741922e9fa89050c0af564994f24zhanyong.wan#include "gtest/gtest-spi.h" 364b6829f0d28990dd645e16386eb226d0f10c8731shiqian 374b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include <ctype.h> 384b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include <math.h> 394b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include <stdarg.h> 404b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include <stdio.h> 414b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include <stdlib.h> 428883b42f2a78976dde09f31ca72806072e33bd5fvladlosev#include <time.h> 43e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian#include <wchar.h> 44e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian#include <wctype.h> 454b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan#include <algorithm> 472733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan#include <iomanip> 482733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan#include <limits> 49d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com#include <list> 50d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com#include <map> 51c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan#include <ostream> // NOLINT 5265de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan#include <sstream> 5393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan#include <vector> 54f6d087b78d230d875bf5d8281112662795044680zhanyong.wan 554cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_OS_LINUX 564b6829f0d28990dd645e16386eb226d0f10c8731shiqian 574b6829f0d28990dd645e16386eb226d0f10c8731shiqian// TODO(kenton@google.com): Use autoconf to detect availability of 584b6829f0d28990dd645e16386eb226d0f10c8731shiqian// gettimeofday(). 59733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define GTEST_HAS_GETTIMEOFDAY_ 1 604b6829f0d28990dd645e16386eb226d0f10c8731shiqian 61733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <fcntl.h> // NOLINT 62733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <limits.h> // NOLINT 63733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <sched.h> // NOLINT 644b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Declares vsnprintf(). This header is not available on Windows. 65733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <strings.h> // NOLINT 66733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <sys/mman.h> // NOLINT 67733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <sys/time.h> // NOLINT 68733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <unistd.h> // NOLINT 69733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <string> 704b6829f0d28990dd645e16386eb226d0f10c8731shiqian 714cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#elif GTEST_OS_SYMBIAN 72733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define GTEST_HAS_GETTIMEOFDAY_ 1 73733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <sys/time.h> // NOLINT 74e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian 754cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#elif GTEST_OS_ZOS 76733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define GTEST_HAS_GETTIMEOFDAY_ 1 77733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <sys/time.h> // NOLINT 7831c0c5e8bf3845bb60176e999a2cc64b63812a2ashiqian 79941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian// On z/OS we additionally need strings.h for strcasecmp. 80733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <strings.h> // NOLINT 81941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian 82fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan#elif GTEST_OS_WINDOWS_MOBILE // We are on Windows CE. 834b6829f0d28990dd645e16386eb226d0f10c8731shiqian 84733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <windows.h> // NOLINT 85d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com# undef min 864b6829f0d28990dd645e16386eb226d0f10c8731shiqian 874cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#elif GTEST_OS_WINDOWS // We are on Windows proper. 884b6829f0d28990dd645e16386eb226d0f10c8731shiqian 89733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <io.h> // NOLINT 90733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <sys/timeb.h> // NOLINT 91733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <sys/types.h> // NOLINT 92733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <sys/stat.h> // NOLINT 934b6829f0d28990dd645e16386eb226d0f10c8731shiqian 94733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if GTEST_OS_WINDOWS_MINGW 954b6829f0d28990dd645e16386eb226d0f10c8731shiqian// MinGW has gettimeofday() but not _ftime64(). 964b6829f0d28990dd645e16386eb226d0f10c8731shiqian// TODO(kenton@google.com): Use autoconf to detect availability of 974b6829f0d28990dd645e16386eb226d0f10c8731shiqian// gettimeofday(). 984b6829f0d28990dd645e16386eb226d0f10c8731shiqian// TODO(kenton@google.com): There are other ways to get the time on 994b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Windows, like GetTickCount() or GetSystemTimeAsFileTime(). MinGW 1004b6829f0d28990dd645e16386eb226d0f10c8731shiqian// supports these. consider using them instead. 101733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define GTEST_HAS_GETTIMEOFDAY_ 1 102733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <sys/time.h> // NOLINT 103733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif // GTEST_OS_WINDOWS_MINGW 1044b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1054b6829f0d28990dd645e16386eb226d0f10c8731shiqian// cpplint thinks that the header is already included, so we want to 1064b6829f0d28990dd645e16386eb226d0f10c8731shiqian// silence it. 107733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <windows.h> // NOLINT 108d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com# undef min 1094b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1104b6829f0d28990dd645e16386eb226d0f10c8731shiqian#else 1114b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Assume other platforms have gettimeofday(). 1134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// TODO(kenton@google.com): Use autoconf to detect availability of 1144b6829f0d28990dd645e16386eb226d0f10c8731shiqian// gettimeofday(). 115733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define GTEST_HAS_GETTIMEOFDAY_ 1 1164b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1174b6829f0d28990dd645e16386eb226d0f10c8731shiqian// cpplint thinks that the header is already included, so we want to 1184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// silence it. 119733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <sys/time.h> // NOLINT 120733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <unistd.h> // NOLINT 1214b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1224cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#endif // GTEST_OS_LINUX 1234b6829f0d28990dd645e16386eb226d0f10c8731shiqian 124b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan#if GTEST_HAS_EXCEPTIONS 125733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <stdexcept> 126b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan#endif 127b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan 128c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan#if GTEST_CAN_STREAM_RESULTS_ 129733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <arpa/inet.h> // NOLINT 130733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# include <netdb.h> // NOLINT 131c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan#endif 132c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan 1334b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Indicates that this translation unit is part of Google Test's 1344b6829f0d28990dd645e16386eb226d0f10c8731shiqian// implementation. It must come before gtest-internal-inl.h is 1354b6829f0d28990dd645e16386eb226d0f10c8731shiqian// included, or there will be a compiler error. This trick is to 1364b6829f0d28990dd645e16386eb226d0f10c8731shiqian// prevent a user from accidentally including gtest-internal-inl.h in 1374b6829f0d28990dd645e16386eb226d0f10c8731shiqian// his code. 1384cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#define GTEST_IMPLEMENTATION_ 1 1394b6829f0d28990dd645e16386eb226d0f10c8731shiqian#include "src/gtest-internal-inl.h" 1404cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#undef GTEST_IMPLEMENTATION_ 1414b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1424cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_OS_WINDOWS 143733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# define vsnprintf _vsnprintf 1444b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif // GTEST_OS_WINDOWS 1454b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1464b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace testing { 1474b6829f0d28990dd645e16386eb226d0f10c8731shiqian 14893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanusing internal::CountIf; 14993d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanusing internal::ForEach; 15093d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanusing internal::GetElementOr; 15193d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanusing internal::Shuffle; 15293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan 1534b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Constants. 1544b6829f0d28990dd645e16386eb226d0f10c8731shiqian 155e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// A test whose test case name or test name matches this filter is 156e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// disabled and not run. 157e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianstatic const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*"; 158e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 159e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// A test case whose name matches this filter is considered a death 160e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// test case and will be run before test cases whose name doesn't 161e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// match this filter. 162e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianstatic const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*"; 1634b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1644b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A test filter that matches everything. 1654b6829f0d28990dd645e16386eb226d0f10c8731shiqianstatic const char kUniversalFilter[] = "*"; 1664b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1674b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The default output file for XML output. 1684b6829f0d28990dd645e16386eb226d0f10c8731shiqianstatic const char kDefaultOutputFile[] = "test_detail.xml"; 1694b6829f0d28990dd645e16386eb226d0f10c8731shiqian 170905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// The environment variable name for the test shard index. 171905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanstatic const char kTestShardIndex[] = "GTEST_SHARD_INDEX"; 172905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// The environment variable name for the total number of test shards. 173905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanstatic const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS"; 174905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// The environment variable name for the test shard status file. 175905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanstatic const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE"; 176905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan 177e44602ec83c65102035ce5304ae8de0cb16e9e56shiqiannamespace internal { 178e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian 179f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqian// The text used in failure messages to indicate the start of the 180f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqian// stack trace. 181e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianconst char kStackTraceMarker[] = "\nStack trace:\n"; 182e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian 183ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev// g_help_flag is true iff the --help flag or an equivalent form is 184ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev// specified on the command line. 185ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosevbool g_help_flag = false; 186ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev 187e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian} // namespace internal 188f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqian 189270a551cb5a078909c1ec68eb2143cf7a2322e2czhanyong.wanstatic const char* GetDefaultFilter() { 190270a551cb5a078909c1ec68eb2143cf7a2322e2czhanyong.wan return kUniversalFilter; 191270a551cb5a078909c1ec68eb2143cf7a2322e2czhanyong.wan} 192270a551cb5a078909c1ec68eb2143cf7a2322e2czhanyong.wan 193e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianGTEST_DEFINE_bool_( 194ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian also_run_disabled_tests, 195ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian internal::BoolFromGTestEnv("also_run_disabled_tests", false), 196ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian "Run disabled tests too, in addition to the tests normally being run."); 197ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian 198ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqianGTEST_DEFINE_bool_( 1994b6829f0d28990dd645e16386eb226d0f10c8731shiqian break_on_failure, 2004b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::BoolFromGTestEnv("break_on_failure", false), 2014b6829f0d28990dd645e16386eb226d0f10c8731shiqian "True iff a failed assertion should be a debugger break-point."); 2024b6829f0d28990dd645e16386eb226d0f10c8731shiqian 203e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianGTEST_DEFINE_bool_( 2044b6829f0d28990dd645e16386eb226d0f10c8731shiqian catch_exceptions, 205480f1c2878a043af55c5adfc4ed82a6b8a2aae03vladlosev internal::BoolFromGTestEnv("catch_exceptions", true), 2064cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan "True iff " GTEST_NAME_ 2074b6829f0d28990dd645e16386eb226d0f10c8731shiqian " should catch exceptions and treat them as test failures."); 2084b6829f0d28990dd645e16386eb226d0f10c8731shiqian 209e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianGTEST_DEFINE_string_( 2104b6829f0d28990dd645e16386eb226d0f10c8731shiqian color, 2114b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::StringFromGTestEnv("color", "auto"), 2124b6829f0d28990dd645e16386eb226d0f10c8731shiqian "Whether to use colors in the output. Valid values: yes, no, " 2134b6829f0d28990dd645e16386eb226d0f10c8731shiqian "and auto. 'auto' means to use colors if the output is " 2144b6829f0d28990dd645e16386eb226d0f10c8731shiqian "being sent to a terminal and the TERM environment variable " 2154036e7d55c332d45cfb3f22ed682acce2b8390fdzhanyong.wan "is set to a terminal type that supports colors."); 2164b6829f0d28990dd645e16386eb226d0f10c8731shiqian 217e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianGTEST_DEFINE_string_( 2184b6829f0d28990dd645e16386eb226d0f10c8731shiqian filter, 219270a551cb5a078909c1ec68eb2143cf7a2322e2czhanyong.wan internal::StringFromGTestEnv("filter", GetDefaultFilter()), 2204b6829f0d28990dd645e16386eb226d0f10c8731shiqian "A colon-separated list of glob (not regex) patterns " 2214b6829f0d28990dd645e16386eb226d0f10c8731shiqian "for filtering the tests to run, optionally followed by a " 2224b6829f0d28990dd645e16386eb226d0f10c8731shiqian "'-' and a : separated list of negative patterns (tests to " 2234b6829f0d28990dd645e16386eb226d0f10c8731shiqian "exclude). A test is run if it matches one of the positive " 2244b6829f0d28990dd645e16386eb226d0f10c8731shiqian "patterns and does not match any of the negative patterns."); 2254b6829f0d28990dd645e16386eb226d0f10c8731shiqian 226e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianGTEST_DEFINE_bool_(list_tests, false, 227e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian "List all tests without running them."); 2284b6829f0d28990dd645e16386eb226d0f10c8731shiqian 229e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianGTEST_DEFINE_string_( 2304b6829f0d28990dd645e16386eb226d0f10c8731shiqian output, 2314b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::StringFromGTestEnv("output", ""), 2324b6829f0d28990dd645e16386eb226d0f10c8731shiqian "A format (currently must be \"xml\"), optionally followed " 2334b6829f0d28990dd645e16386eb226d0f10c8731shiqian "by a colon and an output file name or directory. A directory " 2344b6829f0d28990dd645e16386eb226d0f10c8731shiqian "is indicated by a trailing pathname separator. " 2354b6829f0d28990dd645e16386eb226d0f10c8731shiqian "Examples: \"xml:filename.xml\", \"xml::directoryname/\". " 2364b6829f0d28990dd645e16386eb226d0f10c8731shiqian "If a directory is specified, output files will be created " 2374b6829f0d28990dd645e16386eb226d0f10c8731shiqian "within that directory, with file-names based on the test " 2384b6829f0d28990dd645e16386eb226d0f10c8731shiqian "executable's name and, if necessary, made unique by adding " 2394b6829f0d28990dd645e16386eb226d0f10c8731shiqian "digits."); 2404b6829f0d28990dd645e16386eb226d0f10c8731shiqian 241e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianGTEST_DEFINE_bool_( 242d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian print_time, 24373ad5a3327d38504954d33b58f27e29a7089bd96zhanyong.wan internal::BoolFromGTestEnv("print_time", true), 2444cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan "True iff " GTEST_NAME_ 245d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian " should display elapsed time in text output."); 246d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian 247e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianGTEST_DEFINE_int32_( 2489b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan random_seed, 2499b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan internal::Int32FromGTestEnv("random_seed", 0), 2509b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan "Random number seed to use when shuffling test orders. Must be in range " 2519b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan "[1, 99999], or 0 to use a seed based on the current time."); 2529b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan 2539b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanGTEST_DEFINE_int32_( 2544b6829f0d28990dd645e16386eb226d0f10c8731shiqian repeat, 2554b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::Int32FromGTestEnv("repeat", 1), 2564b6829f0d28990dd645e16386eb226d0f10c8731shiqian "How many times to repeat each test. Specify a negative number " 2574b6829f0d28990dd645e16386eb226d0f10c8731shiqian "for repeating forever. Useful for shaking out flaky tests."); 2584b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2599b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanGTEST_DEFINE_bool_( 2609b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan show_internal_stack_frames, false, 2619b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan "True iff " GTEST_NAME_ " should include internal stack frames when " 2629b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan "printing test failure stack traces."); 2639b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan 2649b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanGTEST_DEFINE_bool_( 2659b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan shuffle, 2669b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan internal::BoolFromGTestEnv("shuffle", false), 2679b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan "True iff " GTEST_NAME_ 2689b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan " should randomize tests' order on every run."); 2699b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan 270e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianGTEST_DEFINE_int32_( 2714b6829f0d28990dd645e16386eb226d0f10c8731shiqian stack_trace_depth, 272ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth), 2734b6829f0d28990dd645e16386eb226d0f10c8731shiqian "The maximum number of stack frames to print when an " 2744b6829f0d28990dd645e16386eb226d0f10c8731shiqian "assertion fails. The valid range is 0 through 100, inclusive."); 2754b6829f0d28990dd645e16386eb226d0f10c8731shiqian 276c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wanGTEST_DEFINE_string_( 277c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan stream_result_to, 278c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan internal::StringFromGTestEnv("stream_result_to", ""), 279c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan "This flag specifies the host name and the port number on which to stream " 280c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan "test results. Example: \"localhost:555\". The flag is effective only on " 281c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan "Linux."); 282c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan 283e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianGTEST_DEFINE_bool_( 284b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan throw_on_failure, 285b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan internal::BoolFromGTestEnv("throw_on_failure", false), 286b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan "When this flag is specified, a failed assertion will throw an exception " 287b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan "if exceptions are enabled or exit the program with a non-zero code " 288b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan "otherwise."); 289b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan 2904b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace internal { 2914b6829f0d28990dd645e16386eb226d0f10c8731shiqian 29285f555add7acc03149b76db239a4cdd18433a558zhanyong.wan// Generates a random number from [0, range), using a Linear 29385f555add7acc03149b76db239a4cdd18433a558zhanyong.wan// Congruential Generator (LCG). Crashes if 'range' is 0 or greater 29485f555add7acc03149b76db239a4cdd18433a558zhanyong.wan// than kMaxRange. 29585f555add7acc03149b76db239a4cdd18433a558zhanyong.wanUInt32 Random::Generate(UInt32 range) { 29685f555add7acc03149b76db239a4cdd18433a558zhanyong.wan // These constants are the same as are used in glibc's rand(3). 29785f555add7acc03149b76db239a4cdd18433a558zhanyong.wan state_ = (1103515245U*state_ + 12345U) % kMaxRange; 29885f555add7acc03149b76db239a4cdd18433a558zhanyong.wan 29985f555add7acc03149b76db239a4cdd18433a558zhanyong.wan GTEST_CHECK_(range > 0) 30085f555add7acc03149b76db239a4cdd18433a558zhanyong.wan << "Cannot generate a number in the range [0, 0)."; 30185f555add7acc03149b76db239a4cdd18433a558zhanyong.wan GTEST_CHECK_(range <= kMaxRange) 30285f555add7acc03149b76db239a4cdd18433a558zhanyong.wan << "Generation of a number in [0, " << range << ") was requested, " 30385f555add7acc03149b76db239a4cdd18433a558zhanyong.wan << "but this can only generate numbers in [0, " << kMaxRange << ")."; 30485f555add7acc03149b76db239a4cdd18433a558zhanyong.wan 30585f555add7acc03149b76db239a4cdd18433a558zhanyong.wan // Converting via modulus introduces a bit of downward bias, but 30685f555add7acc03149b76db239a4cdd18433a558zhanyong.wan // it's simple, and a linear congruential generator isn't too good 30785f555add7acc03149b76db239a4cdd18433a558zhanyong.wan // to begin with. 30885f555add7acc03149b76db239a4cdd18433a558zhanyong.wan return state_ % range; 30985f555add7acc03149b76db239a4cdd18433a558zhanyong.wan} 31085f555add7acc03149b76db239a4cdd18433a558zhanyong.wan 3114b6829f0d28990dd645e16386eb226d0f10c8731shiqian// GTestIsInitialized() returns true iff the user has initialized 3124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Google Test. Useful for catching the user mistake of not initializing 3134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Google Test before calling RUN_ALL_TESTS(). 314f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev// 3154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A user must call testing::InitGoogleTest() to initialize Google 316f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev// Test. g_init_gtest_count is set to the number of times 3174b6829f0d28990dd645e16386eb226d0f10c8731shiqian// InitGoogleTest() has been called. We don't protect this variable 3184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// under a mutex as it is only accessed in the main thread. 31986554039f1bc9e84c9e4e22a5af5d2b396fef5a0vladlosevGTEST_API_ int g_init_gtest_count = 0; 320f179f4ee7cc76e7103a726ebf666902b07f89659vladlosevstatic bool GTestIsInitialized() { return g_init_gtest_count != 0; } 3214b6829f0d28990dd645e16386eb226d0f10c8731shiqian 322a8a582fb926a678d1c4303384bd4dc872f746de8zhanyong.wan// Iterates over a vector of TestCases, keeping a running sum of the 3234b6829f0d28990dd645e16386eb226d0f10c8731shiqian// results of calling a given int-returning method on each. 3244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns the sum. 32593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wanstatic int SumOverTestCaseList(const std::vector<TestCase*>& case_list, 3264b6829f0d28990dd645e16386eb226d0f10c8731shiqian int (TestCase::*method)() const) { 3274b6829f0d28990dd645e16386eb226d0f10c8731shiqian int sum = 0; 32893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan for (size_t i = 0; i < case_list.size(); i++) { 32993d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan sum += (case_list[i]->*method)(); 3304b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 3314b6829f0d28990dd645e16386eb226d0f10c8731shiqian return sum; 3324b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 3334b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3344b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns true iff the test case passed. 3354b6829f0d28990dd645e16386eb226d0f10c8731shiqianstatic bool TestCasePassed(const TestCase* test_case) { 3364b6829f0d28990dd645e16386eb226d0f10c8731shiqian return test_case->should_run() && test_case->Passed(); 3374b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 3384b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3394b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns true iff the test case failed. 3404b6829f0d28990dd645e16386eb226d0f10c8731shiqianstatic bool TestCaseFailed(const TestCase* test_case) { 3414b6829f0d28990dd645e16386eb226d0f10c8731shiqian return test_case->should_run() && test_case->Failed(); 3424b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 3434b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3444b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns true iff test_case contains at least one test that should 3454b6829f0d28990dd645e16386eb226d0f10c8731shiqian// run. 3464b6829f0d28990dd645e16386eb226d0f10c8731shiqianstatic bool ShouldRunTestCase(const TestCase* test_case) { 3474b6829f0d28990dd645e16386eb226d0f10c8731shiqian return test_case->should_run(); 3484b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 3494b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3504b6829f0d28990dd645e16386eb226d0f10c8731shiqian// AssertHelper constructor. 351334aaead71ccf797a18f2128c320f0304e724860zhanyong.wanAssertHelper::AssertHelper(TestPartResult::Type type, 352334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan const char* file, 353334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan int line, 354334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan const char* message) 355f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan : data_(new AssertHelperData(type, file, line, message)) { 356f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan} 357f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 358f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wanAssertHelper::~AssertHelper() { 359f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan delete data_; 3604b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 3614b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3624b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Message assignment, for assertion streaming support. 3634b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid AssertHelper::operator=(const Message& message) const { 3644b6829f0d28990dd645e16386eb226d0f10c8731shiqian UnitTest::GetInstance()-> 365f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan AddTestPartResult(data_->type, data_->file, data_->line, 366f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan AppendUserMessage(data_->message, message), 3674b6829f0d28990dd645e16386eb226d0f10c8731shiqian UnitTest::GetInstance()->impl() 3684b6829f0d28990dd645e16386eb226d0f10c8731shiqian ->CurrentOsStackTraceExceptTop(1) 3694b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Skips the stack frame for this function itself. 3704b6829f0d28990dd645e16386eb226d0f10c8731shiqian ); // NOLINT 3714b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 3724b6829f0d28990dd645e16386eb226d0f10c8731shiqian 373f904a612d9444ab36c07a8e619c113432e046f49vladlosev// Mutex for linked pointers. 37486554039f1bc9e84c9e4e22a5af5d2b396fef5a0vladlosevGTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex); 375f904a612d9444ab36c07a8e619c113432e046f49vladlosev 3764b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Application pathname gotten in InitGoogleTest. 37703c314931649a999b0cf5deb0a434a1009157416jgm@google.comstd::string g_executable_path; 3784b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3794b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns the current application's name, removing directory path if that 3804b6829f0d28990dd645e16386eb226d0f10c8731shiqian// is present. 3814b6829f0d28990dd645e16386eb226d0f10c8731shiqianFilePath GetCurrentExecutableName() { 3824b6829f0d28990dd645e16386eb226d0f10c8731shiqian FilePath result; 3834b6829f0d28990dd645e16386eb226d0f10c8731shiqian 384fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan#if GTEST_OS_WINDOWS 3854b6829f0d28990dd645e16386eb226d0f10c8731shiqian result.Set(FilePath(g_executable_path).RemoveExtension("exe")); 3864b6829f0d28990dd645e16386eb226d0f10c8731shiqian#else 3874b6829f0d28990dd645e16386eb226d0f10c8731shiqian result.Set(FilePath(g_executable_path)); 388fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan#endif // GTEST_OS_WINDOWS 3894b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3904b6829f0d28990dd645e16386eb226d0f10c8731shiqian return result.RemoveDirectoryName(); 3914b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 3924b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3934b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Functions for processing the gtest_output flag. 3944b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3954b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns the output format, or "" for normal printed output. 39603c314931649a999b0cf5deb0a434a1009157416jgm@google.comstd::string UnitTestOptions::GetOutputFormat() { 3974b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* const gtest_output_flag = GTEST_FLAG(output).c_str(); 39803c314931649a999b0cf5deb0a434a1009157416jgm@google.com if (gtest_output_flag == NULL) return std::string(""); 3994b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4004b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* const colon = strchr(gtest_output_flag, ':'); 4014b6829f0d28990dd645e16386eb226d0f10c8731shiqian return (colon == NULL) ? 40203c314931649a999b0cf5deb0a434a1009157416jgm@google.com std::string(gtest_output_flag) : 40303c314931649a999b0cf5deb0a434a1009157416jgm@google.com std::string(gtest_output_flag, colon - gtest_output_flag); 4044b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 4054b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4064b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns the name of the requested output file, or the default if none 4074b6829f0d28990dd645e16386eb226d0f10c8731shiqian// was explicitly specified. 40803c314931649a999b0cf5deb0a434a1009157416jgm@google.comstd::string UnitTestOptions::GetAbsolutePathToOutputFile() { 4094b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* const gtest_output_flag = GTEST_FLAG(output).c_str(); 4104b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (gtest_output_flag == NULL) 41103c314931649a999b0cf5deb0a434a1009157416jgm@google.com return ""; 4124b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4134b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* const colon = strchr(gtest_output_flag, ':'); 4144b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (colon == NULL) 41503c314931649a999b0cf5deb0a434a1009157416jgm@google.com return internal::FilePath::ConcatPaths( 41603c314931649a999b0cf5deb0a434a1009157416jgm@google.com internal::FilePath( 41703c314931649a999b0cf5deb0a434a1009157416jgm@google.com UnitTest::GetInstance()->original_working_dir()), 41803c314931649a999b0cf5deb0a434a1009157416jgm@google.com internal::FilePath(kDefaultOutputFile)).string(); 4194b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4204b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::FilePath output_name(colon + 1); 421e5722bdcf1680483a80d97707dd8b97a7c346759zhanyong.wan if (!output_name.IsAbsolutePath()) 422e5722bdcf1680483a80d97707dd8b97a7c346759zhanyong.wan // TODO(wan@google.com): on Windows \some\path is not an absolute 423e5722bdcf1680483a80d97707dd8b97a7c346759zhanyong.wan // path (as its meaning depends on the current drive), yet the 424e5722bdcf1680483a80d97707dd8b97a7c346759zhanyong.wan // following logic for turning it into an absolute path is wrong. 425e5722bdcf1680483a80d97707dd8b97a7c346759zhanyong.wan // Fix it. 426e5722bdcf1680483a80d97707dd8b97a7c346759zhanyong.wan output_name = internal::FilePath::ConcatPaths( 42790592e714eba798bf335ae56a07fcbad8f9703a6zhanyong.wan internal::FilePath(UnitTest::GetInstance()->original_working_dir()), 42890592e714eba798bf335ae56a07fcbad8f9703a6zhanyong.wan internal::FilePath(colon + 1)); 429e5722bdcf1680483a80d97707dd8b97a7c346759zhanyong.wan 4304b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (!output_name.IsDirectory()) 43103c314931649a999b0cf5deb0a434a1009157416jgm@google.com return output_name.string(); 4324b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4334b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::FilePath result(internal::FilePath::GenerateUniqueFileName( 4344b6829f0d28990dd645e16386eb226d0f10c8731shiqian output_name, internal::GetCurrentExecutableName(), 4354b6829f0d28990dd645e16386eb226d0f10c8731shiqian GetOutputFormat().c_str())); 43603c314931649a999b0cf5deb0a434a1009157416jgm@google.com return result.string(); 4374b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 4384b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4394b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns true iff the wildcard pattern matches the string. The 4404b6829f0d28990dd645e16386eb226d0f10c8731shiqian// first ':' or '\0' character in pattern marks the end of it. 4414b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 4424b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This recursive algorithm isn't very efficient, but is clear and 4434b6829f0d28990dd645e16386eb226d0f10c8731shiqian// works well enough for matching test names, which are short. 4444b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool UnitTestOptions::PatternMatchesString(const char *pattern, 4454b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char *str) { 4464b6829f0d28990dd645e16386eb226d0f10c8731shiqian switch (*pattern) { 4474b6829f0d28990dd645e16386eb226d0f10c8731shiqian case '\0': 4484b6829f0d28990dd645e16386eb226d0f10c8731shiqian case ':': // Either ':' or '\0' marks the end of the pattern. 4494b6829f0d28990dd645e16386eb226d0f10c8731shiqian return *str == '\0'; 4504b6829f0d28990dd645e16386eb226d0f10c8731shiqian case '?': // Matches any single character. 4514b6829f0d28990dd645e16386eb226d0f10c8731shiqian return *str != '\0' && PatternMatchesString(pattern + 1, str + 1); 4524b6829f0d28990dd645e16386eb226d0f10c8731shiqian case '*': // Matches any string (possibly empty) of characters. 4534b6829f0d28990dd645e16386eb226d0f10c8731shiqian return (*str != '\0' && PatternMatchesString(pattern, str + 1)) || 4544b6829f0d28990dd645e16386eb226d0f10c8731shiqian PatternMatchesString(pattern + 1, str); 4554b6829f0d28990dd645e16386eb226d0f10c8731shiqian default: // Non-special character. Matches itself. 4564b6829f0d28990dd645e16386eb226d0f10c8731shiqian return *pattern == *str && 4574b6829f0d28990dd645e16386eb226d0f10c8731shiqian PatternMatchesString(pattern + 1, str + 1); 4584b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 4594b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 4604b6829f0d28990dd645e16386eb226d0f10c8731shiqian 46103c314931649a999b0cf5deb0a434a1009157416jgm@google.combool UnitTestOptions::MatchesFilter( 46203c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string& name, const char* filter) { 4634b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char *cur_pattern = filter; 464b0a12f719caf4e37894868334ce41b1864b0be53zhanyong.wan for (;;) { 4654b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (PatternMatchesString(cur_pattern, name.c_str())) { 4664b6829f0d28990dd645e16386eb226d0f10c8731shiqian return true; 4674b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 4684b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4694b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Finds the next pattern in the filter. 4704b6829f0d28990dd645e16386eb226d0f10c8731shiqian cur_pattern = strchr(cur_pattern, ':'); 4714b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4724b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Returns if no more pattern can be found. 4734b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (cur_pattern == NULL) { 4744b6829f0d28990dd645e16386eb226d0f10c8731shiqian return false; 4754b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 4764b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4774b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Skips the pattern separater (the ':' character). 4784b6829f0d28990dd645e16386eb226d0f10c8731shiqian cur_pattern++; 4794b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 4804b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 4814b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4824b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns true iff the user-specified filter matches the test case 4834b6829f0d28990dd645e16386eb226d0f10c8731shiqian// name and the test name. 48403c314931649a999b0cf5deb0a434a1009157416jgm@google.combool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name, 48503c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string &test_name) { 48603c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string& full_name = test_case_name + "." + test_name.c_str(); 4874b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4884b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Split --gtest_filter at '-', if there is one, to separate into 4894b6829f0d28990dd645e16386eb226d0f10c8731shiqian // positive filter and negative filter portions 4904b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* const p = GTEST_FLAG(filter).c_str(); 4914b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* const dash = strchr(p, '-'); 49203c314931649a999b0cf5deb0a434a1009157416jgm@google.com std::string positive; 49303c314931649a999b0cf5deb0a434a1009157416jgm@google.com std::string negative; 4944b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (dash == NULL) { 4954b6829f0d28990dd645e16386eb226d0f10c8731shiqian positive = GTEST_FLAG(filter).c_str(); // Whole string is a positive filter 49603c314931649a999b0cf5deb0a434a1009157416jgm@google.com negative = ""; 4974b6829f0d28990dd645e16386eb226d0f10c8731shiqian } else { 49803c314931649a999b0cf5deb0a434a1009157416jgm@google.com positive = std::string(p, dash); // Everything up to the dash 49903c314931649a999b0cf5deb0a434a1009157416jgm@google.com negative = std::string(dash + 1); // Everything after the dash 5004b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (positive.empty()) { 5014b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Treat '-test1' as the same as '*-test1' 5024b6829f0d28990dd645e16386eb226d0f10c8731shiqian positive = kUniversalFilter; 5034b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 5044b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 5054b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5064b6829f0d28990dd645e16386eb226d0f10c8731shiqian // A filter is a colon-separated list of patterns. It matches a 5074b6829f0d28990dd645e16386eb226d0f10c8731shiqian // test if any pattern in it matches the test. 5084b6829f0d28990dd645e16386eb226d0f10c8731shiqian return (MatchesFilter(full_name, positive.c_str()) && 5094b6829f0d28990dd645e16386eb226d0f10c8731shiqian !MatchesFilter(full_name, negative.c_str())); 5104b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 5114b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5125d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan#if GTEST_HAS_SEH 5134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the 5144b6829f0d28990dd645e16386eb226d0f10c8731shiqian// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise. 5154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This function is useful as an __except condition. 5164b6829f0d28990dd645e16386eb226d0f10c8731shiqianint UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) { 517739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan // Google Test should handle a SEH exception if: 5184b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 1. the user wants it to, AND 519739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan // 2. this is not a breakpoint exception, AND 520739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan // 3. this is not a C++ exception (VC++ implements them via SEH, 521739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan // apparently). 522739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan // 523739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan // SEH exception code for C++ exceptions. 524739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan // (see http://support.microsoft.com/kb/185294 for more information). 525739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan const DWORD kCxxExceptionCode = 0xe06d7363; 526739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 527739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan bool should_handle = true; 528739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 529739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan if (!GTEST_FLAG(catch_exceptions)) 530739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan should_handle = false; 531739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan else if (exception_code == EXCEPTION_BREAKPOINT) 532739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan should_handle = false; 533739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan else if (exception_code == kCxxExceptionCode) 534739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan should_handle = false; 535739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 536739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH; 5374b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 5385d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan#endif // GTEST_HAS_SEH 5394b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5404b6829f0d28990dd645e16386eb226d0f10c8731shiqian} // namespace internal 5414b6829f0d28990dd645e16386eb226d0f10c8731shiqian 542e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// The c'tor sets this object as the test part result reporter used by 543e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// Google Test. The 'result' parameter specifies where to report the 544e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// results. Intercepts only failures from the current thread. 545e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter( 546e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian TestPartResultArray* result) 547e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD), 548e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian result_(result) { 549e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian Init(); 5504b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 5514b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5524b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The c'tor sets this object as the test part result reporter used by 5534b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Google Test. The 'result' parameter specifies where to report the 5544b6829f0d28990dd645e16386eb226d0f10c8731shiqian// results. 5554b6829f0d28990dd645e16386eb226d0f10c8731shiqianScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter( 556e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian InterceptMode intercept_mode, TestPartResultArray* result) 557e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian : intercept_mode_(intercept_mode), 5584b6829f0d28990dd645e16386eb226d0f10c8731shiqian result_(result) { 559e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian Init(); 560e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian} 561e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian 562e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianvoid ScopedFakeTestPartResultReporter::Init() { 563a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); 564e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian if (intercept_mode_ == INTERCEPT_ALL_THREADS) { 565e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian old_reporter_ = impl->GetGlobalTestPartResultReporter(); 566e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian impl->SetGlobalTestPartResultReporter(this); 567e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian } else { 568e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian old_reporter_ = impl->GetTestPartResultReporterForCurrentThread(); 569e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian impl->SetTestPartResultReporterForCurrentThread(this); 570e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian } 5714b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 5724b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5734b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The d'tor restores the test part result reporter used by Google Test 5744b6829f0d28990dd645e16386eb226d0f10c8731shiqian// before. 5754b6829f0d28990dd645e16386eb226d0f10c8731shiqianScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() { 576a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); 577e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian if (intercept_mode_ == INTERCEPT_ALL_THREADS) { 578e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian impl->SetGlobalTestPartResultReporter(old_reporter_); 579e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian } else { 580e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian impl->SetTestPartResultReporterForCurrentThread(old_reporter_); 581e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian } 5824b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 5834b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5844b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Increments the test part result count and remembers the result. 5854b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This method is from the TestPartResultReporterInterface interface. 5864b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid ScopedFakeTestPartResultReporter::ReportTestPartResult( 5874b6829f0d28990dd645e16386eb226d0f10c8731shiqian const TestPartResult& result) { 5884b6829f0d28990dd645e16386eb226d0f10c8731shiqian result_->Append(result); 5894b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 5904b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5914b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace internal { 5924b6829f0d28990dd645e16386eb226d0f10c8731shiqian 593fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// Returns the type ID of ::testing::Test. We should always call this 594fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// instead of GetTypeId< ::testing::Test>() to get the type ID of 595fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// testing::Test. This is to work around a suspected linker bug when 596fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// using Google Test as a framework on Mac OS X. The bug causes 597fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// GetTypeId< ::testing::Test>() to return different values depending 598fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// on whether the call is from the Google Test framework itself or 599fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// from user test code. GetTestTypeId() is guaranteed to always 600fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// return the same value, as it always calls GetTypeId<>() from the 601fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// gtest.cc, which is within the Google Test framework. 602fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqianTypeId GetTestTypeId() { 603fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian return GetTypeId<Test>(); 604fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian} 605fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian 606fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// The value of GetTestTypeId() as seen from within the Google Test 607fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian// library. This is solely for testing GetTestTypeId(). 608fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqianextern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId(); 609fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian 6104b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This predicate-formatter checks that 'results' contains a test part 6114b6829f0d28990dd645e16386eb226d0f10c8731shiqian// failure of the given type and that the failure message contains the 6124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// given substring. 6134b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult HasOneFailure(const char* /* results_expr */, 6144b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* /* type_expr */, 6154b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* /* substr_expr */, 6164b6829f0d28990dd645e16386eb226d0f10c8731shiqian const TestPartResultArray& results, 617334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan TestPartResult::Type type, 618375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan const string& substr) { 61903c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string expected(type == TestPartResult::kFatalFailure ? 620334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan "1 fatal failure" : 621334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan "1 non-fatal failure"); 6224b6829f0d28990dd645e16386eb226d0f10c8731shiqian Message msg; 6234b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (results.size() != 1) { 6244b6829f0d28990dd645e16386eb226d0f10c8731shiqian msg << "Expected: " << expected << "\n" 6254b6829f0d28990dd645e16386eb226d0f10c8731shiqian << " Actual: " << results.size() << " failures"; 6264b6829f0d28990dd645e16386eb226d0f10c8731shiqian for (int i = 0; i < results.size(); i++) { 6274b6829f0d28990dd645e16386eb226d0f10c8731shiqian msg << "\n" << results.GetTestPartResult(i); 6284b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 6293928282cf0323a42e85e7885bddc54409021166fzhanyong.wan return AssertionFailure() << msg; 6304b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 6314b6829f0d28990dd645e16386eb226d0f10c8731shiqian 6324b6829f0d28990dd645e16386eb226d0f10c8731shiqian const TestPartResult& r = results.GetTestPartResult(0); 6334b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (r.type() != type) { 6343928282cf0323a42e85e7885bddc54409021166fzhanyong.wan return AssertionFailure() << "Expected: " << expected << "\n" 6353928282cf0323a42e85e7885bddc54409021166fzhanyong.wan << " Actual:\n" 6363928282cf0323a42e85e7885bddc54409021166fzhanyong.wan << r; 6374b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 6384b6829f0d28990dd645e16386eb226d0f10c8731shiqian 639375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan if (strstr(r.message(), substr.c_str()) == NULL) { 6403928282cf0323a42e85e7885bddc54409021166fzhanyong.wan return AssertionFailure() << "Expected: " << expected << " containing \"" 6413928282cf0323a42e85e7885bddc54409021166fzhanyong.wan << substr << "\"\n" 6423928282cf0323a42e85e7885bddc54409021166fzhanyong.wan << " Actual:\n" 6433928282cf0323a42e85e7885bddc54409021166fzhanyong.wan << r; 6444b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 6454b6829f0d28990dd645e16386eb226d0f10c8731shiqian 6464b6829f0d28990dd645e16386eb226d0f10c8731shiqian return AssertionSuccess(); 6474b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 6484b6829f0d28990dd645e16386eb226d0f10c8731shiqian 6494b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The constructor of SingleFailureChecker remembers where to look up 6504b6829f0d28990dd645e16386eb226d0f10c8731shiqian// test part results, what type of failure we expect, and what 6514b6829f0d28990dd645e16386eb226d0f10c8731shiqian// substring the failure message should contain. 6524b6829f0d28990dd645e16386eb226d0f10c8731shiqianSingleFailureChecker:: SingleFailureChecker( 6534b6829f0d28990dd645e16386eb226d0f10c8731shiqian const TestPartResultArray* results, 654334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan TestPartResult::Type type, 655375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan const string& substr) 6564b6829f0d28990dd645e16386eb226d0f10c8731shiqian : results_(results), 6574b6829f0d28990dd645e16386eb226d0f10c8731shiqian type_(type), 6584b6829f0d28990dd645e16386eb226d0f10c8731shiqian substr_(substr) {} 6594b6829f0d28990dd645e16386eb226d0f10c8731shiqian 6604b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The destructor of SingleFailureChecker verifies that the given 6614b6829f0d28990dd645e16386eb226d0f10c8731shiqian// TestPartResultArray contains exactly one failure that has the given 6624b6829f0d28990dd645e16386eb226d0f10c8731shiqian// type and contains the given substring. If that's not the case, a 6634b6829f0d28990dd645e16386eb226d0f10c8731shiqian// non-fatal failure will be generated. 6644b6829f0d28990dd645e16386eb226d0f10c8731shiqianSingleFailureChecker::~SingleFailureChecker() { 665375ce98f43aebcc1bd702cf9fcb860788e5cb820zhanyong.wan EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_); 6664b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 6674b6829f0d28990dd645e16386eb226d0f10c8731shiqian 668e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianDefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter( 669e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian UnitTestImpl* unit_test) : unit_test_(unit_test) {} 670e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian 671e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianvoid DefaultGlobalTestPartResultReporter::ReportTestPartResult( 672e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian const TestPartResult& result) { 673e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian unit_test_->current_test_result()->AddTestPartResult(result); 6747dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan unit_test_->listeners()->repeater()->OnTestPartResult(result); 675e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian} 676e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian 677e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianDefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter( 678e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian UnitTestImpl* unit_test) : unit_test_(unit_test) {} 679e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian 680e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianvoid DefaultPerThreadTestPartResultReporter::ReportTestPartResult( 681e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian const TestPartResult& result) { 682e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result); 683e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian} 684e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian 685e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// Returns the global test part result reporter. 686e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTestPartResultReporterInterface* 687e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianUnitTestImpl::GetGlobalTestPartResultReporter() { 688e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian internal::MutexLock lock(&global_test_part_result_reporter_mutex_); 689e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian return global_test_part_result_repoter_; 6904b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 6914b6829f0d28990dd645e16386eb226d0f10c8731shiqian 692e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// Sets the global test part result reporter. 693e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianvoid UnitTestImpl::SetGlobalTestPartResultReporter( 694e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian TestPartResultReporterInterface* reporter) { 695e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian internal::MutexLock lock(&global_test_part_result_reporter_mutex_); 696e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian global_test_part_result_repoter_ = reporter; 697e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian} 698e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian 699e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// Returns the test part result reporter for the current thread. 700e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianTestPartResultReporterInterface* 701e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianUnitTestImpl::GetTestPartResultReporterForCurrentThread() { 702e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian return per_thread_test_part_result_reporter_.get(); 7034b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 7044b6829f0d28990dd645e16386eb226d0f10c8731shiqian 705e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian// Sets the test part result reporter for the current thread. 706e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianvoid UnitTestImpl::SetTestPartResultReporterForCurrentThread( 7074b6829f0d28990dd645e16386eb226d0f10c8731shiqian TestPartResultReporterInterface* reporter) { 708e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian per_thread_test_part_result_reporter_.set(reporter); 7094b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 7104b6829f0d28990dd645e16386eb226d0f10c8731shiqian 7114b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Gets the number of successful test cases. 7124b6829f0d28990dd645e16386eb226d0f10c8731shiqianint UnitTestImpl::successful_test_case_count() const { 71393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan return CountIf(test_cases_, TestCasePassed); 7144b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 7154b6829f0d28990dd645e16386eb226d0f10c8731shiqian 7164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Gets the number of failed test cases. 7174b6829f0d28990dd645e16386eb226d0f10c8731shiqianint UnitTestImpl::failed_test_case_count() const { 71893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan return CountIf(test_cases_, TestCaseFailed); 7194b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 7204b6829f0d28990dd645e16386eb226d0f10c8731shiqian 7214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Gets the number of all test cases. 7224b6829f0d28990dd645e16386eb226d0f10c8731shiqianint UnitTestImpl::total_test_case_count() const { 723b03ca47c10be432be5d984cb91ce22c81dfa2252zhanyong.wan return static_cast<int>(test_cases_.size()); 7244b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 7254b6829f0d28990dd645e16386eb226d0f10c8731shiqian 7264b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Gets the number of all test cases that contain at least one test 7274b6829f0d28990dd645e16386eb226d0f10c8731shiqian// that should run. 7284b6829f0d28990dd645e16386eb226d0f10c8731shiqianint UnitTestImpl::test_case_to_run_count() const { 72993d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan return CountIf(test_cases_, ShouldRunTestCase); 7304b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 7314b6829f0d28990dd645e16386eb226d0f10c8731shiqian 7324b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Gets the number of successful tests. 7334b6829f0d28990dd645e16386eb226d0f10c8731shiqianint UnitTestImpl::successful_test_count() const { 7344b6829f0d28990dd645e16386eb226d0f10c8731shiqian return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count); 7354b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 7364b6829f0d28990dd645e16386eb226d0f10c8731shiqian 7374b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Gets the number of failed tests. 7384b6829f0d28990dd645e16386eb226d0f10c8731shiqianint UnitTestImpl::failed_test_count() const { 7394b6829f0d28990dd645e16386eb226d0f10c8731shiqian return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count); 7404b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 7414b6829f0d28990dd645e16386eb226d0f10c8731shiqian 742c567ac6c5431d9d2867ace1da1418f4575215516vladlosev// Gets the number of disabled tests that will be reported in the XML report. 743c567ac6c5431d9d2867ace1da1418f4575215516vladlosevint UnitTestImpl::reportable_disabled_test_count() const { 744c567ac6c5431d9d2867ace1da1418f4575215516vladlosev return SumOverTestCaseList(test_cases_, 745c567ac6c5431d9d2867ace1da1418f4575215516vladlosev &TestCase::reportable_disabled_test_count); 746c567ac6c5431d9d2867ace1da1418f4575215516vladlosev} 747c567ac6c5431d9d2867ace1da1418f4575215516vladlosev 7484b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Gets the number of disabled tests. 7494b6829f0d28990dd645e16386eb226d0f10c8731shiqianint UnitTestImpl::disabled_test_count() const { 7504b6829f0d28990dd645e16386eb226d0f10c8731shiqian return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count); 7514b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 7524b6829f0d28990dd645e16386eb226d0f10c8731shiqian 753c567ac6c5431d9d2867ace1da1418f4575215516vladlosev// Gets the number of tests to be printed in the XML report. 754c567ac6c5431d9d2867ace1da1418f4575215516vladlosevint UnitTestImpl::reportable_test_count() const { 755c567ac6c5431d9d2867ace1da1418f4575215516vladlosev return SumOverTestCaseList(test_cases_, &TestCase::reportable_test_count); 756c567ac6c5431d9d2867ace1da1418f4575215516vladlosev} 757c567ac6c5431d9d2867ace1da1418f4575215516vladlosev 7584b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Gets the number of all tests. 7594b6829f0d28990dd645e16386eb226d0f10c8731shiqianint UnitTestImpl::total_test_count() const { 7604b6829f0d28990dd645e16386eb226d0f10c8731shiqian return SumOverTestCaseList(test_cases_, &TestCase::total_test_count); 7614b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 7624b6829f0d28990dd645e16386eb226d0f10c8731shiqian 7634b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Gets the number of tests that should run. 7644b6829f0d28990dd645e16386eb226d0f10c8731shiqianint UnitTestImpl::test_to_run_count() const { 7654b6829f0d28990dd645e16386eb226d0f10c8731shiqian return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count); 7664b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 7674b6829f0d28990dd645e16386eb226d0f10c8731shiqian 76803c314931649a999b0cf5deb0a434a1009157416jgm@google.com// Returns the current OS stack trace as an std::string. 7694b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 7704b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The maximum number of stack frames to be included is specified by 7714b6829f0d28990dd645e16386eb226d0f10c8731shiqian// the gtest_stack_trace_depth flag. The skip_count parameter 7724b6829f0d28990dd645e16386eb226d0f10c8731shiqian// specifies the number of top frames to be skipped, which doesn't 7734b6829f0d28990dd645e16386eb226d0f10c8731shiqian// count against the number of frames to be included. 7744b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 7754b6829f0d28990dd645e16386eb226d0f10c8731shiqian// For example, if Foo() calls Bar(), which in turn calls 7764b6829f0d28990dd645e16386eb226d0f10c8731shiqian// CurrentOsStackTraceExceptTop(1), Foo() will be included in the 7774b6829f0d28990dd645e16386eb226d0f10c8731shiqian// trace but Bar() and CurrentOsStackTraceExceptTop() won't. 77803c314931649a999b0cf5deb0a434a1009157416jgm@google.comstd::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) { 7794b6829f0d28990dd645e16386eb226d0f10c8731shiqian (void)skip_count; 78003c314931649a999b0cf5deb0a434a1009157416jgm@google.com return ""; 7814b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 7824b6829f0d28990dd645e16386eb226d0f10c8731shiqian 7839b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan// Returns the current time in milliseconds. 7849b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanTimeInMillis GetTimeInMillis() { 785fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__) 7869b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan // Difference between 1970-01-01 and 1601-01-01 in milliseconds. 7874b6829f0d28990dd645e16386eb226d0f10c8731shiqian // http://analogous.blogspot.com/2005/04/epoch.html 78898efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan const TimeInMillis kJavaEpochToWinFileTimeDelta = 78998efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan static_cast<TimeInMillis>(116444736UL) * 100000UL; 7904b6829f0d28990dd645e16386eb226d0f10c8731shiqian const DWORD kTenthMicrosInMilliSecond = 10000; 7914b6829f0d28990dd645e16386eb226d0f10c8731shiqian 7924b6829f0d28990dd645e16386eb226d0f10c8731shiqian SYSTEMTIME now_systime; 7934b6829f0d28990dd645e16386eb226d0f10c8731shiqian FILETIME now_filetime; 7944b6829f0d28990dd645e16386eb226d0f10c8731shiqian ULARGE_INTEGER now_int64; 7954b6829f0d28990dd645e16386eb226d0f10c8731shiqian // TODO(kenton@google.com): Shouldn't this just use 7964b6829f0d28990dd645e16386eb226d0f10c8731shiqian // GetSystemTimeAsFileTime()? 7974b6829f0d28990dd645e16386eb226d0f10c8731shiqian GetSystemTime(&now_systime); 7984b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (SystemTimeToFileTime(&now_systime, &now_filetime)) { 7994b6829f0d28990dd645e16386eb226d0f10c8731shiqian now_int64.LowPart = now_filetime.dwLowDateTime; 8004b6829f0d28990dd645e16386eb226d0f10c8731shiqian now_int64.HighPart = now_filetime.dwHighDateTime; 8014b6829f0d28990dd645e16386eb226d0f10c8731shiqian now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) - 8024b6829f0d28990dd645e16386eb226d0f10c8731shiqian kJavaEpochToWinFileTimeDelta; 8034b6829f0d28990dd645e16386eb226d0f10c8731shiqian return now_int64.QuadPart; 8044b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 8054b6829f0d28990dd645e16386eb226d0f10c8731shiqian return 0; 8064cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_ 8074b6829f0d28990dd645e16386eb226d0f10c8731shiqian __timeb64 now; 808733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 8094b6829f0d28990dd645e16386eb226d0f10c8731shiqian // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996 8104b6829f0d28990dd645e16386eb226d0f10c8731shiqian // (deprecated function) there. 8114b6829f0d28990dd645e16386eb226d0f10c8731shiqian // TODO(kenton@google.com): Use GetTickCount()? Or use 8124b6829f0d28990dd645e16386eb226d0f10c8731shiqian // SystemTimeToFileTime() 813f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996) 8144b6829f0d28990dd645e16386eb226d0f10c8731shiqian _ftime64(&now); 815f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com GTEST_DISABLE_MSC_WARNINGS_POP_() 816733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 8174b6829f0d28990dd645e16386eb226d0f10c8731shiqian return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm; 8184cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#elif GTEST_HAS_GETTIMEOFDAY_ 8194b6829f0d28990dd645e16386eb226d0f10c8731shiqian struct timeval now; 8204b6829f0d28990dd645e16386eb226d0f10c8731shiqian gettimeofday(&now, NULL); 8214b6829f0d28990dd645e16386eb226d0f10c8731shiqian return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000; 8224b6829f0d28990dd645e16386eb226d0f10c8731shiqian#else 823733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# error "Don't know how to get the current time on your system." 8244b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif 8254b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 8264b6829f0d28990dd645e16386eb226d0f10c8731shiqian 8274b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Utilities 8284b6829f0d28990dd645e16386eb226d0f10c8731shiqian 82903c314931649a999b0cf5deb0a434a1009157416jgm@google.com// class String. 8304b6829f0d28990dd645e16386eb226d0f10c8731shiqian 831fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan#if GTEST_OS_WINDOWS_MOBILE 832dd4a17bc20377d250ed116b1083d851adbe45f25shiqian// Creates a UTF-16 wide string from the given ANSI string, allocating 833dd4a17bc20377d250ed116b1083d851adbe45f25shiqian// memory using new. The caller is responsible for deleting the return 834dd4a17bc20377d250ed116b1083d851adbe45f25shiqian// value using delete[]. Returns the wide string, or NULL if the 835dd4a17bc20377d250ed116b1083d851adbe45f25shiqian// input is NULL. 836dd4a17bc20377d250ed116b1083d851adbe45f25shiqianLPCWSTR String::AnsiToUtf16(const char* ansi) { 837dd4a17bc20377d250ed116b1083d851adbe45f25shiqian if (!ansi) return NULL; 838dd4a17bc20377d250ed116b1083d851adbe45f25shiqian const int length = strlen(ansi); 839dd4a17bc20377d250ed116b1083d851adbe45f25shiqian const int unicode_length = 840dd4a17bc20377d250ed116b1083d851adbe45f25shiqian MultiByteToWideChar(CP_ACP, 0, ansi, length, 841dd4a17bc20377d250ed116b1083d851adbe45f25shiqian NULL, 0); 842dd4a17bc20377d250ed116b1083d851adbe45f25shiqian WCHAR* unicode = new WCHAR[unicode_length + 1]; 843dd4a17bc20377d250ed116b1083d851adbe45f25shiqian MultiByteToWideChar(CP_ACP, 0, ansi, length, 844dd4a17bc20377d250ed116b1083d851adbe45f25shiqian unicode, unicode_length); 845dd4a17bc20377d250ed116b1083d851adbe45f25shiqian unicode[unicode_length] = 0; 846dd4a17bc20377d250ed116b1083d851adbe45f25shiqian return unicode; 847dd4a17bc20377d250ed116b1083d851adbe45f25shiqian} 848dd4a17bc20377d250ed116b1083d851adbe45f25shiqian 849dd4a17bc20377d250ed116b1083d851adbe45f25shiqian// Creates an ANSI string from the given wide string, allocating 850dd4a17bc20377d250ed116b1083d851adbe45f25shiqian// memory using new. The caller is responsible for deleting the return 851dd4a17bc20377d250ed116b1083d851adbe45f25shiqian// value using delete[]. Returns the ANSI string, or NULL if the 852dd4a17bc20377d250ed116b1083d851adbe45f25shiqian// input is NULL. 853dd4a17bc20377d250ed116b1083d851adbe45f25shiqianconst char* String::Utf16ToAnsi(LPCWSTR utf16_str) { 854dd4a17bc20377d250ed116b1083d851adbe45f25shiqian if (!utf16_str) return NULL; 855dd4a17bc20377d250ed116b1083d851adbe45f25shiqian const int ansi_length = 856dd4a17bc20377d250ed116b1083d851adbe45f25shiqian WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, 857dd4a17bc20377d250ed116b1083d851adbe45f25shiqian NULL, 0, NULL, NULL); 858dd4a17bc20377d250ed116b1083d851adbe45f25shiqian char* ansi = new char[ansi_length + 1]; 859dd4a17bc20377d250ed116b1083d851adbe45f25shiqian WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, 860dd4a17bc20377d250ed116b1083d851adbe45f25shiqian ansi, ansi_length, NULL, NULL); 861dd4a17bc20377d250ed116b1083d851adbe45f25shiqian ansi[ansi_length] = 0; 862dd4a17bc20377d250ed116b1083d851adbe45f25shiqian return ansi; 863dd4a17bc20377d250ed116b1083d851adbe45f25shiqian} 864dd4a17bc20377d250ed116b1083d851adbe45f25shiqian 865fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan#endif // GTEST_OS_WINDOWS_MOBILE 866dd4a17bc20377d250ed116b1083d851adbe45f25shiqian 8674b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Compares two C strings. Returns true iff they have the same content. 8684b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 8694b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Unlike strcmp(), this function can handle NULL argument(s). A NULL 8704b6829f0d28990dd645e16386eb226d0f10c8731shiqian// C string is considered different to any non-NULL C string, 8714b6829f0d28990dd645e16386eb226d0f10c8731shiqian// including the empty string. 8724b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool String::CStringEquals(const char * lhs, const char * rhs) { 8734b6829f0d28990dd645e16386eb226d0f10c8731shiqian if ( lhs == NULL ) return rhs == NULL; 8744b6829f0d28990dd645e16386eb226d0f10c8731shiqian 8754b6829f0d28990dd645e16386eb226d0f10c8731shiqian if ( rhs == NULL ) return false; 8764b6829f0d28990dd645e16386eb226d0f10c8731shiqian 8774b6829f0d28990dd645e16386eb226d0f10c8731shiqian return strcmp(lhs, rhs) == 0; 8784b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 8794b6829f0d28990dd645e16386eb226d0f10c8731shiqian 8804b6829f0d28990dd645e16386eb226d0f10c8731shiqian#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING 8814b6829f0d28990dd645e16386eb226d0f10c8731shiqian 8824b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Converts an array of wide chars to a narrow string using the UTF-8 8834b6829f0d28990dd645e16386eb226d0f10c8731shiqian// encoding, and streams the result to the given Message object. 88489be5763249cbab785abfa310fb1cd6b5e9c4adfzhanyong.wanstatic void StreamWideCharsToMessage(const wchar_t* wstr, size_t length, 8854b6829f0d28990dd645e16386eb226d0f10c8731shiqian Message* msg) { 88689be5763249cbab785abfa310fb1cd6b5e9c4adfzhanyong.wan for (size_t i = 0; i != length; ) { // NOLINT 887e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev if (wstr[i] != L'\0') { 88889be5763249cbab785abfa310fb1cd6b5e9c4adfzhanyong.wan *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i)); 88989be5763249cbab785abfa310fb1cd6b5e9c4adfzhanyong.wan while (i != length && wstr[i] != L'\0') 890e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev i++; 8914b6829f0d28990dd645e16386eb226d0f10c8731shiqian } else { 8924b6829f0d28990dd645e16386eb226d0f10c8731shiqian *msg << '\0'; 893e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev i++; 8944b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 8954b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 8964b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 8974b6829f0d28990dd645e16386eb226d0f10c8731shiqian 8984b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING 8994b6829f0d28990dd645e16386eb226d0f10c8731shiqian 9004b6829f0d28990dd645e16386eb226d0f10c8731shiqian} // namespace internal 9014b6829f0d28990dd645e16386eb226d0f10c8731shiqian 9022733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan// Constructs an empty Message. 9032733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan// We allocate the stringstream separately because otherwise each use of 9042733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's 9052733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan// stack frame leading to huge stack frames in some cases; gcc does not reuse 9062733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan// the stack space. 9072733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wanMessage::Message() : ss_(new ::std::stringstream) { 9082733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan // By default, we want there to be enough precision when printing 9092733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan // a double to a Message. 9102733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2); 9112733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan} 9122733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan 9132733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan// These two overloads allow streaming a wide C string to a Message 9142733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan// using the UTF-8 encoding. 9152733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wanMessage& Message::operator <<(const wchar_t* wide_c_str) { 9162733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan return *this << internal::String::ShowWideCString(wide_c_str); 9172733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan} 9182733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wanMessage& Message::operator <<(wchar_t* wide_c_str) { 9192733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan return *this << internal::String::ShowWideCString(wide_c_str); 9202733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan} 9212733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan 9224b6829f0d28990dd645e16386eb226d0f10c8731shiqian#if GTEST_HAS_STD_WSTRING 9234b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Converts the given wide string to a narrow string using the UTF-8 9244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// encoding, and streams the result to this Message object. 9254b6829f0d28990dd645e16386eb226d0f10c8731shiqianMessage& Message::operator <<(const ::std::wstring& wstr) { 9264b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this); 9274b6829f0d28990dd645e16386eb226d0f10c8731shiqian return *this; 9284b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 9294b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif // GTEST_HAS_STD_WSTRING 9304b6829f0d28990dd645e16386eb226d0f10c8731shiqian 9314b6829f0d28990dd645e16386eb226d0f10c8731shiqian#if GTEST_HAS_GLOBAL_WSTRING 9324b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Converts the given wide string to a narrow string using the UTF-8 9334b6829f0d28990dd645e16386eb226d0f10c8731shiqian// encoding, and streams the result to this Message object. 9344b6829f0d28990dd645e16386eb226d0f10c8731shiqianMessage& Message::operator <<(const ::wstring& wstr) { 9354b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this); 9364b6829f0d28990dd645e16386eb226d0f10c8731shiqian return *this; 9374b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 9384b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif // GTEST_HAS_GLOBAL_WSTRING 9394b6829f0d28990dd645e16386eb226d0f10c8731shiqian 9402733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan// Gets the text streamed to this object so far as an std::string. 9412733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan// Each '\0' character in the buffer is replaced with "\\0". 9422733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wanstd::string Message::GetString() const { 9432733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan return internal::StringStreamToString(ss_.get()); 9442733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan} 9452733a36231e9e59dfe0648562ac021ccea0e27d8zhanyong.wan 946fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// AssertionResult constructors. 947fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// Used in EXPECT_TRUE/FALSE(assertion_result). 948fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevAssertionResult::AssertionResult(const AssertionResult& other) 949fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev : success_(other.success_), 950fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev message_(other.message_.get() != NULL ? 9511287840af7b9efca823ad2fecb6d905f2c4a3acevladlosev new ::std::string(*other.message_) : 9521287840af7b9efca823ad2fecb6d905f2c4a3acevladlosev static_cast< ::std::string*>(NULL)) { 9534b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 9544b6829f0d28990dd645e16386eb226d0f10c8731shiqian 955f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com// Swaps two AssertionResults. 956f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.comvoid AssertionResult::swap(AssertionResult& other) { 957f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com using std::swap; 958f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com swap(success_, other.success_); 959f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com swap(message_, other.message_); 960f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com} 961f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com 962fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE. 963fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevAssertionResult AssertionResult::operator!() const { 964fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev AssertionResult negation(!success_); 965fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev if (message_.get() != NULL) 966fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev negation << *message_; 967fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev return negation; 968fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev} 9694b6829f0d28990dd645e16386eb226d0f10c8731shiqian 9704b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Makes a successful assertion result. 9714b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult AssertionSuccess() { 972fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev return AssertionResult(true); 9734b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 9744b6829f0d28990dd645e16386eb226d0f10c8731shiqian 975fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// Makes a failed assertion result. 976fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosevAssertionResult AssertionFailure() { 977fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev return AssertionResult(false); 978fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev} 9794b6829f0d28990dd645e16386eb226d0f10c8731shiqian 9804b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Makes a failed assertion result with the given failure message. 981fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// Deprecated; use AssertionFailure() << message. 9824b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult AssertionFailure(const Message& message) { 983fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev return AssertionFailure() << message; 9844b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 9854b6829f0d28990dd645e16386eb226d0f10c8731shiqian 9864b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace internal { 9874b6829f0d28990dd645e16386eb226d0f10c8731shiqian 988d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comnamespace edit_distance { 989d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comstd::vector<EditType> CalculateOptimalEdits(const std::vector<size_t>& left, 990d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com const std::vector<size_t>& right) { 991d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com std::vector<std::vector<double> > costs( 992d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com left.size() + 1, std::vector<double>(right.size() + 1)); 993d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com std::vector<std::vector<EditType> > best_move( 994d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com left.size() + 1, std::vector<EditType>(right.size() + 1)); 995d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 996d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // Populate for empty right. 997d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com for (size_t l_i = 0; l_i < costs.size(); ++l_i) { 998d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com costs[l_i][0] = static_cast<double>(l_i); 999d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com best_move[l_i][0] = kRemove; 1000d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1001d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // Populate for empty left. 1002d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com for (size_t r_i = 1; r_i < costs[0].size(); ++r_i) { 1003d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com costs[0][r_i] = static_cast<double>(r_i); 1004d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com best_move[0][r_i] = kAdd; 1005d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1006d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1007d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com for (size_t l_i = 0; l_i < left.size(); ++l_i) { 1008d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com for (size_t r_i = 0; r_i < right.size(); ++r_i) { 1009d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com if (left[l_i] == right[r_i]) { 1010d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // Found a match. Consume it. 1011d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com costs[l_i + 1][r_i + 1] = costs[l_i][r_i]; 1012d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com best_move[l_i + 1][r_i + 1] = kMatch; 1013d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com continue; 1014d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1015d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1016d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com const double add = costs[l_i + 1][r_i]; 1017d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com const double remove = costs[l_i][r_i + 1]; 1018d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com const double replace = costs[l_i][r_i]; 1019d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com if (add < remove && add < replace) { 1020d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com costs[l_i + 1][r_i + 1] = add + 1; 1021d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com best_move[l_i + 1][r_i + 1] = kAdd; 1022d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } else if (remove < add && remove < replace) { 1023d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com costs[l_i + 1][r_i + 1] = remove + 1; 1024d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com best_move[l_i + 1][r_i + 1] = kRemove; 1025d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } else { 1026d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // We make replace a little more expensive than add/remove to lower 1027d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // their priority. 1028d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com costs[l_i + 1][r_i + 1] = replace + 1.00001; 1029d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com best_move[l_i + 1][r_i + 1] = kReplace; 1030d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1031d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1032d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1033d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1034d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // Reconstruct the best path. We do it in reverse order. 1035d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com std::vector<EditType> best_path; 1036d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com for (size_t l_i = left.size(), r_i = right.size(); l_i > 0 || r_i > 0;) { 1037d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com EditType move = best_move[l_i][r_i]; 1038d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com best_path.push_back(move); 1039d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com l_i -= move != kAdd; 1040d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com r_i -= move != kRemove; 1041d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1042d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com std::reverse(best_path.begin(), best_path.end()); 1043d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com return best_path; 1044d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com} 1045d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1046d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comnamespace { 1047d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1048d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// Helper class to convert string into ids with deduplication. 1049d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comclass InternalStrings { 1050d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com public: 1051d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com size_t GetId(const std::string& str) { 1052d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com IdMap::iterator it = ids_.find(str); 1053d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com if (it != ids_.end()) return it->second; 1054d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com size_t id = ids_.size(); 1055d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com return ids_[str] = id; 1056d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1057d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1058d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com private: 1059d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com typedef std::map<std::string, size_t> IdMap; 1060d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com IdMap ids_; 1061d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com}; 1062d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1063d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com} // namespace 1064d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1065d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comstd::vector<EditType> CalculateOptimalEdits( 1066d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com const std::vector<std::string>& left, 1067d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com const std::vector<std::string>& right) { 1068d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com std::vector<size_t> left_ids, right_ids; 1069d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com { 1070d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com InternalStrings intern_table; 1071d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com for (size_t i = 0; i < left.size(); ++i) { 1072d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com left_ids.push_back(intern_table.GetId(left[i])); 1073d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1074d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com for (size_t i = 0; i < right.size(); ++i) { 1075d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com right_ids.push_back(intern_table.GetId(right[i])); 1076d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1077d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1078d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com return CalculateOptimalEdits(left_ids, right_ids); 1079d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com} 1080d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1081d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comnamespace { 1082d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1083d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// Helper class that holds the state for one hunk and prints it out to the 1084d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// stream. 1085d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// It reorders adds/removes when possible to group all removes before all 1086d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// adds. It also adds the hunk header before printint into the stream. 1087d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comclass Hunk { 1088d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com public: 1089d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com Hunk(size_t left_start, size_t right_start) 1090d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com : left_start_(left_start), 1091d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com right_start_(right_start), 1092d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com adds_(), 1093d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com removes_(), 1094d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com common_() {} 1095d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1096d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com void PushLine(char edit, const char* line) { 1097d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com switch (edit) { 1098d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com case ' ': 1099d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com ++common_; 1100d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com FlushEdits(); 1101d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com hunk_.push_back(std::make_pair(' ', line)); 1102d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com break; 1103d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com case '-': 1104d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com ++removes_; 1105d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com hunk_removes_.push_back(std::make_pair('-', line)); 1106d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com break; 1107d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com case '+': 1108d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com ++adds_; 1109d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com hunk_adds_.push_back(std::make_pair('+', line)); 1110d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com break; 1111d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1112d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1113d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1114d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com void PrintTo(std::ostream* os) { 1115d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com PrintHeader(os); 1116d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com FlushEdits(); 1117d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com for (std::list<std::pair<char, const char*> >::const_iterator it = 1118d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com hunk_.begin(); 1119d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com it != hunk_.end(); ++it) { 1120d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com *os << it->first << it->second << "\n"; 1121d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1122d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1123d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1124d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com bool has_edits() const { return adds_ || removes_; } 1125d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1126d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com private: 1127d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com void FlushEdits() { 1128d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com hunk_.splice(hunk_.end(), hunk_removes_); 1129d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com hunk_.splice(hunk_.end(), hunk_adds_); 1130d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1131d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1132d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // Print a unified diff header for one hunk. 1133d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // The format is 1134d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // "@@ -<left_start>,<left_length> +<right_start>,<right_length> @@" 1135d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // where the left/right parts are ommitted if unnecessary. 1136d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com void PrintHeader(std::ostream* ss) const { 1137d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com *ss << "@@ "; 1138d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com if (removes_) { 1139d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com *ss << "-" << left_start_ << "," << (removes_ + common_); 1140d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1141d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com if (removes_ && adds_) { 1142d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com *ss << " "; 1143d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1144d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com if (adds_) { 1145d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com *ss << "+" << right_start_ << "," << (adds_ + common_); 1146d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1147d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com *ss << " @@\n"; 1148d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1149d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1150d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com size_t left_start_, right_start_; 1151d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com size_t adds_, removes_, common_; 1152d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com std::list<std::pair<char, const char*> > hunk_, hunk_adds_, hunk_removes_; 1153d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com}; 1154d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1155d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com} // namespace 1156d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1157d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// Create a list of diff hunks in Unified diff format. 1158d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// Each hunk has a header generated by PrintHeader above plus a body with 1159d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// lines prefixed with ' ' for no change, '-' for deletion and '+' for 1160d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// addition. 1161d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// 'context' represents the desired unchanged prefix/suffix around the diff. 1162d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// If two hunks are close enough that their contexts overlap, then they are 1163d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// joined into one hunk. 1164d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comstd::string CreateUnifiedDiff(const std::vector<std::string>& left, 1165d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com const std::vector<std::string>& right, 1166d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com size_t context) { 1167d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com const std::vector<EditType> edits = CalculateOptimalEdits(left, right); 1168d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1169d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com size_t l_i = 0, r_i = 0, edit_i = 0; 1170d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com std::stringstream ss; 1171d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com while (edit_i < edits.size()) { 1172d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // Find first edit. 1173d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com while (edit_i < edits.size() && edits[edit_i] == kMatch) { 1174d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com ++l_i; 1175d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com ++r_i; 1176d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com ++edit_i; 1177d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1178d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1179d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // Find the first line to include in the hunk. 1180d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com const size_t prefix_context = std::min(l_i, context); 1181d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com Hunk hunk(l_i - prefix_context + 1, r_i - prefix_context + 1); 1182d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com for (size_t i = prefix_context; i > 0; --i) { 1183d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com hunk.PushLine(' ', left[l_i - i].c_str()); 1184d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1185d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1186d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // Iterate the edits until we found enough suffix for the hunk or the input 1187d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // is over. 1188d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com size_t n_suffix = 0; 1189d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com for (; edit_i < edits.size(); ++edit_i) { 1190d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com if (n_suffix >= context) { 1191d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // Continue only if the next hunk is very close. 1192d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com std::vector<EditType>::const_iterator it = edits.begin() + edit_i; 1193d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com while (it != edits.end() && *it == kMatch) ++it; 1194d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com if (it == edits.end() || (it - edits.begin()) - edit_i >= context) { 1195d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // There is no next edit or it is too far away. 1196d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com break; 1197d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1198d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1199d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1200d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com EditType edit = edits[edit_i]; 1201d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // Reset count when a non match is found. 1202d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com n_suffix = edit == kMatch ? n_suffix + 1 : 0; 1203d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1204d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com if (edit == kMatch || edit == kRemove || edit == kReplace) { 1205d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com hunk.PushLine(edit == kMatch ? ' ' : '-', left[l_i].c_str()); 1206d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1207d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com if (edit == kAdd || edit == kReplace) { 1208d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com hunk.PushLine('+', right[r_i].c_str()); 1209d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1210d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1211d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // Advance indices, depending on edit type. 1212d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com l_i += edit != kAdd; 1213d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com r_i += edit != kRemove; 1214d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1215d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1216d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com if (!hunk.has_edits()) { 1217d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com // We are done. We don't want this hunk. 1218d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com break; 1219d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1220d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1221d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com hunk.PrintTo(&ss); 1222d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1223d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com return ss.str(); 1224d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com} 1225d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1226d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com} // namespace edit_distance 1227d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1228d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comnamespace { 1229d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1230d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// The string representation of the values received in EqFailure() are already 1231d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// escaped. Split them on escaped '\n' boundaries. Leave all other escaped 1232d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com// characters the same. 1233d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.comstd::vector<std::string> SplitEscapedString(const std::string& str) { 1234d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com std::vector<std::string> lines; 1235d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com size_t start = 0, end = str.size(); 1236d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com if (end > 2 && str[0] == '"' && str[end - 1] == '"') { 1237d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com ++start; 1238d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com --end; 1239d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1240d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com bool escaped = false; 1241d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com for (size_t i = start; i + 1 < end; ++i) { 1242d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com if (escaped) { 1243d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com escaped = false; 1244d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com if (str[i] == 'n') { 1245d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com lines.push_back(str.substr(start, i - start - 1)); 1246d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com start = i + 1; 1247d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1248d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } else { 1249d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com escaped = str[i] == '\\'; 1250d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1251d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1252d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com lines.push_back(str.substr(start, end - start)); 1253d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com return lines; 1254d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com} 1255d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 1256d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com} // namespace 1257d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 12584b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Constructs and returns the message for an equality assertion 12594b6829f0d28990dd645e16386eb226d0f10c8731shiqian// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. 12604b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 12614b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The first four parameters are the expressions used in the assertion 12624b6829f0d28990dd645e16386eb226d0f10c8731shiqian// and their values, as strings. For example, for ASSERT_EQ(foo, bar) 12634b6829f0d28990dd645e16386eb226d0f10c8731shiqian// where foo is 5 and bar is 6, we have: 12644b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 12654b6829f0d28990dd645e16386eb226d0f10c8731shiqian// expected_expression: "foo" 12664b6829f0d28990dd645e16386eb226d0f10c8731shiqian// actual_expression: "bar" 12674b6829f0d28990dd645e16386eb226d0f10c8731shiqian// expected_value: "5" 12684b6829f0d28990dd645e16386eb226d0f10c8731shiqian// actual_value: "6" 12694b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 12704b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The ignoring_case parameter is true iff the assertion is a 12714b6829f0d28990dd645e16386eb226d0f10c8731shiqian// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will 12724b6829f0d28990dd645e16386eb226d0f10c8731shiqian// be inserted into the message. 12734b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult EqFailure(const char* expected_expression, 12744b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* actual_expression, 127503c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string& expected_value, 127603c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string& actual_value, 12774b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool ignoring_case) { 12784b6829f0d28990dd645e16386eb226d0f10c8731shiqian Message msg; 12794b6829f0d28990dd645e16386eb226d0f10c8731shiqian msg << "Value of: " << actual_expression; 12804b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (actual_value != actual_expression) { 12814b6829f0d28990dd645e16386eb226d0f10c8731shiqian msg << "\n Actual: " << actual_value; 12824b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 12834b6829f0d28990dd645e16386eb226d0f10c8731shiqian 12844b6829f0d28990dd645e16386eb226d0f10c8731shiqian msg << "\nExpected: " << expected_expression; 12854b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (ignoring_case) { 12864b6829f0d28990dd645e16386eb226d0f10c8731shiqian msg << " (ignoring case)"; 12874b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 12884b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (expected_value != expected_expression) { 12894b6829f0d28990dd645e16386eb226d0f10c8731shiqian msg << "\nWhich is: " << expected_value; 12904b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 12914b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1292d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com if (!expected_value.empty() && !actual_value.empty()) { 1293d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com const std::vector<std::string> expected_lines = 1294d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com SplitEscapedString(expected_value); 1295d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com const std::vector<std::string> actual_lines = 1296d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com SplitEscapedString(actual_value); 1297d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com if (expected_lines.size() > 1 || actual_lines.size() > 1) { 1298d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com msg << "\nWith diff:\n" 1299d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com << edit_distance::CreateUnifiedDiff(expected_lines, actual_lines); 1300d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1301d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com } 1302d9abf3b04db54a8081365ab131aeb0943b5aab36kosak@google.com 13033928282cf0323a42e85e7885bddc54409021166fzhanyong.wan return AssertionFailure() << msg; 13044b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 13054b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1306fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev// Constructs a failure message for Boolean assertions such as EXPECT_TRUE. 130703c314931649a999b0cf5deb0a434a1009157416jgm@google.comstd::string GetBoolAssertionFailureMessage( 130803c314931649a999b0cf5deb0a434a1009157416jgm@google.com const AssertionResult& assertion_result, 130903c314931649a999b0cf5deb0a434a1009157416jgm@google.com const char* expression_text, 131003c314931649a999b0cf5deb0a434a1009157416jgm@google.com const char* actual_predicate_value, 131103c314931649a999b0cf5deb0a434a1009157416jgm@google.com const char* expected_predicate_value) { 1312fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev const char* actual_message = assertion_result.message(); 1313fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev Message msg; 1314fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev msg << "Value of: " << expression_text 1315fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev << "\n Actual: " << actual_predicate_value; 1316fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev if (actual_message[0] != '\0') 1317fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev msg << " (" << actual_message << ")"; 1318fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev msg << "\nExpected: " << expected_predicate_value; 1319fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev return msg.GetString(); 1320fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev} 13214b6829f0d28990dd645e16386eb226d0f10c8731shiqian 13224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Helper function for implementing ASSERT_NEAR. 13234b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult DoubleNearPredFormat(const char* expr1, 13244b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* expr2, 13254b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* abs_error_expr, 13264b6829f0d28990dd645e16386eb226d0f10c8731shiqian double val1, 13274b6829f0d28990dd645e16386eb226d0f10c8731shiqian double val2, 13284b6829f0d28990dd645e16386eb226d0f10c8731shiqian double abs_error) { 13294b6829f0d28990dd645e16386eb226d0f10c8731shiqian const double diff = fabs(val1 - val2); 13304b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (diff <= abs_error) return AssertionSuccess(); 13314b6829f0d28990dd645e16386eb226d0f10c8731shiqian 13324b6829f0d28990dd645e16386eb226d0f10c8731shiqian // TODO(wan): do not print the value of an expression if it's 13334b6829f0d28990dd645e16386eb226d0f10c8731shiqian // already a literal. 13343928282cf0323a42e85e7885bddc54409021166fzhanyong.wan return AssertionFailure() 13353928282cf0323a42e85e7885bddc54409021166fzhanyong.wan << "The difference between " << expr1 << " and " << expr2 13364b6829f0d28990dd645e16386eb226d0f10c8731shiqian << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n" 13374b6829f0d28990dd645e16386eb226d0f10c8731shiqian << expr1 << " evaluates to " << val1 << ",\n" 13384b6829f0d28990dd645e16386eb226d0f10c8731shiqian << expr2 << " evaluates to " << val2 << ", and\n" 13394b6829f0d28990dd645e16386eb226d0f10c8731shiqian << abs_error_expr << " evaluates to " << abs_error << "."; 13404b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 13414b6829f0d28990dd645e16386eb226d0f10c8731shiqian 13424b6829f0d28990dd645e16386eb226d0f10c8731shiqian 13434b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Helper template for implementing FloatLE() and DoubleLE(). 13444b6829f0d28990dd645e16386eb226d0f10c8731shiqiantemplate <typename RawType> 13454b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult FloatingPointLE(const char* expr1, 13464b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* expr2, 13474b6829f0d28990dd645e16386eb226d0f10c8731shiqian RawType val1, 13484b6829f0d28990dd645e16386eb226d0f10c8731shiqian RawType val2) { 13494b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Returns success if val1 is less than val2, 13504b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (val1 < val2) { 13514b6829f0d28990dd645e16386eb226d0f10c8731shiqian return AssertionSuccess(); 13524b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 13534b6829f0d28990dd645e16386eb226d0f10c8731shiqian 13544b6829f0d28990dd645e16386eb226d0f10c8731shiqian // or if val1 is almost equal to val2. 13554b6829f0d28990dd645e16386eb226d0f10c8731shiqian const FloatingPoint<RawType> lhs(val1), rhs(val2); 13564b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (lhs.AlmostEquals(rhs)) { 13574b6829f0d28990dd645e16386eb226d0f10c8731shiqian return AssertionSuccess(); 13584b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 13594b6829f0d28990dd645e16386eb226d0f10c8731shiqian 13604b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Note that the above two checks will both fail if either val1 or 13614b6829f0d28990dd645e16386eb226d0f10c8731shiqian // val2 is NaN, as the IEEE floating-point standard requires that 13624b6829f0d28990dd645e16386eb226d0f10c8731shiqian // any predicate involving a NaN must return false. 13634b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1364b15c73341d7a7abff7a04e1de18de59ba0f34009zhanyong.wan ::std::stringstream val1_ss; 13654b6829f0d28990dd645e16386eb226d0f10c8731shiqian val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2) 13664b6829f0d28990dd645e16386eb226d0f10c8731shiqian << val1; 13674b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1368b15c73341d7a7abff7a04e1de18de59ba0f34009zhanyong.wan ::std::stringstream val2_ss; 13694b6829f0d28990dd645e16386eb226d0f10c8731shiqian val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2) 13704b6829f0d28990dd645e16386eb226d0f10c8731shiqian << val2; 13714b6829f0d28990dd645e16386eb226d0f10c8731shiqian 13723928282cf0323a42e85e7885bddc54409021166fzhanyong.wan return AssertionFailure() 13733928282cf0323a42e85e7885bddc54409021166fzhanyong.wan << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n" 1374b15c73341d7a7abff7a04e1de18de59ba0f34009zhanyong.wan << " Actual: " << StringStreamToString(&val1_ss) << " vs " 1375b15c73341d7a7abff7a04e1de18de59ba0f34009zhanyong.wan << StringStreamToString(&val2_ss); 13764b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 13774b6829f0d28990dd645e16386eb226d0f10c8731shiqian 13784b6829f0d28990dd645e16386eb226d0f10c8731shiqian} // namespace internal 13794b6829f0d28990dd645e16386eb226d0f10c8731shiqian 13804b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Asserts that val1 is less than, or almost equal to, val2. Fails 13814b6829f0d28990dd645e16386eb226d0f10c8731shiqian// otherwise. In particular, it fails if either val1 or val2 is NaN. 13824b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult FloatLE(const char* expr1, const char* expr2, 13834b6829f0d28990dd645e16386eb226d0f10c8731shiqian float val1, float val2) { 13844b6829f0d28990dd645e16386eb226d0f10c8731shiqian return internal::FloatingPointLE<float>(expr1, expr2, val1, val2); 13854b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 13864b6829f0d28990dd645e16386eb226d0f10c8731shiqian 13874b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Asserts that val1 is less than, or almost equal to, val2. Fails 13884b6829f0d28990dd645e16386eb226d0f10c8731shiqian// otherwise. In particular, it fails if either val1 or val2 is NaN. 13894b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult DoubleLE(const char* expr1, const char* expr2, 13904b6829f0d28990dd645e16386eb226d0f10c8731shiqian double val1, double val2) { 13914b6829f0d28990dd645e16386eb226d0f10c8731shiqian return internal::FloatingPointLE<double>(expr1, expr2, val1, val2); 13924b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 13934b6829f0d28990dd645e16386eb226d0f10c8731shiqian 13944b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace internal { 13954b6829f0d28990dd645e16386eb226d0f10c8731shiqian 13964b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The helper function for {ASSERT|EXPECT}_EQ with int or enum 13974b6829f0d28990dd645e16386eb226d0f10c8731shiqian// arguments. 13984b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult CmpHelperEQ(const char* expected_expression, 13994b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* actual_expression, 14004b6829f0d28990dd645e16386eb226d0f10c8731shiqian BiggestInt expected, 14014b6829f0d28990dd645e16386eb226d0f10c8731shiqian BiggestInt actual) { 14024b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (expected == actual) { 14034b6829f0d28990dd645e16386eb226d0f10c8731shiqian return AssertionSuccess(); 14044b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 14054b6829f0d28990dd645e16386eb226d0f10c8731shiqian 14064b6829f0d28990dd645e16386eb226d0f10c8731shiqian return EqFailure(expected_expression, 14074b6829f0d28990dd645e16386eb226d0f10c8731shiqian actual_expression, 14084b6829f0d28990dd645e16386eb226d0f10c8731shiqian FormatForComparisonFailureMessage(expected, actual), 14094b6829f0d28990dd645e16386eb226d0f10c8731shiqian FormatForComparisonFailureMessage(actual, expected), 14104b6829f0d28990dd645e16386eb226d0f10c8731shiqian false); 14114b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 14124b6829f0d28990dd645e16386eb226d0f10c8731shiqian 14134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A macro for implementing the helper functions needed to implement 14144b6829f0d28990dd645e16386eb226d0f10c8731shiqian// ASSERT_?? and EXPECT_?? with integer or enum arguments. It is here 14154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// just to avoid copy-and-paste of similar code. 1416e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian#define GTEST_IMPL_CMP_HELPER_(op_name, op)\ 14174b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ 14184b6829f0d28990dd645e16386eb226d0f10c8731shiqian BiggestInt val1, BiggestInt val2) {\ 14194b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (val1 op val2) {\ 14204b6829f0d28990dd645e16386eb226d0f10c8731shiqian return AssertionSuccess();\ 14214b6829f0d28990dd645e16386eb226d0f10c8731shiqian } else {\ 14223928282cf0323a42e85e7885bddc54409021166fzhanyong.wan return AssertionFailure() \ 14233928282cf0323a42e85e7885bddc54409021166fzhanyong.wan << "Expected: (" << expr1 << ") " #op " (" << expr2\ 14244b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\ 14254b6829f0d28990dd645e16386eb226d0f10c8731shiqian << " vs " << FormatForComparisonFailureMessage(val2, val1);\ 14264b6829f0d28990dd645e16386eb226d0f10c8731shiqian }\ 14274b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 14284b6829f0d28990dd645e16386eb226d0f10c8731shiqian 14294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Implements the helper function for {ASSERT|EXPECT}_NE with int or 14304b6829f0d28990dd645e16386eb226d0f10c8731shiqian// enum arguments. 1431e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianGTEST_IMPL_CMP_HELPER_(NE, !=) 14324b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Implements the helper function for {ASSERT|EXPECT}_LE with int or 14334b6829f0d28990dd645e16386eb226d0f10c8731shiqian// enum arguments. 1434e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianGTEST_IMPL_CMP_HELPER_(LE, <=) 14354b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Implements the helper function for {ASSERT|EXPECT}_LT with int or 14364b6829f0d28990dd645e16386eb226d0f10c8731shiqian// enum arguments. 1437e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianGTEST_IMPL_CMP_HELPER_(LT, < ) 14384b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Implements the helper function for {ASSERT|EXPECT}_GE with int or 14394b6829f0d28990dd645e16386eb226d0f10c8731shiqian// enum arguments. 1440e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianGTEST_IMPL_CMP_HELPER_(GE, >=) 14414b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Implements the helper function for {ASSERT|EXPECT}_GT with int or 14424b6829f0d28990dd645e16386eb226d0f10c8731shiqian// enum arguments. 1443e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianGTEST_IMPL_CMP_HELPER_(GT, > ) 14444b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1445e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian#undef GTEST_IMPL_CMP_HELPER_ 14464b6829f0d28990dd645e16386eb226d0f10c8731shiqian 14474b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The helper function for {ASSERT|EXPECT}_STREQ. 14484b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult CmpHelperSTREQ(const char* expected_expression, 14494b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* actual_expression, 14504b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* expected, 14514b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* actual) { 14524b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (String::CStringEquals(expected, actual)) { 14534b6829f0d28990dd645e16386eb226d0f10c8731shiqian return AssertionSuccess(); 14544b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 14554b6829f0d28990dd645e16386eb226d0f10c8731shiqian 14564b6829f0d28990dd645e16386eb226d0f10c8731shiqian return EqFailure(expected_expression, 14574b6829f0d28990dd645e16386eb226d0f10c8731shiqian actual_expression, 14586b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan PrintToString(expected), 14596b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan PrintToString(actual), 14604b6829f0d28990dd645e16386eb226d0f10c8731shiqian false); 14614b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 14624b6829f0d28990dd645e16386eb226d0f10c8731shiqian 14634b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The helper function for {ASSERT|EXPECT}_STRCASEEQ. 14644b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult CmpHelperSTRCASEEQ(const char* expected_expression, 14654b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* actual_expression, 14664b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* expected, 14674b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* actual) { 14684b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (String::CaseInsensitiveCStringEquals(expected, actual)) { 14694b6829f0d28990dd645e16386eb226d0f10c8731shiqian return AssertionSuccess(); 14704b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 14714b6829f0d28990dd645e16386eb226d0f10c8731shiqian 14724b6829f0d28990dd645e16386eb226d0f10c8731shiqian return EqFailure(expected_expression, 14734b6829f0d28990dd645e16386eb226d0f10c8731shiqian actual_expression, 14746b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan PrintToString(expected), 14756b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan PrintToString(actual), 14764b6829f0d28990dd645e16386eb226d0f10c8731shiqian true); 14774b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 14784b6829f0d28990dd645e16386eb226d0f10c8731shiqian 14794b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The helper function for {ASSERT|EXPECT}_STRNE. 14804b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult CmpHelperSTRNE(const char* s1_expression, 14814b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* s2_expression, 14824b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* s1, 14834b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* s2) { 14844b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (!String::CStringEquals(s1, s2)) { 14854b6829f0d28990dd645e16386eb226d0f10c8731shiqian return AssertionSuccess(); 14864b6829f0d28990dd645e16386eb226d0f10c8731shiqian } else { 14873928282cf0323a42e85e7885bddc54409021166fzhanyong.wan return AssertionFailure() << "Expected: (" << s1_expression << ") != (" 14883928282cf0323a42e85e7885bddc54409021166fzhanyong.wan << s2_expression << "), actual: \"" 14893928282cf0323a42e85e7885bddc54409021166fzhanyong.wan << s1 << "\" vs \"" << s2 << "\""; 14904b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 14914b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 14924b6829f0d28990dd645e16386eb226d0f10c8731shiqian 14934b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The helper function for {ASSERT|EXPECT}_STRCASENE. 14944b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult CmpHelperSTRCASENE(const char* s1_expression, 14954b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* s2_expression, 14964b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* s1, 14974b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* s2) { 14984b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (!String::CaseInsensitiveCStringEquals(s1, s2)) { 14994b6829f0d28990dd645e16386eb226d0f10c8731shiqian return AssertionSuccess(); 15004b6829f0d28990dd645e16386eb226d0f10c8731shiqian } else { 15013928282cf0323a42e85e7885bddc54409021166fzhanyong.wan return AssertionFailure() 15023928282cf0323a42e85e7885bddc54409021166fzhanyong.wan << "Expected: (" << s1_expression << ") != (" 15034b6829f0d28990dd645e16386eb226d0f10c8731shiqian << s2_expression << ") (ignoring case), actual: \"" 15044b6829f0d28990dd645e16386eb226d0f10c8731shiqian << s1 << "\" vs \"" << s2 << "\""; 15054b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 15064b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 15074b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15084b6829f0d28990dd645e16386eb226d0f10c8731shiqian} // namespace internal 15094b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15104b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace { 15114b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Helper functions for implementing IsSubString() and IsNotSubstring(). 15134b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15144b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This group of overloaded functions return true iff needle is a 15154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// substring of haystack. NULL is considered a substring of itself 15164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// only. 15174b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15184b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool IsSubstringPred(const char* needle, const char* haystack) { 15194b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (needle == NULL || haystack == NULL) 15204b6829f0d28990dd645e16386eb226d0f10c8731shiqian return needle == haystack; 15214b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15224b6829f0d28990dd645e16386eb226d0f10c8731shiqian return strstr(haystack, needle) != NULL; 15234b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 15244b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15254b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) { 15264b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (needle == NULL || haystack == NULL) 15274b6829f0d28990dd645e16386eb226d0f10c8731shiqian return needle == haystack; 15284b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15294b6829f0d28990dd645e16386eb226d0f10c8731shiqian return wcsstr(haystack, needle) != NULL; 15304b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 15314b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15324b6829f0d28990dd645e16386eb226d0f10c8731shiqian// StringType here can be either ::std::string or ::std::wstring. 15334b6829f0d28990dd645e16386eb226d0f10c8731shiqiantemplate <typename StringType> 15344b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool IsSubstringPred(const StringType& needle, 15354b6829f0d28990dd645e16386eb226d0f10c8731shiqian const StringType& haystack) { 15364b6829f0d28990dd645e16386eb226d0f10c8731shiqian return haystack.find(needle) != StringType::npos; 15374b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 15384b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15394b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This function implements either IsSubstring() or IsNotSubstring(), 15404b6829f0d28990dd645e16386eb226d0f10c8731shiqian// depending on the value of the expected_to_be_substring parameter. 15414b6829f0d28990dd645e16386eb226d0f10c8731shiqian// StringType here can be const char*, const wchar_t*, ::std::string, 15424b6829f0d28990dd645e16386eb226d0f10c8731shiqian// or ::std::wstring. 15434b6829f0d28990dd645e16386eb226d0f10c8731shiqiantemplate <typename StringType> 15444b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult IsSubstringImpl( 15454b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool expected_to_be_substring, 15464b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* needle_expr, const char* haystack_expr, 15474b6829f0d28990dd645e16386eb226d0f10c8731shiqian const StringType& needle, const StringType& haystack) { 15484b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (IsSubstringPred(needle, haystack) == expected_to_be_substring) 15494b6829f0d28990dd645e16386eb226d0f10c8731shiqian return AssertionSuccess(); 15504b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15514b6829f0d28990dd645e16386eb226d0f10c8731shiqian const bool is_wide_string = sizeof(needle[0]) > 1; 15524b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* const begin_string_quote = is_wide_string ? "L\"" : "\""; 15533928282cf0323a42e85e7885bddc54409021166fzhanyong.wan return AssertionFailure() 15544b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "Value of: " << needle_expr << "\n" 15554b6829f0d28990dd645e16386eb226d0f10c8731shiqian << " Actual: " << begin_string_quote << needle << "\"\n" 15564b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "Expected: " << (expected_to_be_substring ? "" : "not ") 15574b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "a substring of " << haystack_expr << "\n" 15583928282cf0323a42e85e7885bddc54409021166fzhanyong.wan << "Which is: " << begin_string_quote << haystack << "\""; 15594b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 15604b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15614b6829f0d28990dd645e16386eb226d0f10c8731shiqian} // namespace 15624b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15634b6829f0d28990dd645e16386eb226d0f10c8731shiqian// IsSubstring() and IsNotSubstring() check whether needle is a 15644b6829f0d28990dd645e16386eb226d0f10c8731shiqian// substring of haystack (NULL is considered a substring of itself 15654b6829f0d28990dd645e16386eb226d0f10c8731shiqian// only), and return an appropriate error message when they fail. 15664b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15674b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult IsSubstring( 15684b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* needle_expr, const char* haystack_expr, 15694b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* needle, const char* haystack) { 15704b6829f0d28990dd645e16386eb226d0f10c8731shiqian return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); 15714b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 15724b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15734b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult IsSubstring( 15744b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* needle_expr, const char* haystack_expr, 15754b6829f0d28990dd645e16386eb226d0f10c8731shiqian const wchar_t* needle, const wchar_t* haystack) { 15764b6829f0d28990dd645e16386eb226d0f10c8731shiqian return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); 15774b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 15784b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15794b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult IsNotSubstring( 15804b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* needle_expr, const char* haystack_expr, 15814b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* needle, const char* haystack) { 15824b6829f0d28990dd645e16386eb226d0f10c8731shiqian return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); 15834b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 15844b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15854b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult IsNotSubstring( 15864b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* needle_expr, const char* haystack_expr, 15874b6829f0d28990dd645e16386eb226d0f10c8731shiqian const wchar_t* needle, const wchar_t* haystack) { 15884b6829f0d28990dd645e16386eb226d0f10c8731shiqian return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); 15894b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 15904b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15914b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult IsSubstring( 15924b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* needle_expr, const char* haystack_expr, 15934b6829f0d28990dd645e16386eb226d0f10c8731shiqian const ::std::string& needle, const ::std::string& haystack) { 15944b6829f0d28990dd645e16386eb226d0f10c8731shiqian return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); 15954b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 15964b6829f0d28990dd645e16386eb226d0f10c8731shiqian 15974b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult IsNotSubstring( 15984b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* needle_expr, const char* haystack_expr, 15994b6829f0d28990dd645e16386eb226d0f10c8731shiqian const ::std::string& needle, const ::std::string& haystack) { 16004b6829f0d28990dd645e16386eb226d0f10c8731shiqian return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); 16014b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 16024b6829f0d28990dd645e16386eb226d0f10c8731shiqian 16034b6829f0d28990dd645e16386eb226d0f10c8731shiqian#if GTEST_HAS_STD_WSTRING 16044b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult IsSubstring( 16054b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* needle_expr, const char* haystack_expr, 16064b6829f0d28990dd645e16386eb226d0f10c8731shiqian const ::std::wstring& needle, const ::std::wstring& haystack) { 16074b6829f0d28990dd645e16386eb226d0f10c8731shiqian return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); 16084b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 16094b6829f0d28990dd645e16386eb226d0f10c8731shiqian 16104b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult IsNotSubstring( 16114b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* needle_expr, const char* haystack_expr, 16124b6829f0d28990dd645e16386eb226d0f10c8731shiqian const ::std::wstring& needle, const ::std::wstring& haystack) { 16134b6829f0d28990dd645e16386eb226d0f10c8731shiqian return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); 16144b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 16154b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif // GTEST_HAS_STD_WSTRING 16164b6829f0d28990dd645e16386eb226d0f10c8731shiqian 16174b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace internal { 16184b6829f0d28990dd645e16386eb226d0f10c8731shiqian 16194cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_OS_WINDOWS 16204b6829f0d28990dd645e16386eb226d0f10c8731shiqian 16214b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace { 16224b6829f0d28990dd645e16386eb226d0f10c8731shiqian 16234b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Helper function for IsHRESULT{SuccessFailure} predicates 16244b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult HRESULTFailureHelper(const char* expr, 16254b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* expected, 16264b6829f0d28990dd645e16386eb226d0f10c8731shiqian long hr) { // NOLINT 1627733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if GTEST_OS_WINDOWS_MOBILE 1628733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 16294b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Windows CE doesn't support FormatMessage. 16304b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char error_text[] = ""; 1631733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 1632733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# else 1633733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 16344b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Looks up the human-readable system message for the HRESULT code 16354b6829f0d28990dd645e16386eb226d0f10c8731shiqian // and since we're not passing any params to FormatMessage, we don't 16364b6829f0d28990dd645e16386eb226d0f10c8731shiqian // want inserts expanded. 16374b6829f0d28990dd645e16386eb226d0f10c8731shiqian const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM | 16384b6829f0d28990dd645e16386eb226d0f10c8731shiqian FORMAT_MESSAGE_IGNORE_INSERTS; 16393b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com const DWORD kBufSize = 4096; 16404b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Gets the system's human readable message string for this HRESULT. 16414b6829f0d28990dd645e16386eb226d0f10c8731shiqian char error_text[kBufSize] = { '\0' }; 16424b6829f0d28990dd645e16386eb226d0f10c8731shiqian DWORD message_length = ::FormatMessageA(kFlags, 16434b6829f0d28990dd645e16386eb226d0f10c8731shiqian 0, // no source, we're asking system 16444b6829f0d28990dd645e16386eb226d0f10c8731shiqian hr, // the error 16454b6829f0d28990dd645e16386eb226d0f10c8731shiqian 0, // no line width restrictions 16464b6829f0d28990dd645e16386eb226d0f10c8731shiqian error_text, // output buffer 16474b6829f0d28990dd645e16386eb226d0f10c8731shiqian kBufSize, // buf size 16484b6829f0d28990dd645e16386eb226d0f10c8731shiqian NULL); // no arguments for inserts 16493b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com // Trims tailing white space (FormatMessage leaves a trailing CR-LF) 16505d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan for (; message_length && IsSpace(error_text[message_length - 1]); 16514b6829f0d28990dd645e16386eb226d0f10c8731shiqian --message_length) { 16524b6829f0d28990dd645e16386eb226d0f10c8731shiqian error_text[message_length - 1] = '\0'; 16534b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 1654733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 1655733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif // GTEST_OS_WINDOWS_MOBILE 16564b6829f0d28990dd645e16386eb226d0f10c8731shiqian 16573b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com const std::string error_hex("0x" + String::FormatHexInt(hr)); 16583928282cf0323a42e85e7885bddc54409021166fzhanyong.wan return ::testing::AssertionFailure() 16593928282cf0323a42e85e7885bddc54409021166fzhanyong.wan << "Expected: " << expr << " " << expected << ".\n" 16603b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com << " Actual: " << error_hex << " " << error_text << "\n"; 16614b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 16624b6829f0d28990dd645e16386eb226d0f10c8731shiqian 16634b6829f0d28990dd645e16386eb226d0f10c8731shiqian} // namespace 16644b6829f0d28990dd645e16386eb226d0f10c8731shiqian 16654b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult IsHRESULTSuccess(const char* expr, long hr) { // NOLINT 16664b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (SUCCEEDED(hr)) { 16674b6829f0d28990dd645e16386eb226d0f10c8731shiqian return AssertionSuccess(); 16684b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 16694b6829f0d28990dd645e16386eb226d0f10c8731shiqian return HRESULTFailureHelper(expr, "succeeds", hr); 16704b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 16714b6829f0d28990dd645e16386eb226d0f10c8731shiqian 16724b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult IsHRESULTFailure(const char* expr, long hr) { // NOLINT 16734b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (FAILED(hr)) { 16744b6829f0d28990dd645e16386eb226d0f10c8731shiqian return AssertionSuccess(); 16754b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 16764b6829f0d28990dd645e16386eb226d0f10c8731shiqian return HRESULTFailureHelper(expr, "fails", hr); 16774b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 16784b6829f0d28990dd645e16386eb226d0f10c8731shiqian 16794b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif // GTEST_OS_WINDOWS 16804b6829f0d28990dd645e16386eb226d0f10c8731shiqian 16814b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Utility functions for encoding Unicode text (wide strings) in 16824b6829f0d28990dd645e16386eb226d0f10c8731shiqian// UTF-8. 16834b6829f0d28990dd645e16386eb226d0f10c8731shiqian 16844b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8 16854b6829f0d28990dd645e16386eb226d0f10c8731shiqian// like this: 16864b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 16874b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Code-point length Encoding 16884b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 0 - 7 bits 0xxxxxxx 16894b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 8 - 11 bits 110xxxxx 10xxxxxx 16904b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 12 - 16 bits 1110xxxx 10xxxxxx 10xxxxxx 16914b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 17 - 21 bits 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 16924b6829f0d28990dd645e16386eb226d0f10c8731shiqian 16934b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The maximum code-point a one-byte UTF-8 sequence can represent. 16944b6829f0d28990dd645e16386eb226d0f10c8731shiqianconst UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) << 7) - 1; 16954b6829f0d28990dd645e16386eb226d0f10c8731shiqian 16964b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The maximum code-point a two-byte UTF-8 sequence can represent. 16974b6829f0d28990dd645e16386eb226d0f10c8731shiqianconst UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1; 16984b6829f0d28990dd645e16386eb226d0f10c8731shiqian 16994b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The maximum code-point a three-byte UTF-8 sequence can represent. 17004b6829f0d28990dd645e16386eb226d0f10c8731shiqianconst UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1; 17014b6829f0d28990dd645e16386eb226d0f10c8731shiqian 17024b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The maximum code-point a four-byte UTF-8 sequence can represent. 17034b6829f0d28990dd645e16386eb226d0f10c8731shiqianconst UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1; 17044b6829f0d28990dd645e16386eb226d0f10c8731shiqian 17054b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Chops off the n lowest bits from a bit pattern. Returns the n 17064b6829f0d28990dd645e16386eb226d0f10c8731shiqian// lowest bits. As a side effect, the original bit pattern will be 17074b6829f0d28990dd645e16386eb226d0f10c8731shiqian// shifted to the right by n bits. 17084b6829f0d28990dd645e16386eb226d0f10c8731shiqianinline UInt32 ChopLowBits(UInt32* bits, int n) { 17094b6829f0d28990dd645e16386eb226d0f10c8731shiqian const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1); 17104b6829f0d28990dd645e16386eb226d0f10c8731shiqian *bits >>= n; 17114b6829f0d28990dd645e16386eb226d0f10c8731shiqian return low_bits; 17124b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 17134b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1714e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Converts a Unicode code point to a narrow string in UTF-8 encoding. 1715e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// code_point parameter is of type UInt32 because wchar_t may not be 1716e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// wide enough to contain a code point. 1717e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// If the code_point is not a valid Unicode code point 17183b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted 17193b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com// to "(Invalid Unicode 0xXXXXXXXX)". 17203b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.comstd::string CodePointToUtf8(UInt32 code_point) { 17213b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com if (code_point > kMaxCodePoint4) { 17223b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com return "(Invalid Unicode 0x" + String::FormatHexInt(code_point) + ")"; 17233b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com } 17243b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com 17253b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com char str[5]; // Big enough for the largest valid code point. 1726e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev if (code_point <= kMaxCodePoint1) { 1727e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev str[1] = '\0'; 1728e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev str[0] = static_cast<char>(code_point); // 0xxxxxxx 1729e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev } else if (code_point <= kMaxCodePoint2) { 1730e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev str[2] = '\0'; 1731e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx 1732e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev str[0] = static_cast<char>(0xC0 | code_point); // 110xxxxx 1733e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev } else if (code_point <= kMaxCodePoint3) { 1734e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev str[3] = '\0'; 1735e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx 1736e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx 1737e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev str[0] = static_cast<char>(0xE0 | code_point); // 1110xxxx 17383b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com } else { // code_point <= kMaxCodePoint4 1739e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev str[4] = '\0'; 1740e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx 1741e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx 1742e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx 1743e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev str[0] = static_cast<char>(0xF0 | code_point); // 11110xxx 17444b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 1745e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev return str; 1746e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev} 1747e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev 1748e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// The following two functions only make sense if the the system 1749e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// uses UTF-16 for wide string encoding. All supported systems 1750e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16. 17514b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1752e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Determines if the arguments constitute UTF-16 surrogate pair 1753e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// and thus should be combined into a single Unicode code point 1754e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// using CreateCodePointFromUtf16SurrogatePair. 1755e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevinline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) { 1756b0a12f719caf4e37894868334ce41b1864b0be53zhanyong.wan return sizeof(wchar_t) == 2 && 1757b0a12f719caf4e37894868334ce41b1864b0be53zhanyong.wan (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00; 1758e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev} 1759e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev 1760e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Creates a Unicode code point from UTF16 surrogate pair. 1761e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosevinline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first, 1762e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev wchar_t second) { 1763b0a12f719caf4e37894868334ce41b1864b0be53zhanyong.wan const UInt32 mask = (1 << 10) - 1; 1764b0a12f719caf4e37894868334ce41b1864b0be53zhanyong.wan return (sizeof(wchar_t) == 2) ? 1765b0a12f719caf4e37894868334ce41b1864b0be53zhanyong.wan (((first & mask) << 10) | (second & mask)) + 0x10000 : 1766b0a12f719caf4e37894868334ce41b1864b0be53zhanyong.wan // This function should not be called when the condition is 1767b0a12f719caf4e37894868334ce41b1864b0be53zhanyong.wan // false, but we provide a sensible default in case it is. 1768b0a12f719caf4e37894868334ce41b1864b0be53zhanyong.wan static_cast<UInt32>(first); 1769e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev} 1770e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev 1771e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Converts a wide string to a narrow string in UTF-8 encoding. 1772e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// The wide string is assumed to have the following encoding: 1773e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS) 1774e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// UTF-32 if sizeof(wchar_t) == 4 (on Linux) 1775e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Parameter str points to a null-terminated wide string. 1776e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// Parameter num_chars may additionally limit the number 1777e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// of wchar_t characters processed. -1 is used when the entire string 1778e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// should be processed. 1779e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// If the string contains code points that are not valid Unicode code points 1780e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output 1781e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding 1782e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// and contains invalid UTF-16 surrogate pairs, values in those pairs 1783e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev// will be encoded as individual Unicode characters from Basic Normal Plane. 178403c314931649a999b0cf5deb0a434a1009157416jgm@google.comstd::string WideStringToUtf8(const wchar_t* str, int num_chars) { 1785e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev if (num_chars == -1) 1786f904a612d9444ab36c07a8e619c113432e046f49vladlosev num_chars = static_cast<int>(wcslen(str)); 1787e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev 1788b15c73341d7a7abff7a04e1de18de59ba0f34009zhanyong.wan ::std::stringstream stream; 1789e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev for (int i = 0; i < num_chars; ++i) { 1790e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev UInt32 unicode_code_point; 1791e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev 1792e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev if (str[i] == L'\0') { 1793e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev break; 1794e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) { 1795e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i], 1796e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev str[i + 1]); 1797e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev i++; 1798e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev } else { 1799e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev unicode_code_point = static_cast<UInt32>(str[i]); 1800e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev } 1801e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev 18023b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com stream << CodePointToUtf8(unicode_code_point); 1803e006e686a4230b548709d6ba2d42bfdf4f9f1638vladlosev } 1804b15c73341d7a7abff7a04e1de18de59ba0f34009zhanyong.wan return StringStreamToString(&stream); 18054b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 18064b6829f0d28990dd645e16386eb226d0f10c8731shiqian 180703c314931649a999b0cf5deb0a434a1009157416jgm@google.com// Converts a wide C string to an std::string using the UTF-8 encoding. 18084b6829f0d28990dd645e16386eb226d0f10c8731shiqian// NULL will be converted to "(null)". 180903c314931649a999b0cf5deb0a434a1009157416jgm@google.comstd::string String::ShowWideCString(const wchar_t * wide_c_str) { 181003c314931649a999b0cf5deb0a434a1009157416jgm@google.com if (wide_c_str == NULL) return "(null)"; 18114b6829f0d28990dd645e16386eb226d0f10c8731shiqian 181203c314931649a999b0cf5deb0a434a1009157416jgm@google.com return internal::WideStringToUtf8(wide_c_str, -1); 18134b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 18144b6829f0d28990dd645e16386eb226d0f10c8731shiqian 18154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Compares two wide C strings. Returns true iff they have the same 18164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// content. 18174b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 18184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Unlike wcscmp(), this function can handle NULL argument(s). A NULL 18194b6829f0d28990dd645e16386eb226d0f10c8731shiqian// C string is considered different to any non-NULL C string, 18204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// including the empty string. 18214b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) { 18224b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (lhs == NULL) return rhs == NULL; 18234b6829f0d28990dd645e16386eb226d0f10c8731shiqian 18244b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (rhs == NULL) return false; 18254b6829f0d28990dd645e16386eb226d0f10c8731shiqian 18264b6829f0d28990dd645e16386eb226d0f10c8731shiqian return wcscmp(lhs, rhs) == 0; 18274b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 18284b6829f0d28990dd645e16386eb226d0f10c8731shiqian 18294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Helper function for *_STREQ on wide strings. 18304b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult CmpHelperSTREQ(const char* expected_expression, 18314b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* actual_expression, 18324b6829f0d28990dd645e16386eb226d0f10c8731shiqian const wchar_t* expected, 18334b6829f0d28990dd645e16386eb226d0f10c8731shiqian const wchar_t* actual) { 18344b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (String::WideCStringEquals(expected, actual)) { 18354b6829f0d28990dd645e16386eb226d0f10c8731shiqian return AssertionSuccess(); 18364b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 18374b6829f0d28990dd645e16386eb226d0f10c8731shiqian 18384b6829f0d28990dd645e16386eb226d0f10c8731shiqian return EqFailure(expected_expression, 18394b6829f0d28990dd645e16386eb226d0f10c8731shiqian actual_expression, 18406b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan PrintToString(expected), 18416b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan PrintToString(actual), 18424b6829f0d28990dd645e16386eb226d0f10c8731shiqian false); 18434b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 18444b6829f0d28990dd645e16386eb226d0f10c8731shiqian 18454b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Helper function for *_STRNE on wide strings. 18464b6829f0d28990dd645e16386eb226d0f10c8731shiqianAssertionResult CmpHelperSTRNE(const char* s1_expression, 18474b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* s2_expression, 18484b6829f0d28990dd645e16386eb226d0f10c8731shiqian const wchar_t* s1, 18494b6829f0d28990dd645e16386eb226d0f10c8731shiqian const wchar_t* s2) { 18504b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (!String::WideCStringEquals(s1, s2)) { 18514b6829f0d28990dd645e16386eb226d0f10c8731shiqian return AssertionSuccess(); 18524b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 18534b6829f0d28990dd645e16386eb226d0f10c8731shiqian 18543928282cf0323a42e85e7885bddc54409021166fzhanyong.wan return AssertionFailure() << "Expected: (" << s1_expression << ") != (" 18553928282cf0323a42e85e7885bddc54409021166fzhanyong.wan << s2_expression << "), actual: " 18566b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan << PrintToString(s1) 18576b625a794e8a0e314f3ccc2f6a892f4a40a7e788zhanyong.wan << " vs " << PrintToString(s2); 18584b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 18594b6829f0d28990dd645e16386eb226d0f10c8731shiqian 18604b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Compares two C strings, ignoring case. Returns true iff they have 18614b6829f0d28990dd645e16386eb226d0f10c8731shiqian// the same content. 18624b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 18634b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Unlike strcasecmp(), this function can handle NULL argument(s). A 18644b6829f0d28990dd645e16386eb226d0f10c8731shiqian// NULL C string is considered different to any non-NULL C string, 18654b6829f0d28990dd645e16386eb226d0f10c8731shiqian// including the empty string. 18664b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) { 1867a49bf25b24dd239a9da88e783f037d817a6287b0zhanyong.wan if (lhs == NULL) 1868a49bf25b24dd239a9da88e783f037d817a6287b0zhanyong.wan return rhs == NULL; 1869a49bf25b24dd239a9da88e783f037d817a6287b0zhanyong.wan if (rhs == NULL) 1870a49bf25b24dd239a9da88e783f037d817a6287b0zhanyong.wan return false; 1871c7f60f1514013d57a624c3a2966709998678f24bzhanyong.wan return posix::StrCaseCmp(lhs, rhs) == 0; 18724b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 18734b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1874e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // Compares two wide C strings, ignoring case. Returns true iff they 1875e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // have the same content. 1876e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // 1877e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // Unlike wcscasecmp(), this function can handle NULL argument(s). 1878e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // A NULL C string is considered different to any non-NULL wide C string, 1879e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // including the empty string. 1880e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // NB: The implementations on different platforms slightly differ. 1881e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // On windows, this method uses _wcsicmp which compares according to LC_CTYPE 1882e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // environment variable. On GNU platform this method uses wcscasecmp 1883e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // which compares according to LC_CTYPE category of the current locale. 1884e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the 1885e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // current locale. 1886e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianbool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs, 1887e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian const wchar_t* rhs) { 18885d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan if (lhs == NULL) return rhs == NULL; 1889e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 18905d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan if (rhs == NULL) return false; 1891e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 18924cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_OS_WINDOWS 1893e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian return _wcsicmp(lhs, rhs) == 0; 1894585ec31ea716f08233a815e680fc0d4699843938zhanyong.wan#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID 18957291f9d79146744508a910a510b64bb07354435fshiqian return wcscasecmp(lhs, rhs) == 0; 18967291f9d79146744508a910a510b64bb07354435fshiqian#else 1897585ec31ea716f08233a815e680fc0d4699843938zhanyong.wan // Android, Mac OS X and Cygwin don't define wcscasecmp. 1898585ec31ea716f08233a815e680fc0d4699843938zhanyong.wan // Other unknown OSes may not define it either. 1899e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian wint_t left, right; 1900e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian do { 1901e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian left = towlower(*lhs++); 1902e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian right = towlower(*rhs++); 1903e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian } while (left && left == right); 1904e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian return left == right; 1905ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian#endif // OS selector 1906e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian} 1907e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 190803c314931649a999b0cf5deb0a434a1009157416jgm@google.com// Returns true iff str ends with the given suffix, ignoring case. 190903c314931649a999b0cf5deb0a434a1009157416jgm@google.com// Any string is considered to end with an empty suffix. 191003c314931649a999b0cf5deb0a434a1009157416jgm@google.combool String::EndsWithCaseInsensitive( 191103c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string& str, const std::string& suffix) { 191203c314931649a999b0cf5deb0a434a1009157416jgm@google.com const size_t str_len = str.length(); 191303c314931649a999b0cf5deb0a434a1009157416jgm@google.com const size_t suffix_len = suffix.length(); 191403c314931649a999b0cf5deb0a434a1009157416jgm@google.com return (str_len >= suffix_len) && 191503c314931649a999b0cf5deb0a434a1009157416jgm@google.com CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len, 191603c314931649a999b0cf5deb0a434a1009157416jgm@google.com suffix.c_str()); 19174b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 19184b6829f0d28990dd645e16386eb226d0f10c8731shiqian 19193b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com// Formats an int value as "%02d". 19203b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.comstd::string String::FormatIntWidth2(int value) { 19213b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com std::stringstream ss; 19223b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com ss << std::setfill('0') << std::setw(2) << value; 19233b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com return ss.str(); 19243b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com} 1925733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 19263b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com// Formats an int value as "%X". 19273b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.comstd::string String::FormatHexInt(int value) { 19283b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com std::stringstream ss; 19293b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com ss << std::hex << std::uppercase << value; 19303b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com return ss.str(); 19313b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com} 19324b6829f0d28990dd645e16386eb226d0f10c8731shiqian 19333b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com// Formats a byte as "%02X". 19343b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.comstd::string String::FormatByte(unsigned char value) { 19353b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com std::stringstream ss; 19363b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase 19373b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com << static_cast<unsigned int>(value); 19383b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com return ss.str(); 19394b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 19404b6829f0d28990dd645e16386eb226d0f10c8731shiqian 194103c314931649a999b0cf5deb0a434a1009157416jgm@google.com// Converts the buffer in a stringstream to an std::string, converting NUL 19424b6829f0d28990dd645e16386eb226d0f10c8731shiqian// bytes to "\\0" along the way. 194303c314931649a999b0cf5deb0a434a1009157416jgm@google.comstd::string StringStreamToString(::std::stringstream* ss) { 19444b6829f0d28990dd645e16386eb226d0f10c8731shiqian const ::std::string& str = ss->str(); 19454b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* const start = str.c_str(); 19464b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* const end = start + str.length(); 19474b6829f0d28990dd645e16386eb226d0f10c8731shiqian 194803c314931649a999b0cf5deb0a434a1009157416jgm@google.com std::string result; 194903c314931649a999b0cf5deb0a434a1009157416jgm@google.com result.reserve(2 * (end - start)); 19504b6829f0d28990dd645e16386eb226d0f10c8731shiqian for (const char* ch = start; ch != end; ++ch) { 19514b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (*ch == '\0') { 195203c314931649a999b0cf5deb0a434a1009157416jgm@google.com result += "\\0"; // Replaces NUL with "\\0"; 19534b6829f0d28990dd645e16386eb226d0f10c8731shiqian } else { 195403c314931649a999b0cf5deb0a434a1009157416jgm@google.com result += *ch; 19554b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 19564b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 19574b6829f0d28990dd645e16386eb226d0f10c8731shiqian 195803c314931649a999b0cf5deb0a434a1009157416jgm@google.com return result; 19594b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 19604b6829f0d28990dd645e16386eb226d0f10c8731shiqian 19614b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Appends the user-supplied message to the Google-Test-generated message. 196203c314931649a999b0cf5deb0a434a1009157416jgm@google.comstd::string AppendUserMessage(const std::string& gtest_msg, 196303c314931649a999b0cf5deb0a434a1009157416jgm@google.com const Message& user_msg) { 19644b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Appends the user message if it's non-empty. 196503c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string user_msg_string = user_msg.GetString(); 19664b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (user_msg_string.empty()) { 19674b6829f0d28990dd645e16386eb226d0f10c8731shiqian return gtest_msg; 19684b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 19694b6829f0d28990dd645e16386eb226d0f10c8731shiqian 197003c314931649a999b0cf5deb0a434a1009157416jgm@google.com return gtest_msg + "\n" + user_msg_string; 19714b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 19724b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1973fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan} // namespace internal 1974fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan 19754b6829f0d28990dd645e16386eb226d0f10c8731shiqian// class TestResult 19764b6829f0d28990dd645e16386eb226d0f10c8731shiqian 19774b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Creates an empty TestResult. 19784b6829f0d28990dd645e16386eb226d0f10c8731shiqianTestResult::TestResult() 197993d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan : death_test_count_(0), 19804b6829f0d28990dd645e16386eb226d0f10c8731shiqian elapsed_time_(0) { 19814b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 19824b6829f0d28990dd645e16386eb226d0f10c8731shiqian 19834b6829f0d28990dd645e16386eb226d0f10c8731shiqian// D'tor. 19844b6829f0d28990dd645e16386eb226d0f10c8731shiqianTestResult::~TestResult() { 19854b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 19864b6829f0d28990dd645e16386eb226d0f10c8731shiqian 1987449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan// Returns the i-th test part result among all the results. i can 1988449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan// range from 0 to total_part_count() - 1. If i is not in that range, 1989449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan// aborts the program. 1990449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wanconst TestPartResult& TestResult::GetTestPartResult(int i) const { 1991dd40afa307d95e1fae723b719ffc1af389e41ce6zhanyong.wan if (i < 0 || i >= total_part_count()) 1992dd40afa307d95e1fae723b719ffc1af389e41ce6zhanyong.wan internal::posix::Abort(); 199393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan return test_part_results_.at(i); 19949644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan} 19959644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan 19969644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Returns the i-th test property. i can range from 0 to 1997449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan// test_property_count() - 1. If i is not in that range, aborts the 1998449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan// program. 1999449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wanconst TestProperty& TestResult::GetTestProperty(int i) const { 2000dd40afa307d95e1fae723b719ffc1af389e41ce6zhanyong.wan if (i < 0 || i >= test_property_count()) 2001dd40afa307d95e1fae723b719ffc1af389e41ce6zhanyong.wan internal::posix::Abort(); 200293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan return test_properties_.at(i); 20039644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan} 20049644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan 2005535de1065311cc5e95e84811dc05f513393fa940zhanyong.wan// Clears the test part results. 2006535de1065311cc5e95e84811dc05f513393fa940zhanyong.wanvoid TestResult::ClearTestPartResults() { 200793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan test_part_results_.clear(); 2008535de1065311cc5e95e84811dc05f513393fa940zhanyong.wan} 2009535de1065311cc5e95e84811dc05f513393fa940zhanyong.wan 20104b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Adds a test part result to the list. 20114b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid TestResult::AddTestPartResult(const TestPartResult& test_part_result) { 201293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan test_part_results_.push_back(test_part_result); 20134b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 20144b6829f0d28990dd645e16386eb226d0f10c8731shiqian 20154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Adds a test property to the list. If a property with the same key as the 20164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// supplied property is already represented, the value of this test_property 20174b6829f0d28990dd645e16386eb226d0f10c8731shiqian// replaces the old value for that key. 2018dfbdf0bab51520595679a99710983daba6fc18ebvladlosevvoid TestResult::RecordProperty(const std::string& xml_element, 2019dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const TestProperty& test_property) { 2020dfbdf0bab51520595679a99710983daba6fc18ebvladlosev if (!ValidateTestProperty(xml_element, test_property)) { 20214b6829f0d28990dd645e16386eb226d0f10c8731shiqian return; 20224b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 20231cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan internal::MutexLock lock(&test_properites_mutex_); 202493d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan const std::vector<TestProperty>::iterator property_with_matching_key = 202593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan std::find_if(test_properties_.begin(), test_properties_.end(), 202693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan internal::TestPropertyKeyIs(test_property.key())); 202793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan if (property_with_matching_key == test_properties_.end()) { 202893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan test_properties_.push_back(test_property); 20294b6829f0d28990dd645e16386eb226d0f10c8731shiqian return; 20304b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 2031449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan property_with_matching_key->SetValue(test_property.value()); 20324b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 20334b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2034dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// The list of reserved attributes used in the <testsuites> element of XML 2035dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// output. 2036dfbdf0bab51520595679a99710983daba6fc18ebvladlosevstatic const char* const kReservedTestSuitesAttributes[] = { 2037dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "disabled", 2038dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "errors", 2039dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "failures", 2040dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "name", 2041dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "random_seed", 2042dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "tests", 2043dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "time", 2044dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "timestamp" 2045dfbdf0bab51520595679a99710983daba6fc18ebvladlosev}; 2046dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 2047dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// The list of reserved attributes used in the <testsuite> element of XML 2048dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// output. 2049dfbdf0bab51520595679a99710983daba6fc18ebvladlosevstatic const char* const kReservedTestSuiteAttributes[] = { 2050dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "disabled", 2051dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "errors", 2052dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "failures", 2053dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "name", 2054dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "tests", 2055dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "time" 2056dfbdf0bab51520595679a99710983daba6fc18ebvladlosev}; 2057dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 2058dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// The list of reserved attributes used in the <testcase> element of XML output. 2059dfbdf0bab51520595679a99710983daba6fc18ebvladlosevstatic const char* const kReservedTestCaseAttributes[] = { 2060dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "classname", 2061dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "name", 2062dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "status", 2063dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "time", 2064dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "type_param", 2065dfbdf0bab51520595679a99710983daba6fc18ebvladlosev "value_param" 2066dfbdf0bab51520595679a99710983daba6fc18ebvladlosev}; 2067dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 2068dfbdf0bab51520595679a99710983daba6fc18ebvladlosevtemplate <int kSize> 2069dfbdf0bab51520595679a99710983daba6fc18ebvladlosevstd::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) { 2070dfbdf0bab51520595679a99710983daba6fc18ebvladlosev return std::vector<std::string>(array, array + kSize); 2071dfbdf0bab51520595679a99710983daba6fc18ebvladlosev} 2072dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 2073dfbdf0bab51520595679a99710983daba6fc18ebvladlosevstatic std::vector<std::string> GetReservedAttributesForElement( 2074dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const std::string& xml_element) { 2075dfbdf0bab51520595679a99710983daba6fc18ebvladlosev if (xml_element == "testsuites") { 2076dfbdf0bab51520595679a99710983daba6fc18ebvladlosev return ArrayAsVector(kReservedTestSuitesAttributes); 2077dfbdf0bab51520595679a99710983daba6fc18ebvladlosev } else if (xml_element == "testsuite") { 2078dfbdf0bab51520595679a99710983daba6fc18ebvladlosev return ArrayAsVector(kReservedTestSuiteAttributes); 2079dfbdf0bab51520595679a99710983daba6fc18ebvladlosev } else if (xml_element == "testcase") { 2080dfbdf0bab51520595679a99710983daba6fc18ebvladlosev return ArrayAsVector(kReservedTestCaseAttributes); 2081dfbdf0bab51520595679a99710983daba6fc18ebvladlosev } else { 2082dfbdf0bab51520595679a99710983daba6fc18ebvladlosev GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element; 2083dfbdf0bab51520595679a99710983daba6fc18ebvladlosev } 2084dfbdf0bab51520595679a99710983daba6fc18ebvladlosev // This code is unreachable but some compilers may not realizes that. 2085dfbdf0bab51520595679a99710983daba6fc18ebvladlosev return std::vector<std::string>(); 2086dfbdf0bab51520595679a99710983daba6fc18ebvladlosev} 2087dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 2088dfbdf0bab51520595679a99710983daba6fc18ebvladlosevstatic std::string FormatWordList(const std::vector<std::string>& words) { 2089dfbdf0bab51520595679a99710983daba6fc18ebvladlosev Message word_list; 2090dfbdf0bab51520595679a99710983daba6fc18ebvladlosev for (size_t i = 0; i < words.size(); ++i) { 2091dfbdf0bab51520595679a99710983daba6fc18ebvladlosev if (i > 0 && words.size() > 2) { 2092dfbdf0bab51520595679a99710983daba6fc18ebvladlosev word_list << ", "; 2093dfbdf0bab51520595679a99710983daba6fc18ebvladlosev } 2094dfbdf0bab51520595679a99710983daba6fc18ebvladlosev if (i == words.size() - 1) { 2095dfbdf0bab51520595679a99710983daba6fc18ebvladlosev word_list << "and "; 2096dfbdf0bab51520595679a99710983daba6fc18ebvladlosev } 2097dfbdf0bab51520595679a99710983daba6fc18ebvladlosev word_list << "'" << words[i] << "'"; 2098dfbdf0bab51520595679a99710983daba6fc18ebvladlosev } 2099dfbdf0bab51520595679a99710983daba6fc18ebvladlosev return word_list.GetString(); 2100dfbdf0bab51520595679a99710983daba6fc18ebvladlosev} 2101dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 2102dfbdf0bab51520595679a99710983daba6fc18ebvladlosevbool ValidateTestPropertyName(const std::string& property_name, 2103dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const std::vector<std::string>& reserved_names) { 2104dfbdf0bab51520595679a99710983daba6fc18ebvladlosev if (std::find(reserved_names.begin(), reserved_names.end(), property_name) != 2105dfbdf0bab51520595679a99710983daba6fc18ebvladlosev reserved_names.end()) { 2106dfbdf0bab51520595679a99710983daba6fc18ebvladlosev ADD_FAILURE() << "Reserved key used in RecordProperty(): " << property_name 2107dfbdf0bab51520595679a99710983daba6fc18ebvladlosev << " (" << FormatWordList(reserved_names) 2108dfbdf0bab51520595679a99710983daba6fc18ebvladlosev << " are reserved by " << GTEST_NAME_ << ")"; 21094b6829f0d28990dd645e16386eb226d0f10c8731shiqian return false; 21104b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 21114b6829f0d28990dd645e16386eb226d0f10c8731shiqian return true; 21124b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 21134b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2114dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// Adds a failure if the key is a reserved attribute of the element named 2115dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// xml_element. Returns true if the property is valid. 2116dfbdf0bab51520595679a99710983daba6fc18ebvladlosevbool TestResult::ValidateTestProperty(const std::string& xml_element, 2117dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const TestProperty& test_property) { 2118dfbdf0bab51520595679a99710983daba6fc18ebvladlosev return ValidateTestPropertyName(test_property.key(), 2119dfbdf0bab51520595679a99710983daba6fc18ebvladlosev GetReservedAttributesForElement(xml_element)); 2120dfbdf0bab51520595679a99710983daba6fc18ebvladlosev} 2121dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 21224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Clears the object. 21234b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid TestResult::Clear() { 212493d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan test_part_results_.clear(); 212593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan test_properties_.clear(); 21264b6829f0d28990dd645e16386eb226d0f10c8731shiqian death_test_count_ = 0; 21274b6829f0d28990dd645e16386eb226d0f10c8731shiqian elapsed_time_ = 0; 21284b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 21294b6829f0d28990dd645e16386eb226d0f10c8731shiqian 21301cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan// Returns true iff the test failed. 21311cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wanbool TestResult::Failed() const { 21321cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan for (int i = 0; i < total_part_count(); ++i) { 21331cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan if (GetTestPartResult(i).failed()) 21341cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan return true; 21351cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan } 21361cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan return false; 21374b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 21384b6829f0d28990dd645e16386eb226d0f10c8731shiqian 21394b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns true iff the test part fatally failed. 21401b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanstatic bool TestPartFatallyFailed(const TestPartResult& result) { 21414b6829f0d28990dd645e16386eb226d0f10c8731shiqian return result.fatally_failed(); 21424b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 21434b6829f0d28990dd645e16386eb226d0f10c8731shiqian 21444b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns true iff the test fatally failed. 21454b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool TestResult::HasFatalFailure() const { 214693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan return CountIf(test_part_results_, TestPartFatallyFailed) > 0; 21474b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 21484b6829f0d28990dd645e16386eb226d0f10c8731shiqian 21491b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan// Returns true iff the test part non-fatally failed. 21501b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanstatic bool TestPartNonfatallyFailed(const TestPartResult& result) { 21511b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan return result.nonfatally_failed(); 21521b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan} 21531b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan 21541b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan// Returns true iff the test has a non-fatal failure. 21551b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanbool TestResult::HasNonfatalFailure() const { 215693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0; 21571b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan} 21581b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan 21594b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Gets the number of all test parts. This is the sum of the number 21604b6829f0d28990dd645e16386eb226d0f10c8731shiqian// of successful test parts and the number of failed test parts. 21614b6829f0d28990dd645e16386eb226d0f10c8731shiqianint TestResult::total_part_count() const { 2162b03ca47c10be432be5d984cb91ce22c81dfa2252zhanyong.wan return static_cast<int>(test_part_results_.size()); 21634b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 21644b6829f0d28990dd645e16386eb226d0f10c8731shiqian 21659644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Returns the number of the test properties. 21669644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanint TestResult::test_property_count() const { 2167b03ca47c10be432be5d984cb91ce22c81dfa2252zhanyong.wan return static_cast<int>(test_properties_.size()); 21689644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan} 21699644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan 21704b6829f0d28990dd645e16386eb226d0f10c8731shiqian// class Test 21714b6829f0d28990dd645e16386eb226d0f10c8731shiqian 21724b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Creates a Test object. 21734b6829f0d28990dd645e16386eb226d0f10c8731shiqian 21744b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The c'tor saves the values of all Google Test flags. 21754b6829f0d28990dd645e16386eb226d0f10c8731shiqianTest::Test() 21764b6829f0d28990dd645e16386eb226d0f10c8731shiqian : gtest_flag_saver_(new internal::GTestFlagSaver) { 21774b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 21784b6829f0d28990dd645e16386eb226d0f10c8731shiqian 21794b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The d'tor restores the values of all Google Test flags. 21804b6829f0d28990dd645e16386eb226d0f10c8731shiqianTest::~Test() { 21814b6829f0d28990dd645e16386eb226d0f10c8731shiqian delete gtest_flag_saver_; 21824b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 21834b6829f0d28990dd645e16386eb226d0f10c8731shiqian 21844b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Sets up the test fixture. 21854b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 21864b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A sub-class may override this. 21874b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid Test::SetUp() { 21884b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 21894b6829f0d28990dd645e16386eb226d0f10c8731shiqian 21904b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Tears down the test fixture. 21914b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 21924b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A sub-class may override this. 21934b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid Test::TearDown() { 21944b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 21954b6829f0d28990dd645e16386eb226d0f10c8731shiqian 21964b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Allows user supplied key value pairs to be recorded for later output. 2197dfbdf0bab51520595679a99710983daba6fc18ebvladlosevvoid Test::RecordProperty(const std::string& key, const std::string& value) { 2198dfbdf0bab51520595679a99710983daba6fc18ebvladlosev UnitTest::GetInstance()->RecordProperty(key, value); 21994b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 22004b6829f0d28990dd645e16386eb226d0f10c8731shiqian 22014b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Allows user supplied key value pairs to be recorded for later output. 2202dfbdf0bab51520595679a99710983daba6fc18ebvladlosevvoid Test::RecordProperty(const std::string& key, int value) { 22034b6829f0d28990dd645e16386eb226d0f10c8731shiqian Message value_message; 22044b6829f0d28990dd645e16386eb226d0f10c8731shiqian value_message << value; 22054b6829f0d28990dd645e16386eb226d0f10c8731shiqian RecordProperty(key, value_message.GetString().c_str()); 22064b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 22074b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2208a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wannamespace internal { 2209a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan 2210334aaead71ccf797a18f2128c320f0304e724860zhanyong.wanvoid ReportFailureInUnknownLocation(TestPartResult::Type result_type, 221103c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string& message) { 2212a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan // This function is a friend of UnitTest and as such has access to 2213a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan // AddTestPartResult. 2214a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan UnitTest::GetInstance()->AddTestPartResult( 2215a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan result_type, 2216a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan NULL, // No info about the source file where the exception occurred. 2217a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan -1, // We have no info on which line caused the exception. 2218a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan message, 221903c314931649a999b0cf5deb0a434a1009157416jgm@google.com ""); // No stack trace, either. 2220a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan} 2221a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan 2222a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan} // namespace internal 2223a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan 22244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Google Test requires all tests in the same test case to use the same test 22254b6829f0d28990dd645e16386eb226d0f10c8731shiqian// fixture class. This function checks if the current test has the 22264b6829f0d28990dd645e16386eb226d0f10c8731shiqian// same fixture class as the first test in the current test case. If 22274b6829f0d28990dd645e16386eb226d0f10c8731shiqian// yes, it returns true; otherwise it generates a Google Test failure and 22284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// returns false. 22294b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool Test::HasSameFixtureClass() { 22304b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); 22314b6829f0d28990dd645e16386eb226d0f10c8731shiqian const TestCase* const test_case = impl->current_test_case(); 22324b6829f0d28990dd645e16386eb226d0f10c8731shiqian 22334b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Info about the first test in the current test case. 2234739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan const TestInfo* const first_test_info = test_case->test_info_list()[0]; 2235739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_; 22364b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* const first_test_name = first_test_info->name(); 22374b6829f0d28990dd645e16386eb226d0f10c8731shiqian 22384b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Info about the current test. 2239739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan const TestInfo* const this_test_info = impl->current_test_info(); 2240739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_; 22414b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* const this_test_name = this_test_info->name(); 22424b6829f0d28990dd645e16386eb226d0f10c8731shiqian 22434b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (this_fixture_id != first_fixture_id) { 22444b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Is the first test defined using TEST? 2245fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId(); 22464b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Is this test defined using TEST? 2247fe6a9a48c2a8280439e58c2e9020268a80df89b3shiqian const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId(); 22484b6829f0d28990dd645e16386eb226d0f10c8731shiqian 22494b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (first_is_TEST || this_is_TEST) { 22502f9c469cd2ac136ca4b496b8682a316ce6bf466dkosak@google.com // Both TEST and TEST_F appear in same test case, which is incorrect. 22512f9c469cd2ac136ca4b496b8682a316ce6bf466dkosak@google.com // Tell the user how to fix this. 22524b6829f0d28990dd645e16386eb226d0f10c8731shiqian 22534b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Gets the name of the TEST and the name of the TEST_F. Note 22544b6829f0d28990dd645e16386eb226d0f10c8731shiqian // that first_is_TEST and this_is_TEST cannot both be true, as 22554b6829f0d28990dd645e16386eb226d0f10c8731shiqian // the fixture IDs are different for the two tests. 22564b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* const TEST_name = 22574b6829f0d28990dd645e16386eb226d0f10c8731shiqian first_is_TEST ? first_test_name : this_test_name; 22584b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* const TEST_F_name = 22594b6829f0d28990dd645e16386eb226d0f10c8731shiqian first_is_TEST ? this_test_name : first_test_name; 22604b6829f0d28990dd645e16386eb226d0f10c8731shiqian 22614b6829f0d28990dd645e16386eb226d0f10c8731shiqian ADD_FAILURE() 22624b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "All tests in the same test case must use the same test fixture\n" 22634b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "class, so mixing TEST_F and TEST in the same test case is\n" 22644b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "illegal. In test case " << this_test_info->test_case_name() 22654b6829f0d28990dd645e16386eb226d0f10c8731shiqian << ",\n" 22664b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "test " << TEST_F_name << " is defined using TEST_F but\n" 22674b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "test " << TEST_name << " is defined using TEST. You probably\n" 22684b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "want to change the TEST to TEST_F or move it to another test\n" 22694b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "case."; 22704b6829f0d28990dd645e16386eb226d0f10c8731shiqian } else { 22712f9c469cd2ac136ca4b496b8682a316ce6bf466dkosak@google.com // Two fixture classes with the same name appear in two different 22722f9c469cd2ac136ca4b496b8682a316ce6bf466dkosak@google.com // namespaces, which is not allowed. Tell the user how to fix this. 22734b6829f0d28990dd645e16386eb226d0f10c8731shiqian ADD_FAILURE() 22744b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "All tests in the same test case must use the same test fixture\n" 22754b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "class. However, in test case " 22764b6829f0d28990dd645e16386eb226d0f10c8731shiqian << this_test_info->test_case_name() << ",\n" 22774b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "you defined test " << first_test_name 22784b6829f0d28990dd645e16386eb226d0f10c8731shiqian << " and test " << this_test_name << "\n" 22794b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "using two different test fixture classes. This can happen if\n" 22804b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "the two classes are from different namespaces or translation\n" 22814b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "units and have the same name. You should probably rename one\n" 22824b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "of the classes to put the tests into different test cases."; 22834b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 22844b6829f0d28990dd645e16386eb226d0f10c8731shiqian return false; 22854b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 22864b6829f0d28990dd645e16386eb226d0f10c8731shiqian 22874b6829f0d28990dd645e16386eb226d0f10c8731shiqian return true; 22884b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 22894b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2290739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#if GTEST_HAS_SEH 22914b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2292739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// Adds an "exception thrown" fatal failure to the current test. This 2293739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// function returns its result via an output parameter pointer because VC++ 2294739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// prohibits creation of objects with destructors on stack in functions 2295739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// using __try (see error C2712). 229603c314931649a999b0cf5deb0a434a1009157416jgm@google.comstatic std::string* FormatSehExceptionMessage(DWORD exception_code, 229703c314931649a999b0cf5deb0a434a1009157416jgm@google.com const char* location) { 2298739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan Message message; 2299739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan message << "SEH exception with code 0x" << std::setbase(16) << 2300739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan exception_code << std::setbase(10) << " thrown in " << location << "."; 2301739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 230203c314931649a999b0cf5deb0a434a1009157416jgm@google.com return new std::string(message.GetString()); 2303739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan} 2304739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 2305739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#endif // GTEST_HAS_SEH 2306739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 2307c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wannamespace internal { 2308c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan 2309739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#if GTEST_HAS_EXCEPTIONS 2310739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 2311739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// Adds an "exception thrown" fatal failure to the current test. 231203c314931649a999b0cf5deb0a434a1009157416jgm@google.comstatic std::string FormatCxxExceptionMessage(const char* description, 231303c314931649a999b0cf5deb0a434a1009157416jgm@google.com const char* location) { 2314739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan Message message; 2315739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan if (description != NULL) { 2316739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan message << "C++ exception with description \"" << description << "\""; 2317739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } else { 2318739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan message << "Unknown C++ exception"; 2319739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } 2320739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan message << " thrown in " << location << "."; 2321739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 2322739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan return message.GetString(); 2323739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan} 2324739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 232503c314931649a999b0cf5deb0a434a1009157416jgm@google.comstatic std::string PrintTestPartResultToString( 2326739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan const TestPartResult& test_part_result); 2327739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 2328c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wanGoogleTestFailureException::GoogleTestFailureException( 2329c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan const TestPartResult& failure) 2330c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {} 2331c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan 2332739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#endif // GTEST_HAS_EXCEPTIONS 2333739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 2334c2df1529d41617b516a4d89241940433b03f10aazhanyong.wan// We put these helper functions in the internal namespace as IBM's xlC 233515f3ae05e214688e834f622d00b6a02b64ce6d53vladlosev// compiler rejects the code if they were declared static. 233615f3ae05e214688e834f622d00b6a02b64ce6d53vladlosev 2337739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// Runs the given method and handles SEH exceptions it throws, when 2338739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// SEH is supported; returns the 0-value for type Result in case of an 2339739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// SEH exception. (Microsoft compilers cannot handle SEH and C++ 2340739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// exceptions in the same function. Therefore, we provide a separate 2341739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// wrapper function for handling SEH exceptions.) 2342739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wantemplate <class T, typename Result> 234315f3ae05e214688e834f622d00b6a02b64ce6d53vladlosevResult HandleSehExceptionsInMethodIfSupported( 2344739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan T* object, Result (T::*method)(), const char* location) { 2345cfe35b311c96348b27ed3cef84c7fb84fe02199ezhanyong.wan#if GTEST_HAS_SEH 23464b6829f0d28990dd645e16386eb226d0f10c8731shiqian __try { 2347739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan return (object->*method)(); 2348739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan } __except (internal::UnitTestOptions::GTestShouldProcessSEH( // NOLINT 23494b6829f0d28990dd645e16386eb226d0f10c8731shiqian GetExceptionCode())) { 2350739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan // We create the exception message on the heap because VC++ prohibits 2351739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan // creation of objects with destructors on stack in functions using __try 2352739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan // (see error C2712). 235303c314931649a999b0cf5deb0a434a1009157416jgm@google.com std::string* exception_message = FormatSehExceptionMessage( 2354739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan GetExceptionCode(), location); 2355739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure, 2356739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan *exception_message); 2357739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan delete exception_message; 2358739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan return static_cast<Result>(0); 23594b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 2360739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#else 2361739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan (void)location; 2362739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan return (object->*method)(); 2363739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#endif // GTEST_HAS_SEH 2364739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan} 23654b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2366739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// Runs the given method and catches and reports C++ and/or SEH-style 2367739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// exceptions, if they are supported; returns the 0-value for type 2368739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// Result in case of an SEH exception. 2369739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wantemplate <class T, typename Result> 237015f3ae05e214688e834f622d00b6a02b64ce6d53vladlosevResult HandleExceptionsInMethodIfSupported( 2371739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan T* object, Result (T::*method)(), const char* location) { 23725d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // NOTE: The user code can affect the way in which Google Test handles 23735d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // exceptions by setting GTEST_FLAG(catch_exceptions), but only before 23745d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // RUN_ALL_TESTS() starts. It is technically possible to check the flag 23755d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // after the exception is caught and either report or re-throw the 23765d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // exception based on the flag's value: 23775d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // 23785d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // try { 23795d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // // Perform the test method. 23805d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // } catch (...) { 23815d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // if (GTEST_FLAG(catch_exceptions)) 23825d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // // Report the exception as failure. 23835d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // else 23845d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // throw; // Re-throws the original exception. 23855d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // } 23865d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // 23875d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // However, the purpose of this flag is to allow the program to drop into 23885d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // the debugger when the exception is thrown. On most platforms, once the 23895d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // control enters the catch block, the exception origin information is 23905d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // lost and the debugger will stop the program at the point of the 23915d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // re-throw in this function -- instead of at the point of the original 23925d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // throw statement in the code under test. For this reason, we perform 23935d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // the check early, sacrificing the ability to affect Google Test's 23945d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // exception handling in the method where the exception is thrown. 23955d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan if (internal::GetUnitTestImpl()->catch_exceptions()) { 2396739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#if GTEST_HAS_EXCEPTIONS 23975d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan try { 23985d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan return HandleSehExceptionsInMethodIfSupported(object, method, location); 2399c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan } catch (const internal::GoogleTestFailureException&) { // NOLINT 2400c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan // This exception type can only be thrown by a failed Google 2401c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan // Test assertion with the intention of letting another testing 2402c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan // framework catch it. Therefore we just re-throw it. 24035d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan throw; 24045d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan } catch (const std::exception& e) { // NOLINT 24055d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan internal::ReportFailureInUnknownLocation( 24065d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan TestPartResult::kFatalFailure, 24075d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan FormatCxxExceptionMessage(e.what(), location)); 24085d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan } catch (...) { // NOLINT 24095d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan internal::ReportFailureInUnknownLocation( 24105d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan TestPartResult::kFatalFailure, 24115d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan FormatCxxExceptionMessage(NULL, location)); 24125d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan } 24135d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan return static_cast<Result>(0); 2414739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#else 24155d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan return HandleSehExceptionsInMethodIfSupported(object, method, location); 2416739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan#endif // GTEST_HAS_EXCEPTIONS 24175d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan } else { 24185d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan return (object->*method)(); 24195d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan } 2420739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan} 24214b6829f0d28990dd645e16386eb226d0f10c8731shiqian 242215f3ae05e214688e834f622d00b6a02b64ce6d53vladlosev} // namespace internal 242315f3ae05e214688e834f622d00b6a02b64ce6d53vladlosev 2424739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// Runs the test and updates the test result. 2425739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanvoid Test::Run() { 2426739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan if (!HasSameFixtureClass()) return; 24274b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2428739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); 24294b6829f0d28990dd645e16386eb226d0f10c8731shiqian impl->os_stack_trace_getter()->UponLeavingGTest(); 243015f3ae05e214688e834f622d00b6a02b64ce6d53vladlosev internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()"); 24314b6829f0d28990dd645e16386eb226d0f10c8731shiqian // We will run the test only if SetUp() was successful. 24324b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (!HasFatalFailure()) { 24334b6829f0d28990dd645e16386eb226d0f10c8731shiqian impl->os_stack_trace_getter()->UponLeavingGTest(); 243415f3ae05e214688e834f622d00b6a02b64ce6d53vladlosev internal::HandleExceptionsInMethodIfSupported( 2435739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan this, &Test::TestBody, "the test body"); 24364b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 24374b6829f0d28990dd645e16386eb226d0f10c8731shiqian 24384b6829f0d28990dd645e16386eb226d0f10c8731shiqian // However, we want to clean up as much as possible. Hence we will 24394b6829f0d28990dd645e16386eb226d0f10c8731shiqian // always call TearDown(), even if SetUp() or the test body has 24404b6829f0d28990dd645e16386eb226d0f10c8731shiqian // failed. 24414b6829f0d28990dd645e16386eb226d0f10c8731shiqian impl->os_stack_trace_getter()->UponLeavingGTest(); 244215f3ae05e214688e834f622d00b6a02b64ce6d53vladlosev internal::HandleExceptionsInMethodIfSupported( 2443739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan this, &Test::TearDown, "TearDown()"); 24444b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 24454b6829f0d28990dd645e16386eb226d0f10c8731shiqian 24464b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns true iff the current test has a fatal failure. 24474b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool Test::HasFatalFailure() { 24484b6829f0d28990dd645e16386eb226d0f10c8731shiqian return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure(); 24494b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 24504b6829f0d28990dd645e16386eb226d0f10c8731shiqian 24511b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan// Returns true iff the current test has a non-fatal failure. 24521b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wanbool Test::HasNonfatalFailure() { 24531b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan return internal::GetUnitTestImpl()->current_test_result()-> 24541b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan HasNonfatalFailure(); 24551b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan} 24561b171100b3341c01fb377f8202d9eaccbeec1f55zhanyong.wan 24574b6829f0d28990dd645e16386eb226d0f10c8731shiqian// class TestInfo 24584b6829f0d28990dd645e16386eb226d0f10c8731shiqian 24594834581321d60c17997d65a2360c7674f15f9bbcshiqian// Constructs a TestInfo object. It assumes ownership of the test factory 2460739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// object. 24613b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.comTestInfo::TestInfo(const std::string& a_test_case_name, 24623b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com const std::string& a_name, 2463a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan const char* a_type_param, 2464a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan const char* a_value_param, 24654b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::TypeId fixture_class_id, 2466739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan internal::TestFactoryBase* factory) 2467739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan : test_case_name_(a_test_case_name), 2468739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan name_(a_name), 2469a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan type_param_(a_type_param ? new std::string(a_type_param) : NULL), 2470a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan value_param_(a_value_param ? new std::string(a_value_param) : NULL), 2471739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan fixture_class_id_(fixture_class_id), 2472739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan should_run_(false), 2473739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan is_disabled_(false), 2474739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan matches_filter_(false), 2475739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan factory_(factory), 2476739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan result_() {} 24774b6829f0d28990dd645e16386eb226d0f10c8731shiqian 24784b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Destructs a TestInfo object. 2479739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanTestInfo::~TestInfo() { delete factory_; } 24804b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2481e8ff148b4309e115da1c55089dc3b9a241a928dcshiqiannamespace internal { 2482e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 2483e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// Creates a new TestInfo object and registers it with Google Test; 2484e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// returns the created object. 24854b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 24864b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Arguments: 24874b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 2488e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// test_case_name: name of the test case 2489e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// name: name of the test 2490a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan// type_param: the name of the test's type parameter, or NULL if 2491a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan// this is not a typed or a type-parameterized test. 2492a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan// value_param: text representation of the test's value parameter, 2493a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan// or NULL if this is not a value-parameterized test. 2494e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// fixture_class_id: ID of the test fixture class 2495e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// set_up_tc: pointer to the function that sets up the test case 2496e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// tear_down_tc: pointer to the function that tears down the test case 2497e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// factory: pointer to the factory that creates a test object. 2498e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// The newly created TestInfo instance will assume 2499e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian// ownership of the factory object. 2500e8ff148b4309e115da1c55089dc3b9a241a928dcshiqianTestInfo* MakeAndRegisterTestInfo( 25013b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com const char* test_case_name, 25023b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com const char* name, 2503a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan const char* type_param, 2504a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan const char* value_param, 2505e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian TypeId fixture_class_id, 2506e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian SetUpTestCaseFunc set_up_tc, 2507e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian TearDownTestCaseFunc tear_down_tc, 2508e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian TestFactoryBase* factory) { 25094b6829f0d28990dd645e16386eb226d0f10c8731shiqian TestInfo* const test_info = 2510a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan new TestInfo(test_case_name, name, type_param, value_param, 2511e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian fixture_class_id, factory); 2512e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info); 25134b6829f0d28990dd645e16386eb226d0f10c8731shiqian return test_info; 25144b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 25154b6829f0d28990dd645e16386eb226d0f10c8731shiqian 25164cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_HAS_PARAM_TEST 2517f904a612d9444ab36c07a8e619c113432e046f49vladlosevvoid ReportInvalidTestCaseType(const char* test_case_name, 2518f904a612d9444ab36c07a8e619c113432e046f49vladlosev const char* file, int line) { 2519f904a612d9444ab36c07a8e619c113432e046f49vladlosev Message errors; 2520f904a612d9444ab36c07a8e619c113432e046f49vladlosev errors 2521f904a612d9444ab36c07a8e619c113432e046f49vladlosev << "Attempted redefinition of test case " << test_case_name << ".\n" 2522f904a612d9444ab36c07a8e619c113432e046f49vladlosev << "All tests in the same test case must use the same test fixture\n" 2523f904a612d9444ab36c07a8e619c113432e046f49vladlosev << "class. However, in test case " << test_case_name << ", you tried\n" 2524f904a612d9444ab36c07a8e619c113432e046f49vladlosev << "to define a test using a fixture class different from the one\n" 2525f904a612d9444ab36c07a8e619c113432e046f49vladlosev << "used earlier. This can happen if the two fixture classes are\n" 2526f904a612d9444ab36c07a8e619c113432e046f49vladlosev << "from different namespaces and have the same name. You should\n" 2527f904a612d9444ab36c07a8e619c113432e046f49vladlosev << "probably rename one of the classes to put the tests into different\n" 2528f904a612d9444ab36c07a8e619c113432e046f49vladlosev << "test cases."; 2529f904a612d9444ab36c07a8e619c113432e046f49vladlosev 2530f904a612d9444ab36c07a8e619c113432e046f49vladlosev fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(), 2531f904a612d9444ab36c07a8e619c113432e046f49vladlosev errors.GetString().c_str()); 2532f904a612d9444ab36c07a8e619c113432e046f49vladlosev} 2533f904a612d9444ab36c07a8e619c113432e046f49vladlosev#endif // GTEST_HAS_PARAM_TEST 2534f904a612d9444ab36c07a8e619c113432e046f49vladlosev 2535e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian} // namespace internal 2536e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian 25374b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace { 25384b6829f0d28990dd645e16386eb226d0f10c8731shiqian 25394b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A predicate that checks the test name of a TestInfo against a known 25404b6829f0d28990dd645e16386eb226d0f10c8731shiqian// value. 25414b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 25424b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This is used for implementation of the TestCase class only. We put 25434b6829f0d28990dd645e16386eb226d0f10c8731shiqian// it in the anonymous namespace to prevent polluting the outer 25444b6829f0d28990dd645e16386eb226d0f10c8731shiqian// namespace. 25454b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 25464b6829f0d28990dd645e16386eb226d0f10c8731shiqian// TestNameIs is copyable. 25474b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass TestNameIs { 25484b6829f0d28990dd645e16386eb226d0f10c8731shiqian public: 25494b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Constructor. 25504b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 25514b6829f0d28990dd645e16386eb226d0f10c8731shiqian // TestNameIs has NO default constructor. 25524b6829f0d28990dd645e16386eb226d0f10c8731shiqian explicit TestNameIs(const char* name) 25534b6829f0d28990dd645e16386eb226d0f10c8731shiqian : name_(name) {} 25544b6829f0d28990dd645e16386eb226d0f10c8731shiqian 25554b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Returns true iff the test name of test_info matches name_. 25564b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool operator()(const TestInfo * test_info) const { 255703c314931649a999b0cf5deb0a434a1009157416jgm@google.com return test_info && test_info->name() == name_; 25584b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 25594b6829f0d28990dd645e16386eb226d0f10c8731shiqian 25604b6829f0d28990dd645e16386eb226d0f10c8731shiqian private: 256103c314931649a999b0cf5deb0a434a1009157416jgm@google.com std::string name_; 25624b6829f0d28990dd645e16386eb226d0f10c8731shiqian}; 25634b6829f0d28990dd645e16386eb226d0f10c8731shiqian 25644b6829f0d28990dd645e16386eb226d0f10c8731shiqian} // namespace 25654b6829f0d28990dd645e16386eb226d0f10c8731shiqian 25664b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace internal { 25674b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2568f904a612d9444ab36c07a8e619c113432e046f49vladlosev// This method expands all parameterized tests registered with macros TEST_P 2569f904a612d9444ab36c07a8e619c113432e046f49vladlosev// and INSTANTIATE_TEST_CASE_P into regular tests and registers those. 2570f904a612d9444ab36c07a8e619c113432e046f49vladlosev// This will be done just once during the program runtime. 2571f904a612d9444ab36c07a8e619c113432e046f49vladlosevvoid UnitTestImpl::RegisterParameterizedTests() { 25724cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_HAS_PARAM_TEST 2573f904a612d9444ab36c07a8e619c113432e046f49vladlosev if (!parameterized_tests_registered_) { 2574f904a612d9444ab36c07a8e619c113432e046f49vladlosev parameterized_test_registry_.RegisterTests(); 2575f904a612d9444ab36c07a8e619c113432e046f49vladlosev parameterized_tests_registered_ = true; 2576f904a612d9444ab36c07a8e619c113432e046f49vladlosev } 2577f904a612d9444ab36c07a8e619c113432e046f49vladlosev#endif 2578f904a612d9444ab36c07a8e619c113432e046f49vladlosev} 2579f904a612d9444ab36c07a8e619c113432e046f49vladlosev 2580739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan} // namespace internal 2581739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 25824b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Creates the test object, runs it, records its result, and then 25834b6829f0d28990dd645e16386eb226d0f10c8731shiqian// deletes it. 2584739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanvoid TestInfo::Run() { 25854b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (!should_run_) return; 25864b6829f0d28990dd645e16386eb226d0f10c8731shiqian 25874b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Tells UnitTest where to store test result. 2588739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); 2589739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan impl->set_current_test_info(this); 25904b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2591fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); 2592f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 2593f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan // Notifies the unit test event listeners that a test is about to start. 2594739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan repeater->OnTestStart(*this); 25954b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2596739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan const TimeInMillis start = internal::GetTimeInMillis(); 25974b6829f0d28990dd645e16386eb226d0f10c8731shiqian 25984b6829f0d28990dd645e16386eb226d0f10c8731shiqian impl->os_stack_trace_getter()->UponLeavingGTest(); 25994b6829f0d28990dd645e16386eb226d0f10c8731shiqian 26004b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Creates the test object. 260115f3ae05e214688e834f622d00b6a02b64ce6d53vladlosev Test* const test = internal::HandleExceptionsInMethodIfSupported( 2602739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan factory_, &internal::TestFactoryBase::CreateTest, 2603739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "the test fixture's constructor"); 26044b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2605c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan // Runs the test only if the test object was created and its 2606c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan // constructor didn't generate a fatal failure. 2607739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan if ((test != NULL) && !Test::HasFatalFailure()) { 2608739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan // This doesn't throw as all user code that can throw are wrapped into 2609739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan // exception handling code. 26104b6829f0d28990dd645e16386eb226d0f10c8731shiqian test->Run(); 26114b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 26124b6829f0d28990dd645e16386eb226d0f10c8731shiqian 26134b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Deletes the test object. 26144b6829f0d28990dd645e16386eb226d0f10c8731shiqian impl->os_stack_trace_getter()->UponLeavingGTest(); 261515f3ae05e214688e834f622d00b6a02b64ce6d53vladlosev internal::HandleExceptionsInMethodIfSupported( 2616739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan test, &Test::DeleteSelf_, "the test fixture's destructor"); 26174b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2618739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan result_.set_elapsed_time(internal::GetTimeInMillis() - start); 26194b6829f0d28990dd645e16386eb226d0f10c8731shiqian 26204b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Notifies the unit test event listener that a test has just finished. 2621739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan repeater->OnTestEnd(*this); 26224b6829f0d28990dd645e16386eb226d0f10c8731shiqian 26234b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Tells UnitTest to stop associating assertion results to this 26244b6829f0d28990dd645e16386eb226d0f10c8731shiqian // test. 26254b6829f0d28990dd645e16386eb226d0f10c8731shiqian impl->set_current_test_info(NULL); 26264b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 26274b6829f0d28990dd645e16386eb226d0f10c8731shiqian 26284b6829f0d28990dd645e16386eb226d0f10c8731shiqian// class TestCase 26294b6829f0d28990dd645e16386eb226d0f10c8731shiqian 26304b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Gets the number of successful tests in this test case. 26314b6829f0d28990dd645e16386eb226d0f10c8731shiqianint TestCase::successful_test_count() const { 263293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan return CountIf(test_info_list_, TestPassed); 26334b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 26344b6829f0d28990dd645e16386eb226d0f10c8731shiqian 26354b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Gets the number of failed tests in this test case. 26364b6829f0d28990dd645e16386eb226d0f10c8731shiqianint TestCase::failed_test_count() const { 263793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan return CountIf(test_info_list_, TestFailed); 26384b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 26394b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2640c567ac6c5431d9d2867ace1da1418f4575215516vladlosev// Gets the number of disabled tests that will be reported in the XML report. 2641c567ac6c5431d9d2867ace1da1418f4575215516vladlosevint TestCase::reportable_disabled_test_count() const { 2642c567ac6c5431d9d2867ace1da1418f4575215516vladlosev return CountIf(test_info_list_, TestReportableDisabled); 2643c567ac6c5431d9d2867ace1da1418f4575215516vladlosev} 2644c567ac6c5431d9d2867ace1da1418f4575215516vladlosev 2645c567ac6c5431d9d2867ace1da1418f4575215516vladlosev// Gets the number of disabled tests in this test case. 26464b6829f0d28990dd645e16386eb226d0f10c8731shiqianint TestCase::disabled_test_count() const { 264793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan return CountIf(test_info_list_, TestDisabled); 26484b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 26494b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2650c567ac6c5431d9d2867ace1da1418f4575215516vladlosev// Gets the number of tests to be printed in the XML report. 2651c567ac6c5431d9d2867ace1da1418f4575215516vladlosevint TestCase::reportable_test_count() const { 2652c567ac6c5431d9d2867ace1da1418f4575215516vladlosev return CountIf(test_info_list_, TestReportable); 2653c567ac6c5431d9d2867ace1da1418f4575215516vladlosev} 2654c567ac6c5431d9d2867ace1da1418f4575215516vladlosev 26554b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Get the number of tests in this test case that should run. 26564b6829f0d28990dd645e16386eb226d0f10c8731shiqianint TestCase::test_to_run_count() const { 265793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan return CountIf(test_info_list_, ShouldRunTest); 26584b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 26594b6829f0d28990dd645e16386eb226d0f10c8731shiqian 26604b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Gets the number of all tests. 26614b6829f0d28990dd645e16386eb226d0f10c8731shiqianint TestCase::total_test_count() const { 2662b03ca47c10be432be5d984cb91ce22c81dfa2252zhanyong.wan return static_cast<int>(test_info_list_.size()); 26634b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 26644b6829f0d28990dd645e16386eb226d0f10c8731shiqian 26654b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Creates a TestCase with the given name. 26664b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 26674b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Arguments: 26684b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 26694b6829f0d28990dd645e16386eb226d0f10c8731shiqian// name: name of the test case 2670a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan// a_type_param: the name of the test case's type parameter, or NULL if 2671a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan// this is not a typed or a type-parameterized test case. 26724b6829f0d28990dd645e16386eb226d0f10c8731shiqian// set_up_tc: pointer to the function that sets up the test case 26734b6829f0d28990dd645e16386eb226d0f10c8731shiqian// tear_down_tc: pointer to the function that tears down the test case 2674a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wanTestCase::TestCase(const char* a_name, const char* a_type_param, 26754b6829f0d28990dd645e16386eb226d0f10c8731shiqian Test::SetUpTestCaseFunc set_up_tc, 26764b6829f0d28990dd645e16386eb226d0f10c8731shiqian Test::TearDownTestCaseFunc tear_down_tc) 26777de3401f5f8c2a61476a3623e9802f973764fc27zhanyong.wan : name_(a_name), 2678a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan type_param_(a_type_param ? new std::string(a_type_param) : NULL), 26794b6829f0d28990dd645e16386eb226d0f10c8731shiqian set_up_tc_(set_up_tc), 26804b6829f0d28990dd645e16386eb226d0f10c8731shiqian tear_down_tc_(tear_down_tc), 26814b6829f0d28990dd645e16386eb226d0f10c8731shiqian should_run_(false), 26824b6829f0d28990dd645e16386eb226d0f10c8731shiqian elapsed_time_(0) { 26834b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 26844b6829f0d28990dd645e16386eb226d0f10c8731shiqian 26854b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Destructor of TestCase. 26864b6829f0d28990dd645e16386eb226d0f10c8731shiqianTestCase::~TestCase() { 26874b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Deletes every Test in the collection. 268893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan ForEach(test_info_list_, internal::Delete<TestInfo>); 26894b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 26904b6829f0d28990dd645e16386eb226d0f10c8731shiqian 26919644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Returns the i-th test among all the tests. i can range from 0 to 26929644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// total_test_count() - 1. If i is not in that range, returns NULL. 26939644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanconst TestInfo* TestCase::GetTestInfo(int i) const { 269493d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan const int index = GetElementOr(test_indices_, i, -1); 269593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan return index < 0 ? NULL : test_info_list_[index]; 2696f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan} 2697f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan 2698f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan// Returns the i-th test among all the tests. i can range from 0 to 2699f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan// total_test_count() - 1. If i is not in that range, returns NULL. 2700f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wanTestInfo* TestCase::GetMutableTestInfo(int i) { 270193d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan const int index = GetElementOr(test_indices_, i, -1); 270293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan return index < 0 ? NULL : test_info_list_[index]; 27039644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan} 27049644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan 27054b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Adds a test to this test case. Will delete the test upon 27064b6829f0d28990dd645e16386eb226d0f10c8731shiqian// destruction of the TestCase object. 27074b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid TestCase::AddTestInfo(TestInfo * test_info) { 270893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan test_info_list_.push_back(test_info); 2709b03ca47c10be432be5d984cb91ce22c81dfa2252zhanyong.wan test_indices_.push_back(static_cast<int>(test_indices_.size())); 27104b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 27114b6829f0d28990dd645e16386eb226d0f10c8731shiqian 27124b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Runs every test in this TestCase. 27134b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid TestCase::Run() { 27144b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (!should_run_) return; 27154b6829f0d28990dd645e16386eb226d0f10c8731shiqian 27164b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); 27174b6829f0d28990dd645e16386eb226d0f10c8731shiqian impl->set_current_test_case(this); 27184b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2719fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); 27204b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2721f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan repeater->OnTestCaseStart(*this); 27224b6829f0d28990dd645e16386eb226d0f10c8731shiqian impl->os_stack_trace_getter()->UponLeavingGTest(); 272315f3ae05e214688e834f622d00b6a02b64ce6d53vladlosev internal::HandleExceptionsInMethodIfSupported( 2724739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan this, &TestCase::RunSetUpTestCase, "SetUpTestCase()"); 27254b6829f0d28990dd645e16386eb226d0f10c8731shiqian 27264b6829f0d28990dd645e16386eb226d0f10c8731shiqian const internal::TimeInMillis start = internal::GetTimeInMillis(); 2727f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan for (int i = 0; i < total_test_count(); i++) { 2728739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan GetMutableTestInfo(i)->Run(); 2729f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan } 27304b6829f0d28990dd645e16386eb226d0f10c8731shiqian elapsed_time_ = internal::GetTimeInMillis() - start; 27314b6829f0d28990dd645e16386eb226d0f10c8731shiqian 27324b6829f0d28990dd645e16386eb226d0f10c8731shiqian impl->os_stack_trace_getter()->UponLeavingGTest(); 273315f3ae05e214688e834f622d00b6a02b64ce6d53vladlosev internal::HandleExceptionsInMethodIfSupported( 2734739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan this, &TestCase::RunTearDownTestCase, "TearDownTestCase()"); 2735739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 2736f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan repeater->OnTestCaseEnd(*this); 27374b6829f0d28990dd645e16386eb226d0f10c8731shiqian impl->set_current_test_case(NULL); 27384b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 27394b6829f0d28990dd645e16386eb226d0f10c8731shiqian 27404b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Clears the results of all tests in this test case. 27414b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid TestCase::ClearResult() { 2742dfbdf0bab51520595679a99710983daba6fc18ebvladlosev ad_hoc_test_result_.Clear(); 2743739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan ForEach(test_info_list_, TestInfo::ClearTestResult); 2744b9a1628577f7ab2eb30a656aeff763909770c9c1zhanyong.wan} 2745b9a1628577f7ab2eb30a656aeff763909770c9c1zhanyong.wan 2746f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan// Shuffles the tests in this test case. 2747f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wanvoid TestCase::ShuffleTests(internal::Random* random) { 274893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan Shuffle(random, &test_indices_); 2749f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan} 2750f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan 2751f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan// Restores the test order to before the first shuffle. 2752f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wanvoid TestCase::UnshuffleTests() { 275393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan for (size_t i = 0; i < test_indices_.size(); i++) { 2754b03ca47c10be432be5d984cb91ce22c81dfa2252zhanyong.wan test_indices_[i] = static_cast<int>(i); 2755f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan } 2756f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan} 2757f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan 27584b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Formats a countable noun. Depending on its quantity, either the 27594b6829f0d28990dd645e16386eb226d0f10c8731shiqian// singular form or the plural form is used. e.g. 27604b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 27614b6829f0d28990dd645e16386eb226d0f10c8731shiqian// FormatCountableNoun(1, "formula", "formuli") returns "1 formula". 27624b6829f0d28990dd645e16386eb226d0f10c8731shiqian// FormatCountableNoun(5, "book", "books") returns "5 books". 276303c314931649a999b0cf5deb0a434a1009157416jgm@google.comstatic std::string FormatCountableNoun(int count, 276403c314931649a999b0cf5deb0a434a1009157416jgm@google.com const char * singular_form, 276503c314931649a999b0cf5deb0a434a1009157416jgm@google.com const char * plural_form) { 27663b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com return internal::StreamableToString(count) + " " + 27673b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com (count == 1 ? singular_form : plural_form); 27684b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 27694b6829f0d28990dd645e16386eb226d0f10c8731shiqian 27704b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Formats the count of tests. 277103c314931649a999b0cf5deb0a434a1009157416jgm@google.comstatic std::string FormatTestCount(int test_count) { 27724b6829f0d28990dd645e16386eb226d0f10c8731shiqian return FormatCountableNoun(test_count, "test", "tests"); 27734b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 27744b6829f0d28990dd645e16386eb226d0f10c8731shiqian 27754b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Formats the count of test cases. 277603c314931649a999b0cf5deb0a434a1009157416jgm@google.comstatic std::string FormatTestCaseCount(int test_case_count) { 27774b6829f0d28990dd645e16386eb226d0f10c8731shiqian return FormatCountableNoun(test_case_count, "test case", "test cases"); 27784b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 27794b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2780334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan// Converts a TestPartResult::Type enum to human-friendly string 2781334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan// representation. Both kNonFatalFailure and kFatalFailure are translated 2782334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan// to "Failure", as the user usually doesn't care about the difference 2783334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan// between the two when viewing the test result. 2784334aaead71ccf797a18f2128c320f0304e724860zhanyong.wanstatic const char * TestPartResultTypeToString(TestPartResult::Type type) { 27854b6829f0d28990dd645e16386eb226d0f10c8731shiqian switch (type) { 2786334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan case TestPartResult::kSuccess: 27874b6829f0d28990dd645e16386eb226d0f10c8731shiqian return "Success"; 27884b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2789334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan case TestPartResult::kNonFatalFailure: 2790334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan case TestPartResult::kFatalFailure: 2791adf85093a9659fc9bbfb7f4bb973be557c4849b9shiqian#ifdef _MSC_VER 2792adf85093a9659fc9bbfb7f4bb973be557c4849b9shiqian return "error: "; 2793adf85093a9659fc9bbfb7f4bb973be557c4849b9shiqian#else 2794adf85093a9659fc9bbfb7f4bb973be557c4849b9shiqian return "Failure\n"; 2795adf85093a9659fc9bbfb7f4bb973be557c4849b9shiqian#endif 2796de8db2d6fa0cd59c0415b09295fb89bc809f1e7evladlosev default: 2797de8db2d6fa0cd59c0415b09295fb89bc809f1e7evladlosev return "Unknown result type"; 27984b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 27994b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 28004b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2801c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wannamespace internal { 2802c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan 280303c314931649a999b0cf5deb0a434a1009157416jgm@google.com// Prints a TestPartResult to an std::string. 280403c314931649a999b0cf5deb0a434a1009157416jgm@google.comstatic std::string PrintTestPartResultToString( 2805b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan const TestPartResult& test_part_result) { 2806b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan return (Message() 2807b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan << internal::FormatFileLocation(test_part_result.file_name(), 2808b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan test_part_result.line_number()) 2809b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan << " " << TestPartResultTypeToString(test_part_result.type()) 2810b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan << test_part_result.message()).GetString(); 2811b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan} 2812b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan 28134b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Prints a TestPartResult. 2814f4f05bb7cd810d17a33683c5e429e981e6088ddazhanyong.wanstatic void PrintTestPartResult(const TestPartResult& test_part_result) { 281503c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string& result = 2816f4f05bb7cd810d17a33683c5e429e981e6088ddazhanyong.wan PrintTestPartResultToString(test_part_result); 2817f4f05bb7cd810d17a33683c5e429e981e6088ddazhanyong.wan printf("%s\n", result.c_str()); 28184b6829f0d28990dd645e16386eb226d0f10c8731shiqian fflush(stdout); 2819f4f05bb7cd810d17a33683c5e429e981e6088ddazhanyong.wan // If the test program runs in Visual Studio or a debugger, the 282096ac1fd602a5d0c8c9c32c0d0bfd065cf73129e6zhanyong.wan // following statements add the test part result message to the Output 2821f4f05bb7cd810d17a33683c5e429e981e6088ddazhanyong.wan // window such that the user can double-click on it to jump to the 2822f4f05bb7cd810d17a33683c5e429e981e6088ddazhanyong.wan // corresponding source code location; otherwise they do nothing. 2823fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE 28247dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan // We don't call OutputDebugString*() on Windows Mobile, as printing 28257dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan // to stdout is done by OutputDebugString() there already - we don't 28267dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan // want the same message printed twice. 2827f4f05bb7cd810d17a33683c5e429e981e6088ddazhanyong.wan ::OutputDebugStringA(result.c_str()); 2828f4f05bb7cd810d17a33683c5e429e981e6088ddazhanyong.wan ::OutputDebugStringA("\n"); 2829f4f05bb7cd810d17a33683c5e429e981e6088ddazhanyong.wan#endif 28304b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 28314b6829f0d28990dd645e16386eb226d0f10c8731shiqian 28324b6829f0d28990dd645e16386eb226d0f10c8731shiqian// class PrettyUnitTestResultPrinter 28334b6829f0d28990dd645e16386eb226d0f10c8731shiqian 28344b6829f0d28990dd645e16386eb226d0f10c8731shiqianenum GTestColor { 2835baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan COLOR_DEFAULT, 28364b6829f0d28990dd645e16386eb226d0f10c8731shiqian COLOR_RED, 28374b6829f0d28990dd645e16386eb226d0f10c8731shiqian COLOR_GREEN, 28384b6829f0d28990dd645e16386eb226d0f10c8731shiqian COLOR_YELLOW 28394b6829f0d28990dd645e16386eb226d0f10c8731shiqian}; 28404b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2841f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE && \ 2842f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT 28434b6829f0d28990dd645e16386eb226d0f10c8731shiqian 28444b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns the character attribute for the given color. 28454b6829f0d28990dd645e16386eb226d0f10c8731shiqianWORD GetColorAttribute(GTestColor color) { 28464b6829f0d28990dd645e16386eb226d0f10c8731shiqian switch (color) { 28474b6829f0d28990dd645e16386eb226d0f10c8731shiqian case COLOR_RED: return FOREGROUND_RED; 28484b6829f0d28990dd645e16386eb226d0f10c8731shiqian case COLOR_GREEN: return FOREGROUND_GREEN; 28494b6829f0d28990dd645e16386eb226d0f10c8731shiqian case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN; 2850baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan default: return 0; 28514b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 28524b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 28534b6829f0d28990dd645e16386eb226d0f10c8731shiqian 28544b6829f0d28990dd645e16386eb226d0f10c8731shiqian#else 28554b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2856baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan// Returns the ANSI color code for the given color. COLOR_DEFAULT is 2857baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan// an invalid input. 28584b6829f0d28990dd645e16386eb226d0f10c8731shiqianconst char* GetAnsiColorCode(GTestColor color) { 28594b6829f0d28990dd645e16386eb226d0f10c8731shiqian switch (color) { 28604b6829f0d28990dd645e16386eb226d0f10c8731shiqian case COLOR_RED: return "1"; 28614b6829f0d28990dd645e16386eb226d0f10c8731shiqian case COLOR_GREEN: return "2"; 28624b6829f0d28990dd645e16386eb226d0f10c8731shiqian case COLOR_YELLOW: return "3"; 2863baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan default: return NULL; 28644b6829f0d28990dd645e16386eb226d0f10c8731shiqian }; 28654b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 28664b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2867fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE 28684b6829f0d28990dd645e16386eb226d0f10c8731shiqian 28694b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns true iff Google Test should use colors in the output. 28704b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool ShouldUseColor(bool stdout_is_tty) { 28714b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* const gtest_color = GTEST_FLAG(color).c_str(); 28724b6829f0d28990dd645e16386eb226d0f10c8731shiqian 28734b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) { 28744cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_OS_WINDOWS 28754b6829f0d28990dd645e16386eb226d0f10c8731shiqian // On Windows the TERM variable is usually not set, but the 28764b6829f0d28990dd645e16386eb226d0f10c8731shiqian // console there does support colors. 28774b6829f0d28990dd645e16386eb226d0f10c8731shiqian return stdout_is_tty; 28784b6829f0d28990dd645e16386eb226d0f10c8731shiqian#else 28794b6829f0d28990dd645e16386eb226d0f10c8731shiqian // On non-Windows platforms, we rely on the TERM variable. 2880c7f60f1514013d57a624c3a2966709998678f24bzhanyong.wan const char* const term = posix::GetEnv("TERM"); 28814b6829f0d28990dd645e16386eb226d0f10c8731shiqian const bool term_supports_color = 28824b6829f0d28990dd645e16386eb226d0f10c8731shiqian String::CStringEquals(term, "xterm") || 28834b6829f0d28990dd645e16386eb226d0f10c8731shiqian String::CStringEquals(term, "xterm-color") || 288472e15a586ed33322f1ba344ac1a871fb83cc410czhanyong.wan String::CStringEquals(term, "xterm-256color") || 28859f2549154b3d605f0eec2fb691c741e087b61e6fvladlosev String::CStringEquals(term, "screen") || 28864036e7d55c332d45cfb3f22ed682acce2b8390fdzhanyong.wan String::CStringEquals(term, "screen-256color") || 2887a8a582fb926a678d1c4303384bd4dc872f746de8zhanyong.wan String::CStringEquals(term, "linux") || 28884b6829f0d28990dd645e16386eb226d0f10c8731shiqian String::CStringEquals(term, "cygwin"); 28894b6829f0d28990dd645e16386eb226d0f10c8731shiqian return stdout_is_tty && term_supports_color; 2890e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian#endif // GTEST_OS_WINDOWS 28914b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 28924b6829f0d28990dd645e16386eb226d0f10c8731shiqian 28934b6829f0d28990dd645e16386eb226d0f10c8731shiqian return String::CaseInsensitiveCStringEquals(gtest_color, "yes") || 28944b6829f0d28990dd645e16386eb226d0f10c8731shiqian String::CaseInsensitiveCStringEquals(gtest_color, "true") || 28954b6829f0d28990dd645e16386eb226d0f10c8731shiqian String::CaseInsensitiveCStringEquals(gtest_color, "t") || 28964b6829f0d28990dd645e16386eb226d0f10c8731shiqian String::CStringEquals(gtest_color, "1"); 28974b6829f0d28990dd645e16386eb226d0f10c8731shiqian // We take "yes", "true", "t", and "1" as meaning "yes". If the 28984b6829f0d28990dd645e16386eb226d0f10c8731shiqian // value is neither one of these nor "auto", we treat it as "no" to 28994b6829f0d28990dd645e16386eb226d0f10c8731shiqian // be conservative. 29004b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 29014b6829f0d28990dd645e16386eb226d0f10c8731shiqian 29024b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Helpers for printing colored strings to stdout. Note that on Windows, we 29034b6829f0d28990dd645e16386eb226d0f10c8731shiqian// cannot simply emit special characters and have the terminal change colors. 29044b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This routine must actually emit the characters rather than return a string 29054b6829f0d28990dd645e16386eb226d0f10c8731shiqian// that would be colored when printed, as can be done on Linux. 29064b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid ColoredPrintf(GTestColor color, const char* fmt, ...) { 29074b6829f0d28990dd645e16386eb226d0f10c8731shiqian va_list args; 29084b6829f0d28990dd645e16386eb226d0f10c8731shiqian va_start(args, fmt); 29094b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2910f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS || \ 2911f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com GTEST_OS_IOS || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT 2912baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan const bool use_color = false; 2913dd4a17bc20377d250ed116b1083d851adbe45f25shiqian#else 2914baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan static const bool in_color_mode = 2915c7f60f1514013d57a624c3a2966709998678f24bzhanyong.wan ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0); 2916baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan const bool use_color = in_color_mode && (color != COLOR_DEFAULT); 2917fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan#endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS 29184b6829f0d28990dd645e16386eb226d0f10c8731shiqian // The '!= 0' comparison is necessary to satisfy MSVC 7.1. 29194b6829f0d28990dd645e16386eb226d0f10c8731shiqian 29204b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (!use_color) { 29214b6829f0d28990dd645e16386eb226d0f10c8731shiqian vprintf(fmt, args); 29224b6829f0d28990dd645e16386eb226d0f10c8731shiqian va_end(args); 29234b6829f0d28990dd645e16386eb226d0f10c8731shiqian return; 29244b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 29254b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2926f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE && \ 2927f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT 29284b6829f0d28990dd645e16386eb226d0f10c8731shiqian const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE); 29294b6829f0d28990dd645e16386eb226d0f10c8731shiqian 29304b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Gets the current text color. 29314b6829f0d28990dd645e16386eb226d0f10c8731shiqian CONSOLE_SCREEN_BUFFER_INFO buffer_info; 29324b6829f0d28990dd645e16386eb226d0f10c8731shiqian GetConsoleScreenBufferInfo(stdout_handle, &buffer_info); 29334b6829f0d28990dd645e16386eb226d0f10c8731shiqian const WORD old_color_attrs = buffer_info.wAttributes; 29344b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2935cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wan // We need to flush the stream buffers into the console before each 2936cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wan // SetConsoleTextAttribute call lest it affect the text that is already 2937cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wan // printed but has not yet reached the console. 2938cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wan fflush(stdout); 29394b6829f0d28990dd645e16386eb226d0f10c8731shiqian SetConsoleTextAttribute(stdout_handle, 29404b6829f0d28990dd645e16386eb226d0f10c8731shiqian GetColorAttribute(color) | FOREGROUND_INTENSITY); 29414b6829f0d28990dd645e16386eb226d0f10c8731shiqian vprintf(fmt, args); 29424b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2943cf8a584c9971a7d646d58be41dd3547e62cb538fzhanyong.wan fflush(stdout); 29444b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Restores the text color. 29454b6829f0d28990dd645e16386eb226d0f10c8731shiqian SetConsoleTextAttribute(stdout_handle, old_color_attrs); 29464b6829f0d28990dd645e16386eb226d0f10c8731shiqian#else 29474b6829f0d28990dd645e16386eb226d0f10c8731shiqian printf("\033[0;3%sm", GetAnsiColorCode(color)); 29484b6829f0d28990dd645e16386eb226d0f10c8731shiqian vprintf(fmt, args); 29494b6829f0d28990dd645e16386eb226d0f10c8731shiqian printf("\033[m"); // Resets the terminal to default. 2950fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE 29514b6829f0d28990dd645e16386eb226d0f10c8731shiqian va_end(args); 29524b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 29534b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2954b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan// Text printed in Google Test's text output and --gunit_list_tests 2955b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan// output to label the type parameter and value parameter for a test. 2956b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wanstatic const char kTypeParamLabel[] = "TypeParam"; 2957b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wanstatic const char kValueParamLabel[] = "GetParam()"; 2958b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan 29593a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosevvoid PrintFullTestCommentIfPresent(const TestInfo& test_info) { 2960a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan const char* const type_param = test_info.type_param(); 2961a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan const char* const value_param = test_info.value_param(); 2962a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan 2963a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan if (type_param != NULL || value_param != NULL) { 2964a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan printf(", where "); 2965a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan if (type_param != NULL) { 2966b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan printf("%s = %s", kTypeParamLabel, type_param); 2967a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan if (value_param != NULL) 2968a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan printf(" and "); 2969a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan } 2970a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan if (value_param != NULL) { 2971b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan printf("%s = %s", kValueParamLabel, value_param); 29723a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev } 29733a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev } 29743a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev} 29753a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev 2976fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan// This class implements the TestEventListener interface. 29774b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 29784b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Class PrettyUnitTestResultPrinter is copyable. 2979fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wanclass PrettyUnitTestResultPrinter : public TestEventListener { 29804b6829f0d28990dd645e16386eb226d0f10c8731shiqian public: 29814b6829f0d28990dd645e16386eb226d0f10c8731shiqian PrettyUnitTestResultPrinter() {} 29824b6829f0d28990dd645e16386eb226d0f10c8731shiqian static void PrintTestName(const char * test_case, const char * test) { 29834b6829f0d28990dd645e16386eb226d0f10c8731shiqian printf("%s.%s", test_case, test); 29844b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 29854b6829f0d28990dd645e16386eb226d0f10c8731shiqian 2986fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan // The following methods override what's in the TestEventListener class. 29877dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {} 29887dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration); 29897dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test); 29907dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {} 29919644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan virtual void OnTestCaseStart(const TestCase& test_case); 29929644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan virtual void OnTestStart(const TestInfo& test_info); 29937dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan virtual void OnTestPartResult(const TestPartResult& result); 29949644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan virtual void OnTestEnd(const TestInfo& test_info); 2995334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan virtual void OnTestCaseEnd(const TestCase& test_case); 29967dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test); 29977dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {} 29987dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration); 29997dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {} 30004b6829f0d28990dd645e16386eb226d0f10c8731shiqian 30014b6829f0d28990dd645e16386eb226d0f10c8731shiqian private: 3002a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan static void PrintFailedTests(const UnitTest& unit_test); 30034b6829f0d28990dd645e16386eb226d0f10c8731shiqian}; 30044b6829f0d28990dd645e16386eb226d0f10c8731shiqian 30057dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan // Fired before each iteration of tests starts. 30067dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wanvoid PrettyUnitTestResultPrinter::OnTestIterationStart( 30077dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan const UnitTest& unit_test, int iteration) { 30087dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan if (GTEST_FLAG(repeat) != 1) 30097dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1); 30107dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan 30119644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan const char* const filter = GTEST_FLAG(filter).c_str(); 30124b6829f0d28990dd645e16386eb226d0f10c8731shiqian 30134b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Prints the filter if it's not *. This reminds the user that some 30144b6829f0d28990dd645e16386eb226d0f10c8731shiqian // tests may be skipped. 301503c314931649a999b0cf5deb0a434a1009157416jgm@google.com if (!String::CStringEquals(filter, kUniversalFilter)) { 30164b6829f0d28990dd645e16386eb226d0f10c8731shiqian ColoredPrintf(COLOR_YELLOW, 30174cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan "Note: %s filter = %s\n", GTEST_NAME_, filter); 30184b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 30194b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3020905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) { 302122d36b42fbb9db2e0c814a7a1cc9279153fdfa31vladlosev const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1); 3022905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan ColoredPrintf(COLOR_YELLOW, 302322d36b42fbb9db2e0c814a7a1cc9279153fdfa31vladlosev "Note: This is test shard %d of %s.\n", 302422d36b42fbb9db2e0c814a7a1cc9279153fdfa31vladlosev static_cast<int>(shard_index) + 1, 3025c7f60f1514013d57a624c3a2966709998678f24bzhanyong.wan internal::posix::GetEnv(kTestTotalShards)); 3026905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan } 3027905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan 30289b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan if (GTEST_FLAG(shuffle)) { 30299b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan ColoredPrintf(COLOR_YELLOW, 30309b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan "Note: Randomizing tests' orders with a seed of %d .\n", 30319b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan unit_test.random_seed()); 30329b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan } 30339b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan 30344b6829f0d28990dd645e16386eb226d0f10c8731shiqian ColoredPrintf(COLOR_GREEN, "[==========] "); 30354b6829f0d28990dd645e16386eb226d0f10c8731shiqian printf("Running %s from %s.\n", 3036a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan FormatTestCount(unit_test.test_to_run_count()).c_str(), 3037a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str()); 30384b6829f0d28990dd645e16386eb226d0f10c8731shiqian fflush(stdout); 30394b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 30404b6829f0d28990dd645e16386eb226d0f10c8731shiqian 30417dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wanvoid PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart( 30429644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan const UnitTest& /*unit_test*/) { 30434b6829f0d28990dd645e16386eb226d0f10c8731shiqian ColoredPrintf(COLOR_GREEN, "[----------] "); 30444b6829f0d28990dd645e16386eb226d0f10c8731shiqian printf("Global test environment set-up.\n"); 30454b6829f0d28990dd645e16386eb226d0f10c8731shiqian fflush(stdout); 30464b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 30474b6829f0d28990dd645e16386eb226d0f10c8731shiqian 30489644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanvoid PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) { 304903c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string counts = 30509644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan FormatCountableNoun(test_case.test_to_run_count(), "test", "tests"); 30514b6829f0d28990dd645e16386eb226d0f10c8731shiqian ColoredPrintf(COLOR_GREEN, "[----------] "); 305274b3308eea50db2e7ea0a113a61ac6793b83991azhanyong.wan printf("%s from %s", counts.c_str(), test_case.name()); 3053a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan if (test_case.type_param() == NULL) { 3054e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian printf("\n"); 3055e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian } else { 3056b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param()); 3057e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian } 30584b6829f0d28990dd645e16386eb226d0f10c8731shiqian fflush(stdout); 30594b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 30604b6829f0d28990dd645e16386eb226d0f10c8731shiqian 30619644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanvoid PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) { 30624b6829f0d28990dd645e16386eb226d0f10c8731shiqian ColoredPrintf(COLOR_GREEN, "[ RUN ] "); 306374b3308eea50db2e7ea0a113a61ac6793b83991azhanyong.wan PrintTestName(test_info.test_case_name(), test_info.name()); 30643a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev printf("\n"); 30654b6829f0d28990dd645e16386eb226d0f10c8731shiqian fflush(stdout); 30664b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 30674b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3068334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan// Called after an assertion failure. 3069334aaead71ccf797a18f2128c320f0304e724860zhanyong.wanvoid PrettyUnitTestResultPrinter::OnTestPartResult( 3070334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan const TestPartResult& result) { 3071334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan // If the test part succeeded, we don't need to do anything. 3072334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan if (result.type() == TestPartResult::kSuccess) 3073334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan return; 3074334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan 3075334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan // Print failure message from the assertion (e.g. expected this and got that). 3076334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan PrintTestPartResult(result); 3077334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan fflush(stdout); 3078334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan} 3079334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan 30809644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanvoid PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) { 30819644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan if (test_info.result()->Passed()) { 30824b6829f0d28990dd645e16386eb226d0f10c8731shiqian ColoredPrintf(COLOR_GREEN, "[ OK ] "); 30834b6829f0d28990dd645e16386eb226d0f10c8731shiqian } else { 30844b6829f0d28990dd645e16386eb226d0f10c8731shiqian ColoredPrintf(COLOR_RED, "[ FAILED ] "); 30854b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 308674b3308eea50db2e7ea0a113a61ac6793b83991azhanyong.wan PrintTestName(test_info.test_case_name(), test_info.name()); 30873a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev if (test_info.result()->Failed()) 30883a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev PrintFullTestCommentIfPresent(test_info); 30893a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev 3090d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian if (GTEST_FLAG(print_time)) { 3091d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian printf(" (%s ms)\n", internal::StreamableToString( 30929644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan test_info.result()->elapsed_time()).c_str()); 3093d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian } else { 3094d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian printf("\n"); 3095d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian } 30964b6829f0d28990dd645e16386eb226d0f10c8731shiqian fflush(stdout); 30974b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 30984b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3099334aaead71ccf797a18f2128c320f0304e724860zhanyong.wanvoid PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) { 3100334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan if (!GTEST_FLAG(print_time)) return; 31014b6829f0d28990dd645e16386eb226d0f10c8731shiqian 310203c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string counts = 3103334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan FormatCountableNoun(test_case.test_to_run_count(), "test", "tests"); 3104334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan ColoredPrintf(COLOR_GREEN, "[----------] "); 3105334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan printf("%s from %s (%s ms total)\n\n", 310674b3308eea50db2e7ea0a113a61ac6793b83991azhanyong.wan counts.c_str(), test_case.name(), 3107334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan internal::StreamableToString(test_case.elapsed_time()).c_str()); 31084b6829f0d28990dd645e16386eb226d0f10c8731shiqian fflush(stdout); 31094b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 31104b6829f0d28990dd645e16386eb226d0f10c8731shiqian 31117dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wanvoid PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart( 31129644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan const UnitTest& /*unit_test*/) { 31134b6829f0d28990dd645e16386eb226d0f10c8731shiqian ColoredPrintf(COLOR_GREEN, "[----------] "); 31144b6829f0d28990dd645e16386eb226d0f10c8731shiqian printf("Global test environment tear-down\n"); 31154b6829f0d28990dd645e16386eb226d0f10c8731shiqian fflush(stdout); 31164b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 31174b6829f0d28990dd645e16386eb226d0f10c8731shiqian 31184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Internal helper for printing the list of failed tests. 3119a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wanvoid PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) { 3120a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan const int failed_test_count = unit_test.failed_test_count(); 31214b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (failed_test_count == 0) { 31224b6829f0d28990dd645e16386eb226d0f10c8731shiqian return; 31234b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 31244b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3125a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan for (int i = 0; i < unit_test.total_test_case_count(); ++i) { 3126a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan const TestCase& test_case = *unit_test.GetTestCase(i); 3127a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan if (!test_case.should_run() || (test_case.failed_test_count() == 0)) { 31284b6829f0d28990dd645e16386eb226d0f10c8731shiqian continue; 31294b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 3130a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan for (int j = 0; j < test_case.total_test_count(); ++j) { 3131a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan const TestInfo& test_info = *test_case.GetTestInfo(j); 3132a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan if (!test_info.should_run() || test_info.result()->Passed()) { 31334b6829f0d28990dd645e16386eb226d0f10c8731shiqian continue; 31344b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 31354b6829f0d28990dd645e16386eb226d0f10c8731shiqian ColoredPrintf(COLOR_RED, "[ FAILED ] "); 3136a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan printf("%s.%s", test_case.name(), test_info.name()); 31373a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev PrintFullTestCommentIfPresent(test_info); 31383a6fc976eaf7f79a3e8212595ccf49d72d37335bvladlosev printf("\n"); 31394b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 31404b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 31414b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 31424b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3143c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wanvoid PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, 3144c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan int /*iteration*/) { 31454b6829f0d28990dd645e16386eb226d0f10c8731shiqian ColoredPrintf(COLOR_GREEN, "[==========] "); 3146d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian printf("%s from %s ran.", 3147a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan FormatTestCount(unit_test.test_to_run_count()).c_str(), 3148a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str()); 3149d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian if (GTEST_FLAG(print_time)) { 3150d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian printf(" (%s ms total)", 3151a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan internal::StreamableToString(unit_test.elapsed_time()).c_str()); 3152d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian } 3153d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian printf("\n"); 31544b6829f0d28990dd645e16386eb226d0f10c8731shiqian ColoredPrintf(COLOR_GREEN, "[ PASSED ] "); 3155a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str()); 31564b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3157a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan int num_failures = unit_test.failed_test_count(); 3158a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan if (!unit_test.Passed()) { 3159a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan const int failed_test_count = unit_test.failed_test_count(); 31604b6829f0d28990dd645e16386eb226d0f10c8731shiqian ColoredPrintf(COLOR_RED, "[ FAILED ] "); 31614b6829f0d28990dd645e16386eb226d0f10c8731shiqian printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str()); 3162a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan PrintFailedTests(unit_test); 31634b6829f0d28990dd645e16386eb226d0f10c8731shiqian printf("\n%2d FAILED %s\n", num_failures, 31644b6829f0d28990dd645e16386eb226d0f10c8731shiqian num_failures == 1 ? "TEST" : "TESTS"); 31654b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 31664b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3167c567ac6c5431d9d2867ace1da1418f4575215516vladlosev int num_disabled = unit_test.reportable_disabled_test_count(); 3168ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) { 31694b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (!num_failures) { 31704b6829f0d28990dd645e16386eb226d0f10c8731shiqian printf("\n"); // Add a spacer if no FAILURE banner is displayed. 31714b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 31724b6829f0d28990dd645e16386eb226d0f10c8731shiqian ColoredPrintf(COLOR_YELLOW, 31734b6829f0d28990dd645e16386eb226d0f10c8731shiqian " YOU HAVE %d DISABLED %s\n\n", 31744b6829f0d28990dd645e16386eb226d0f10c8731shiqian num_disabled, 31754b6829f0d28990dd645e16386eb226d0f10c8731shiqian num_disabled == 1 ? "TEST" : "TESTS"); 31764b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 31774b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Ensure that Google Test output is printed before, e.g., heapchecker output. 31784b6829f0d28990dd645e16386eb226d0f10c8731shiqian fflush(stdout); 31794b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 31804b6829f0d28990dd645e16386eb226d0f10c8731shiqian 31814b6829f0d28990dd645e16386eb226d0f10c8731shiqian// End PrettyUnitTestResultPrinter 31824b6829f0d28990dd645e16386eb226d0f10c8731shiqian 31837dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan// class TestEventRepeater 31844b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 31854b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This class forwards events to other event listeners. 3186fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wanclass TestEventRepeater : public TestEventListener { 31874b6829f0d28990dd645e16386eb226d0f10c8731shiqian public: 31887dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan TestEventRepeater() : forwarding_enabled_(true) {} 31897dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan virtual ~TestEventRepeater(); 3190fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan void Append(TestEventListener *listener); 3191fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan TestEventListener* Release(TestEventListener* listener); 3192f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 3193f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan // Controls whether events will be forwarded to listeners_. Set to false 3194f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan // in death test child processes. 3195f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan bool forwarding_enabled() const { return forwarding_enabled_; } 3196f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; } 31974b6829f0d28990dd645e16386eb226d0f10c8731shiqian 31987dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan virtual void OnTestProgramStart(const UnitTest& unit_test); 31997dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration); 32007dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test); 32017dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test); 32029644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan virtual void OnTestCaseStart(const TestCase& test_case); 32039644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan virtual void OnTestStart(const TestInfo& test_info); 32047dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan virtual void OnTestPartResult(const TestPartResult& result); 3205334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan virtual void OnTestEnd(const TestInfo& test_info); 3206334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan virtual void OnTestCaseEnd(const TestCase& test_case); 3207334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test); 3208334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test); 3209334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration); 3210334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan virtual void OnTestProgramEnd(const UnitTest& unit_test); 32114b6829f0d28990dd645e16386eb226d0f10c8731shiqian 32124b6829f0d28990dd645e16386eb226d0f10c8731shiqian private: 3213f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan // Controls whether events will be forwarded to listeners_. Set to false 3214f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan // in death test child processes. 3215f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan bool forwarding_enabled_; 3216f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan // The list of listeners that receive events. 321793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan std::vector<TestEventListener*> listeners_; 32184b6829f0d28990dd645e16386eb226d0f10c8731shiqian 32197dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater); 32204b6829f0d28990dd645e16386eb226d0f10c8731shiqian}; 32214b6829f0d28990dd645e16386eb226d0f10c8731shiqian 32227dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wanTestEventRepeater::~TestEventRepeater() { 322393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan ForEach(listeners_, Delete<TestEventListener>); 32244b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 32254b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3226fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wanvoid TestEventRepeater::Append(TestEventListener *listener) { 322793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan listeners_.push_back(listener); 32284b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 32294b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3230f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// TODO(vladl@google.com): Factor the search functionality into Vector::Find. 3231fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wanTestEventListener* TestEventRepeater::Release(TestEventListener *listener) { 323293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan for (size_t i = 0; i < listeners_.size(); ++i) { 323393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan if (listeners_[i] == listener) { 323493d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan listeners_.erase(listeners_.begin() + i); 3235f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan return listener; 3236f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan } 3237f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan } 3238f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 3239f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan return NULL; 3240f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan} 3241f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 32427dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan// Since most methods are very similar, use macros to reduce boilerplate. 32437dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan// This defines a member that forwards the call to all listeners. 3244e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian#define GTEST_REPEATER_METHOD_(Name, Type) \ 32457dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wanvoid TestEventRepeater::Name(const Type& parameter) { \ 3246f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan if (forwarding_enabled_) { \ 324793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan for (size_t i = 0; i < listeners_.size(); i++) { \ 324893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan listeners_[i]->Name(parameter); \ 3249f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan } \ 32504b6829f0d28990dd645e16386eb226d0f10c8731shiqian } \ 32514b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 32527dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan// This defines a member that forwards the call to all listeners in reverse 32537dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan// order. 32547dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \ 32557dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wanvoid TestEventRepeater::Name(const Type& parameter) { \ 32567dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan if (forwarding_enabled_) { \ 32577dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \ 325893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan listeners_[i]->Name(parameter); \ 32597dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan } \ 32607dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan } \ 32617dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan} 32624b6829f0d28990dd645e16386eb226d0f10c8731shiqian 32637dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wanGTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest) 32647dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wanGTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest) 3265e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianGTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase) 3266e44602ec83c65102035ce5304ae8de0cb16e9e56shiqianGTEST_REPEATER_METHOD_(OnTestStart, TestInfo) 32677dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wanGTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult) 3268334aaead71ccf797a18f2128c320f0304e724860zhanyong.wanGTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest) 32697dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wanGTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest) 32707dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wanGTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest) 32717dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wanGTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo) 3272334aaead71ccf797a18f2128c320f0304e724860zhanyong.wanGTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase) 3273334aaead71ccf797a18f2128c320f0304e724860zhanyong.wanGTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest) 32744b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3275e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian#undef GTEST_REPEATER_METHOD_ 32767dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan#undef GTEST_REVERSE_REPEATER_METHOD_ 32774b6829f0d28990dd645e16386eb226d0f10c8731shiqian 32787dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wanvoid TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test, 32797dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan int iteration) { 32807dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan if (forwarding_enabled_) { 328193d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan for (size_t i = 0; i < listeners_.size(); i++) { 328293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan listeners_[i]->OnTestIterationStart(unit_test, iteration); 32837dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan } 32847dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan } 32857dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan} 32867dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan 32877dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wanvoid TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test, 32887dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan int iteration) { 32897dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan if (forwarding_enabled_) { 32907dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { 329193d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan listeners_[i]->OnTestIterationEnd(unit_test, iteration); 32927dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan } 32937dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan } 32947dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan} 32957dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan 32967dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan// End TestEventRepeater 32974b6829f0d28990dd645e16386eb226d0f10c8731shiqian 32984b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This class generates an XML output file. 32999644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanclass XmlUnitTestResultPrinter : public EmptyTestEventListener { 33004b6829f0d28990dd645e16386eb226d0f10c8731shiqian public: 33014b6829f0d28990dd645e16386eb226d0f10c8731shiqian explicit XmlUnitTestResultPrinter(const char* output_file); 33024b6829f0d28990dd645e16386eb226d0f10c8731shiqian 33037dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration); 33044b6829f0d28990dd645e16386eb226d0f10c8731shiqian 33054b6829f0d28990dd645e16386eb226d0f10c8731shiqian private: 33064b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Is c a whitespace character that is normalized to a space character 33074b6829f0d28990dd645e16386eb226d0f10c8731shiqian // when it appears in an XML attribute value? 33084b6829f0d28990dd645e16386eb226d0f10c8731shiqian static bool IsNormalizableWhitespace(char c) { 33094b6829f0d28990dd645e16386eb226d0f10c8731shiqian return c == 0x9 || c == 0xA || c == 0xD; 33104b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 33114b6829f0d28990dd645e16386eb226d0f10c8731shiqian 33124b6829f0d28990dd645e16386eb226d0f10c8731shiqian // May c appear in a well-formed XML document? 33134b6829f0d28990dd645e16386eb226d0f10c8731shiqian static bool IsValidXmlCharacter(char c) { 33144b6829f0d28990dd645e16386eb226d0f10c8731shiqian return IsNormalizableWhitespace(c) || c >= 0x20; 33154b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 33164b6829f0d28990dd645e16386eb226d0f10c8731shiqian 33174b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Returns an XML-escaped copy of the input string str. If 33184b6829f0d28990dd645e16386eb226d0f10c8731shiqian // is_attribute is true, the text is meant to appear as an attribute 33194b6829f0d28990dd645e16386eb226d0f10c8731shiqian // value, and normalizable whitespace is preserved by replacing it 33204b6829f0d28990dd645e16386eb226d0f10c8731shiqian // with character references. 3321dfbdf0bab51520595679a99710983daba6fc18ebvladlosev static std::string EscapeXml(const std::string& str, bool is_attribute); 33224b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3323f6d087b78d230d875bf5d8281112662795044680zhanyong.wan // Returns the given string with all characters invalid in XML removed. 3324dfbdf0bab51520595679a99710983daba6fc18ebvladlosev static std::string RemoveInvalidXmlCharacters(const std::string& str); 3325f6d087b78d230d875bf5d8281112662795044680zhanyong.wan 33264b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Convenience wrapper around EscapeXml when str is an attribute value. 3327dfbdf0bab51520595679a99710983daba6fc18ebvladlosev static std::string EscapeXmlAttribute(const std::string& str) { 33284b6829f0d28990dd645e16386eb226d0f10c8731shiqian return EscapeXml(str, true); 33294b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 33304b6829f0d28990dd645e16386eb226d0f10c8731shiqian 33314b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Convenience wrapper around EscapeXml when str is not an attribute value. 333203c314931649a999b0cf5deb0a434a1009157416jgm@google.com static std::string EscapeXmlText(const char* str) { 333303c314931649a999b0cf5deb0a434a1009157416jgm@google.com return EscapeXml(str, false); 333403c314931649a999b0cf5deb0a434a1009157416jgm@google.com } 33354b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3336dfbdf0bab51520595679a99710983daba6fc18ebvladlosev // Verifies that the given attribute belongs to the given element and 3337dfbdf0bab51520595679a99710983daba6fc18ebvladlosev // streams the attribute as XML. 3338dfbdf0bab51520595679a99710983daba6fc18ebvladlosev static void OutputXmlAttribute(std::ostream* stream, 3339dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const std::string& element_name, 3340dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const std::string& name, 3341dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const std::string& value); 3342dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 3343f6d087b78d230d875bf5d8281112662795044680zhanyong.wan // Streams an XML CDATA section, escaping invalid CDATA sequences as needed. 3344f6d087b78d230d875bf5d8281112662795044680zhanyong.wan static void OutputXmlCDataSection(::std::ostream* stream, const char* data); 3345f6d087b78d230d875bf5d8281112662795044680zhanyong.wan 3346f6d087b78d230d875bf5d8281112662795044680zhanyong.wan // Streams an XML representation of a TestInfo object. 3347f6d087b78d230d875bf5d8281112662795044680zhanyong.wan static void OutputXmlTestInfo(::std::ostream* stream, 3348f6d087b78d230d875bf5d8281112662795044680zhanyong.wan const char* test_case_name, 3349f6d087b78d230d875bf5d8281112662795044680zhanyong.wan const TestInfo& test_info); 33504b6829f0d28990dd645e16386eb226d0f10c8731shiqian 33514b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Prints an XML representation of a TestCase object 3352dfbdf0bab51520595679a99710983daba6fc18ebvladlosev static void PrintXmlTestCase(::std::ostream* stream, 3353dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const TestCase& test_case); 33544b6829f0d28990dd645e16386eb226d0f10c8731shiqian 33554b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Prints an XML summary of unit_test to output stream out. 3356dfbdf0bab51520595679a99710983daba6fc18ebvladlosev static void PrintXmlUnitTest(::std::ostream* stream, 3357dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const UnitTest& unit_test); 33584b6829f0d28990dd645e16386eb226d0f10c8731shiqian 33594b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Produces a string representing the test properties in a result as space 33604b6829f0d28990dd645e16386eb226d0f10c8731shiqian // delimited XML attributes based on the property key="value" pairs. 336103c314931649a999b0cf5deb0a434a1009157416jgm@google.com // When the std::string is not empty, it includes a space at the beginning, 33624b6829f0d28990dd645e16386eb226d0f10c8731shiqian // to delimit this attribute from prior attributes. 336303c314931649a999b0cf5deb0a434a1009157416jgm@google.com static std::string TestPropertiesAsXmlAttributes(const TestResult& result); 33644b6829f0d28990dd645e16386eb226d0f10c8731shiqian 33654b6829f0d28990dd645e16386eb226d0f10c8731shiqian // The output file. 336603c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string output_file_; 33674b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3368e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter); 33694b6829f0d28990dd645e16386eb226d0f10c8731shiqian}; 33704b6829f0d28990dd645e16386eb226d0f10c8731shiqian 33714b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Creates a new XmlUnitTestResultPrinter. 33724b6829f0d28990dd645e16386eb226d0f10c8731shiqianXmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file) 33734b6829f0d28990dd645e16386eb226d0f10c8731shiqian : output_file_(output_file) { 33744b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (output_file_.c_str() == NULL || output_file_.empty()) { 33754b6829f0d28990dd645e16386eb226d0f10c8731shiqian fprintf(stderr, "XML output file may not be null\n"); 33764b6829f0d28990dd645e16386eb226d0f10c8731shiqian fflush(stderr); 33774b6829f0d28990dd645e16386eb226d0f10c8731shiqian exit(EXIT_FAILURE); 33784b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 33794b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 33804b6829f0d28990dd645e16386eb226d0f10c8731shiqian 33814b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Called after the unit test ends. 33827dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wanvoid XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, 33837dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan int /*iteration*/) { 33844b6829f0d28990dd645e16386eb226d0f10c8731shiqian FILE* xmlout = NULL; 3385f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan FilePath output_file(output_file_); 3386f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan FilePath output_dir(output_file.RemoveFileName()); 33874b6829f0d28990dd645e16386eb226d0f10c8731shiqian 33884b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (output_dir.CreateDirectoriesRecursively()) { 3389f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan xmlout = posix::FOpen(output_file_.c_str(), "w"); 33904b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 33914b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (xmlout == NULL) { 33924b6829f0d28990dd645e16386eb226d0f10c8731shiqian // TODO(wan): report the reason of the failure. 33934b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 33944b6829f0d28990dd645e16386eb226d0f10c8731shiqian // We don't do it for now as: 33954b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 33964b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 1. There is no urgent need for it. 33974b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 2. It's a bit involved to make the errno variable thread-safe on 33984b6829f0d28990dd645e16386eb226d0f10c8731shiqian // all three operating systems (Linux, Windows, and Mac OS). 33994b6829f0d28990dd645e16386eb226d0f10c8731shiqian // 3. To interpret the meaning of errno in a thread-safe way, 34004b6829f0d28990dd645e16386eb226d0f10c8731shiqian // we need the strerror_r() function, which is not available on 34014b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Windows. 34024b6829f0d28990dd645e16386eb226d0f10c8731shiqian fprintf(stderr, 34034b6829f0d28990dd645e16386eb226d0f10c8731shiqian "Unable to open file \"%s\"\n", 34044b6829f0d28990dd645e16386eb226d0f10c8731shiqian output_file_.c_str()); 34054b6829f0d28990dd645e16386eb226d0f10c8731shiqian fflush(stderr); 34064b6829f0d28990dd645e16386eb226d0f10c8731shiqian exit(EXIT_FAILURE); 34074b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 3408dfbdf0bab51520595679a99710983daba6fc18ebvladlosev std::stringstream stream; 3409dfbdf0bab51520595679a99710983daba6fc18ebvladlosev PrintXmlUnitTest(&stream, unit_test); 3410dfbdf0bab51520595679a99710983daba6fc18ebvladlosev fprintf(xmlout, "%s", StringStreamToString(&stream).c_str()); 34114b6829f0d28990dd645e16386eb226d0f10c8731shiqian fclose(xmlout); 34124b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 34134b6829f0d28990dd645e16386eb226d0f10c8731shiqian 34144b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns an XML-escaped copy of the input string str. If is_attribute 34154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// is true, the text is meant to appear as an attribute value, and 34164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// normalizable whitespace is preserved by replacing it with character 34174b6829f0d28990dd645e16386eb226d0f10c8731shiqian// references. 34184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 34194b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Invalid XML characters in str, if any, are stripped from the output. 34204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// It is expected that most, if not all, of the text processed by this 34214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// module will consist of ordinary English text. 34224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// If this module is ever modified to produce version 1.1 XML output, 34234b6829f0d28990dd645e16386eb226d0f10c8731shiqian// most invalid characters can be retained using character references. 34244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// TODO(wan): It might be nice to have a minimally invasive, human-readable 34254b6829f0d28990dd645e16386eb226d0f10c8731shiqian// escaping scheme for invalid characters, rather than dropping them. 342603c314931649a999b0cf5deb0a434a1009157416jgm@google.comstd::string XmlUnitTestResultPrinter::EscapeXml( 3427dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const std::string& str, bool is_attribute) { 34284b6829f0d28990dd645e16386eb226d0f10c8731shiqian Message m; 34294b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3430dfbdf0bab51520595679a99710983daba6fc18ebvladlosev for (size_t i = 0; i < str.size(); ++i) { 3431dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const char ch = str[i]; 3432dfbdf0bab51520595679a99710983daba6fc18ebvladlosev switch (ch) { 3433dfbdf0bab51520595679a99710983daba6fc18ebvladlosev case '<': 3434dfbdf0bab51520595679a99710983daba6fc18ebvladlosev m << "<"; 3435dfbdf0bab51520595679a99710983daba6fc18ebvladlosev break; 3436dfbdf0bab51520595679a99710983daba6fc18ebvladlosev case '>': 3437dfbdf0bab51520595679a99710983daba6fc18ebvladlosev m << ">"; 3438dfbdf0bab51520595679a99710983daba6fc18ebvladlosev break; 3439dfbdf0bab51520595679a99710983daba6fc18ebvladlosev case '&': 3440dfbdf0bab51520595679a99710983daba6fc18ebvladlosev m << "&"; 3441dfbdf0bab51520595679a99710983daba6fc18ebvladlosev break; 3442dfbdf0bab51520595679a99710983daba6fc18ebvladlosev case '\'': 3443dfbdf0bab51520595679a99710983daba6fc18ebvladlosev if (is_attribute) 3444dfbdf0bab51520595679a99710983daba6fc18ebvladlosev m << "'"; 3445dfbdf0bab51520595679a99710983daba6fc18ebvladlosev else 3446dfbdf0bab51520595679a99710983daba6fc18ebvladlosev m << '\''; 3447dfbdf0bab51520595679a99710983daba6fc18ebvladlosev break; 3448dfbdf0bab51520595679a99710983daba6fc18ebvladlosev case '"': 3449dfbdf0bab51520595679a99710983daba6fc18ebvladlosev if (is_attribute) 3450dfbdf0bab51520595679a99710983daba6fc18ebvladlosev m << """; 3451dfbdf0bab51520595679a99710983daba6fc18ebvladlosev else 3452dfbdf0bab51520595679a99710983daba6fc18ebvladlosev m << '"'; 3453dfbdf0bab51520595679a99710983daba6fc18ebvladlosev break; 3454dfbdf0bab51520595679a99710983daba6fc18ebvladlosev default: 3455dfbdf0bab51520595679a99710983daba6fc18ebvladlosev if (IsValidXmlCharacter(ch)) { 3456dfbdf0bab51520595679a99710983daba6fc18ebvladlosev if (is_attribute && IsNormalizableWhitespace(ch)) 3457dfbdf0bab51520595679a99710983daba6fc18ebvladlosev m << "&#x" << String::FormatByte(static_cast<unsigned char>(ch)) 3458dfbdf0bab51520595679a99710983daba6fc18ebvladlosev << ";"; 34594b6829f0d28990dd645e16386eb226d0f10c8731shiqian else 3460dfbdf0bab51520595679a99710983daba6fc18ebvladlosev m << ch; 3461dfbdf0bab51520595679a99710983daba6fc18ebvladlosev } 3462dfbdf0bab51520595679a99710983daba6fc18ebvladlosev break; 34634b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 34644b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 34654b6829f0d28990dd645e16386eb226d0f10c8731shiqian 34664b6829f0d28990dd645e16386eb226d0f10c8731shiqian return m.GetString(); 34674b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 34684b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3469f6d087b78d230d875bf5d8281112662795044680zhanyong.wan// Returns the given string with all characters invalid in XML removed. 3470f6d087b78d230d875bf5d8281112662795044680zhanyong.wan// Currently invalid characters are dropped from the string. An 3471f6d087b78d230d875bf5d8281112662795044680zhanyong.wan// alternative is to replace them with certain characters such as . or ?. 3472dfbdf0bab51520595679a99710983daba6fc18ebvladlosevstd::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters( 3473dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const std::string& str) { 3474dfbdf0bab51520595679a99710983daba6fc18ebvladlosev std::string output; 34759beddf89f4372081229ad12f3126952658da9081vladlosev output.reserve(str.size()); 3476dfbdf0bab51520595679a99710983daba6fc18ebvladlosev for (std::string::const_iterator it = str.begin(); it != str.end(); ++it) 34779beddf89f4372081229ad12f3126952658da9081vladlosev if (IsValidXmlCharacter(*it)) 34789beddf89f4372081229ad12f3126952658da9081vladlosev output.push_back(*it); 3479f6d087b78d230d875bf5d8281112662795044680zhanyong.wan 34809beddf89f4372081229ad12f3126952658da9081vladlosev return output; 3481f6d087b78d230d875bf5d8281112662795044680zhanyong.wan} 3482f6d087b78d230d875bf5d8281112662795044680zhanyong.wan 34834b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The following routines generate an XML representation of a UnitTest 34844b6829f0d28990dd645e16386eb226d0f10c8731shiqian// object. 34854b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 34864b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This is how Google Test concepts map to the DTD: 34874b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 3488b0b40063a828ca7a4ceb079ecd508775c6aa9d93zhanyong.wan// <testsuites name="AllTests"> <-- corresponds to a UnitTest object 34894b6829f0d28990dd645e16386eb226d0f10c8731shiqian// <testsuite name="testcase-name"> <-- corresponds to a TestCase object 34904b6829f0d28990dd645e16386eb226d0f10c8731shiqian// <testcase name="test-name"> <-- corresponds to a TestInfo object 3491f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqian// <failure message="...">...</failure> 3492f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqian// <failure message="...">...</failure> 3493f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqian// <failure message="...">...</failure> 3494f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqian// <-- individual assertion failures 34954b6829f0d28990dd645e16386eb226d0f10c8731shiqian// </testcase> 34964b6829f0d28990dd645e16386eb226d0f10c8731shiqian// </testsuite> 3497b0b40063a828ca7a4ceb079ecd508775c6aa9d93zhanyong.wan// </testsuites> 34984b6829f0d28990dd645e16386eb226d0f10c8731shiqian 349965de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan// Formats the given time in milliseconds as seconds. 350065de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wanstd::string FormatTimeInMillisAsSeconds(TimeInMillis ms) { 350165de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan ::std::stringstream ss; 350265de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan ss << ms/1000.0; 350365de7e062b96a0b579ba832ec8e5527528b8fa51zhanyong.wan return ss.str(); 3504f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqian} 3505f0e809a3c9946e99595d4faeb0a16bdc2ca9ffd5shiqian 35068883b42f2a78976dde09f31ca72806072e33bd5fvladlosev// Converts the given epoch time in milliseconds to a date string in the ISO 35078883b42f2a78976dde09f31ca72806072e33bd5fvladlosev// 8601 format, without the timezone information. 35088883b42f2a78976dde09f31ca72806072e33bd5fvladlosevstd::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) { 35098883b42f2a78976dde09f31ca72806072e33bd5fvladlosev time_t seconds = static_cast<time_t>(ms / 1000); 3510d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com struct tm time_struct; 35118883b42f2a78976dde09f31ca72806072e33bd5fvladlosev#ifdef _MSC_VER 3512d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com if (localtime_s(&time_struct, &seconds) != 0) 3513d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com return ""; // Invalid ms value 35148883b42f2a78976dde09f31ca72806072e33bd5fvladlosev#else 3515d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com if (localtime_r(&seconds, &time_struct) == NULL) 35168883b42f2a78976dde09f31ca72806072e33bd5fvladlosev return ""; // Invalid ms value 3517d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com#endif 35188883b42f2a78976dde09f31ca72806072e33bd5fvladlosev 35193b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com // YYYY-MM-DDThh:mm:ss 3520d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com return StreamableToString(time_struct.tm_year + 1900) + "-" + 3521d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com String::FormatIntWidth2(time_struct.tm_mon + 1) + "-" + 3522d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com String::FormatIntWidth2(time_struct.tm_mday) + "T" + 3523d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com String::FormatIntWidth2(time_struct.tm_hour) + ":" + 3524d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com String::FormatIntWidth2(time_struct.tm_min) + ":" + 3525d132283f055f07588d82ad43fbf501645cb39c9dkosak@google.com String::FormatIntWidth2(time_struct.tm_sec); 35268883b42f2a78976dde09f31ca72806072e33bd5fvladlosev} 35278883b42f2a78976dde09f31ca72806072e33bd5fvladlosev 3528f6d087b78d230d875bf5d8281112662795044680zhanyong.wan// Streams an XML CDATA section, escaping invalid CDATA sequences as needed. 3529f6d087b78d230d875bf5d8281112662795044680zhanyong.wanvoid XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream, 3530f6d087b78d230d875bf5d8281112662795044680zhanyong.wan const char* data) { 3531f6d087b78d230d875bf5d8281112662795044680zhanyong.wan const char* segment = data; 3532f6d087b78d230d875bf5d8281112662795044680zhanyong.wan *stream << "<![CDATA["; 3533f6d087b78d230d875bf5d8281112662795044680zhanyong.wan for (;;) { 3534f6d087b78d230d875bf5d8281112662795044680zhanyong.wan const char* const next_segment = strstr(segment, "]]>"); 3535f6d087b78d230d875bf5d8281112662795044680zhanyong.wan if (next_segment != NULL) { 3536d6cb9725050e07247a186a397573e7c95e263bb4vladlosev stream->write( 3537d6cb9725050e07247a186a397573e7c95e263bb4vladlosev segment, static_cast<std::streamsize>(next_segment - segment)); 3538f6d087b78d230d875bf5d8281112662795044680zhanyong.wan *stream << "]]>]]><![CDATA["; 3539f6d087b78d230d875bf5d8281112662795044680zhanyong.wan segment = next_segment + strlen("]]>"); 3540f6d087b78d230d875bf5d8281112662795044680zhanyong.wan } else { 3541f6d087b78d230d875bf5d8281112662795044680zhanyong.wan *stream << segment; 3542f6d087b78d230d875bf5d8281112662795044680zhanyong.wan break; 3543f6d087b78d230d875bf5d8281112662795044680zhanyong.wan } 3544f6d087b78d230d875bf5d8281112662795044680zhanyong.wan } 3545f6d087b78d230d875bf5d8281112662795044680zhanyong.wan *stream << "]]>"; 3546f6d087b78d230d875bf5d8281112662795044680zhanyong.wan} 3547f6d087b78d230d875bf5d8281112662795044680zhanyong.wan 3548dfbdf0bab51520595679a99710983daba6fc18ebvladlosevvoid XmlUnitTestResultPrinter::OutputXmlAttribute( 3549dfbdf0bab51520595679a99710983daba6fc18ebvladlosev std::ostream* stream, 3550dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const std::string& element_name, 3551dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const std::string& name, 3552dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const std::string& value) { 3553dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const std::vector<std::string>& allowed_names = 3554dfbdf0bab51520595679a99710983daba6fc18ebvladlosev GetReservedAttributesForElement(element_name); 3555dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 3556dfbdf0bab51520595679a99710983daba6fc18ebvladlosev GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) != 3557dfbdf0bab51520595679a99710983daba6fc18ebvladlosev allowed_names.end()) 3558dfbdf0bab51520595679a99710983daba6fc18ebvladlosev << "Attribute " << name << " is not allowed for element <" << element_name 3559dfbdf0bab51520595679a99710983daba6fc18ebvladlosev << ">."; 3560dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 3561dfbdf0bab51520595679a99710983daba6fc18ebvladlosev *stream << " " << name << "=\"" << EscapeXmlAttribute(value) << "\""; 3562dfbdf0bab51520595679a99710983daba6fc18ebvladlosev} 3563dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 35644b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Prints an XML representation of a TestInfo object. 35654b6829f0d28990dd645e16386eb226d0f10c8731shiqian// TODO(wan): There is also value in printing properties with the plain printer. 3566f6d087b78d230d875bf5d8281112662795044680zhanyong.wanvoid XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream, 3567f6d087b78d230d875bf5d8281112662795044680zhanyong.wan const char* test_case_name, 3568f6d087b78d230d875bf5d8281112662795044680zhanyong.wan const TestInfo& test_info) { 35691cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan const TestResult& result = *test_info.result(); 3570dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const std::string kTestcase = "testcase"; 3571dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 3572dfbdf0bab51520595679a99710983daba6fc18ebvladlosev *stream << " <testcase"; 3573dfbdf0bab51520595679a99710983daba6fc18ebvladlosev OutputXmlAttribute(stream, kTestcase, "name", test_info.name()); 3574a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan 3575a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan if (test_info.value_param() != NULL) { 3576dfbdf0bab51520595679a99710983daba6fc18ebvladlosev OutputXmlAttribute(stream, kTestcase, "value_param", 3577dfbdf0bab51520595679a99710983daba6fc18ebvladlosev test_info.value_param()); 3578a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan } 3579a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan if (test_info.type_param() != NULL) { 3580dfbdf0bab51520595679a99710983daba6fc18ebvladlosev OutputXmlAttribute(stream, kTestcase, "type_param", test_info.type_param()); 3581a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan } 3582a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan 3583dfbdf0bab51520595679a99710983daba6fc18ebvladlosev OutputXmlAttribute(stream, kTestcase, "status", 3584dfbdf0bab51520595679a99710983daba6fc18ebvladlosev test_info.should_run() ? "run" : "notrun"); 3585dfbdf0bab51520595679a99710983daba6fc18ebvladlosev OutputXmlAttribute(stream, kTestcase, "time", 3586dfbdf0bab51520595679a99710983daba6fc18ebvladlosev FormatTimeInMillisAsSeconds(result.elapsed_time())); 3587dfbdf0bab51520595679a99710983daba6fc18ebvladlosev OutputXmlAttribute(stream, kTestcase, "classname", test_case_name); 3588dfbdf0bab51520595679a99710983daba6fc18ebvladlosev *stream << TestPropertiesAsXmlAttributes(result); 35894b6829f0d28990dd645e16386eb226d0f10c8731shiqian 35904b6829f0d28990dd645e16386eb226d0f10c8731shiqian int failures = 0; 3591a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan for (int i = 0; i < result.total_part_count(); ++i) { 3592449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan const TestPartResult& part = result.GetTestPartResult(i); 35934b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (part.failed()) { 35944dcb99d7acb0a551b7122f68a4d15d993f748c9djgm@google.com if (++failures == 1) { 3595f6d087b78d230d875bf5d8281112662795044680zhanyong.wan *stream << ">\n"; 35964dcb99d7acb0a551b7122f68a4d15d993f748c9djgm@google.com } 35979beddf89f4372081229ad12f3126952658da9081vladlosev const string location = internal::FormatCompilerIndependentFileLocation( 35989beddf89f4372081229ad12f3126952658da9081vladlosev part.file_name(), part.line_number()); 35994dcb99d7acb0a551b7122f68a4d15d993f748c9djgm@google.com const string summary = location + "\n" + part.summary(); 36004dcb99d7acb0a551b7122f68a4d15d993f748c9djgm@google.com *stream << " <failure message=\"" 36014dcb99d7acb0a551b7122f68a4d15d993f748c9djgm@google.com << EscapeXmlAttribute(summary.c_str()) 36024dcb99d7acb0a551b7122f68a4d15d993f748c9djgm@google.com << "\" type=\"\">"; 36034dcb99d7acb0a551b7122f68a4d15d993f748c9djgm@google.com const string detail = location + "\n" + part.message(); 36044dcb99d7acb0a551b7122f68a4d15d993f748c9djgm@google.com OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str()); 3605f6d087b78d230d875bf5d8281112662795044680zhanyong.wan *stream << "</failure>\n"; 36064b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 36074b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 36084b6829f0d28990dd645e16386eb226d0f10c8731shiqian 36094b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (failures == 0) 3610f6d087b78d230d875bf5d8281112662795044680zhanyong.wan *stream << " />\n"; 36114b6829f0d28990dd645e16386eb226d0f10c8731shiqian else 3612f6d087b78d230d875bf5d8281112662795044680zhanyong.wan *stream << " </testcase>\n"; 36134b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 36144b6829f0d28990dd645e16386eb226d0f10c8731shiqian 36154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Prints an XML representation of a TestCase object 3616dfbdf0bab51520595679a99710983daba6fc18ebvladlosevvoid XmlUnitTestResultPrinter::PrintXmlTestCase(std::ostream* stream, 3617a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan const TestCase& test_case) { 3618dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const std::string kTestsuite = "testsuite"; 3619dfbdf0bab51520595679a99710983daba6fc18ebvladlosev *stream << " <" << kTestsuite; 3620dfbdf0bab51520595679a99710983daba6fc18ebvladlosev OutputXmlAttribute(stream, kTestsuite, "name", test_case.name()); 3621dfbdf0bab51520595679a99710983daba6fc18ebvladlosev OutputXmlAttribute(stream, kTestsuite, "tests", 3622c567ac6c5431d9d2867ace1da1418f4575215516vladlosev StreamableToString(test_case.reportable_test_count())); 3623dfbdf0bab51520595679a99710983daba6fc18ebvladlosev OutputXmlAttribute(stream, kTestsuite, "failures", 3624dfbdf0bab51520595679a99710983daba6fc18ebvladlosev StreamableToString(test_case.failed_test_count())); 3625c567ac6c5431d9d2867ace1da1418f4575215516vladlosev OutputXmlAttribute( 3626c567ac6c5431d9d2867ace1da1418f4575215516vladlosev stream, kTestsuite, "disabled", 3627c567ac6c5431d9d2867ace1da1418f4575215516vladlosev StreamableToString(test_case.reportable_disabled_test_count())); 3628dfbdf0bab51520595679a99710983daba6fc18ebvladlosev OutputXmlAttribute(stream, kTestsuite, "errors", "0"); 3629dfbdf0bab51520595679a99710983daba6fc18ebvladlosev OutputXmlAttribute(stream, kTestsuite, "time", 3630dfbdf0bab51520595679a99710983daba6fc18ebvladlosev FormatTimeInMillisAsSeconds(test_case.elapsed_time())); 3631dfbdf0bab51520595679a99710983daba6fc18ebvladlosev *stream << TestPropertiesAsXmlAttributes(test_case.ad_hoc_test_result()) 3632dfbdf0bab51520595679a99710983daba6fc18ebvladlosev << ">\n"; 3633dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 3634c567ac6c5431d9d2867ace1da1418f4575215516vladlosev for (int i = 0; i < test_case.total_test_count(); ++i) { 3635c567ac6c5431d9d2867ace1da1418f4575215516vladlosev if (test_case.GetTestInfo(i)->is_reportable()) 3636c567ac6c5431d9d2867ace1da1418f4575215516vladlosev OutputXmlTestInfo(stream, test_case.name(), *test_case.GetTestInfo(i)); 3637c567ac6c5431d9d2867ace1da1418f4575215516vladlosev } 3638dfbdf0bab51520595679a99710983daba6fc18ebvladlosev *stream << " </" << kTestsuite << ">\n"; 36394b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 36404b6829f0d28990dd645e16386eb226d0f10c8731shiqian 36414b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Prints an XML summary of unit_test to output stream out. 3642dfbdf0bab51520595679a99710983daba6fc18ebvladlosevvoid XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream, 36439644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan const UnitTest& unit_test) { 3644dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const std::string kTestsuites = "testsuites"; 3645dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 3646dfbdf0bab51520595679a99710983daba6fc18ebvladlosev *stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; 3647dfbdf0bab51520595679a99710983daba6fc18ebvladlosev *stream << "<" << kTestsuites; 3648dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 3649dfbdf0bab51520595679a99710983daba6fc18ebvladlosev OutputXmlAttribute(stream, kTestsuites, "tests", 3650c567ac6c5431d9d2867ace1da1418f4575215516vladlosev StreamableToString(unit_test.reportable_test_count())); 3651dfbdf0bab51520595679a99710983daba6fc18ebvladlosev OutputXmlAttribute(stream, kTestsuites, "failures", 3652dfbdf0bab51520595679a99710983daba6fc18ebvladlosev StreamableToString(unit_test.failed_test_count())); 3653c567ac6c5431d9d2867ace1da1418f4575215516vladlosev OutputXmlAttribute( 3654c567ac6c5431d9d2867ace1da1418f4575215516vladlosev stream, kTestsuites, "disabled", 3655c567ac6c5431d9d2867ace1da1418f4575215516vladlosev StreamableToString(unit_test.reportable_disabled_test_count())); 3656dfbdf0bab51520595679a99710983daba6fc18ebvladlosev OutputXmlAttribute(stream, kTestsuites, "errors", "0"); 3657dfbdf0bab51520595679a99710983daba6fc18ebvladlosev OutputXmlAttribute( 3658dfbdf0bab51520595679a99710983daba6fc18ebvladlosev stream, kTestsuites, "timestamp", 3659dfbdf0bab51520595679a99710983daba6fc18ebvladlosev FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp())); 3660dfbdf0bab51520595679a99710983daba6fc18ebvladlosev OutputXmlAttribute(stream, kTestsuites, "time", 3661dfbdf0bab51520595679a99710983daba6fc18ebvladlosev FormatTimeInMillisAsSeconds(unit_test.elapsed_time())); 3662dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 36639b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan if (GTEST_FLAG(shuffle)) { 3664dfbdf0bab51520595679a99710983daba6fc18ebvladlosev OutputXmlAttribute(stream, kTestsuites, "random_seed", 3665dfbdf0bab51520595679a99710983daba6fc18ebvladlosev StreamableToString(unit_test.random_seed())); 36669b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan } 3667dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 3668dfbdf0bab51520595679a99710983daba6fc18ebvladlosev *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result()); 3669dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 3670dfbdf0bab51520595679a99710983daba6fc18ebvladlosev OutputXmlAttribute(stream, kTestsuites, "name", "AllTests"); 3671dfbdf0bab51520595679a99710983daba6fc18ebvladlosev *stream << ">\n"; 3672dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 3673dfbdf0bab51520595679a99710983daba6fc18ebvladlosev for (int i = 0; i < unit_test.total_test_case_count(); ++i) { 3674c567ac6c5431d9d2867ace1da1418f4575215516vladlosev if (unit_test.GetTestCase(i)->reportable_test_count() > 0) 3675c567ac6c5431d9d2867ace1da1418f4575215516vladlosev PrintXmlTestCase(stream, *unit_test.GetTestCase(i)); 3676dfbdf0bab51520595679a99710983daba6fc18ebvladlosev } 3677dfbdf0bab51520595679a99710983daba6fc18ebvladlosev *stream << "</" << kTestsuites << ">\n"; 36784b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 36794b6829f0d28990dd645e16386eb226d0f10c8731shiqian 36804b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Produces a string representing the test properties in a result as space 36814b6829f0d28990dd645e16386eb226d0f10c8731shiqian// delimited XML attributes based on the property key="value" pairs. 368203c314931649a999b0cf5deb0a434a1009157416jgm@google.comstd::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes( 36831cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wan const TestResult& result) { 36844b6829f0d28990dd645e16386eb226d0f10c8731shiqian Message attributes; 3685a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan for (int i = 0; i < result.test_property_count(); ++i) { 3686449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan const TestProperty& property = result.GetTestProperty(i); 36874b6829f0d28990dd645e16386eb226d0f10c8731shiqian attributes << " " << property.key() << "=" 36884b6829f0d28990dd645e16386eb226d0f10c8731shiqian << "\"" << EscapeXmlAttribute(property.value()) << "\""; 36894b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 36904b6829f0d28990dd645e16386eb226d0f10c8731shiqian return attributes.GetString(); 36914b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 36924b6829f0d28990dd645e16386eb226d0f10c8731shiqian 36934b6829f0d28990dd645e16386eb226d0f10c8731shiqian// End XmlUnitTestResultPrinter 36944b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3695c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan#if GTEST_CAN_STREAM_RESULTS_ 3696c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan 3697c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan// Checks if str contains '=', '&', '%' or '\n' characters. If yes, 3698c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan// replaces them by "%xx" where xx is their hexadecimal value. For 3699c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan// example, replaces "=" with "%3D". This algorithm is O(strlen(str)) 3700c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan// in both time and space -- important as the input str may contain an 3701c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan// arbitrarily long test failure message and stack trace. 3702c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wanstring StreamingListener::UrlEncode(const char* str) { 3703c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan string result; 3704c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan result.reserve(strlen(str) + 1); 3705c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan for (char ch = *str; ch != '\0'; ch = *++str) { 3706c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan switch (ch) { 3707c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan case '%': 3708c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan case '=': 3709c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan case '&': 3710c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan case '\n': 37113b8388d9490a64a47ed8cbdab2021935b1b2c76ckosak@google.com result.append("%" + String::FormatByte(static_cast<unsigned char>(ch))); 3712c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan break; 3713c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan default: 3714c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan result.push_back(ch); 3715c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan break; 3716c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan } 3717c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan } 3718c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan return result; 3719c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan} 3720c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan 3721a032cfff4091c87a137a8d24ce2eb97c740cf4c8kosak@google.comvoid StreamingListener::SocketWriter::MakeConnection() { 3722c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan GTEST_CHECK_(sockfd_ == -1) 3723c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan << "MakeConnection() can't be called when there is already a connection."; 3724c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan 3725c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan addrinfo hints; 3726c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan memset(&hints, 0, sizeof(hints)); 3727c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan hints.ai_family = AF_UNSPEC; // To allow both IPv4 and IPv6 addresses. 3728c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan hints.ai_socktype = SOCK_STREAM; 3729c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan addrinfo* servinfo = NULL; 3730c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan 3731c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan // Use the getaddrinfo() to get a linked list of IP addresses for 3732c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan // the given host name. 3733c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan const int error_num = getaddrinfo( 3734c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan host_name_.c_str(), port_num_.c_str(), &hints, &servinfo); 3735c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan if (error_num != 0) { 3736c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: " 3737c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan << gai_strerror(error_num); 3738c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan } 3739c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan 3740c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan // Loop through all the results and connect to the first we can. 3741c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL; 3742c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan cur_addr = cur_addr->ai_next) { 3743c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan sockfd_ = socket( 3744c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol); 3745c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan if (sockfd_ != -1) { 3746c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan // Connect the client socket to the server socket. 3747c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) { 3748c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan close(sockfd_); 3749c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan sockfd_ = -1; 3750c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan } 3751c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan } 3752c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan } 3753c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan 3754c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan freeaddrinfo(servinfo); // all done with this structure 3755c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan 3756c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan if (sockfd_ == -1) { 3757c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to " 3758c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan << host_name_ << ":" << port_num_; 3759c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan } 3760c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan} 3761c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan 3762c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan// End of class Streaming Listener 3763c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan#endif // GTEST_CAN_STREAM_RESULTS__ 3764c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan 37654b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Class ScopedTrace 37664b6829f0d28990dd645e16386eb226d0f10c8731shiqian 37674b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Pushes the given source file location and message onto a per-thread 37684b6829f0d28990dd645e16386eb226d0f10c8731shiqian// trace stack maintained by Google Test. 3769ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosevScopedTrace::ScopedTrace(const char* file, int line, const Message& message) 3770aa3c420019cb0215b00013cb94658a917ec4f712zhanyong.wan GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) { 37714b6829f0d28990dd645e16386eb226d0f10c8731shiqian TraceInfo trace; 37724b6829f0d28990dd645e16386eb226d0f10c8731shiqian trace.file = file; 37734b6829f0d28990dd645e16386eb226d0f10c8731shiqian trace.line = line; 37744b6829f0d28990dd645e16386eb226d0f10c8731shiqian trace.message = message.GetString(); 37754b6829f0d28990dd645e16386eb226d0f10c8731shiqian 37764b6829f0d28990dd645e16386eb226d0f10c8731shiqian UnitTest::GetInstance()->PushGTestTrace(trace); 37774b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 37784b6829f0d28990dd645e16386eb226d0f10c8731shiqian 37794b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Pops the info pushed by the c'tor. 3780ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosevScopedTrace::~ScopedTrace() 3781aa3c420019cb0215b00013cb94658a917ec4f712zhanyong.wan GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) { 37824b6829f0d28990dd645e16386eb226d0f10c8731shiqian UnitTest::GetInstance()->PopGTestTrace(); 37834b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 37844b6829f0d28990dd645e16386eb226d0f10c8731shiqian 37854b6829f0d28990dd645e16386eb226d0f10c8731shiqian 37864b6829f0d28990dd645e16386eb226d0f10c8731shiqian// class OsStackTraceGetter 37874b6829f0d28990dd645e16386eb226d0f10c8731shiqian 378803c314931649a999b0cf5deb0a434a1009157416jgm@google.com// Returns the current OS stack trace as an std::string. Parameters: 37894b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 37904b6829f0d28990dd645e16386eb226d0f10c8731shiqian// max_depth - the maximum number of stack frames to be included 37914b6829f0d28990dd645e16386eb226d0f10c8731shiqian// in the trace. 37924b6829f0d28990dd645e16386eb226d0f10c8731shiqian// skip_count - the number of top frames to be skipped; doesn't count 37934b6829f0d28990dd645e16386eb226d0f10c8731shiqian// against max_depth. 37944b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 379503c314931649a999b0cf5deb0a434a1009157416jgm@google.comstring OsStackTraceGetter::CurrentStackTrace(int /* max_depth */, 3796ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosev int /* skip_count */) 3797ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosev GTEST_LOCK_EXCLUDED_(mutex_) { 379803c314931649a999b0cf5deb0a434a1009157416jgm@google.com return ""; 37994b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 38004b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3801ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosevvoid OsStackTraceGetter::UponLeavingGTest() 3802ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosev GTEST_LOCK_EXCLUDED_(mutex_) { 38034b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 38044b6829f0d28990dd645e16386eb226d0f10c8731shiqian 38054b6829f0d28990dd645e16386eb226d0f10c8731shiqianconst char* const 38064b6829f0d28990dd645e16386eb226d0f10c8731shiqianOsStackTraceGetter::kElidedFramesMarker = 38074cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan "... " GTEST_NAME_ " internal frames ..."; 38084b6829f0d28990dd645e16386eb226d0f10c8731shiqian 38091cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan// A helper class that creates the premature-exit file in its 38101cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan// constructor and deletes the file in its destructor. 38111cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wanclass ScopedPrematureExitFile { 38121cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan public: 38131cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan explicit ScopedPrematureExitFile(const char* premature_exit_filepath) 38141cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan : premature_exit_filepath_(premature_exit_filepath) { 38151cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // If a path to the premature-exit file is specified... 38161cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan if (premature_exit_filepath != NULL && *premature_exit_filepath != '\0') { 38171cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // create the file with a single "0" character in it. I/O 38181cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // errors are ignored as there's nothing better we can do and we 38191cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // don't want to fail the test because of this. 38201cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan FILE* pfile = posix::FOpen(premature_exit_filepath, "w"); 38211cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan fwrite("0", 1, 1, pfile); 38221cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan fclose(pfile); 38231cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan } 38241cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan } 38251cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan 38261cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan ~ScopedPrematureExitFile() { 38271cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan if (premature_exit_filepath_ != NULL && *premature_exit_filepath_ != '\0') { 38281cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan remove(premature_exit_filepath_); 38291cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan } 38301cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan } 38311cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan 38321cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan private: 38331cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan const char* const premature_exit_filepath_; 38341cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan 38351cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile); 38361cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan}; 38371cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan 38384b6829f0d28990dd645e16386eb226d0f10c8731shiqian} // namespace internal 38394b6829f0d28990dd645e16386eb226d0f10c8731shiqian 3840f6d087b78d230d875bf5d8281112662795044680zhanyong.wan// class TestEventListeners 3841f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 3842f6d087b78d230d875bf5d8281112662795044680zhanyong.wanTestEventListeners::TestEventListeners() 38437dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan : repeater_(new internal::TestEventRepeater()), 3844f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan default_result_printer_(NULL), 3845f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan default_xml_generator_(NULL) { 3846f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan} 3847f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 3848f6d087b78d230d875bf5d8281112662795044680zhanyong.wanTestEventListeners::~TestEventListeners() { delete repeater_; } 3849f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 3850f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// Returns the standard listener responsible for the default console 3851f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// output. Can be removed from the listeners list to shut down default 3852f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// console output. Note that removing this object from the listener list 3853f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// with Release transfers its ownership to the user. 3854f6d087b78d230d875bf5d8281112662795044680zhanyong.wanvoid TestEventListeners::Append(TestEventListener* listener) { 3855f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan repeater_->Append(listener); 3856f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan} 3857f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 3858f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// Removes the given event listener from the list and returns it. It then 3859f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// becomes the caller's responsibility to delete the listener. Returns 3860f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// NULL if the listener is not found in the list. 3861f6d087b78d230d875bf5d8281112662795044680zhanyong.wanTestEventListener* TestEventListeners::Release(TestEventListener* listener) { 3862f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan if (listener == default_result_printer_) 3863f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan default_result_printer_ = NULL; 3864f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan else if (listener == default_xml_generator_) 3865f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan default_xml_generator_ = NULL; 3866f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan return repeater_->Release(listener); 3867f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan} 3868f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 3869fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan// Returns repeater that broadcasts the TestEventListener events to all 3870fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan// subscribers. 3871f6d087b78d230d875bf5d8281112662795044680zhanyong.wanTestEventListener* TestEventListeners::repeater() { return repeater_; } 3872f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 3873f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// Sets the default_result_printer attribute to the provided listener. 3874f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// The listener is also added to the listener list and previous 3875f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// default_result_printer is removed from it and deleted. The listener can 3876f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// also be NULL in which case it will not be added to the list. Does 3877f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// nothing if the previous and the current listener objects are the same. 3878f6d087b78d230d875bf5d8281112662795044680zhanyong.wanvoid TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) { 3879f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan if (default_result_printer_ != listener) { 3880f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan // It is an error to pass this method a listener that is already in the 3881f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan // list. 3882f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan delete Release(default_result_printer_); 3883f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan default_result_printer_ = listener; 3884f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan if (listener != NULL) 3885f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan Append(listener); 3886f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan } 3887f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan} 3888f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 3889f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// Sets the default_xml_generator attribute to the provided listener. The 3890f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// listener is also added to the listener list and previous 3891f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// default_xml_generator is removed from it and deleted. The listener can 3892f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// also be NULL in which case it will not be added to the list. Does 3893f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// nothing if the previous and the current listener objects are the same. 3894f6d087b78d230d875bf5d8281112662795044680zhanyong.wanvoid TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) { 3895f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan if (default_xml_generator_ != listener) { 3896f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan // It is an error to pass this method a listener that is already in the 3897f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan // list. 3898f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan delete Release(default_xml_generator_); 3899f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan default_xml_generator_ = listener; 3900f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan if (listener != NULL) 3901f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan Append(listener); 3902f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan } 3903f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan} 3904f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 3905f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// Controls whether events will be forwarded by the repeater to the 3906f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// listeners in the list. 3907f6d087b78d230d875bf5d8281112662795044680zhanyong.wanbool TestEventListeners::EventForwardingEnabled() const { 3908f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan return repeater_->forwarding_enabled(); 3909f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan} 3910f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 3911f6d087b78d230d875bf5d8281112662795044680zhanyong.wanvoid TestEventListeners::SuppressEventForwarding() { 3912f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan repeater_->set_forwarding_enabled(false); 3913f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan} 3914f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 39154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// class UnitTest 39164b6829f0d28990dd645e16386eb226d0f10c8731shiqian 39174b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Gets the singleton UnitTest object. The first time this method is 39184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// called, a UnitTest object is constructed and returned. Consecutive 39194b6829f0d28990dd645e16386eb226d0f10c8731shiqian// calls will return the same object. 39204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 39214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// We don't protect this under mutex_ as a user is not supposed to 39224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// call this before main() starts, from which point on the return 39234b6829f0d28990dd645e16386eb226d0f10c8731shiqian// value will never change. 3924dfbdf0bab51520595679a99710983daba6fc18ebvladlosevUnitTest* UnitTest::GetInstance() { 39254b6829f0d28990dd645e16386eb226d0f10c8731shiqian // When compiled with MSVC 7.1 in optimized mode, destroying the 39264b6829f0d28990dd645e16386eb226d0f10c8731shiqian // UnitTest object upon exiting the program messes up the exit code, 39274b6829f0d28990dd645e16386eb226d0f10c8731shiqian // causing successful tests to appear failed. We have to use a 39284b6829f0d28990dd645e16386eb226d0f10c8731shiqian // different implementation in this case to bypass the compiler bug. 39294b6829f0d28990dd645e16386eb226d0f10c8731shiqian // This implementation makes the compiler happy, at the cost of 39304b6829f0d28990dd645e16386eb226d0f10c8731shiqian // leaking the UnitTest object. 393198efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan 393298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan // CodeGear C++Builder insists on a public destructor for the 393398efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan // default implementation. Use this implementation to keep good OO 393498efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan // design with private destructor. 393598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan 393698efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__) 39374b6829f0d28990dd645e16386eb226d0f10c8731shiqian static UnitTest* const instance = new UnitTest; 39384b6829f0d28990dd645e16386eb226d0f10c8731shiqian return instance; 39394b6829f0d28990dd645e16386eb226d0f10c8731shiqian#else 39404b6829f0d28990dd645e16386eb226d0f10c8731shiqian static UnitTest instance; 39414b6829f0d28990dd645e16386eb226d0f10c8731shiqian return &instance; 394298efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan#endif // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__) 39434b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 39444b6829f0d28990dd645e16386eb226d0f10c8731shiqian 39459644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Gets the number of successful test cases. 39469644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanint UnitTest::successful_test_case_count() const { 39479644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan return impl()->successful_test_case_count(); 39489644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan} 39499644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan 39509644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Gets the number of failed test cases. 39519644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanint UnitTest::failed_test_case_count() const { 39529644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan return impl()->failed_test_case_count(); 39539644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan} 39549644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan 39559644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Gets the number of all test cases. 39569644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanint UnitTest::total_test_case_count() const { 39579644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan return impl()->total_test_case_count(); 39589644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan} 39599644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan 39609644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Gets the number of all test cases that contain at least one test 39619644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// that should run. 39629644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanint UnitTest::test_case_to_run_count() const { 39639644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan return impl()->test_case_to_run_count(); 39649644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan} 39659644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan 39669644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Gets the number of successful tests. 39679644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanint UnitTest::successful_test_count() const { 39689644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan return impl()->successful_test_count(); 39699644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan} 39709644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan 39719644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Gets the number of failed tests. 39729644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanint UnitTest::failed_test_count() const { return impl()->failed_test_count(); } 39739644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan 3974c567ac6c5431d9d2867ace1da1418f4575215516vladlosev// Gets the number of disabled tests that will be reported in the XML report. 3975c567ac6c5431d9d2867ace1da1418f4575215516vladlosevint UnitTest::reportable_disabled_test_count() const { 3976c567ac6c5431d9d2867ace1da1418f4575215516vladlosev return impl()->reportable_disabled_test_count(); 3977c567ac6c5431d9d2867ace1da1418f4575215516vladlosev} 3978c567ac6c5431d9d2867ace1da1418f4575215516vladlosev 39799644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Gets the number of disabled tests. 39809644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanint UnitTest::disabled_test_count() const { 39819644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan return impl()->disabled_test_count(); 39829644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan} 39839644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan 3984c567ac6c5431d9d2867ace1da1418f4575215516vladlosev// Gets the number of tests to be printed in the XML report. 3985c567ac6c5431d9d2867ace1da1418f4575215516vladlosevint UnitTest::reportable_test_count() const { 3986c567ac6c5431d9d2867ace1da1418f4575215516vladlosev return impl()->reportable_test_count(); 3987c567ac6c5431d9d2867ace1da1418f4575215516vladlosev} 3988c567ac6c5431d9d2867ace1da1418f4575215516vladlosev 39899644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Gets the number of all tests. 39909644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanint UnitTest::total_test_count() const { return impl()->total_test_count(); } 39919644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan 39929644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Gets the number of tests that should run. 39939644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanint UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); } 39949644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan 39958883b42f2a78976dde09f31ca72806072e33bd5fvladlosev// Gets the time of the test program start, in ms from the start of the 39968883b42f2a78976dde09f31ca72806072e33bd5fvladlosev// UNIX epoch. 39978883b42f2a78976dde09f31ca72806072e33bd5fvladlosevinternal::TimeInMillis UnitTest::start_timestamp() const { 39988883b42f2a78976dde09f31ca72806072e33bd5fvladlosev return impl()->start_timestamp(); 39998883b42f2a78976dde09f31ca72806072e33bd5fvladlosev} 40008883b42f2a78976dde09f31ca72806072e33bd5fvladlosev 40019644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Gets the elapsed time, in milliseconds. 40029644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.waninternal::TimeInMillis UnitTest::elapsed_time() const { 40039644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan return impl()->elapsed_time(); 40049644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan} 40059644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan 40069644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Returns true iff the unit test passed (i.e. all test cases passed). 40079644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanbool UnitTest::Passed() const { return impl()->Passed(); } 40089644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan 40099644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Returns true iff the unit test failed (i.e. some test case failed 40109644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// or something outside of all tests failed). 40119644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanbool UnitTest::Failed() const { return impl()->Failed(); } 40129644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan 40139644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// Gets the i-th test case among all the test cases. i can range from 0 to 40149644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan// total_test_case_count() - 1. If i is not in that range, returns NULL. 40159644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanconst TestCase* UnitTest::GetTestCase(int i) const { 40169644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan return impl()->GetTestCase(i); 40179644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan} 40189644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan 4019dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// Returns the TestResult containing information on test failures and 4020dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// properties logged outside of individual test cases. 4021dfbdf0bab51520595679a99710983daba6fc18ebvladlosevconst TestResult& UnitTest::ad_hoc_test_result() const { 4022dfbdf0bab51520595679a99710983daba6fc18ebvladlosev return *impl()->ad_hoc_test_result(); 4023dfbdf0bab51520595679a99710983daba6fc18ebvladlosev} 4024dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 4025f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan// Gets the i-th test case among all the test cases. i can range from 0 to 4026f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan// total_test_case_count() - 1. If i is not in that range, returns NULL. 4027f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wanTestCase* UnitTest::GetMutableTestCase(int i) { 4028f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan return impl()->GetMutableTestCase(i); 4029f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan} 4030f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan 4031f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// Returns the list of event listeners that can be used to track events 4032f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// inside Google Test. 4033f6d087b78d230d875bf5d8281112662795044680zhanyong.wanTestEventListeners& UnitTest::listeners() { 4034f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan return *impl()->listeners(); 4035f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan} 4036f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 40374b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Registers and returns a global test environment. When a test 40384b6829f0d28990dd645e16386eb226d0f10c8731shiqian// program is run, all global test environments will be set-up in the 40394b6829f0d28990dd645e16386eb226d0f10c8731shiqian// order they were registered. After all tests in the program have 40404b6829f0d28990dd645e16386eb226d0f10c8731shiqian// finished, all global test environments will be torn-down in the 40414b6829f0d28990dd645e16386eb226d0f10c8731shiqian// *reverse* order they were registered. 40424b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 40434b6829f0d28990dd645e16386eb226d0f10c8731shiqian// The UnitTest object takes ownership of the given environment. 40444b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 40454b6829f0d28990dd645e16386eb226d0f10c8731shiqian// We don't protect this under mutex_, as we only support calling it 40464b6829f0d28990dd645e16386eb226d0f10c8731shiqian// from the main thread. 40474b6829f0d28990dd645e16386eb226d0f10c8731shiqianEnvironment* UnitTest::AddEnvironment(Environment* env) { 40484b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (env == NULL) { 40494b6829f0d28990dd645e16386eb226d0f10c8731shiqian return NULL; 40504b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 40514b6829f0d28990dd645e16386eb226d0f10c8731shiqian 405293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan impl_->environments().push_back(env); 40534b6829f0d28990dd645e16386eb226d0f10c8731shiqian return env; 40544b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 40554b6829f0d28990dd645e16386eb226d0f10c8731shiqian 40564b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Adds a TestPartResult to the current TestResult object. All Google Test 40574b6829f0d28990dd645e16386eb226d0f10c8731shiqian// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call 40584b6829f0d28990dd645e16386eb226d0f10c8731shiqian// this to report their results. The user code should use the 40594b6829f0d28990dd645e16386eb226d0f10c8731shiqian// assertion macros instead of calling this directly. 4060ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosevvoid UnitTest::AddTestPartResult( 4061ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosev TestPartResult::Type result_type, 4062ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosev const char* file_name, 4063ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosev int line_number, 406403c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string& message, 406503f2695f34fb7224b643828de1ce242a749dab42zhanyong.wan const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) { 40664b6829f0d28990dd645e16386eb226d0f10c8731shiqian Message msg; 40674b6829f0d28990dd645e16386eb226d0f10c8731shiqian msg << message; 40684b6829f0d28990dd645e16386eb226d0f10c8731shiqian 40694b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::MutexLock lock(&mutex_); 407093d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan if (impl_->gtest_trace_stack().size() > 0) { 40714cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan msg << "\n" << GTEST_NAME_ << " trace:"; 40724b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4073b03ca47c10be432be5d984cb91ce22c81dfa2252zhanyong.wan for (int i = static_cast<int>(impl_->gtest_trace_stack().size()); 4074b03ca47c10be432be5d984cb91ce22c81dfa2252zhanyong.wan i > 0; --i) { 407593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1]; 4076f4f05bb7cd810d17a33683c5e429e981e6088ddazhanyong.wan msg << "\n" << internal::FormatFileLocation(trace.file, trace.line) 4077f4f05bb7cd810d17a33683c5e429e981e6088ddazhanyong.wan << " " << trace.message; 40784b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 40794b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 40804b6829f0d28990dd645e16386eb226d0f10c8731shiqian 40814b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) { 4082e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian msg << internal::kStackTraceMarker << os_stack_trace; 40834b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 40844b6829f0d28990dd645e16386eb226d0f10c8731shiqian 40854b6829f0d28990dd645e16386eb226d0f10c8731shiqian const TestPartResult result = 40864b6829f0d28990dd645e16386eb226d0f10c8731shiqian TestPartResult(result_type, file_name, line_number, 40874b6829f0d28990dd645e16386eb226d0f10c8731shiqian msg.GetString().c_str()); 4088e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian impl_->GetTestPartResultReporterForCurrentThread()-> 4089e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian ReportTestPartResult(result); 40904b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4091334aaead71ccf797a18f2128c320f0304e724860zhanyong.wan if (result_type != TestPartResult::kSuccess) { 409293a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wan // gtest_break_on_failure takes precedence over 409393a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wan // gtest_throw_on_failure. This allows a user to set the latter 4094b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan // in the code (perhaps in order to use Google Test assertions 4095b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan // with another testing framework) and specify the former on the 4096b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan // command line for debugging. 4097b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan if (GTEST_FLAG(break_on_failure)) { 4098f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT 4099b5460573abbb1a4c601e792aa2e912aca4fa2134zhanyong.wan // Using DebugBreak on Windows allows gtest to still break into a debugger 4100b5460573abbb1a4c601e792aa2e912aca4fa2134zhanyong.wan // when a failure happens and both the --gtest_break_on_failure and 4101b5460573abbb1a4c601e792aa2e912aca4fa2134zhanyong.wan // the --gtest_catch_exceptions flags are specified. 4102b5460573abbb1a4c601e792aa2e912aca4fa2134zhanyong.wan DebugBreak(); 4103b5460573abbb1a4c601e792aa2e912aca4fa2134zhanyong.wan#else 41043010d4da1efc1842bd1b8ac42f61172cd638ddf6zhanyong.wan // Dereference NULL through a volatile pointer to prevent the compiler 41053010d4da1efc1842bd1b8ac42f61172cd638ddf6zhanyong.wan // from removing. We use this rather than abort() or __builtin_trap() for 41063010d4da1efc1842bd1b8ac42f61172cd638ddf6zhanyong.wan // portability: Symbian doesn't implement abort() well, and some debuggers 41073010d4da1efc1842bd1b8ac42f61172cd638ddf6zhanyong.wan // don't correctly trap abort(). 41083010d4da1efc1842bd1b8ac42f61172cd638ddf6zhanyong.wan *static_cast<volatile int*>(NULL) = 1; 4109b5460573abbb1a4c601e792aa2e912aca4fa2134zhanyong.wan#endif // GTEST_OS_WINDOWS 4110b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan } else if (GTEST_FLAG(throw_on_failure)) { 4111b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan#if GTEST_HAS_EXCEPTIONS 4112c2f7c754e62a0de338a470d6987a4873827d4045zhanyong.wan throw internal::GoogleTestFailureException(result); 4113b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan#else 4114b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan // We cannot call abort() as it generates a pop-up in debug mode 4115b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan // that cannot be suppressed in VC 7.1 or below. 4116b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan exit(1); 4117b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan#endif 4118b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan } 41194b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 41204b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 41214b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4122dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// Adds a TestProperty to the current TestResult object when invoked from 4123dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// inside a test, to current TestCase's ad_hoc_test_result_ when invoked 4124dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// from SetUpTestCase or TearDownTestCase, or to the global property set 4125dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// when invoked elsewhere. If the result already contains a property with 4126dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// the same key, the value will be updated. 4127dfbdf0bab51520595679a99710983daba6fc18ebvladlosevvoid UnitTest::RecordProperty(const std::string& key, 4128dfbdf0bab51520595679a99710983daba6fc18ebvladlosev const std::string& value) { 4129dfbdf0bab51520595679a99710983daba6fc18ebvladlosev impl_->RecordProperty(TestProperty(key, value)); 41304b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 41314b6829f0d28990dd645e16386eb226d0f10c8731shiqian 41324b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Runs all tests in this UnitTest object and prints the result. 41334b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns 0 if successful, or 1 otherwise. 41344b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 41354b6829f0d28990dd645e16386eb226d0f10c8731shiqian// We don't protect this under mutex_, as we only support calling it 41364b6829f0d28990dd645e16386eb226d0f10c8731shiqian// from the main thread. 41374b6829f0d28990dd645e16386eb226d0f10c8731shiqianint UnitTest::Run() { 41381cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan const bool in_death_test_child_process = 41391cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan internal::GTEST_FLAG(internal_run_death_test).length() > 0; 41401cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan 41411cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // Google Test implements this protocol for catching that a test 41421cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // program exits before returning control to Google Test: 41431cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // 41441cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // 1. Upon start, Google Test creates a file whose absolute path 41451cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // is specified by the environment variable 41461cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // TEST_PREMATURE_EXIT_FILE. 41471cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // 2. When Google Test has finished its work, it deletes the file. 41481cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // 41491cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before 41501cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // running a Google-Test-based test program and check the existence 41511cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // of the file at the end of the test execution to see if it has 41521cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // exited prematurely. 41531cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan 41541cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // If we are in the child process of a death test, don't 41551cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // create/delete the premature exit file, as doing so is unnecessary 41561cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // and will confuse the parent process. Otherwise, create/delete 41571cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // the file upon entering/leaving this function. If the program 41581cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // somehow exits before this function has a chance to return, the 41591cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // premature-exit file will be left undeleted, causing a test runner 41601cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // that understands the premature-exit-file protocol to report the 41611cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan // test as having failed. 41621cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan const internal::ScopedPrematureExitFile premature_exit_file( 41631cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan in_death_test_child_process ? 41641cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan NULL : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE")); 41651cb04aa3e99c736bbd1eb90ebda3d6117355aacczhanyong.wan 41665d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // Captures the value of GTEST_FLAG(catch_exceptions). This value will be 41675d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // used for the duration of the program. 41685d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions)); 41694b6829f0d28990dd645e16386eb226d0f10c8731shiqian 41705d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan#if GTEST_HAS_SEH 4171c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // Either the user wants Google Test to catch exceptions thrown by the 4172c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // tests or this is executing in the context of death test child 4173c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // process. In either case the user does not want to see pop-up dialogs 41745d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // about crashes - they are expected. 41755d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan if (impl()->catch_exceptions() || in_death_test_child_process) { 4176f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com# if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT 4177c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // SetErrorMode doesn't exist on CE. 41784b6829f0d28990dd645e16386eb226d0f10c8731shiqian SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT | 41794b6829f0d28990dd645e16386eb226d0f10c8731shiqian SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); 4180733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif // !GTEST_OS_WINDOWS_MOBILE 41814b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4182733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE 4183c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // Death test children can be terminated with _abort(). On Windows, 4184c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // _abort() can show a dialog with a warning message. This forces the 4185c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // abort message to go to stderr instead. 4186c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan _set_error_mode(_OUT_TO_STDERR); 4187733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif 4188c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 4189733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE 4190c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // In the debug version, Visual Studio pops up a separate dialog 4191c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // offering a choice to debug the aborted program. We need to suppress 4192c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement 4193c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // executed. Google Test will notify the user of any unexpected 4194c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // failure via stderr. 419598efcc49448a78cae3af3ed793a3ad6927620fc4zhanyong.wan // 4196c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // VC++ doesn't define _set_abort_behavior() prior to the version 8.0. 4197c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // Users of prior VC versions shall suffer the agony and pain of 4198c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // clicking through the countless debug dialogs. 4199c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // TODO(vladl@google.com): find a way to suppress the abort dialog() in the 4200c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan // debug mode when compiled with VC 7.1 or lower. 4201c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan if (!GTEST_FLAG(break_on_failure)) 4202c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan _set_abort_behavior( 4203c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan 0x0, // Clear the following flags: 4204c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan _WRITE_ABORT_MSG | _CALL_REPORTFAULT); // pop-up window, core dump. 4205733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan# endif 4206c85c0c20322a1f36113cf4d6282908e16ca32669zhanyong.wan } 4207cfe35b311c96348b27ed3cef84c7fb84fe02199ezhanyong.wan#endif // GTEST_HAS_SEH 4208739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan 420915f3ae05e214688e834f622d00b6a02b64ce6d53vladlosev return internal::HandleExceptionsInMethodIfSupported( 42105d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan impl(), 4211739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan &internal::UnitTestImpl::RunAllTests, 4212739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan "auxiliary test code (environments or event listeners)") ? 0 : 1; 42134b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 42144b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4215c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian// Returns the working directory when the first TEST() or TEST_F() was 4216c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian// executed. 4217c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqianconst char* UnitTest::original_working_dir() const { 4218c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian return impl_->original_working_dir_.c_str(); 4219c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian} 4220c3b4de35a18a1f011e8009d4d794f787f7e4e0c1shiqian 42214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns the TestCase object for the test that's currently running, 42224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// or NULL if no test is running. 4223ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosevconst TestCase* UnitTest::current_test_case() const 4224ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosev GTEST_LOCK_EXCLUDED_(mutex_) { 42254b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::MutexLock lock(&mutex_); 42264b6829f0d28990dd645e16386eb226d0f10c8731shiqian return impl_->current_test_case(); 42274b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 42284b6829f0d28990dd645e16386eb226d0f10c8731shiqian 42294b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns the TestInfo object for the test that's currently running, 42304b6829f0d28990dd645e16386eb226d0f10c8731shiqian// or NULL if no test is running. 4231ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosevconst TestInfo* UnitTest::current_test_info() const 4232ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosev GTEST_LOCK_EXCLUDED_(mutex_) { 42334b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::MutexLock lock(&mutex_); 42344b6829f0d28990dd645e16386eb226d0f10c8731shiqian return impl_->current_test_info(); 42354b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 42364b6829f0d28990dd645e16386eb226d0f10c8731shiqian 42379b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan// Returns the random seed used at the start of the current test run. 42389b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wanint UnitTest::random_seed() const { return impl_->random_seed(); } 42399b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan 42404cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_HAS_PARAM_TEST 4241f904a612d9444ab36c07a8e619c113432e046f49vladlosev// Returns ParameterizedTestCaseRegistry object used to keep track of 4242f904a612d9444ab36c07a8e619c113432e046f49vladlosev// value-parameterized tests and instantiate and register them. 4243f904a612d9444ab36c07a8e619c113432e046f49vladlosevinternal::ParameterizedTestCaseRegistry& 4244ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosev UnitTest::parameterized_test_registry() 4245ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosev GTEST_LOCK_EXCLUDED_(mutex_) { 4246f904a612d9444ab36c07a8e619c113432e046f49vladlosev return impl_->parameterized_test_registry(); 4247f904a612d9444ab36c07a8e619c113432e046f49vladlosev} 4248f904a612d9444ab36c07a8e619c113432e046f49vladlosev#endif // GTEST_HAS_PARAM_TEST 4249f904a612d9444ab36c07a8e619c113432e046f49vladlosev 42504b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Creates an empty UnitTest. 42514b6829f0d28990dd645e16386eb226d0f10c8731shiqianUnitTest::UnitTest() { 42524b6829f0d28990dd645e16386eb226d0f10c8731shiqian impl_ = new internal::UnitTestImpl(this); 42534b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 42544b6829f0d28990dd645e16386eb226d0f10c8731shiqian 42554b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Destructor of UnitTest. 42564b6829f0d28990dd645e16386eb226d0f10c8731shiqianUnitTest::~UnitTest() { 42574b6829f0d28990dd645e16386eb226d0f10c8731shiqian delete impl_; 42584b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 42594b6829f0d28990dd645e16386eb226d0f10c8731shiqian 42604b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Pushes a trace defined by SCOPED_TRACE() on to the per-thread 42614b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Google Test trace stack. 4262ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosevvoid UnitTest::PushGTestTrace(const internal::TraceInfo& trace) 4263ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosev GTEST_LOCK_EXCLUDED_(mutex_) { 42644b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::MutexLock lock(&mutex_); 426593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan impl_->gtest_trace_stack().push_back(trace); 42664b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 42674b6829f0d28990dd645e16386eb226d0f10c8731shiqian 42684b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Pops a trace from the per-thread Google Test trace stack. 4269ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosevvoid UnitTest::PopGTestTrace() 4270ee89af8d5f0578d9da31c5295f59f2d2bdebec39vladlosev GTEST_LOCK_EXCLUDED_(mutex_) { 42714b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::MutexLock lock(&mutex_); 427293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan impl_->gtest_trace_stack().pop_back(); 42734b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 42744b6829f0d28990dd645e16386eb226d0f10c8731shiqian 42754b6829f0d28990dd645e16386eb226d0f10c8731shiqiannamespace internal { 42764b6829f0d28990dd645e16386eb226d0f10c8731shiqian 42774b6829f0d28990dd645e16386eb226d0f10c8731shiqianUnitTestImpl::UnitTestImpl(UnitTest* parent) 42784b6829f0d28990dd645e16386eb226d0f10c8731shiqian : parent_(parent), 4279f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com GTEST_DISABLE_MSC_WARNINGS_PUSH_(4355 /* using this in initializer */) 4280e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian default_global_test_part_result_reporter_(this), 4281e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian default_per_thread_test_part_result_reporter_(this), 4282f0d7f455d0ba1b1da1891c3ee54961a162e8fbc4billydonahue@google.com GTEST_DISABLE_MSC_WARNINGS_POP_() 4283e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian global_test_part_result_repoter_( 4284e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian &default_global_test_part_result_reporter_), 4285e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian per_thread_test_part_result_reporter_( 4286e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian &default_per_thread_test_part_result_reporter_), 42874cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_HAS_PARAM_TEST 4288f904a612d9444ab36c07a8e619c113432e046f49vladlosev parameterized_test_registry_(), 4289f904a612d9444ab36c07a8e619c113432e046f49vladlosev parameterized_tests_registered_(false), 4290f904a612d9444ab36c07a8e619c113432e046f49vladlosev#endif // GTEST_HAS_PARAM_TEST 4291449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan last_death_test_case_(-1), 42924b6829f0d28990dd645e16386eb226d0f10c8731shiqian current_test_case_(NULL), 42934b6829f0d28990dd645e16386eb226d0f10c8731shiqian current_test_info_(NULL), 42944b6829f0d28990dd645e16386eb226d0f10c8731shiqian ad_hoc_test_result_(), 42954b6829f0d28990dd645e16386eb226d0f10c8731shiqian os_stack_trace_getter_(NULL), 4296f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan post_flag_parse_init_performed_(false), 4297f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan random_seed_(0), // Will be overridden by the flag before first use. 4298f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan random_(0), // Will be reseeded before first use. 42998883b42f2a78976dde09f31ca72806072e33bd5fvladlosev start_timestamp_(0), 43004b6829f0d28990dd645e16386eb226d0f10c8731shiqian elapsed_time_(0), 43015d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan#if GTEST_HAS_DEATH_TEST 43025d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan death_test_factory_(new DefaultDeathTestFactory), 43035d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan#endif 43045d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan // Will be overridden by the flag before first use. 43055d0c3dc09ece41c649deea59f975d0ff5548424azhanyong.wan catch_exceptions_(false) { 4306f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter); 43074b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 43084b6829f0d28990dd645e16386eb226d0f10c8731shiqian 43094b6829f0d28990dd645e16386eb226d0f10c8731shiqianUnitTestImpl::~UnitTestImpl() { 43104b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Deletes every TestCase. 431193d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan ForEach(test_cases_, internal::Delete<TestCase>); 43124b6829f0d28990dd645e16386eb226d0f10c8731shiqian 43134b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Deletes every Environment. 431493d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan ForEach(environments_, internal::Delete<Environment>); 43154b6829f0d28990dd645e16386eb226d0f10c8731shiqian 43164b6829f0d28990dd645e16386eb226d0f10c8731shiqian delete os_stack_trace_getter_; 43174b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 43184b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4319dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// Adds a TestProperty to the current TestResult object when invoked in a 4320dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// context of a test, to current test case's ad_hoc_test_result when invoke 4321dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// from SetUpTestCase/TearDownTestCase, or to the global property set 4322dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// otherwise. If the result already contains a property with the same key, 4323dfbdf0bab51520595679a99710983daba6fc18ebvladlosev// the value will be updated. 4324dfbdf0bab51520595679a99710983daba6fc18ebvladlosevvoid UnitTestImpl::RecordProperty(const TestProperty& test_property) { 4325dfbdf0bab51520595679a99710983daba6fc18ebvladlosev std::string xml_element; 4326dfbdf0bab51520595679a99710983daba6fc18ebvladlosev TestResult* test_result; // TestResult appropriate for property recording. 4327dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 4328dfbdf0bab51520595679a99710983daba6fc18ebvladlosev if (current_test_info_ != NULL) { 4329dfbdf0bab51520595679a99710983daba6fc18ebvladlosev xml_element = "testcase"; 4330dfbdf0bab51520595679a99710983daba6fc18ebvladlosev test_result = &(current_test_info_->result_); 4331dfbdf0bab51520595679a99710983daba6fc18ebvladlosev } else if (current_test_case_ != NULL) { 4332dfbdf0bab51520595679a99710983daba6fc18ebvladlosev xml_element = "testsuite"; 4333dfbdf0bab51520595679a99710983daba6fc18ebvladlosev test_result = &(current_test_case_->ad_hoc_test_result_); 4334dfbdf0bab51520595679a99710983daba6fc18ebvladlosev } else { 4335dfbdf0bab51520595679a99710983daba6fc18ebvladlosev xml_element = "testsuites"; 4336dfbdf0bab51520595679a99710983daba6fc18ebvladlosev test_result = &ad_hoc_test_result_; 4337dfbdf0bab51520595679a99710983daba6fc18ebvladlosev } 4338dfbdf0bab51520595679a99710983daba6fc18ebvladlosev test_result->RecordProperty(xml_element, test_property); 4339dfbdf0bab51520595679a99710983daba6fc18ebvladlosev} 4340dfbdf0bab51520595679a99710983daba6fc18ebvladlosev 4341f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan#if GTEST_HAS_DEATH_TEST 4342f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// Disables event forwarding if the control is currently in a death test 4343f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// subprocess. Must not be called before InitGoogleTest. 4344f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wanvoid UnitTestImpl::SuppressTestEventsIfInSubprocess() { 4345f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan if (internal_run_death_test_flag_.get() != NULL) 4346f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan listeners()->SuppressEventForwarding(); 4347f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan} 4348f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan#endif // GTEST_HAS_DEATH_TEST 4349f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 4350f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// Initializes event listeners performing XML output as specified by 4351f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// UnitTestOptions. Must not be called before InitGoogleTest. 4352f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wanvoid UnitTestImpl::ConfigureXmlOutput() { 435303c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string& output_format = UnitTestOptions::GetOutputFormat(); 4354f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan if (output_format == "xml") { 4355f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter( 4356f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan UnitTestOptions::GetAbsolutePathToOutputFile().c_str())); 4357f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan } else if (output_format != "") { 4358f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan printf("WARNING: unrecognized output format \"%s\" ignored.\n", 4359f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan output_format.c_str()); 4360f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan fflush(stdout); 4361f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan } 4362f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan} 4363f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 4364c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan#if GTEST_CAN_STREAM_RESULTS_ 436503c314931649a999b0cf5deb0a434a1009157416jgm@google.com// Initializes event listeners for streaming test results in string form. 4366c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan// Must not be called before InitGoogleTest. 4367c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wanvoid UnitTestImpl::ConfigureStreamingOutput() { 436803c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string& target = GTEST_FLAG(stream_result_to); 4369c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan if (!target.empty()) { 4370c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan const size_t pos = target.find(':'); 437103c314931649a999b0cf5deb0a434a1009157416jgm@google.com if (pos != std::string::npos) { 4372c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan listeners()->Append(new StreamingListener(target.substr(0, pos), 4373c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan target.substr(pos+1))); 4374c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan } else { 4375c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan printf("WARNING: unrecognized streaming target \"%s\" ignored.\n", 4376c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan target.c_str()); 4377c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan fflush(stdout); 4378c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan } 4379c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan } 4380c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan} 4381c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan#endif // GTEST_CAN_STREAM_RESULTS_ 4382c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan 4383f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// Performs initialization dependent upon flag values obtained in 4384f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to 4385f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest 4386f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// this function is also called from RunAllTests. Since this function can be 4387f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan// called more than once, it has to be idempotent. 4388f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wanvoid UnitTestImpl::PostFlagParsingInit() { 4389f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan // Ensures that this function does not execute more than once. 4390f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan if (!post_flag_parse_init_performed_) { 4391f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan post_flag_parse_init_performed_ = true; 4392f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 4393f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan#if GTEST_HAS_DEATH_TEST 4394f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan InitDeathTestSubprocessControlInfo(); 4395f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan SuppressTestEventsIfInSubprocess(); 4396f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan#endif // GTEST_HAS_DEATH_TEST 4397f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 4398f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan // Registers parameterized tests. This makes parameterized tests 4399f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan // available to the UnitTest reflection API without running 4400f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan // RUN_ALL_TESTS. 4401f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan RegisterParameterizedTests(); 4402f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 4403f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan // Configures listeners for XML output. This makes it possible for users 4404f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan // to shut down the default XML output before invoking RUN_ALL_TESTS. 4405f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan ConfigureXmlOutput(); 4406c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan 4407c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan#if GTEST_CAN_STREAM_RESULTS_ 4408c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan // Configures listeners for streaming test results to the specified server. 4409c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan ConfigureStreamingOutput(); 4410c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan#endif // GTEST_CAN_STREAM_RESULTS_ 4411f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan } 4412f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan} 4413f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 44144b6829f0d28990dd645e16386eb226d0f10c8731shiqian// A predicate that checks the name of a TestCase against a known 44154b6829f0d28990dd645e16386eb226d0f10c8731shiqian// value. 44164b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 44174b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This is used for implementation of the UnitTest class only. We put 44184b6829f0d28990dd645e16386eb226d0f10c8731shiqian// it in the anonymous namespace to prevent polluting the outer 44194b6829f0d28990dd645e16386eb226d0f10c8731shiqian// namespace. 44204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 44214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// TestCaseNameIs is copyable. 44224b6829f0d28990dd645e16386eb226d0f10c8731shiqianclass TestCaseNameIs { 44234b6829f0d28990dd645e16386eb226d0f10c8731shiqian public: 44244b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Constructor. 442503c314931649a999b0cf5deb0a434a1009157416jgm@google.com explicit TestCaseNameIs(const std::string& name) 44264b6829f0d28990dd645e16386eb226d0f10c8731shiqian : name_(name) {} 44274b6829f0d28990dd645e16386eb226d0f10c8731shiqian 44284b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Returns true iff the name of test_case matches name_. 44294b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool operator()(const TestCase* test_case) const { 44304b6829f0d28990dd645e16386eb226d0f10c8731shiqian return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0; 44314b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 44324b6829f0d28990dd645e16386eb226d0f10c8731shiqian 44334b6829f0d28990dd645e16386eb226d0f10c8731shiqian private: 443403c314931649a999b0cf5deb0a434a1009157416jgm@google.com std::string name_; 44354b6829f0d28990dd645e16386eb226d0f10c8731shiqian}; 44364b6829f0d28990dd645e16386eb226d0f10c8731shiqian 44374b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Finds and returns a TestCase with the given name. If one doesn't 4438f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan// exist, creates one and returns it. It's the CALLER'S 4439f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan// RESPONSIBILITY to ensure that this function is only called WHEN THE 4440f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan// TESTS ARE NOT SHUFFLED. 44414b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 44424b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Arguments: 44434b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 44444b6829f0d28990dd645e16386eb226d0f10c8731shiqian// test_case_name: name of the test case 4445a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan// type_param: the name of the test case's type parameter, or NULL if 4446a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan// this is not a typed or a type-parameterized test case. 44474b6829f0d28990dd645e16386eb226d0f10c8731shiqian// set_up_tc: pointer to the function that sets up the test case 44484b6829f0d28990dd645e16386eb226d0f10c8731shiqian// tear_down_tc: pointer to the function that tears down the test case 44494b6829f0d28990dd645e16386eb226d0f10c8731shiqianTestCase* UnitTestImpl::GetTestCase(const char* test_case_name, 4450a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan const char* type_param, 44514b6829f0d28990dd645e16386eb226d0f10c8731shiqian Test::SetUpTestCaseFunc set_up_tc, 44524b6829f0d28990dd645e16386eb226d0f10c8731shiqian Test::TearDownTestCaseFunc tear_down_tc) { 44534b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Can we find a TestCase with the given name? 445493d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan const std::vector<TestCase*>::const_iterator test_case = 445593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan std::find_if(test_cases_.begin(), test_cases_.end(), 445693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan TestCaseNameIs(test_case_name)); 44574b6829f0d28990dd645e16386eb226d0f10c8731shiqian 445893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan if (test_case != test_cases_.end()) 4459449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan return *test_case; 4460449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan 4461449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan // No. Let's create one. 4462449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan TestCase* const new_test_case = 4463a33163a3ddbb60a6c45340e436310f78044c1a7dzhanyong.wan new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc); 44644b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4465449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan // Is this a death test case? 446603c314931649a999b0cf5deb0a434a1009157416jgm@google.com if (internal::UnitTestOptions::MatchesFilter(test_case_name, 4467449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan kDeathTestCaseFilter)) { 4468449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan // Yes. Inserts the test case after the last death test case 4469f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // defined so far. This only works when the test cases haven't 4470f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // been shuffled. Otherwise we may end up running a death test 4471f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // after a non-death test. 447293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan ++last_death_test_case_; 447393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan test_cases_.insert(test_cases_.begin() + last_death_test_case_, 447493d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan new_test_case); 4475449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan } else { 4476449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan // No. Appends to the end of the list. 447793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan test_cases_.push_back(new_test_case); 44784b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 44794b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4480b03ca47c10be432be5d984cb91ce22c81dfa2252zhanyong.wan test_case_indices_.push_back(static_cast<int>(test_case_indices_.size())); 4481449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan return new_test_case; 44824b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 44834b6829f0d28990dd645e16386eb226d0f10c8731shiqian 44844b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Helpers for setting up / tearing down the given environment. They 448593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan// are for use in the ForEach() function. 44864b6829f0d28990dd645e16386eb226d0f10c8731shiqianstatic void SetUpEnvironment(Environment* env) { env->SetUp(); } 44874b6829f0d28990dd645e16386eb226d0f10c8731shiqianstatic void TearDownEnvironment(Environment* env) { env->TearDown(); } 44884b6829f0d28990dd645e16386eb226d0f10c8731shiqian 44894b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Runs all tests in this UnitTest object, prints the result, and 4490739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// returns true if all tests are successful. If any exception is 4491739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// thrown during a test, the test is considered to be failed, but the 4492739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// rest of the tests will still be run. 4493739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// 449485f555add7acc03149b76db239a4cdd18433a558zhanyong.wan// When parameterized tests are enabled, it expands and registers 4495f904a612d9444ab36c07a8e619c113432e046f49vladlosev// parameterized tests first in RegisterParameterizedTests(). 4496f904a612d9444ab36c07a8e619c113432e046f49vladlosev// All other functions called from RunAllTests() may safely assume that 4497f904a612d9444ab36c07a8e619c113432e046f49vladlosev// parameterized tests are ready to be counted and run. 4498739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wanbool UnitTestImpl::RunAllTests() { 44994b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Makes sure InitGoogleTest() was called. 45004b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (!GTestIsInitialized()) { 45014b6829f0d28990dd645e16386eb226d0f10c8731shiqian printf("%s", 45024b6829f0d28990dd645e16386eb226d0f10c8731shiqian "\nThis test program did NOT call ::testing::InitGoogleTest " 45034b6829f0d28990dd645e16386eb226d0f10c8731shiqian "before calling RUN_ALL_TESTS(). Please fix it.\n"); 4504739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan return false; 45054b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 45064b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4507baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan // Do not run any test if the --help flag was specified. 4508baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan if (g_help_flag) 4509739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan return true; 4510baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan 4511cb4cff8a708fdfff9aa3fed7b6c8c55b0d79e4e6zhanyong.wan // Repeats the call to the post-flag parsing initialization in case the 4512cb4cff8a708fdfff9aa3fed7b6c8c55b0d79e4e6zhanyong.wan // user didn't call InitGoogleTest. 4513cb4cff8a708fdfff9aa3fed7b6c8c55b0d79e4e6zhanyong.wan PostFlagParsingInit(); 4514f904a612d9444ab36c07a8e619c113432e046f49vladlosev 4515905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan // Even if sharding is not on, test runners may want to use the 4516905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding 4517905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan // protocol. 4518905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan internal::WriteToShardStatusFileIfNeeded(); 4519905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan 45204b6829f0d28990dd645e16386eb226d0f10c8731shiqian // True iff we are in a subprocess for running a thread-safe-style 45214b6829f0d28990dd645e16386eb226d0f10c8731shiqian // death test. 45224b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool in_subprocess_for_death_test = false; 45234b6829f0d28990dd645e16386eb226d0f10c8731shiqian 45244cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_HAS_DEATH_TEST 45254b6829f0d28990dd645e16386eb226d0f10c8731shiqian in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL); 45264b6829f0d28990dd645e16386eb226d0f10c8731shiqian#endif // GTEST_HAS_DEATH_TEST 45274b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4528905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex, 4529905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan in_subprocess_for_death_test); 4530905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan 45314b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Compares the full test names with the filter to decide which 45324b6829f0d28990dd645e16386eb226d0f10c8731shiqian // tests to run. 4533905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan const bool has_tests_to_run = FilterTests(should_shard 4534905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan ? HONOR_SHARDING_PROTOCOL 4535905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan : IGNORE_SHARDING_PROTOCOL) > 0; 4536905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan 4537a8a582fb926a678d1c4303384bd4dc872f746de8zhanyong.wan // Lists the tests and exits if the --gtest_list_tests flag was specified. 453893a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wan if (GTEST_FLAG(list_tests)) { 453993a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wan // This must be called *after* FilterTests() has been called. 454093a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wan ListTestsMatchingFilter(); 4541739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan return true; 454293a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wan } 454393a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wan 45449b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan random_seed_ = GTEST_FLAG(shuffle) ? 45459b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0; 45469b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan 45474b6829f0d28990dd645e16386eb226d0f10c8731shiqian // True iff at least one test has failed. 45484b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool failed = false; 45494b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4550fff033497b70e96a5dcadb6ba9570c12b5921d74zhanyong.wan TestEventListener* repeater = listeners()->repeater(); 4551f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan 45528883b42f2a78976dde09f31ca72806072e33bd5fvladlosev start_timestamp_ = GetTimeInMillis(); 45537dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan repeater->OnTestProgramStart(*parent_); 45547dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan 45554b6829f0d28990dd645e16386eb226d0f10c8731shiqian // How many times to repeat the tests? We don't want to repeat them 45564b6829f0d28990dd645e16386eb226d0f10c8731shiqian // when we are inside the subprocess of a death test. 45574b6829f0d28990dd645e16386eb226d0f10c8731shiqian const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat); 45584b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Repeats forever if the repeat count is negative. 45594b6829f0d28990dd645e16386eb226d0f10c8731shiqian const bool forever = repeat < 0; 45604b6829f0d28990dd645e16386eb226d0f10c8731shiqian for (int i = 0; forever || i != repeat; i++) { 456163b4f32b442c767ebe54ec66aed8b65d9c0b6f5ezhanyong.wan // We want to preserve failures generated by ad-hoc test 456263b4f32b442c767ebe54ec66aed8b65d9c0b6f5ezhanyong.wan // assertions executed before RUN_ALL_TESTS(). 456363b4f32b442c767ebe54ec66aed8b65d9c0b6f5ezhanyong.wan ClearNonAdHocTestResult(); 45644b6829f0d28990dd645e16386eb226d0f10c8731shiqian 45654b6829f0d28990dd645e16386eb226d0f10c8731shiqian const TimeInMillis start = GetTimeInMillis(); 45664b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4567f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // Shuffles test cases and tests if requested. 4568f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan if (has_tests_to_run && GTEST_FLAG(shuffle)) { 4569f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan random()->Reseed(random_seed_); 4570f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // This should be done before calling OnTestIterationStart(), 4571f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // such that a test event listener can see the actual test order 4572f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // in the event. 4573f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan ShuffleTests(); 4574f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan } 4575f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan 45767dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan // Tells the unit test event listeners that the tests are about to start. 45777dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan repeater->OnTestIterationStart(*parent_, i); 45787dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan 45794b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Runs each test case if there is at least one test to run. 45804b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (has_tests_to_run) { 45814b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Sets up all environments beforehand. 45827dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan repeater->OnEnvironmentsSetUpStart(*parent_); 458393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan ForEach(environments_, SetUpEnvironment); 45847dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan repeater->OnEnvironmentsSetUpEnd(*parent_); 45854b6829f0d28990dd645e16386eb226d0f10c8731shiqian 45864b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Runs the tests only if there was no fatal failure during global 45874b6829f0d28990dd645e16386eb226d0f10c8731shiqian // set-up. 45884b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (!Test::HasFatalFailure()) { 45897de3401f5f8c2a61476a3623e9802f973764fc27zhanyong.wan for (int test_index = 0; test_index < total_test_case_count(); 45907de3401f5f8c2a61476a3623e9802f973764fc27zhanyong.wan test_index++) { 45917de3401f5f8c2a61476a3623e9802f973764fc27zhanyong.wan GetMutableTestCase(test_index)->Run(); 4592f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan } 45934b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 45944b6829f0d28990dd645e16386eb226d0f10c8731shiqian 45954b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Tears down all environments in reverse order afterwards. 45967dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan repeater->OnEnvironmentsTearDownStart(*parent_); 459793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan std::for_each(environments_.rbegin(), environments_.rend(), 459893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan TearDownEnvironment); 45997dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan repeater->OnEnvironmentsTearDownEnd(*parent_); 46004b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 46014b6829f0d28990dd645e16386eb226d0f10c8731shiqian 46024b6829f0d28990dd645e16386eb226d0f10c8731shiqian elapsed_time_ = GetTimeInMillis() - start; 46034b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4604f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan // Tells the unit test event listener that the tests have just finished. 46057dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan repeater->OnTestIterationEnd(*parent_, i); 46064b6829f0d28990dd645e16386eb226d0f10c8731shiqian 46074b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Gets the result and clears it. 46084b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (!Passed()) { 46094b6829f0d28990dd645e16386eb226d0f10c8731shiqian failed = true; 46104b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 46119b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan 4612f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // Restores the original test order after the iteration. This 4613f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // allows the user to quickly repro a failure that happens in the 4614f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // N-th iteration without repeating the first (N - 1) iterations. 4615f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in 4616f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // case the user somehow changes the value of the flag somewhere 4617f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // (it's always safe to unshuffle the tests). 4618f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan UnshuffleTests(); 4619f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan 46209b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan if (GTEST_FLAG(shuffle)) { 4621f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // Picks a new random seed for each iteration. 46229b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan random_seed_ = GetNextRandomSeed(random_seed_); 46239b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan } 46244b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 46254b6829f0d28990dd645e16386eb226d0f10c8731shiqian 46267dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan repeater->OnTestProgramEnd(*parent_); 46277dcfb6b7375177814c5154e9770efc5406778ad0zhanyong.wan 4628739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan return !failed; 46294b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 46304b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4631905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file 4632905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// if the variable is present. If a file already exists at this location, this 4633905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// function will write over it. If the variable is present, but the file cannot 4634905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// be created, prints an error and exits. 4635905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanvoid WriteToShardStatusFileIfNeeded() { 4636c7f60f1514013d57a624c3a2966709998678f24bzhanyong.wan const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile); 4637905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan if (test_shard_file != NULL) { 4638c7f60f1514013d57a624c3a2966709998678f24bzhanyong.wan FILE* const file = posix::FOpen(test_shard_file, "w"); 4639905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan if (file == NULL) { 4640905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan ColoredPrintf(COLOR_RED, 4641905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan "Could not write to the test shard status file \"%s\" " 4642905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan "specified by the %s environment variable.\n", 4643905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan test_shard_file, kTestShardStatusFile); 4644905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan fflush(stdout); 4645905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan exit(EXIT_FAILURE); 4646905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan } 4647905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan fclose(file); 4648905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan } 4649905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan} 4650905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan 4651905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// Checks whether sharding is enabled by examining the relevant 4652905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// environment variable values. If the variables are present, 4653905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// but inconsistent (i.e., shard_index >= total_shards), prints 4654905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// an error and exits. If in_subprocess_for_death_test, sharding is 4655905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// disabled because it must only be applied to the original test 4656905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// process. Otherwise, we could filter out death tests we intended to execute. 4657905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanbool ShouldShard(const char* total_shards_env, 4658905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan const char* shard_index_env, 4659905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan bool in_subprocess_for_death_test) { 4660905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan if (in_subprocess_for_death_test) { 4661905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan return false; 4662905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan } 4663905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan 4664905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1); 4665905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1); 4666905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan 4667905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan if (total_shards == -1 && shard_index == -1) { 4668905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan return false; 4669905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan } else if (total_shards == -1 && shard_index != -1) { 4670905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan const Message msg = Message() 4671905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan << "Invalid environment variables: you have " 4672905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan << kTestShardIndex << " = " << shard_index 4673905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan << ", but have left " << kTestTotalShards << " unset.\n"; 4674905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan ColoredPrintf(COLOR_RED, msg.GetString().c_str()); 4675905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan fflush(stdout); 4676905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan exit(EXIT_FAILURE); 4677905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan } else if (total_shards != -1 && shard_index == -1) { 4678905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan const Message msg = Message() 4679905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan << "Invalid environment variables: you have " 4680905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan << kTestTotalShards << " = " << total_shards 4681905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan << ", but have left " << kTestShardIndex << " unset.\n"; 4682905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan ColoredPrintf(COLOR_RED, msg.GetString().c_str()); 4683905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan fflush(stdout); 4684905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan exit(EXIT_FAILURE); 4685905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan } else if (shard_index < 0 || shard_index >= total_shards) { 4686905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan const Message msg = Message() 4687905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan << "Invalid environment variables: we require 0 <= " 4688905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan << kTestShardIndex << " < " << kTestTotalShards 4689905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan << ", but you have " << kTestShardIndex << "=" << shard_index 4690905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan << ", " << kTestTotalShards << "=" << total_shards << ".\n"; 4691905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan ColoredPrintf(COLOR_RED, msg.GetString().c_str()); 4692905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan fflush(stdout); 4693905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan exit(EXIT_FAILURE); 4694905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan } 4695905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan 4696905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan return total_shards > 1; 4697905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan} 4698905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan 4699905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// Parses the environment variable var as an Int32. If it is unset, 4700905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// returns default_val. If it is not an Int32, prints an error 4701905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// and aborts. 4702ed1042b09b7d6f7857ff3a4ad33acef08a016960zhanyong.wanInt32 Int32FromEnvOrDie(const char* var, Int32 default_val) { 4703c7f60f1514013d57a624c3a2966709998678f24bzhanyong.wan const char* str_val = posix::GetEnv(var); 4704905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan if (str_val == NULL) { 4705905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan return default_val; 4706905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan } 4707905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan 4708905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan Int32 result; 4709905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan if (!ParseInt32(Message() << "The value of environment variable " << var, 4710905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan str_val, &result)) { 4711905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan exit(EXIT_FAILURE); 4712905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan } 4713905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan return result; 4714905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan} 4715905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan 4716905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// Given the total number of shards, the shard index, and the test id, 4717905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// returns true iff the test should be run on this shard. The test id is 4718905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// some arbitrary but unique non-negative integer assigned to each test 4719905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// method. Assumes that 0 <= shard_index < total_shards. 4720905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanbool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) { 4721905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan return (test_id % total_shards) == shard_index; 4722905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan} 4723905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan 47244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Compares the name of each test with the user-specified filter to 47254b6829f0d28990dd645e16386eb226d0f10c8731shiqian// decide whether the test should be run, then records the result in 47264b6829f0d28990dd645e16386eb226d0f10c8731shiqian// each TestCase and TestInfo object. 4727905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// If shard_tests == true, further filters tests based on sharding 4728905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// variables in the environment - see 4729905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide. 47304b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns the number of tests that should run. 4731905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wanint UnitTestImpl::FilterTests(ReactionToSharding shard_tests) { 4732905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ? 4733baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan Int32FromEnvOrDie(kTestTotalShards, -1) : -1; 4734905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ? 4735baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan Int32FromEnvOrDie(kTestShardIndex, -1) : -1; 4736905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan 4737905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan // num_runnable_tests are the number of tests that will 4738905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan // run across all shards (i.e., match filter and are not disabled). 4739905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan // num_selected_tests are the number of tests to be run on 4740905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan // this shard. 47414b6829f0d28990dd645e16386eb226d0f10c8731shiqian int num_runnable_tests = 0; 4742905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan int num_selected_tests = 0; 474393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan for (size_t i = 0; i < test_cases_.size(); i++) { 474493d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan TestCase* const test_case = test_cases_[i]; 474503c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string &test_case_name = test_case->name(); 47464b6829f0d28990dd645e16386eb226d0f10c8731shiqian test_case->set_should_run(false); 47474b6829f0d28990dd645e16386eb226d0f10c8731shiqian 474893d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan for (size_t j = 0; j < test_case->test_info_list().size(); j++) { 474993d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan TestInfo* const test_info = test_case->test_info_list()[j]; 475003c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string test_name(test_info->name()); 47514b6829f0d28990dd645e16386eb226d0f10c8731shiqian // A test is disabled if test case name or test name matches 4752e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian // kDisableTestFilter. 47534b6829f0d28990dd645e16386eb226d0f10c8731shiqian const bool is_disabled = 4754baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan internal::UnitTestOptions::MatchesFilter(test_case_name, 4755baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan kDisableTestFilter) || 4756baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan internal::UnitTestOptions::MatchesFilter(test_name, 4757baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan kDisableTestFilter); 4758739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan test_info->is_disabled_ = is_disabled; 47594b6829f0d28990dd645e16386eb226d0f10c8731shiqian 476093a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wan const bool matches_filter = 47614b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::UnitTestOptions::FilterMatchesTest(test_case_name, 47624b6829f0d28990dd645e16386eb226d0f10c8731shiqian test_name); 4763739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan test_info->matches_filter_ = matches_filter; 476493a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wan 476593a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wan const bool is_runnable = 476693a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wan (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) && 476793a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wan matches_filter; 4768905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan 4769905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan const bool is_selected = is_runnable && 4770905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan (shard_tests == IGNORE_SHARDING_PROTOCOL || 4771905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan ShouldRunTestOnShard(total_shards, shard_index, 4772905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan num_runnable_tests)); 4773905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan 4774905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan num_runnable_tests += is_runnable; 4775905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan num_selected_tests += is_selected; 4776905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan 4777739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan test_info->should_run_ = is_selected; 4778905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan test_case->set_should_run(test_case->should_run() || is_selected); 47794b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 47804b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 4781905074c42ba4d0c5b472730b00e43a01d6a50134zhanyong.wan return num_selected_tests; 47824b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 47834b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4784b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan// Prints the given C-string on a single line by replacing all '\n' 4785b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan// characters with string "\\n". If the output takes more than 4786b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan// max_length characters, only prints the first max_length characters 4787b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan// and "...". 4788b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wanstatic void PrintOnOneLine(const char* str, int max_length) { 4789b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan if (str != NULL) { 4790b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan for (int i = 0; *str != '\0'; ++str) { 4791b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan if (i >= max_length) { 4792b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan printf("..."); 4793b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan break; 4794b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan } 4795b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan if (*str == '\n') { 4796b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan printf("\\n"); 4797b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan i += 2; 4798b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan } else { 4799b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan printf("%c", *str); 4800b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan ++i; 4801b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan } 4802b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan } 4803b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan } 4804b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan} 4805b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan 480693a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wan// Prints the names of the tests matching the user-specified filter flag. 480793a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wanvoid UnitTestImpl::ListTestsMatchingFilter() { 4808b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan // Print at most this many characters for each type/value parameter. 4809b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan const int kMaxParamLength = 250; 4810b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan 481193d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan for (size_t i = 0; i < test_cases_.size(); i++) { 481293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan const TestCase* const test_case = test_cases_[i]; 481393a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wan bool printed_test_case_name = false; 48144b6829f0d28990dd645e16386eb226d0f10c8731shiqian 481593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan for (size_t j = 0; j < test_case->test_info_list().size(); j++) { 4816449f84de9b0c48289e20f63c6d08a39bcee2021bzhanyong.wan const TestInfo* const test_info = 481793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan test_case->test_info_list()[j]; 4818739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan if (test_info->matches_filter_) { 481993a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wan if (!printed_test_case_name) { 482093a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wan printed_test_case_name = true; 4821b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan printf("%s.", test_case->name()); 4822b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan if (test_case->type_param() != NULL) { 4823b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan printf(" # %s = ", kTypeParamLabel); 4824b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan // We print the type parameter on a single line to make 4825b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan // the output easy to parse by a program. 4826b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan PrintOnOneLine(test_case->type_param(), kMaxParamLength); 4827b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan } 4828b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan printf("\n"); 4829b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan } 4830b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan printf(" %s", test_info->name()); 4831b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan if (test_info->value_param() != NULL) { 4832b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan printf(" # %s = ", kValueParamLabel); 4833b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan // We print the value parameter on a single line to make the 4834b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan // output easy to parse by a program. 4835b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan PrintOnOneLine(test_info->value_param(), kMaxParamLength); 483693a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wan } 4837b3d0b4ea4ab877a355e79dd0de704577811fff0fzhanyong.wan printf("\n"); 483893a87b3a4d608dd0439b1f6c909520be197c88efzhanyong.wan } 48394b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 48404b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 48414b6829f0d28990dd645e16386eb226d0f10c8731shiqian fflush(stdout); 48424b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 48434b6829f0d28990dd645e16386eb226d0f10c8731shiqian 48444b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Sets the OS stack trace getter. 48454b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 48464b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Does nothing if the input and the current OS stack trace getter are 48474b6829f0d28990dd645e16386eb226d0f10c8731shiqian// the same; otherwise, deletes the old getter and makes the input the 48484b6829f0d28990dd645e16386eb226d0f10c8731shiqian// current getter. 48494b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid UnitTestImpl::set_os_stack_trace_getter( 48504b6829f0d28990dd645e16386eb226d0f10c8731shiqian OsStackTraceGetterInterface* getter) { 48514b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (os_stack_trace_getter_ != getter) { 48524b6829f0d28990dd645e16386eb226d0f10c8731shiqian delete os_stack_trace_getter_; 48534b6829f0d28990dd645e16386eb226d0f10c8731shiqian os_stack_trace_getter_ = getter; 48544b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 48554b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 48564b6829f0d28990dd645e16386eb226d0f10c8731shiqian 48574b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns the current OS stack trace getter if it is not NULL; 48584b6829f0d28990dd645e16386eb226d0f10c8731shiqian// otherwise, creates an OsStackTraceGetter, makes it the current 48594b6829f0d28990dd645e16386eb226d0f10c8731shiqian// getter, and returns it. 48604b6829f0d28990dd645e16386eb226d0f10c8731shiqianOsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() { 48614b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (os_stack_trace_getter_ == NULL) { 48624b6829f0d28990dd645e16386eb226d0f10c8731shiqian os_stack_trace_getter_ = new OsStackTraceGetter; 48634b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 48644b6829f0d28990dd645e16386eb226d0f10c8731shiqian 48654b6829f0d28990dd645e16386eb226d0f10c8731shiqian return os_stack_trace_getter_; 48664b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 48674b6829f0d28990dd645e16386eb226d0f10c8731shiqian 48684b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns the TestResult for the test that's currently running, or 48694b6829f0d28990dd645e16386eb226d0f10c8731shiqian// the TestResult for the ad hoc test if no test is running. 48701cdc76325936ad3312be0d456b4936c8b8e6bf70zhanyong.wanTestResult* UnitTestImpl::current_test_result() { 48714b6829f0d28990dd645e16386eb226d0f10c8731shiqian return current_test_info_ ? 4872739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan &(current_test_info_->result_) : &ad_hoc_test_result_; 48734b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 48744b6829f0d28990dd645e16386eb226d0f10c8731shiqian 4875f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan// Shuffles all test cases, and the tests within each test case, 4876f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan// making sure that death tests are still run first. 4877f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wanvoid UnitTestImpl::ShuffleTests() { 4878f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // Shuffles the death test cases. 487993d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_); 4880f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan 4881f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // Shuffles the non-death test cases. 488293d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan ShuffleRange(random(), last_death_test_case_ + 1, 4883b03ca47c10be432be5d984cb91ce22c81dfa2252zhanyong.wan static_cast<int>(test_cases_.size()), &test_case_indices_); 4884f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan 4885f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // Shuffles the tests inside each test case. 488693d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan for (size_t i = 0; i < test_cases_.size(); i++) { 488793d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan test_cases_[i]->ShuffleTests(random()); 4888f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan } 4889f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan} 4890f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan 4891f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan// Restores the test cases and tests to their order before the first shuffle. 4892f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wanvoid UnitTestImpl::UnshuffleTests() { 489393d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan for (size_t i = 0; i < test_cases_.size(); i++) { 4894f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // Unshuffles the tests in each test case. 489593d13a8bbcb70bfd80b0d7ae2bf9aedfc06bf0cczhanyong.wan test_cases_[i]->UnshuffleTests(); 4896f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan // Resets the index of each test case. 4897b03ca47c10be432be5d984cb91ce22c81dfa2252zhanyong.wan test_case_indices_[i] = static_cast<int>(i); 4898f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan } 4899f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan} 4900f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan 490103c314931649a999b0cf5deb0a434a1009157416jgm@google.com// Returns the current OS stack trace as an std::string. 4902eb2553da147998571f28fc03f7731a3ea44efa22shiqian// 4903eb2553da147998571f28fc03f7731a3ea44efa22shiqian// The maximum number of stack frames to be included is specified by 4904eb2553da147998571f28fc03f7731a3ea44efa22shiqian// the gtest_stack_trace_depth flag. The skip_count parameter 4905eb2553da147998571f28fc03f7731a3ea44efa22shiqian// specifies the number of top frames to be skipped, which doesn't 4906eb2553da147998571f28fc03f7731a3ea44efa22shiqian// count against the number of frames to be included. 4907eb2553da147998571f28fc03f7731a3ea44efa22shiqian// 4908eb2553da147998571f28fc03f7731a3ea44efa22shiqian// For example, if Foo() calls Bar(), which in turn calls 4909eb2553da147998571f28fc03f7731a3ea44efa22shiqian// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in 4910eb2553da147998571f28fc03f7731a3ea44efa22shiqian// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't. 491103c314931649a999b0cf5deb0a434a1009157416jgm@google.comstd::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/, 491203c314931649a999b0cf5deb0a434a1009157416jgm@google.com int skip_count) { 4913eb2553da147998571f28fc03f7731a3ea44efa22shiqian // We pass skip_count + 1 to skip this wrapper function in addition 4914eb2553da147998571f28fc03f7731a3ea44efa22shiqian // to what the user really wants to skip. 4915a80f23f103e1a008c1df7ecc68eef9aa4ffbdc37zhanyong.wan return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1); 4916eb2553da147998571f28fc03f7731a3ea44efa22shiqian} 4917eb2553da147998571f28fc03f7731a3ea44efa22shiqian 4918739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to 4919739d30448cd8477c7c8802d41d4e0d969a9490dezhanyong.wan// suppress unreachable code warnings. 4920e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wannamespace { 4921e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wanclass ClassUniqueToAlwaysTrue {}; 4922e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan} 4923e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan 4924f6d087b78d230d875bf5d8281112662795044680zhanyong.wanbool IsTrue(bool condition) { return condition; } 4925f6d087b78d230d875bf5d8281112662795044680zhanyong.wan 4926e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wanbool AlwaysTrue() { 4927e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan#if GTEST_HAS_EXCEPTIONS 4928e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan // This condition is always false so AlwaysTrue() never actually throws, 4929e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan // but it makes the compiler think that it may throw. 4930f6d087b78d230d875bf5d8281112662795044680zhanyong.wan if (IsTrue(false)) 4931e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan throw ClassUniqueToAlwaysTrue(); 4932e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan#endif // GTEST_HAS_EXCEPTIONS 4933e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan return true; 4934e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan} 4935e0ca02f7b4175a1c21f7416039f9f06c028b544azhanyong.wan 49364e08d4fffc0fd85cec52bf26ca8e60768c4db39azhanyong.wan// If *pstr starts with the given prefix, modifies *pstr to be right 49374e08d4fffc0fd85cec52bf26ca8e60768c4db39azhanyong.wan// past the prefix and returns true; otherwise leaves *pstr unchanged 49384e08d4fffc0fd85cec52bf26ca8e60768c4db39azhanyong.wan// and returns false. None of pstr, *pstr, and prefix can be NULL. 49394e08d4fffc0fd85cec52bf26ca8e60768c4db39azhanyong.wanbool SkipPrefix(const char* prefix, const char** pstr) { 49404e08d4fffc0fd85cec52bf26ca8e60768c4db39azhanyong.wan const size_t prefix_len = strlen(prefix); 49414e08d4fffc0fd85cec52bf26ca8e60768c4db39azhanyong.wan if (strncmp(*pstr, prefix, prefix_len) == 0) { 49424e08d4fffc0fd85cec52bf26ca8e60768c4db39azhanyong.wan *pstr += prefix_len; 49434e08d4fffc0fd85cec52bf26ca8e60768c4db39azhanyong.wan return true; 49444e08d4fffc0fd85cec52bf26ca8e60768c4db39azhanyong.wan } 49454e08d4fffc0fd85cec52bf26ca8e60768c4db39azhanyong.wan return false; 49464e08d4fffc0fd85cec52bf26ca8e60768c4db39azhanyong.wan} 49474e08d4fffc0fd85cec52bf26ca8e60768c4db39azhanyong.wan 49484b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Parses a string as a command line flag. The string should have 49494b6829f0d28990dd645e16386eb226d0f10c8731shiqian// the format "--flag=value". When def_optional is true, the "=value" 49504b6829f0d28990dd645e16386eb226d0f10c8731shiqian// part can be omitted. 49514b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 49524b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Returns the value of the flag, or NULL if the parsing failed. 49534b6829f0d28990dd645e16386eb226d0f10c8731shiqianconst char* ParseFlagValue(const char* str, 49544b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* flag, 49554b6829f0d28990dd645e16386eb226d0f10c8731shiqian bool def_optional) { 49564b6829f0d28990dd645e16386eb226d0f10c8731shiqian // str and flag must not be NULL. 49574b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (str == NULL || flag == NULL) return NULL; 49584b6829f0d28990dd645e16386eb226d0f10c8731shiqian 49594cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan // The flag must start with "--" followed by GTEST_FLAG_PREFIX_. 496003c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag; 496189be5763249cbab785abfa310fb1cd6b5e9c4adfzhanyong.wan const size_t flag_len = flag_str.length(); 49624b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL; 49634b6829f0d28990dd645e16386eb226d0f10c8731shiqian 49644b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Skips the flag name. 49654b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* flag_end = str + flag_len; 49664b6829f0d28990dd645e16386eb226d0f10c8731shiqian 49674b6829f0d28990dd645e16386eb226d0f10c8731shiqian // When def_optional is true, it's OK to not have a "=value" part. 49684b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (def_optional && (flag_end[0] == '\0')) { 49694b6829f0d28990dd645e16386eb226d0f10c8731shiqian return flag_end; 49704b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 49714b6829f0d28990dd645e16386eb226d0f10c8731shiqian 49724b6829f0d28990dd645e16386eb226d0f10c8731shiqian // If def_optional is true and there are more characters after the 49734b6829f0d28990dd645e16386eb226d0f10c8731shiqian // flag name, or if def_optional is false, there must be a '=' after 49744b6829f0d28990dd645e16386eb226d0f10c8731shiqian // the flag name. 49754b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (flag_end[0] != '=') return NULL; 49764b6829f0d28990dd645e16386eb226d0f10c8731shiqian 49774b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Returns the string after "=". 49784b6829f0d28990dd645e16386eb226d0f10c8731shiqian return flag_end + 1; 49794b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 49804b6829f0d28990dd645e16386eb226d0f10c8731shiqian 49814b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Parses a string for a bool flag, in the form of either 49824b6829f0d28990dd645e16386eb226d0f10c8731shiqian// "--flag=value" or "--flag". 49834b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 49844b6829f0d28990dd645e16386eb226d0f10c8731shiqian// In the former case, the value is taken as true as long as it does 49854b6829f0d28990dd645e16386eb226d0f10c8731shiqian// not start with '0', 'f', or 'F'. 49864b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 49874b6829f0d28990dd645e16386eb226d0f10c8731shiqian// In the latter case, the value is taken as true. 49884b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 49894b6829f0d28990dd645e16386eb226d0f10c8731shiqian// On success, stores the value of the flag in *value, and returns 49904b6829f0d28990dd645e16386eb226d0f10c8731shiqian// true. On failure, returns false without changing *value. 49914b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool ParseBoolFlag(const char* str, const char* flag, bool* value) { 49924b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Gets the value of the flag as a string. 49934b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* const value_str = ParseFlagValue(str, flag, true); 49944b6829f0d28990dd645e16386eb226d0f10c8731shiqian 49954b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Aborts if the parsing failed. 49964b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (value_str == NULL) return false; 49974b6829f0d28990dd645e16386eb226d0f10c8731shiqian 49984b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Converts the string value to a bool. 49994b6829f0d28990dd645e16386eb226d0f10c8731shiqian *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F'); 50004b6829f0d28990dd645e16386eb226d0f10c8731shiqian return true; 50014b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 50024b6829f0d28990dd645e16386eb226d0f10c8731shiqian 50034b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Parses a string for an Int32 flag, in the form of 50044b6829f0d28990dd645e16386eb226d0f10c8731shiqian// "--flag=value". 50054b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 50064b6829f0d28990dd645e16386eb226d0f10c8731shiqian// On success, stores the value of the flag in *value, and returns 50074b6829f0d28990dd645e16386eb226d0f10c8731shiqian// true. On failure, returns false without changing *value. 50084b6829f0d28990dd645e16386eb226d0f10c8731shiqianbool ParseInt32Flag(const char* str, const char* flag, Int32* value) { 50094b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Gets the value of the flag as a string. 50104b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* const value_str = ParseFlagValue(str, flag, false); 50114b6829f0d28990dd645e16386eb226d0f10c8731shiqian 50124b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Aborts if the parsing failed. 50134b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (value_str == NULL) return false; 50144b6829f0d28990dd645e16386eb226d0f10c8731shiqian 50154b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Sets *value to the value of the flag. 50164b6829f0d28990dd645e16386eb226d0f10c8731shiqian return ParseInt32(Message() << "The value of flag --" << flag, 50174b6829f0d28990dd645e16386eb226d0f10c8731shiqian value_str, value); 50184b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 50194b6829f0d28990dd645e16386eb226d0f10c8731shiqian 50204b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Parses a string for a string flag, in the form of 50214b6829f0d28990dd645e16386eb226d0f10c8731shiqian// "--flag=value". 50224b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 50234b6829f0d28990dd645e16386eb226d0f10c8731shiqian// On success, stores the value of the flag in *value, and returns 50244b6829f0d28990dd645e16386eb226d0f10c8731shiqian// true. On failure, returns false without changing *value. 502503c314931649a999b0cf5deb0a434a1009157416jgm@google.combool ParseStringFlag(const char* str, const char* flag, std::string* value) { 50264b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Gets the value of the flag as a string. 50274b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* const value_str = ParseFlagValue(str, flag, false); 50284b6829f0d28990dd645e16386eb226d0f10c8731shiqian 50294b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Aborts if the parsing failed. 50304b6829f0d28990dd645e16386eb226d0f10c8731shiqian if (value_str == NULL) return false; 50314b6829f0d28990dd645e16386eb226d0f10c8731shiqian 50324b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Sets *value to the value of the flag. 50334b6829f0d28990dd645e16386eb226d0f10c8731shiqian *value = value_str; 50344b6829f0d28990dd645e16386eb226d0f10c8731shiqian return true; 50354b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 50364b6829f0d28990dd645e16386eb226d0f10c8731shiqian 50378cfe730f74068ec8b90ba6a8885019bbe5fe6b13vladlosev// Determines whether a string has a prefix that Google Test uses for its 50388cfe730f74068ec8b90ba6a8885019bbe5fe6b13vladlosev// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_. 50398cfe730f74068ec8b90ba6a8885019bbe5fe6b13vladlosev// If Google Test detects that a command line flag has its prefix but is not 50408cfe730f74068ec8b90ba6a8885019bbe5fe6b13vladlosev// recognized, it will print its help message. Flags starting with 50418cfe730f74068ec8b90ba6a8885019bbe5fe6b13vladlosev// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test 50428cfe730f74068ec8b90ba6a8885019bbe5fe6b13vladlosev// internal flags and do not trigger the help message. 5043122c66e14103ddfeeb5460f09cd389f3e9f0de1fvladlosevstatic bool HasGoogleTestFlagPrefix(const char* str) { 50448cfe730f74068ec8b90ba6a8885019bbe5fe6b13vladlosev return (SkipPrefix("--", &str) || 50458cfe730f74068ec8b90ba6a8885019bbe5fe6b13vladlosev SkipPrefix("-", &str) || 50468cfe730f74068ec8b90ba6a8885019bbe5fe6b13vladlosev SkipPrefix("/", &str)) && 50478cfe730f74068ec8b90ba6a8885019bbe5fe6b13vladlosev !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) && 50488cfe730f74068ec8b90ba6a8885019bbe5fe6b13vladlosev (SkipPrefix(GTEST_FLAG_PREFIX_, &str) || 50498cfe730f74068ec8b90ba6a8885019bbe5fe6b13vladlosev SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str)); 50508cfe730f74068ec8b90ba6a8885019bbe5fe6b13vladlosev} 50518cfe730f74068ec8b90ba6a8885019bbe5fe6b13vladlosev 5052baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan// Prints a string containing code-encoded text. The following escape 5053baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan// sequences can be used in the string to control the text color: 5054baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan// 5055baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan// @@ prints a single '@' character. 5056baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan// @R changes the color to red. 5057baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan// @G changes the color to green. 5058baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan// @Y changes the color to yellow. 5059baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan// @D changes to the default terminal text color. 5060baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan// 5061baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan// TODO(wan@google.com): Write tests for this once we add stdout 5062baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan// capturing to Google Test. 5063baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wanstatic void PrintColorEncoded(const char* str) { 5064baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan GTestColor color = COLOR_DEFAULT; // The current color. 5065baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan 5066baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan // Conceptually, we split the string into segments divided by escape 5067baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan // sequences. Then we print one segment at a time. At the end of 5068baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan // each iteration, the str pointer advances to the beginning of the 5069baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan // next segment. 5070baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan for (;;) { 5071baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan const char* p = strchr(str, '@'); 5072baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan if (p == NULL) { 5073baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan ColoredPrintf(color, "%s", str); 5074baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan return; 5075baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan } 5076baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan 507703c314931649a999b0cf5deb0a434a1009157416jgm@google.com ColoredPrintf(color, "%s", std::string(str, p).c_str()); 5078baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan 5079baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan const char ch = p[1]; 5080baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan str = p + 2; 5081baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan if (ch == '@') { 5082baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan ColoredPrintf(color, "@"); 5083baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan } else if (ch == 'D') { 5084baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan color = COLOR_DEFAULT; 5085baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan } else if (ch == 'R') { 5086baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan color = COLOR_RED; 5087baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan } else if (ch == 'G') { 5088baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan color = COLOR_GREEN; 5089baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan } else if (ch == 'Y') { 5090baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan color = COLOR_YELLOW; 5091baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan } else { 5092baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan --str; 5093baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan } 5094baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan } 5095baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan} 5096baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan 5097baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wanstatic const char kColorEncodedHelpMessage[] = 5098baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan"This program contains tests written using " GTEST_NAME_ ". You can use the\n" 5099baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan"following command line flags to control its behavior:\n" 5100baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan"\n" 5101baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan"Test Selection:\n" 5102baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" @G--" GTEST_FLAG_PREFIX_ "list_tests@D\n" 5103baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" List the names of all tests instead of running them. The name of\n" 5104baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" TEST(Foo, Bar) is \"Foo.Bar\".\n" 5105baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS" 5106baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan "[@G-@YNEGATIVE_PATTERNS]@D\n" 5107baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" Run only the tests whose name matches one of the positive patterns but\n" 5108baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" none of the negative patterns. '?' matches any single character; '*'\n" 5109baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" matches any substring; ':' separates two patterns.\n" 5110baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests@D\n" 5111baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" Run all disabled tests too.\n" 51129b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan"\n" 51139b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan"Test Execution:\n" 5114baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n" 5115baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" Run the tests repeatedly; use a negative count to repeat forever.\n" 5116f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan" @G--" GTEST_FLAG_PREFIX_ "shuffle@D\n" 5117f19450f3ad156e1dea624b4d37e645bef067ab5czhanyong.wan" Randomize tests' orders on every iteration.\n" 51189b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan" @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n" 51199b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan" Random number seed to use for shuffling test orders (between 1 and\n" 51209b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan" 99999, or 0 to use a seed based on the current time).\n" 5121baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan"\n" 5122baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan"Test Output:\n" 5123baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\n" 5124baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" Enable/disable colored output. The default is @Gauto@D.\n" 512573ad5a3327d38504954d33b58f27e29a7089bd96zhanyong.wan" -@G-" GTEST_FLAG_PREFIX_ "print_time=0@D\n" 512673ad5a3327d38504954d33b58f27e29a7089bd96zhanyong.wan" Don't print the elapsed time of each test.\n" 5127baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" @G--" GTEST_FLAG_PREFIX_ "output=xml@Y[@G:@YDIRECTORY_PATH@G" 5128baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n" 5129baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" Generate an XML report in the given directory or with the given file\n" 5130baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" name. @YFILE_PATH@D defaults to @Gtest_details.xml@D.\n" 5131c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan#if GTEST_CAN_STREAM_RESULTS_ 5132c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan" @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST@G:@YPORT@D\n" 5133c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan" Stream test results to the given server.\n" 5134c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan#endif // GTEST_CAN_STREAM_RESULTS_ 5135baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan"\n" 5136a49bf25b24dd239a9da88e783f037d817a6287b0zhanyong.wan"Assertion Behavior:\n" 5137a49bf25b24dd239a9da88e783f037d817a6287b0zhanyong.wan#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS 5138a49bf25b24dd239a9da88e783f037d817a6287b0zhanyong.wan" @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\n" 5139a49bf25b24dd239a9da88e783f037d817a6287b0zhanyong.wan" Set the default death test style.\n" 5140a49bf25b24dd239a9da88e783f037d817a6287b0zhanyong.wan#endif // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS 5141baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" @G--" GTEST_FLAG_PREFIX_ "break_on_failure@D\n" 5142baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" Turn assertion failures into debugger break-points.\n" 5143baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" @G--" GTEST_FLAG_PREFIX_ "throw_on_failure@D\n" 5144baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan" Turn assertion failures into C++ exceptions.\n" 5145480f1c2878a043af55c5adfc4ed82a6b8a2aae03vladlosev" @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0@D\n" 5146480f1c2878a043af55c5adfc4ed82a6b8a2aae03vladlosev" Do not report exceptions as test failures. Instead, allow them\n" 5147480f1c2878a043af55c5adfc4ed82a6b8a2aae03vladlosev" to crash the program or throw a pop-up (on Windows).\n" 5148baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan"\n" 5149baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests@D, you can alternatively set " 5150baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan "the corresponding\n" 5151baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan"environment variable of a flag (all letters in upper-case). For example, to\n" 515273ad5a3327d38504954d33b58f27e29a7089bd96zhanyong.wan"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_ 515373ad5a3327d38504954d33b58f27e29a7089bd96zhanyong.wan "color=no@D or set\n" 515473ad5a3327d38504954d33b58f27e29a7089bd96zhanyong.wan"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR@D environment variable to @Gno@D.\n" 5155baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan"\n" 5156baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan"For more information, please read the " GTEST_NAME_ " documentation at\n" 5157baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n" 5158baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan"(not one in your own code or tests), please report it to\n" 5159baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan"@G<" GTEST_DEV_EMAIL_ ">@D.\n"; 5160baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan 5161f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev// Parses the command line for Google Test flags, without initializing 5162f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev// other parts of Google Test. The type parameter CharType can be 5163f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev// instantiated to either char or wchar_t. 51644b6829f0d28990dd645e16386eb226d0f10c8731shiqiantemplate <typename CharType> 5165f179f4ee7cc76e7103a726ebf666902b07f89659vladlosevvoid ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) { 5166f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev for (int i = 1; i < *argc; i++) { 516703c314931649a999b0cf5deb0a434a1009157416jgm@google.com const std::string arg_string = StreamableToString(argv[i]); 51684b6829f0d28990dd645e16386eb226d0f10c8731shiqian const char* const arg = arg_string.c_str(); 51694b6829f0d28990dd645e16386eb226d0f10c8731shiqian 51704b6829f0d28990dd645e16386eb226d0f10c8731shiqian using internal::ParseBoolFlag; 51714b6829f0d28990dd645e16386eb226d0f10c8731shiqian using internal::ParseInt32Flag; 51724b6829f0d28990dd645e16386eb226d0f10c8731shiqian using internal::ParseStringFlag; 51734b6829f0d28990dd645e16386eb226d0f10c8731shiqian 51744b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Do we see a Google Test flag? 5175ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag, 5176ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian >EST_FLAG(also_run_disabled_tests)) || 5177ca6949fd2a0a317fd7c7c48aa86670aac50a48c6shiqian ParseBoolFlag(arg, kBreakOnFailureFlag, 51784b6829f0d28990dd645e16386eb226d0f10c8731shiqian >EST_FLAG(break_on_failure)) || 51794b6829f0d28990dd645e16386eb226d0f10c8731shiqian ParseBoolFlag(arg, kCatchExceptionsFlag, 51804b6829f0d28990dd645e16386eb226d0f10c8731shiqian >EST_FLAG(catch_exceptions)) || 51814b6829f0d28990dd645e16386eb226d0f10c8731shiqian ParseStringFlag(arg, kColorFlag, >EST_FLAG(color)) || 51824b6829f0d28990dd645e16386eb226d0f10c8731shiqian ParseStringFlag(arg, kDeathTestStyleFlag, 51834b6829f0d28990dd645e16386eb226d0f10c8731shiqian >EST_FLAG(death_test_style)) || 518421d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian ParseBoolFlag(arg, kDeathTestUseFork, 518521d43d1a7e09d960b790d992f1bb4e92c70391d4shiqian >EST_FLAG(death_test_use_fork)) || 51864b6829f0d28990dd645e16386eb226d0f10c8731shiqian ParseStringFlag(arg, kFilterFlag, >EST_FLAG(filter)) || 51874b6829f0d28990dd645e16386eb226d0f10c8731shiqian ParseStringFlag(arg, kInternalRunDeathTestFlag, 51884b6829f0d28990dd645e16386eb226d0f10c8731shiqian >EST_FLAG(internal_run_death_test)) || 51894b6829f0d28990dd645e16386eb226d0f10c8731shiqian ParseBoolFlag(arg, kListTestsFlag, >EST_FLAG(list_tests)) || 51904b6829f0d28990dd645e16386eb226d0f10c8731shiqian ParseStringFlag(arg, kOutputFlag, >EST_FLAG(output)) || 5191d981cee92591b1c48b0256fa603f5b8e4e1f7eb0shiqian ParseBoolFlag(arg, kPrintTimeFlag, >EST_FLAG(print_time)) || 51929b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan ParseInt32Flag(arg, kRandomSeedFlag, >EST_FLAG(random_seed)) || 5193b0fe69fcbfaa44ae05f6f2429d9c4bbb326b5ea5zhanyong.wan ParseInt32Flag(arg, kRepeatFlag, >EST_FLAG(repeat)) || 51949b9794ffb9cfafb94f5def851f76b9a104fcb891zhanyong.wan ParseBoolFlag(arg, kShuffleFlag, >EST_FLAG(shuffle)) || 5195ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev ParseInt32Flag(arg, kStackTraceDepthFlag, 5196ba015a9176a56cbfab316fc8f781bbd11a6edc2bvladlosev >EST_FLAG(stack_trace_depth)) || 5197c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan ParseStringFlag(arg, kStreamResultToFlag, 5198c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan >EST_FLAG(stream_result_to)) || 5199c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan ParseBoolFlag(arg, kThrowOnFailureFlag, 5200c95489ee7dd54fc6a2cd1d3e890c330718ead714zhanyong.wan >EST_FLAG(throw_on_failure)) 52014b6829f0d28990dd645e16386eb226d0f10c8731shiqian ) { 52024b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Yes. Shift the remainder of the argv list left by one. Note 52034b6829f0d28990dd645e16386eb226d0f10c8731shiqian // that argv has (*argc + 1) elements, the last one always being 52044b6829f0d28990dd645e16386eb226d0f10c8731shiqian // NULL. The following loop moves the trailing NULL element as 52054b6829f0d28990dd645e16386eb226d0f10c8731shiqian // well. 52064b6829f0d28990dd645e16386eb226d0f10c8731shiqian for (int j = i; j != *argc; j++) { 52074b6829f0d28990dd645e16386eb226d0f10c8731shiqian argv[j] = argv[j + 1]; 52084b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 52094b6829f0d28990dd645e16386eb226d0f10c8731shiqian 52104b6829f0d28990dd645e16386eb226d0f10c8731shiqian // Decrements the argument count. 52114b6829f0d28990dd645e16386eb226d0f10c8731shiqian (*argc)--; 52124b6829f0d28990dd645e16386eb226d0f10c8731shiqian 52134b6829f0d28990dd645e16386eb226d0f10c8731shiqian // We also need to decrement the iterator as we just removed 52144b6829f0d28990dd645e16386eb226d0f10c8731shiqian // an element. 52154b6829f0d28990dd645e16386eb226d0f10c8731shiqian i--; 5216baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan } else if (arg_string == "--help" || arg_string == "-h" || 52178cfe730f74068ec8b90ba6a8885019bbe5fe6b13vladlosev arg_string == "-?" || arg_string == "/?" || 52188cfe730f74068ec8b90ba6a8885019bbe5fe6b13vladlosev HasGoogleTestFlagPrefix(arg)) { 52198cfe730f74068ec8b90ba6a8885019bbe5fe6b13vladlosev // Both help flag and unrecognized Google Test flags (excluding 52208cfe730f74068ec8b90ba6a8885019bbe5fe6b13vladlosev // internal ones) trigger help display. 5221baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan g_help_flag = true; 52224b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 52234b6829f0d28990dd645e16386eb226d0f10c8731shiqian } 5224baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan 5225baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan if (g_help_flag) { 5226baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan // We print the help here instead of in RUN_ALL_TESTS(), as the 5227baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan // latter may not be called at all if the user is using Google 5228baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan // Test with another testing framework. 5229baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan PrintColorEncoded(kColorEncodedHelpMessage); 5230baa766af2a71363fb1ccf8de5de444c4a88f0e61zhanyong.wan } 52314b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 52324b6829f0d28990dd645e16386eb226d0f10c8731shiqian 5233f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev// Parses the command line for Google Test flags, without initializing 5234f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev// other parts of Google Test. 5235f179f4ee7cc76e7103a726ebf666902b07f89659vladlosevvoid ParseGoogleTestFlagsOnly(int* argc, char** argv) { 5236f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev ParseGoogleTestFlagsOnlyImpl(argc, argv); 5237f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev} 5238f179f4ee7cc76e7103a726ebf666902b07f89659vladlosevvoid ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) { 5239f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev ParseGoogleTestFlagsOnlyImpl(argc, argv); 5240f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev} 5241f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev 5242f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev// The internal implementation of InitGoogleTest(). 5243f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev// 5244f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev// The type parameter CharType can be instantiated to either char or 5245f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev// wchar_t. 5246f179f4ee7cc76e7103a726ebf666902b07f89659vladlosevtemplate <typename CharType> 5247f179f4ee7cc76e7103a726ebf666902b07f89659vladlosevvoid InitGoogleTestImpl(int* argc, CharType** argv) { 5248f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev g_init_gtest_count++; 5249f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev 5250f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev // We don't want to run the initialization code twice. 5251f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev if (g_init_gtest_count != 1) return; 5252f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev 5253f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev if (*argc <= 0) return; 5254f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev 5255f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev internal::g_executable_path = internal::StreamableToString(argv[0]); 5256f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev 52574cd62602913a032a7aec091d4c8055ff9af95e37zhanyong.wan#if GTEST_HAS_DEATH_TEST 5258733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 5259f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev g_argvs.clear(); 5260f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev for (int i = 0; i != *argc; i++) { 5261f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev g_argvs.push_back(StreamableToString(argv[i])); 5262f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev } 5263733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan 5264f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev#endif // GTEST_HAS_DEATH_TEST 5265f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev 5266f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev ParseGoogleTestFlagsOnly(argc, argv); 5267f39160b423e8f90902066cf6774e4180667dcbeezhanyong.wan GetUnitTestImpl()->PostFlagParsingInit(); 5268f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev} 5269f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev 52704b6829f0d28990dd645e16386eb226d0f10c8731shiqian} // namespace internal 52714b6829f0d28990dd645e16386eb226d0f10c8731shiqian 52724b6829f0d28990dd645e16386eb226d0f10c8731shiqian// Initializes Google Test. This must be called before calling 52734b6829f0d28990dd645e16386eb226d0f10c8731shiqian// RUN_ALL_TESTS(). In particular, it parses a command line for the 52744b6829f0d28990dd645e16386eb226d0f10c8731shiqian// flags that Google Test recognizes. Whenever a Google Test flag is 52754b6829f0d28990dd645e16386eb226d0f10c8731shiqian// seen, it is removed from argv, and *argc is decremented. 52764b6829f0d28990dd645e16386eb226d0f10c8731shiqian// 52774b6829f0d28990dd645e16386eb226d0f10c8731shiqian// No value is returned. Instead, the Google Test flag variables are 52784b6829f0d28990dd645e16386eb226d0f10c8731shiqian// updated. 5279f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev// 5280f179f4ee7cc76e7103a726ebf666902b07f89659vladlosev// Calling the function for the second time has no user-visible effect. 52814b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid InitGoogleTest(int* argc, char** argv) { 52824b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::InitGoogleTestImpl(argc, argv); 52834b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 52844b6829f0d28990dd645e16386eb226d0f10c8731shiqian 52854b6829f0d28990dd645e16386eb226d0f10c8731shiqian// This overloaded version can be used in Windows programs compiled in 52864b6829f0d28990dd645e16386eb226d0f10c8731shiqian// UNICODE mode. 52874b6829f0d28990dd645e16386eb226d0f10c8731shiqianvoid InitGoogleTest(int* argc, wchar_t** argv) { 52884b6829f0d28990dd645e16386eb226d0f10c8731shiqian internal::InitGoogleTestImpl(argc, argv); 52894b6829f0d28990dd645e16386eb226d0f10c8731shiqian} 52904b6829f0d28990dd645e16386eb226d0f10c8731shiqian 52914b6829f0d28990dd645e16386eb226d0f10c8731shiqian} // namespace testing 5292