1aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Copyright 2005, Google Inc. 2aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// All rights reserved. 3aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 4aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Redistribution and use in source and binary forms, with or without 5aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// modification, are permitted provided that the following conditions are 6aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// met: 7aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 8aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// * Redistributions of source code must retain the above copyright 9aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// notice, this list of conditions and the following disclaimer. 10aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// * Redistributions in binary form must reproduce the above 11aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// copyright notice, this list of conditions and the following disclaimer 12aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in the documentation and/or other materials provided with the 13aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// distribution. 14aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// * Neither the name of Google Inc. nor the names of its 15aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// contributors may be used to endorse or promote products derived from 16aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// this software without specific prior written permission. 17aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 18aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 30aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Utility functions and classes used by the Google C++ testing framework. 31aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 32aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Author: wan@google.com (Zhanyong Wan) 33aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 34aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This file contains purely Google Test's internal implementation. Please 35aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// DO NOT #INCLUDE IT IN A USER PROGRAM. 36aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 37aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_ 38aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#define GTEST_SRC_GTEST_INTERNAL_INL_H_ 39aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 40aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is 41aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// part of Google Test's implementation; otherwise it's undefined. 42aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if !GTEST_IMPLEMENTATION_ 43aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A user is trying to include this from his code - just say no. 44aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# error "gtest-internal-inl.h is part of Google Test's internal implementation." 45aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# error "It must not be included except by Google Test itself." 46aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_IMPLEMENTATION_ 47aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 48aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#ifndef _WIN32_WCE 49aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <errno.h> 50aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // !_WIN32_WCE 51aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <stddef.h> 52aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <stdlib.h> // For strtoll/_strtoul64/malloc/free. 53aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <string.h> // For memmove. 54aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 55aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <algorithm> 56aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <string> 57aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include <vector> 58aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 59aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include "gtest/internal/gtest-port.h" 60aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 61aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_CAN_STREAM_RESULTS_ 62aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <arpa/inet.h> // NOLINT 63aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <netdb.h> // NOLINT 64aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 65aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 66aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_WINDOWS 67aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# include <windows.h> // NOLINT 68aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_OS_WINDOWS 69aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 70aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include "gtest/gtest.h" // NOLINT 71aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#include "gtest/gtest-spi.h" 72aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 73aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace testing { 74aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 75aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Declares the flags. 76aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 77aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// We don't want the users to modify this flag in the code, but want 78aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Google Test's own unit tests to be able to access it. Therefore we 79aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// declare it here as opposed to in gtest.h. 80aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_DECLARE_bool_(death_test_use_fork); 81aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 82aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchternamespace internal { 83aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 84aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The value of GetTestTypeId() as seen from within the Google Test 85aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// library. This is solely for testing GetTestTypeId(). 86aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ extern const TypeId kTestTypeIdInGoogleTest; 87aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 88aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Names of the flags (needed for parsing Google Test flags). 89aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests"; 90aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kBreakOnFailureFlag[] = "break_on_failure"; 91aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kCatchExceptionsFlag[] = "catch_exceptions"; 92aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kColorFlag[] = "color"; 93aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kFilterFlag[] = "filter"; 94aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kListTestsFlag[] = "list_tests"; 95aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kOutputFlag[] = "output"; 96aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kPrintTimeFlag[] = "print_time"; 97aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kRandomSeedFlag[] = "random_seed"; 98aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kRepeatFlag[] = "repeat"; 99aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kShuffleFlag[] = "shuffle"; 100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kStackTraceDepthFlag[] = "stack_trace_depth"; 101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kStreamResultToFlag[] = "stream_result_to"; 102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst char kThrowOnFailureFlag[] = "throw_on_failure"; 103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A valid random seed must be in [1, kMaxRandomSeed]. 105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterconst int kMaxRandomSeed = 99999; 106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// g_help_flag is true iff the --help flag or an equivalent form is 108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// specified on the command line. 109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ extern bool g_help_flag; 110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Returns the current time in milliseconds. 112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ TimeInMillis GetTimeInMillis(); 113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Returns true iff Google Test should use colors in the output. 115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool ShouldUseColor(bool stdout_is_tty); 116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Formats the given time in milliseconds as seconds. 118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms); 119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Converts the given time in milliseconds to a date string in the ISO 8601 121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// format, without the timezone information. N.B.: due to the use the 122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// non-reentrant localtime() function, this function is not thread safe. Do 123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// not use it in any code that can be called from multiple threads. 124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms); 125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Parses a string for an Int32 flag, in the form of "--flag=value". 127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// On success, stores the value of the flag in *value, and returns 129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// true. On failure, returns false without changing *value. 130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool ParseInt32Flag( 131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const char* str, const char* flag, Int32* value); 132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Returns a random seed in range [1, kMaxRandomSeed] based on the 134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// given --gtest_random_seed flag value. 135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int GetRandomSeedFromFlag(Int32 random_seed_flag) { 136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const unsigned int raw_seed = (random_seed_flag == 0) ? 137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static_cast<unsigned int>(GetTimeInMillis()) : 138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static_cast<unsigned int>(random_seed_flag); 139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Normalizes the actual seed to range [1, kMaxRandomSeed] such that 141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // it's easy to type. 142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const int normalized_seed = 143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static_cast<int>((raw_seed - 1U) % 144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static_cast<unsigned int>(kMaxRandomSeed)) + 1; 145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return normalized_seed; 146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Returns the first valid random seed after 'seed'. The behavior is 149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// undefined if 'seed' is invalid. The seed after kMaxRandomSeed is 150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// considered to be 1. 151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int GetNextRandomSeed(int seed) { 152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed) 153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter << "Invalid random seed " << seed << " - must be in [1, " 154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter << kMaxRandomSeed << "]."; 155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const int next_seed = seed + 1; 156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return (next_seed > kMaxRandomSeed) ? 1 : next_seed; 157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This class saves the values of all Google Test flags in its c'tor, and 160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// restores them in its d'tor. 161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTestFlagSaver { 162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // The c'tor. 164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTestFlagSaver() { 165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests); 166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter break_on_failure_ = GTEST_FLAG(break_on_failure); 167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter catch_exceptions_ = GTEST_FLAG(catch_exceptions); 168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter color_ = GTEST_FLAG(color); 169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter death_test_style_ = GTEST_FLAG(death_test_style); 170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter death_test_use_fork_ = GTEST_FLAG(death_test_use_fork); 171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter filter_ = GTEST_FLAG(filter); 172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter internal_run_death_test_ = GTEST_FLAG(internal_run_death_test); 173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter list_tests_ = GTEST_FLAG(list_tests); 174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter output_ = GTEST_FLAG(output); 175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter print_time_ = GTEST_FLAG(print_time); 176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter random_seed_ = GTEST_FLAG(random_seed); 177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter repeat_ = GTEST_FLAG(repeat); 178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter shuffle_ = GTEST_FLAG(shuffle); 179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter stack_trace_depth_ = GTEST_FLAG(stack_trace_depth); 180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter stream_result_to_ = GTEST_FLAG(stream_result_to); 181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter throw_on_failure_ = GTEST_FLAG(throw_on_failure); 182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // The d'tor is not virtual. DO NOT INHERIT FROM THIS CLASS. 185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ~GTestFlagSaver() { 186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_; 187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_FLAG(break_on_failure) = break_on_failure_; 188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_FLAG(catch_exceptions) = catch_exceptions_; 189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_FLAG(color) = color_; 190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_FLAG(death_test_style) = death_test_style_; 191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_FLAG(death_test_use_fork) = death_test_use_fork_; 192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_FLAG(filter) = filter_; 193aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_FLAG(internal_run_death_test) = internal_run_death_test_; 194aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_FLAG(list_tests) = list_tests_; 195aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_FLAG(output) = output_; 196aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_FLAG(print_time) = print_time_; 197aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_FLAG(random_seed) = random_seed_; 198aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_FLAG(repeat) = repeat_; 199aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_FLAG(shuffle) = shuffle_; 200aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_FLAG(stack_trace_depth) = stack_trace_depth_; 201aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_FLAG(stream_result_to) = stream_result_to_; 202aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_FLAG(throw_on_failure) = throw_on_failure_; 203aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 204aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 205aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 206aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Fields for saving the original values of flags. 207aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool also_run_disabled_tests_; 208aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool break_on_failure_; 209aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool catch_exceptions_; 210aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter std::string color_; 211aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter std::string death_test_style_; 212aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool death_test_use_fork_; 213aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter std::string filter_; 214aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter std::string internal_run_death_test_; 215aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool list_tests_; 216aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter std::string output_; 217aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool print_time_; 218aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter internal::Int32 random_seed_; 219aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter internal::Int32 repeat_; 220aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool shuffle_; 221aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter internal::Int32 stack_trace_depth_; 222aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter std::string stream_result_to_; 223aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool throw_on_failure_; 224aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} GTEST_ATTRIBUTE_UNUSED_; 225aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 226aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Converts a Unicode code point to a narrow string in UTF-8 encoding. 227aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// code_point parameter is of type UInt32 because wchar_t may not be 228aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// wide enough to contain a code point. 229aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// If the code_point is not a valid Unicode code point 230aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted 231aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to "(Invalid Unicode 0xXXXXXXXX)". 232aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ std::string CodePointToUtf8(UInt32 code_point); 233aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 234aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Converts a wide string to a narrow string in UTF-8 encoding. 235aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The wide string is assumed to have the following encoding: 236aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS) 237aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// UTF-32 if sizeof(wchar_t) == 4 (on Linux) 238aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Parameter str points to a null-terminated wide string. 239aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Parameter num_chars may additionally limit the number 240aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// of wchar_t characters processed. -1 is used when the entire string 241aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// should be processed. 242aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// If the string contains code points that are not valid Unicode code points 243aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output 244aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding 245aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and contains invalid UTF-16 surrogate pairs, values in those pairs 246aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// will be encoded as individual Unicode characters from Basic Normal Plane. 247aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars); 248aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 249aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file 250aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// if the variable is present. If a file already exists at this location, this 251aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// function will write over it. If the variable is present, but the file cannot 252aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// be created, prints an error and exits. 253aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid WriteToShardStatusFileIfNeeded(); 254aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 255aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Checks whether sharding is enabled by examining the relevant 256aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// environment variable values. If the variables are present, 257aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// but inconsistent (e.g., shard_index >= total_shards), prints 258aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// an error and exits. If in_subprocess_for_death_test, sharding is 259aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// disabled because it must only be applied to the original test 260aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// process. Otherwise, we could filter out death tests we intended to execute. 261aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool ShouldShard(const char* total_shards_str, 262aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const char* shard_index_str, 263aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool in_subprocess_for_death_test); 264aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 265aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Parses the environment variable var as an Int32. If it is unset, 266aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// returns default_val. If it is not an Int32, prints an error and 267aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// and aborts. 268aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val); 269aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 270aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Given the total number of shards, the shard index, and the test id, 271aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// returns true iff the test should be run on this shard. The test id is 272aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// some arbitrary but unique non-negative integer assigned to each test 273aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// method. Assumes that 0 <= shard_index < total_shards. 274aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool ShouldRunTestOnShard( 275aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int total_shards, int shard_index, int test_id); 276aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 277aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// STL container utilities. 278aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 279aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Returns the number of elements in the given container that satisfy 280aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the given predicate. 281aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class Container, typename Predicate> 282aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline int CountIf(const Container& c, Predicate predicate) { 283aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Implemented as an explicit loop since std::count_if() in libCstd on 284aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Solaris has a non-standard signature. 285aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int count = 0; 286aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) { 287aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (predicate(*it)) 288aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ++count; 289aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 290aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return count; 291aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 292aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 293aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Applies a function/functor to each element in the container. 294aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <class Container, typename Functor> 295aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid ForEach(const Container& c, Functor functor) { 296aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter std::for_each(c.begin(), c.end(), functor); 297aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 298aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 299aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Returns the i-th element of the vector, or default_value if i is not 300aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// in range [0, v.size()). 301aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename E> 302aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline E GetElementOr(const std::vector<E>& v, int i, E default_value) { 303aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i]; 304aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 305aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 306aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Performs an in-place shuffle of a range of the vector's elements. 307aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 'begin' and 'end' are element indices as an STL-style range; 308aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// i.e. [begin, end) are shuffled, where 'end' == size() means to 309aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// shuffle to the end of the vector. 310aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename E> 311aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtervoid ShuffleRange(internal::Random* random, int begin, int end, 312aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter std::vector<E>* v) { 313aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const int size = static_cast<int>(v->size()); 314aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_(0 <= begin && begin <= size) 315aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter << "Invalid shuffle range start " << begin << ": must be in range [0, " 316aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter << size << "]."; 317aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_(begin <= end && end <= size) 318aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter << "Invalid shuffle range finish " << end << ": must be in range [" 319aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter << begin << ", " << size << "]."; 320aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 321aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Fisher-Yates shuffle, from 322aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle 323aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter for (int range_width = end - begin; range_width >= 2; range_width--) { 324aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const int last_in_range = begin + range_width - 1; 325aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const int selected = begin + random->Generate(range_width); 326aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter std::swap((*v)[selected], (*v)[last_in_range]); 327aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 328aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 329aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 330aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Performs an in-place shuffle of the vector's elements. 331aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename E> 332aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline void Shuffle(internal::Random* random, std::vector<E>* v) { 333aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ShuffleRange(random, 0, static_cast<int>(v->size()), v); 334aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 335aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 336aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A function for deleting an object. Handy for being used as a 337aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// functor. 338aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename T> 339aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstatic void Delete(T* x) { 340aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter delete x; 341aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 342aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 343aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A predicate that checks the key of a TestProperty against a known key. 344aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 345aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TestPropertyKeyIs is copyable. 346aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TestPropertyKeyIs { 347aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 348aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Constructor. 349aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // 350aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // TestPropertyKeyIs has NO default constructor. 351aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter explicit TestPropertyKeyIs(const std::string& key) : key_(key) {} 352aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 353aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns true iff the test name of test property matches on key_. 354aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool operator()(const TestProperty& test_property) const { 355aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return test_property.key() == key_; 356aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 357aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 358aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 359aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter std::string key_; 360aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 361aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 362aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Class UnitTestOptions. 363aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 364aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This class contains functions for processing options the user 365aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// specifies when running the tests. It has only static members. 366aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 367aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// In most cases, the user can specify an option using either an 368aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// environment variable or a command line flag. E.g. you can set the 369aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// test filter using either GTEST_FILTER or --gtest_filter. If both 370aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the variable and the flag are present, the latter overrides the 371aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// former. 372aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ UnitTestOptions { 373aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 374aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Functions for processing the gtest_output flag. 375aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 376aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns the output format, or "" for normal printed output. 377aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static std::string GetOutputFormat(); 378aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 379aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns the absolute path of the requested output file, or the 380aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // default (test_detail.xml in the original working directory) if 381aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // none was explicitly specified. 382aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static std::string GetAbsolutePathToOutputFile(); 383aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 384aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Functions for processing the gtest_filter flag. 385aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 386aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns true iff the wildcard pattern matches the string. The 387aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // first ':' or '\0' character in pattern marks the end of it. 388aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // 389aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // This recursive algorithm isn't very efficient, but is clear and 390aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // works well enough for matching test names, which are short. 391aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static bool PatternMatchesString(const char *pattern, const char *str); 392aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 393aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns true iff the user-specified filter matches the test case 394aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // name and the test name. 395aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static bool FilterMatchesTest(const std::string &test_case_name, 396aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const std::string &test_name); 397aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 398aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_OS_WINDOWS 399aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Function for supporting the gtest_catch_exception flag. 400aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 401aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the 402aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise. 403aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // This function is useful as an __except condition. 404aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static int GTestShouldProcessSEH(DWORD exception_code); 405aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_OS_WINDOWS 406aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 407aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns true if "name" matches the ':' separated list of glob-style 408aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // filters in "filter". 409aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static bool MatchesFilter(const std::string& name, const char* filter); 410aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 411aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 412aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Returns the current application's name, removing directory path if that 413aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// is present. Used by UnitTestOptions::GetOutputFile. 414aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ FilePath GetCurrentExecutableName(); 415aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 416aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The role interface for getting the OS stack trace as a string. 417aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass OsStackTraceGetterInterface { 418aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 419aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter OsStackTraceGetterInterface() {} 420aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual ~OsStackTraceGetterInterface() {} 421aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 422aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns the current OS stack trace as an std::string. Parameters: 423aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // 424aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // max_depth - the maximum number of stack frames to be included 425aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // in the trace. 426aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // skip_count - the number of top frames to be skipped; doesn't count 427aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // against max_depth. 428aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual string CurrentStackTrace(int max_depth, int skip_count) = 0; 429aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 430aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // UponLeavingGTest() should be called immediately before Google Test calls 431aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // user code. It saves some information about the current stack that 432aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // CurrentStackTrace() will use to find and hide Google Test stack frames. 433aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual void UponLeavingGTest() = 0; 434aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 435aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 436aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface); 437aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 438aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 439aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// A working implementation of the OsStackTraceGetterInterface interface. 440aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass OsStackTraceGetter : public OsStackTraceGetterInterface { 441aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 442aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter OsStackTraceGetter() : caller_frame_(NULL) {} 443aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 444aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual string CurrentStackTrace(int max_depth, int skip_count) 445aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_LOCK_EXCLUDED_(mutex_); 446aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 447aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual void UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_); 448aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 449aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // This string is inserted in place of stack frames that are part of 450aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Google Test's implementation. 451aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static const char* const kElidedFramesMarker; 452aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 453aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 454aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter Mutex mutex_; // protects all internal state 455aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 456aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // We save the stack frame below the frame that calls user code. 457aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // We do this because the address of the frame immediately below 458aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // the user code changes between the call to UponLeavingGTest() 459aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // and any calls to CurrentStackTrace() from within the user code. 460aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void* caller_frame_; 461aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 462aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter); 463aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 464aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 465aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Information about a Google Test trace point. 466aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterstruct TraceInfo { 467aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const char* file; 468aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int line; 469aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter std::string message; 470aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 471aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 472aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This is the default global test part result reporter used in UnitTestImpl. 473aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This class should only be used by UnitTestImpl. 474aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass DefaultGlobalTestPartResultReporter 475aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter : public TestPartResultReporterInterface { 476aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 477aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test); 478aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Implements the TestPartResultReporterInterface. Reports the test part 479aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // result in the current test. 480aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual void ReportTestPartResult(const TestPartResult& result); 481aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 482aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 483aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter UnitTestImpl* const unit_test_; 484aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 485aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter); 486aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 487aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 488aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This is the default per thread test part result reporter used in 489aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// UnitTestImpl. This class should only be used by UnitTestImpl. 490aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass DefaultPerThreadTestPartResultReporter 491aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter : public TestPartResultReporterInterface { 492aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 493aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test); 494aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Implements the TestPartResultReporterInterface. The implementation just 495aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // delegates to the current global test part result reporter of *unit_test_. 496aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual void ReportTestPartResult(const TestPartResult& result); 497aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 498aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 499aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter UnitTestImpl* const unit_test_; 500aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 501aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter); 502aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 503aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 504aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// The private implementation of the UnitTest class. We don't protect 505aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// the methods under a mutex, as this class is not accessible by a 506aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// user and the UnitTest class that delegates work to this class does 507aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// proper locking. 508aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass GTEST_API_ UnitTestImpl { 509aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 510aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter explicit UnitTestImpl(UnitTest* parent); 511aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual ~UnitTestImpl(); 512aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 513aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // There are two different ways to register your own TestPartResultReporter. 514aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // You can register your own repoter to listen either only for test results 515aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // from the current thread or for results from all threads. 516aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // By default, each per-thread test result repoter just passes a new 517aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // TestPartResult to the global test result reporter, which registers the 518aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // test part result for the currently running test. 519aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 520aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns the global test part result reporter. 521aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TestPartResultReporterInterface* GetGlobalTestPartResultReporter(); 522aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 523aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Sets the global test part result reporter. 524aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void SetGlobalTestPartResultReporter( 525aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TestPartResultReporterInterface* reporter); 526aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 527aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns the test part result reporter for the current thread. 528aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread(); 529aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 530aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Sets the test part result reporter for the current thread. 531aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void SetTestPartResultReporterForCurrentThread( 532aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TestPartResultReporterInterface* reporter); 533aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 534aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Gets the number of successful test cases. 535aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int successful_test_case_count() const; 536aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 537aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Gets the number of failed test cases. 538aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int failed_test_case_count() const; 539aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 540aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Gets the number of all test cases. 541aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int total_test_case_count() const; 542aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 543aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Gets the number of all test cases that contain at least one test 544aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // that should run. 545aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int test_case_to_run_count() const; 546aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 547aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Gets the number of successful tests. 548aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int successful_test_count() const; 549aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 550aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Gets the number of failed tests. 551aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int failed_test_count() const; 552aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 553aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Gets the number of disabled tests that will be reported in the XML report. 554aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int reportable_disabled_test_count() const; 555aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 556aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Gets the number of disabled tests. 557aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int disabled_test_count() const; 558aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 559aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Gets the number of tests to be printed in the XML report. 560aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int reportable_test_count() const; 561aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 562aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Gets the number of all tests. 563aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int total_test_count() const; 564aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 565aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Gets the number of tests that should run. 566aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int test_to_run_count() const; 567aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 568aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Gets the time of the test program start, in ms from the start of the 569aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // UNIX epoch. 570aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TimeInMillis start_timestamp() const { return start_timestamp_; } 571aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 572aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Gets the elapsed time, in milliseconds. 573aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TimeInMillis elapsed_time() const { return elapsed_time_; } 574aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 575aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns true iff the unit test passed (i.e. all test cases passed). 576aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool Passed() const { return !Failed(); } 577aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 578aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns true iff the unit test failed (i.e. some test case failed 579aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // or something outside of all tests failed). 580aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool Failed() const { 581aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed(); 582aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 583aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 584aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Gets the i-th test case among all the test cases. i can range from 0 to 585aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // total_test_case_count() - 1. If i is not in that range, returns NULL. 586aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const TestCase* GetTestCase(int i) const { 587aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const int index = GetElementOr(test_case_indices_, i, -1); 588aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return index < 0 ? NULL : test_cases_[i]; 589aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 590aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 591aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Gets the i-th test case among all the test cases. i can range from 0 to 592aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // total_test_case_count() - 1. If i is not in that range, returns NULL. 593aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TestCase* GetMutableTestCase(int i) { 594aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const int index = GetElementOr(test_case_indices_, i, -1); 595aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return index < 0 ? NULL : test_cases_[index]; 596aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 597aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 598aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Provides access to the event listener list. 599aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TestEventListeners* listeners() { return &listeners_; } 600aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 601aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns the TestResult for the test that's currently running, or 602aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // the TestResult for the ad hoc test if no test is running. 603aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TestResult* current_test_result(); 604aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 605aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns the TestResult for the ad hoc test. 606aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; } 607aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 608aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Sets the OS stack trace getter. 609aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // 610aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Does nothing if the input and the current OS stack trace getter 611aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // are the same; otherwise, deletes the old getter and makes the 612aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // input the current getter. 613aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter); 614aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 615aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns the current OS stack trace getter if it is not NULL; 616aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // otherwise, creates an OsStackTraceGetter, makes it the current 617aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // getter, and returns it. 618aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter OsStackTraceGetterInterface* os_stack_trace_getter(); 619aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 620aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns the current OS stack trace as an std::string. 621aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // 622aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // The maximum number of stack frames to be included is specified by 623aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // the gtest_stack_trace_depth flag. The skip_count parameter 624aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // specifies the number of top frames to be skipped, which doesn't 625aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // count against the number of frames to be included. 626aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // 627aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // For example, if Foo() calls Bar(), which in turn calls 628aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // CurrentOsStackTraceExceptTop(1), Foo() will be included in the 629aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // trace but Bar() and CurrentOsStackTraceExceptTop() won't. 630aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_; 631aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 632aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Finds and returns a TestCase with the given name. If one doesn't 633aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // exist, creates one and returns it. 634aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // 635aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Arguments: 636aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // 637aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // test_case_name: name of the test case 638aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // type_param: the name of the test's type parameter, or NULL if 639aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // this is not a typed or a type-parameterized test. 640aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // set_up_tc: pointer to the function that sets up the test case 641aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // tear_down_tc: pointer to the function that tears down the test case 642aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TestCase* GetTestCase(const char* test_case_name, 643aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const char* type_param, 644aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter Test::SetUpTestCaseFunc set_up_tc, 645aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter Test::TearDownTestCaseFunc tear_down_tc); 646aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 647aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Adds a TestInfo to the unit test. 648aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // 649aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Arguments: 650aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // 651aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // set_up_tc: pointer to the function that sets up the test case 652aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // tear_down_tc: pointer to the function that tears down the test case 653aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // test_info: the TestInfo object 654aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc, 655aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter Test::TearDownTestCaseFunc tear_down_tc, 656aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TestInfo* test_info) { 657aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // In order to support thread-safe death tests, we need to 658aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // remember the original working directory when the test program 659aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // was first invoked. We cannot do this in RUN_ALL_TESTS(), as 660aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // the user may have changed the current directory before calling 661aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // RUN_ALL_TESTS(). Therefore we capture the current directory in 662aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // AddTestInfo(), which is called to register a TEST or TEST_F 663aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // before main() is reached. 664aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (original_working_dir_.IsEmpty()) { 665aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter original_working_dir_.Set(FilePath::GetCurrentDir()); 666aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_(!original_working_dir_.IsEmpty()) 667aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter << "Failed to get the current working directory."; 668aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 669aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 670aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GetTestCase(test_info->test_case_name(), 671aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter test_info->type_param(), 672aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter set_up_tc, 673aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter tear_down_tc)->AddTestInfo(test_info); 674aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 675aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 676aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_PARAM_TEST 677aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns ParameterizedTestCaseRegistry object used to keep track of 678aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // value-parameterized tests and instantiate and register them. 679aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter internal::ParameterizedTestCaseRegistry& parameterized_test_registry() { 680aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return parameterized_test_registry_; 681aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 682aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_PARAM_TEST 683aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 684aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Sets the TestCase object for the test that's currently running. 685aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void set_current_test_case(TestCase* a_current_test_case) { 686aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter current_test_case_ = a_current_test_case; 687aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 688aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 689aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Sets the TestInfo object for the test that's currently running. If 690aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // current_test_info is NULL, the assertion results will be stored in 691aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // ad_hoc_test_result_. 692aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void set_current_test_info(TestInfo* a_current_test_info) { 693aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter current_test_info_ = a_current_test_info; 694aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 695aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 696aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Registers all parameterized tests defined using TEST_P and 697aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter 698aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // combination. This method can be called more then once; it has guards 699aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // protecting from registering the tests more then once. If 700aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // value-parameterized tests are disabled, RegisterParameterizedTests is 701aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // present but does nothing. 702aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void RegisterParameterizedTests(); 703aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 704aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Runs all tests in this UnitTest object, prints the result, and 705aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // returns true if all tests are successful. If any exception is 706aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // thrown during a test, this test is considered to be failed, but 707aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // the rest of the tests will still be run. 708aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool RunAllTests(); 709aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 710aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Clears the results of all tests, except the ad hoc tests. 711aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void ClearNonAdHocTestResult() { 712aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ForEach(test_cases_, TestCase::ClearTestCaseResult); 713aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 714aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 715aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Clears the results of ad-hoc test assertions. 716aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void ClearAdHocTestResult() { 717aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter ad_hoc_test_result_.Clear(); 718aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 719aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 720aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Adds a TestProperty to the current TestResult object when invoked in a 721aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // context of a test or a test case, or to the global property set. If the 722aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // result already contains a property with the same key, the value will be 723aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // updated. 724aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void RecordProperty(const TestProperty& test_property); 725aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 726aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter enum ReactionToSharding { 727aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter HONOR_SHARDING_PROTOCOL, 728aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter IGNORE_SHARDING_PROTOCOL 729aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter }; 730aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 731aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Matches the full name of each test against the user-specified 732aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // filter to decide whether the test should run, then records the 733aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // result in each TestCase and TestInfo object. 734aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests 735aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // based on sharding variables in the environment. 736aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns the number of tests that should run. 737aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int FilterTests(ReactionToSharding shard_tests); 738aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 739aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Prints the names of the tests matching the user-specified filter flag. 740aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void ListTestsMatchingFilter(); 741aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 742aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const TestCase* current_test_case() const { return current_test_case_; } 743aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TestInfo* current_test_info() { return current_test_info_; } 744aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const TestInfo* current_test_info() const { return current_test_info_; } 745aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 746aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns the vector of environments that need to be set-up/torn-down 747aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // before/after the tests are run. 748aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter std::vector<Environment*>& environments() { return environments_; } 749aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 750aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Getters for the per-thread Google Test trace stack. 751aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter std::vector<TraceInfo>& gtest_trace_stack() { 752aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return *(gtest_trace_stack_.pointer()); 753aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 754aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const std::vector<TraceInfo>& gtest_trace_stack() const { 755aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return gtest_trace_stack_.get(); 756aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 757aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 758aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_DEATH_TEST 759aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void InitDeathTestSubprocessControlInfo() { 760aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag()); 761aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 762aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns a pointer to the parsed --gtest_internal_run_death_test 763aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // flag, or NULL if that flag was not specified. 764aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // This information is useful only in a death test child process. 765aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Must not be called before a call to InitGoogleTest. 766aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const InternalRunDeathTestFlag* internal_run_death_test_flag() const { 767aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return internal_run_death_test_flag_.get(); 768aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 769aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 770aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns a pointer to the current death test factory. 771aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter internal::DeathTestFactory* death_test_factory() { 772aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return death_test_factory_.get(); 773aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 774aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 775aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void SuppressTestEventsIfInSubprocess(); 776aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 777aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter friend class ReplaceDeathTestFactory; 778aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_DEATH_TEST 779aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 780aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Initializes the event listener performing XML output as specified by 781aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // UnitTestOptions. Must not be called before InitGoogleTest. 782aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void ConfigureXmlOutput(); 783aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 784aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_CAN_STREAM_RESULTS_ 785aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Initializes the event listener for streaming test results to a socket. 786aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Must not be called before InitGoogleTest. 787aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void ConfigureStreamingOutput(); 788aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif 789aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 790aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Performs initialization dependent upon flag values obtained in 791aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to 792aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest 793aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // this function is also called from RunAllTests. Since this function can be 794aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // called more than once, it has to be idempotent. 795aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void PostFlagParsingInit(); 796aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 797aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Gets the random seed used at the start of the current test iteration. 798aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int random_seed() const { return random_seed_; } 799aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 800aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Gets the random number generator. 801aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter internal::Random* random() { return &random_; } 802aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 803aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Shuffles all test cases, and the tests within each test case, 804aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // making sure that death tests are still run first. 805aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void ShuffleTests(); 806aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 807aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Restores the test cases and tests to their order before the first shuffle. 808aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void UnshuffleTests(); 809aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 810aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Returns the value of GTEST_FLAG(catch_exceptions) at the moment 811aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // UnitTest::Run() starts. 812aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool catch_exceptions() const { return catch_exceptions_; } 813aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 814aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 815aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter friend class ::testing::UnitTest; 816aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 817aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Used by UnitTest::Run() to capture the state of 818aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // GTEST_FLAG(catch_exceptions) at the moment it starts. 819aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void set_catch_exceptions(bool value) { catch_exceptions_ = value; } 820aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 821aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // The UnitTest object that owns this implementation object. 822aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter UnitTest* const parent_; 823aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 824aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // The working directory when the first TEST() or TEST_F() was 825aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // executed. 826aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter internal::FilePath original_working_dir_; 827aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 828aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // The default test part result reporters. 829aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_; 830aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter DefaultPerThreadTestPartResultReporter 831aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter default_per_thread_test_part_result_reporter_; 832aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 833aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Points to (but doesn't own) the global test part result reporter. 834aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TestPartResultReporterInterface* global_test_part_result_repoter_; 835aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 836aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Protects read and write access to global_test_part_result_reporter_. 837aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter internal::Mutex global_test_part_result_reporter_mutex_; 838aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 839aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Points to (but doesn't own) the per-thread test part result reporter. 840aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter internal::ThreadLocal<TestPartResultReporterInterface*> 841aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter per_thread_test_part_result_reporter_; 842aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 843aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // The vector of environments that need to be set-up/torn-down 844aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // before/after the tests are run. 845aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter std::vector<Environment*> environments_; 846aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 847aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // The vector of TestCases in their original order. It owns the 848aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // elements in the vector. 849aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter std::vector<TestCase*> test_cases_; 850aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 851aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Provides a level of indirection for the test case list to allow 852aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // easy shuffling and restoring the test case order. The i-th 853aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // element of this vector is the index of the i-th test case in the 854aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // shuffled order. 855aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter std::vector<int> test_case_indices_; 856aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 857aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_PARAM_TEST 858aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // ParameterizedTestRegistry object used to register value-parameterized 859aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // tests. 860aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter internal::ParameterizedTestCaseRegistry parameterized_test_registry_; 861aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 862aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Indicates whether RegisterParameterizedTests() has been called already. 863aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool parameterized_tests_registered_; 864aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_PARAM_TEST 865aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 866aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Index of the last death test case registered. Initially -1. 867aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int last_death_test_case_; 868aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 869aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // This points to the TestCase for the currently running test. It 870aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // changes as Google Test goes through one test case after another. 871aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // When no test is running, this is set to NULL and Google Test 872aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // stores assertion results in ad_hoc_test_result_. Initially NULL. 873aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TestCase* current_test_case_; 874aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 875aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // This points to the TestInfo for the currently running test. It 876aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // changes as Google Test goes through one test after another. When 877aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // no test is running, this is set to NULL and Google Test stores 878aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // assertion results in ad_hoc_test_result_. Initially NULL. 879aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TestInfo* current_test_info_; 880aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 881aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Normally, a user only writes assertions inside a TEST or TEST_F, 882aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // or inside a function called by a TEST or TEST_F. Since Google 883aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Test keeps track of which test is current running, it can 884aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // associate such an assertion with the test it belongs to. 885aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // 886aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // If an assertion is encountered when no TEST or TEST_F is running, 887aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Google Test attributes the assertion result to an imaginary "ad hoc" 888aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // test, and records the result in ad_hoc_test_result_. 889aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TestResult ad_hoc_test_result_; 890aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 891aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // The list of event listeners that can be used to track events inside 892aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Google Test. 893aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TestEventListeners listeners_; 894aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 895aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // The OS stack trace getter. Will be deleted when the UnitTest 896aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // object is destructed. By default, an OsStackTraceGetter is used, 897aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // but the user can set this field to use a custom getter if that is 898aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // desired. 899aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter OsStackTraceGetterInterface* os_stack_trace_getter_; 900aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 901aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // True iff PostFlagParsingInit() has been called. 902aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool post_flag_parse_init_performed_; 903aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 904aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // The random number seed used at the beginning of the test run. 905aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int random_seed_; 906aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 907aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Our random number generator. 908aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter internal::Random random_; 909aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 910aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // The time of the test program start, in ms from the start of the 911aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // UNIX epoch. 912aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TimeInMillis start_timestamp_; 913aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 914aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // How long the test took to run, in milliseconds. 915aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter TimeInMillis elapsed_time_; 916aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 917aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_DEATH_TEST 918aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // The decomposed components of the gtest_internal_run_death_test flag, 919aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // parsed when RUN_ALL_TESTS is called. 920aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_; 921aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_; 922aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_DEATH_TEST 923aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 924aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // A per-thread stack of traces created by the SCOPED_TRACE() macro. 925aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_; 926aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 927aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests() 928aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // starts. 929aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool catch_exceptions_; 930aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 931aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl); 932aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; // class UnitTestImpl 933aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 934aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Convenience function for accessing the global UnitTest 935aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// implementation object. 936aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterinline UnitTestImpl* GetUnitTestImpl() { 937aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return UnitTest::GetInstance()->impl(); 938aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 939aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 940aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_USES_SIMPLE_RE 941aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 942aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Internal helper functions for implementing the simple regular 943aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// expression matcher. 944aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool IsInSet(char ch, const char* str); 945aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool IsAsciiDigit(char ch); 946aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool IsAsciiPunct(char ch); 947aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool IsRepeat(char ch); 948aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool IsAsciiWhiteSpace(char ch); 949aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool IsAsciiWordChar(char ch); 950aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool IsValidEscape(char ch); 951aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch); 952aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool ValidateRegex(const char* regex); 953aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str); 954aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool MatchRepetitionAndRegexAtHead( 955aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter bool escaped, char ch, char repeat, const char* regex, const char* str); 956aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str); 957aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 958aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_USES_SIMPLE_RE 959aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 960aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Parses the command line for Google Test flags, without initializing 961aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// other parts of Google Test. 962aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv); 963aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv); 964aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 965aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_HAS_DEATH_TEST 966aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 967aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Returns the message describing the last system error, regardless of the 968aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// platform. 969aa46da279e2426caf1e103eb079dfec8124c5feeCourtney GoeltzenleuchterGTEST_API_ std::string GetLastErrnoDescription(); 970aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 971aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Attempts to parse a string into a positive integer pointed to by the 972aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// number parameter. Returns true if that is possible. 973aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use 974aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// it here. 975aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchtertemplate <typename Integer> 976aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterbool ParseNaturalNumber(const ::std::string& str, Integer* number) { 977aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Fail fast if the given string does not begin with a digit; 978aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // this bypasses strtoXXX's "optional leading whitespace and plus 979aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // or minus sign" semantics, which are undesirable here. 980aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (str.empty() || !IsDigit(str[0])) { 981aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return false; 982aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 983aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter errno = 0; 984aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 985aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter char* end; 986aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // BiggestConvertible is the largest integer type that system-provided 987aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // string-to-number conversion routines can return. 988aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 989aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# if GTEST_OS_WINDOWS && !defined(__GNUC__) 990aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 991aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // MSVC and C++ Builder define __int64 instead of the standard long long. 992aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter typedef unsigned __int64 BiggestConvertible; 993aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10); 994aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 995aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# else 996aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 997aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter typedef unsigned long long BiggestConvertible; // NOLINT 998aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10); 999aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1000aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter# endif // GTEST_OS_WINDOWS && !defined(__GNUC__) 1001aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1002aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const bool parse_success = *end == '\0' && errno == 0; 1003aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1004aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // TODO(vladl@google.com): Convert this to compile time assertion when it is 1005aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // available. 1006aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed)); 1007aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1008aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const Integer result = static_cast<Integer>(parsed); 1009aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (parse_success && static_cast<BiggestConvertible>(result) == parsed) { 1010aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter *number = result; 1011aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return true; 1012aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1013aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return false; 1014aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} 1015aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_HAS_DEATH_TEST 1016aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1017aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// TestResult contains some private methods that should be hidden from 1018aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Google Test user but are required for testing. This class allow our tests 1019aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// to access them. 1020aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// 1021aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// This class is supplied only for the purpose of testing Google Test's own 1022aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// constructs. Do not use it in user tests, either directly or indirectly. 1023aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass TestResultAccessor { 1024aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 1025aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static void RecordProperty(TestResult* test_result, 1026aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const std::string& xml_element, 1027aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const TestProperty& property) { 1028aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter test_result->RecordProperty(xml_element, property); 1029aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1030aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1031aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static void ClearTestPartResults(TestResult* test_result) { 1032aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter test_result->ClearTestPartResults(); 1033aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1034aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1035aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static const std::vector<testing::TestPartResult>& test_part_results( 1036aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const TestResult& test_result) { 1037aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter return test_result.test_part_results(); 1038aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1039aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; 1040aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1041aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#if GTEST_CAN_STREAM_RESULTS_ 1042aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1043aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter// Streams test results to the given port on the given host machine. 1044aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchterclass StreamingListener : public EmptyTestEventListener { 1045aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 1046aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Abstract base class for writing strings to a socket. 1047aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter class AbstractSocketWriter { 1048aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 1049aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual ~AbstractSocketWriter() {} 1050aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1051aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Sends a string to the socket. 1052aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual void Send(const string& message) = 0; 1053aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1054aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Closes the socket. 1055aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual void CloseConnection() {} 1056aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1057aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Sends a string and a newline to the socket. 1058aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void SendLn(const string& message) { 1059aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter Send(message + "\n"); 1060aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1061aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter }; 1062aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1063aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Concrete class for actually writing strings to a socket. 1064aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter class SocketWriter : public AbstractSocketWriter { 1065aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter public: 1066aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter SocketWriter(const string& host, const string& port) 1067aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter : sockfd_(-1), host_name_(host), port_num_(port) { 1068aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter MakeConnection(); 1069aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1070aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1071aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual ~SocketWriter() { 1072aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (sockfd_ != -1) 1073aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter CloseConnection(); 1074aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1075aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1076aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Sends a string to the socket. 1077aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter virtual void Send(const string& message) { 1078aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_(sockfd_ != -1) 1079aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter << "Send() can be called only when there is a connection."; 1080aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1081aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const int len = static_cast<int>(message.length()); 1082aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (write(sockfd_, message.c_str(), len) != len) { 1083aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_LOG_(WARNING) 1084aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter << "stream_result_to: failed to stream to " 1085aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter << host_name_ << ":" << port_num_; 1086aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1087aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1088aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1089aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 1090aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Creates a client socket and connects to the server. 1091aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void MakeConnection(); 1092aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1093aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Closes the socket. 1094aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void CloseConnection() { 1095aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_CHECK_(sockfd_ != -1) 1096aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter << "CloseConnection() can be called only when there is a connection."; 1097aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1098aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter close(sockfd_); 1099aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter sockfd_ = -1; 1100aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1101aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1102aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter int sockfd_; // socket file descriptor 1103aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const string host_name_; 1104aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const string port_num_; 1105aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1106aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter); 1107aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter }; // class SocketWriter 1108aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1109aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Escapes '=', '&', '%', and '\n' characters in str as "%xx". 1110aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter static string UrlEncode(const char* str); 1111aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1112aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter StreamingListener(const string& host, const string& port) 1113aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter : socket_writer_(new SocketWriter(host, port)) { Start(); } 1114aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1115aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter explicit StreamingListener(AbstractSocketWriter* socket_writer) 1116aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter : socket_writer_(socket_writer) { Start(); } 1117aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1118aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void OnTestProgramStart(const UnitTest& /* unit_test */) { 1119aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter SendLn("event=TestProgramStart"); 1120aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1121aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1122aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void OnTestProgramEnd(const UnitTest& unit_test) { 1123aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Note that Google Test current only report elapsed time for each 1124aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // test iteration, not for the entire test program. 1125aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed())); 1126aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1127aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Notify the streaming server to stop. 1128aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter socket_writer_->CloseConnection(); 1129aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1130aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1131aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) { 1132aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter SendLn("event=TestIterationStart&iteration=" + 1133aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter StreamableToString(iteration)); 1134aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1135aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1136aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) { 1137aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter SendLn("event=TestIterationEnd&passed=" + 1138aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter FormatBool(unit_test.Passed()) + "&elapsed_time=" + 1139aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter StreamableToString(unit_test.elapsed_time()) + "ms"); 1140aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1141aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1142aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void OnTestCaseStart(const TestCase& test_case) { 1143aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter SendLn(std::string("event=TestCaseStart&name=") + test_case.name()); 1144aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1145aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1146aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void OnTestCaseEnd(const TestCase& test_case) { 1147aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed()) 1148aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter + "&elapsed_time=" + StreamableToString(test_case.elapsed_time()) 1149aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter + "ms"); 1150aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1151aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1152aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void OnTestStart(const TestInfo& test_info) { 1153aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter SendLn(std::string("event=TestStart&name=") + test_info.name()); 1154aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1155aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1156aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void OnTestEnd(const TestInfo& test_info) { 1157aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter SendLn("event=TestEnd&passed=" + 1158aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter FormatBool((test_info.result())->Passed()) + 1159aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter "&elapsed_time=" + 1160aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter StreamableToString((test_info.result())->elapsed_time()) + "ms"); 1161aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1162aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1163aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void OnTestPartResult(const TestPartResult& test_part_result) { 1164aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const char* file_name = test_part_result.file_name(); 1165aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter if (file_name == NULL) 1166aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter file_name = ""; 1167aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter SendLn("event=TestPartResult&file=" + UrlEncode(file_name) + 1168aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter "&line=" + StreamableToString(test_part_result.line_number()) + 1169aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter "&message=" + UrlEncode(test_part_result.message())); 1170aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter } 1171aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1172aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter private: 1173aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Sends the given message and a newline to the socket. 1174aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void SendLn(const string& message) { socket_writer_->SendLn(message); } 1175aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1176aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // Called at the start of streaming to notify the receiver what 1177aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter // protocol we are using. 1178aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter void Start() { SendLn("gtest_streaming_protocol_version=1.0"); } 1179aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1180aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter string FormatBool(bool value) { return value ? "1" : "0"; } 1181aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1182aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter const scoped_ptr<AbstractSocketWriter> socket_writer_; 1183aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1184aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener); 1185aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter}; // class StreamingListener 1186aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1187aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_CAN_STREAM_RESULTS_ 1188aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1189aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} // namespace internal 1190aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter} // namespace testing 1191aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter 1192aa46da279e2426caf1e103eb079dfec8124c5feeCourtney Goeltzenleuchter#endif // GTEST_SRC_GTEST_INTERNAL_INL_H_ 1193