113481Sgiacomo.travaglini@arm.com// Copyright 2005, Google Inc. 213481Sgiacomo.travaglini@arm.com// All rights reserved. 313481Sgiacomo.travaglini@arm.com// 413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without 513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are 613481Sgiacomo.travaglini@arm.com// met: 713481Sgiacomo.travaglini@arm.com// 813481Sgiacomo.travaglini@arm.com// * Redistributions of source code must retain the above copyright 913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer. 1013481Sgiacomo.travaglini@arm.com// * Redistributions in binary form must reproduce the above 1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer 1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the 1313481Sgiacomo.travaglini@arm.com// distribution. 1413481Sgiacomo.travaglini@arm.com// * Neither the name of Google Inc. nor the names of its 1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from 1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission. 1713481Sgiacomo.travaglini@arm.com// 1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2913481Sgiacomo.travaglini@arm.com 3013481Sgiacomo.travaglini@arm.com// Utility functions and classes used by the Google C++ testing framework. 3113481Sgiacomo.travaglini@arm.com// 3213481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan) 3313481Sgiacomo.travaglini@arm.com// 3413481Sgiacomo.travaglini@arm.com// This file contains purely Google Test's internal implementation. Please 3513481Sgiacomo.travaglini@arm.com// DO NOT #INCLUDE IT IN A USER PROGRAM. 3613481Sgiacomo.travaglini@arm.com 3713481Sgiacomo.travaglini@arm.com#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_ 3813481Sgiacomo.travaglini@arm.com#define GTEST_SRC_GTEST_INTERNAL_INL_H_ 3913481Sgiacomo.travaglini@arm.com 4013481Sgiacomo.travaglini@arm.com// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is 4113481Sgiacomo.travaglini@arm.com// part of Google Test's implementation; otherwise it's undefined. 4213481Sgiacomo.travaglini@arm.com#if !GTEST_IMPLEMENTATION_ 4313481Sgiacomo.travaglini@arm.com// If this file is included from the user's code, just say no. 4413481Sgiacomo.travaglini@arm.com# error "gtest-internal-inl.h is part of Google Test's internal implementation." 4513481Sgiacomo.travaglini@arm.com# error "It must not be included except by Google Test itself." 4613481Sgiacomo.travaglini@arm.com#endif // GTEST_IMPLEMENTATION_ 4713481Sgiacomo.travaglini@arm.com 4813481Sgiacomo.travaglini@arm.com#ifndef _WIN32_WCE 4913481Sgiacomo.travaglini@arm.com# include <errno.h> 5013481Sgiacomo.travaglini@arm.com#endif // !_WIN32_WCE 5113481Sgiacomo.travaglini@arm.com#include <stddef.h> 5213481Sgiacomo.travaglini@arm.com#include <stdlib.h> // For strtoll/_strtoul64/malloc/free. 5313481Sgiacomo.travaglini@arm.com#include <string.h> // For memmove. 5413481Sgiacomo.travaglini@arm.com 5513481Sgiacomo.travaglini@arm.com#include <algorithm> 5613481Sgiacomo.travaglini@arm.com#include <string> 5713481Sgiacomo.travaglini@arm.com#include <vector> 5813481Sgiacomo.travaglini@arm.com 5913481Sgiacomo.travaglini@arm.com#include "gtest/internal/gtest-port.h" 6013481Sgiacomo.travaglini@arm.com 6113481Sgiacomo.travaglini@arm.com#if GTEST_CAN_STREAM_RESULTS_ 6213481Sgiacomo.travaglini@arm.com# include <arpa/inet.h> // NOLINT 6313481Sgiacomo.travaglini@arm.com# include <netdb.h> // NOLINT 6413481Sgiacomo.travaglini@arm.com#endif 6513481Sgiacomo.travaglini@arm.com 6613481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS 6713481Sgiacomo.travaglini@arm.com# include <windows.h> // NOLINT 6813481Sgiacomo.travaglini@arm.com#endif // GTEST_OS_WINDOWS 6913481Sgiacomo.travaglini@arm.com 7013481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h" // NOLINT 7113481Sgiacomo.travaglini@arm.com#include "gtest/gtest-spi.h" 7213481Sgiacomo.travaglini@arm.com 7313481Sgiacomo.travaglini@arm.comnamespace testing { 7413481Sgiacomo.travaglini@arm.com 7513481Sgiacomo.travaglini@arm.com// Declares the flags. 7613481Sgiacomo.travaglini@arm.com// 7713481Sgiacomo.travaglini@arm.com// We don't want the users to modify this flag in the code, but want 7813481Sgiacomo.travaglini@arm.com// Google Test's own unit tests to be able to access it. Therefore we 7913481Sgiacomo.travaglini@arm.com// declare it here as opposed to in gtest.h. 8013481Sgiacomo.travaglini@arm.comGTEST_DECLARE_bool_(death_test_use_fork); 8113481Sgiacomo.travaglini@arm.com 8213481Sgiacomo.travaglini@arm.comnamespace internal { 8313481Sgiacomo.travaglini@arm.com 8413481Sgiacomo.travaglini@arm.com// The value of GetTestTypeId() as seen from within the Google Test 8513481Sgiacomo.travaglini@arm.com// library. This is solely for testing GetTestTypeId(). 8613481Sgiacomo.travaglini@arm.comGTEST_API_ extern const TypeId kTestTypeIdInGoogleTest; 8713481Sgiacomo.travaglini@arm.com 8813481Sgiacomo.travaglini@arm.com// Names of the flags (needed for parsing Google Test flags). 8913481Sgiacomo.travaglini@arm.comconst char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests"; 9013481Sgiacomo.travaglini@arm.comconst char kBreakOnFailureFlag[] = "break_on_failure"; 9113481Sgiacomo.travaglini@arm.comconst char kCatchExceptionsFlag[] = "catch_exceptions"; 9213481Sgiacomo.travaglini@arm.comconst char kColorFlag[] = "color"; 9313481Sgiacomo.travaglini@arm.comconst char kFilterFlag[] = "filter"; 9413481Sgiacomo.travaglini@arm.comconst char kListTestsFlag[] = "list_tests"; 9513481Sgiacomo.travaglini@arm.comconst char kOutputFlag[] = "output"; 9613481Sgiacomo.travaglini@arm.comconst char kPrintTimeFlag[] = "print_time"; 9713481Sgiacomo.travaglini@arm.comconst char kRandomSeedFlag[] = "random_seed"; 9813481Sgiacomo.travaglini@arm.comconst char kRepeatFlag[] = "repeat"; 9913481Sgiacomo.travaglini@arm.comconst char kShuffleFlag[] = "shuffle"; 10013481Sgiacomo.travaglini@arm.comconst char kStackTraceDepthFlag[] = "stack_trace_depth"; 10113481Sgiacomo.travaglini@arm.comconst char kStreamResultToFlag[] = "stream_result_to"; 10213481Sgiacomo.travaglini@arm.comconst char kThrowOnFailureFlag[] = "throw_on_failure"; 10313481Sgiacomo.travaglini@arm.comconst char kFlagfileFlag[] = "flagfile"; 10413481Sgiacomo.travaglini@arm.com 10513481Sgiacomo.travaglini@arm.com// A valid random seed must be in [1, kMaxRandomSeed]. 10613481Sgiacomo.travaglini@arm.comconst int kMaxRandomSeed = 99999; 10713481Sgiacomo.travaglini@arm.com 10813481Sgiacomo.travaglini@arm.com// g_help_flag is true iff the --help flag or an equivalent form is 10913481Sgiacomo.travaglini@arm.com// specified on the command line. 11013481Sgiacomo.travaglini@arm.comGTEST_API_ extern bool g_help_flag; 11113481Sgiacomo.travaglini@arm.com 11213481Sgiacomo.travaglini@arm.com// Returns the current time in milliseconds. 11313481Sgiacomo.travaglini@arm.comGTEST_API_ TimeInMillis GetTimeInMillis(); 11413481Sgiacomo.travaglini@arm.com 11513481Sgiacomo.travaglini@arm.com// Returns true iff Google Test should use colors in the output. 11613481Sgiacomo.travaglini@arm.comGTEST_API_ bool ShouldUseColor(bool stdout_is_tty); 11713481Sgiacomo.travaglini@arm.com 11813481Sgiacomo.travaglini@arm.com// Formats the given time in milliseconds as seconds. 11913481Sgiacomo.travaglini@arm.comGTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms); 12013481Sgiacomo.travaglini@arm.com 12113481Sgiacomo.travaglini@arm.com// Converts the given time in milliseconds to a date string in the ISO 8601 12213481Sgiacomo.travaglini@arm.com// format, without the timezone information. N.B.: due to the use the 12313481Sgiacomo.travaglini@arm.com// non-reentrant localtime() function, this function is not thread safe. Do 12413481Sgiacomo.travaglini@arm.com// not use it in any code that can be called from multiple threads. 12513481Sgiacomo.travaglini@arm.comGTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms); 12613481Sgiacomo.travaglini@arm.com 12713481Sgiacomo.travaglini@arm.com// Parses a string for an Int32 flag, in the form of "--flag=value". 12813481Sgiacomo.travaglini@arm.com// 12913481Sgiacomo.travaglini@arm.com// On success, stores the value of the flag in *value, and returns 13013481Sgiacomo.travaglini@arm.com// true. On failure, returns false without changing *value. 13113481Sgiacomo.travaglini@arm.comGTEST_API_ bool ParseInt32Flag( 13213481Sgiacomo.travaglini@arm.com const char* str, const char* flag, Int32* value); 13313481Sgiacomo.travaglini@arm.com 13413481Sgiacomo.travaglini@arm.com// Returns a random seed in range [1, kMaxRandomSeed] based on the 13513481Sgiacomo.travaglini@arm.com// given --gtest_random_seed flag value. 13613481Sgiacomo.travaglini@arm.cominline int GetRandomSeedFromFlag(Int32 random_seed_flag) { 13713481Sgiacomo.travaglini@arm.com const unsigned int raw_seed = (random_seed_flag == 0) ? 13813481Sgiacomo.travaglini@arm.com static_cast<unsigned int>(GetTimeInMillis()) : 13913481Sgiacomo.travaglini@arm.com static_cast<unsigned int>(random_seed_flag); 14013481Sgiacomo.travaglini@arm.com 14113481Sgiacomo.travaglini@arm.com // Normalizes the actual seed to range [1, kMaxRandomSeed] such that 14213481Sgiacomo.travaglini@arm.com // it's easy to type. 14313481Sgiacomo.travaglini@arm.com const int normalized_seed = 14413481Sgiacomo.travaglini@arm.com static_cast<int>((raw_seed - 1U) % 14513481Sgiacomo.travaglini@arm.com static_cast<unsigned int>(kMaxRandomSeed)) + 1; 14613481Sgiacomo.travaglini@arm.com return normalized_seed; 14713481Sgiacomo.travaglini@arm.com} 14813481Sgiacomo.travaglini@arm.com 14913481Sgiacomo.travaglini@arm.com// Returns the first valid random seed after 'seed'. The behavior is 15013481Sgiacomo.travaglini@arm.com// undefined if 'seed' is invalid. The seed after kMaxRandomSeed is 15113481Sgiacomo.travaglini@arm.com// considered to be 1. 15213481Sgiacomo.travaglini@arm.cominline int GetNextRandomSeed(int seed) { 15313481Sgiacomo.travaglini@arm.com GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed) 15413481Sgiacomo.travaglini@arm.com << "Invalid random seed " << seed << " - must be in [1, " 15513481Sgiacomo.travaglini@arm.com << kMaxRandomSeed << "]."; 15613481Sgiacomo.travaglini@arm.com const int next_seed = seed + 1; 15713481Sgiacomo.travaglini@arm.com return (next_seed > kMaxRandomSeed) ? 1 : next_seed; 15813481Sgiacomo.travaglini@arm.com} 15913481Sgiacomo.travaglini@arm.com 16013481Sgiacomo.travaglini@arm.com// This class saves the values of all Google Test flags in its c'tor, and 16113481Sgiacomo.travaglini@arm.com// restores them in its d'tor. 16213481Sgiacomo.travaglini@arm.comclass GTestFlagSaver { 16313481Sgiacomo.travaglini@arm.com public: 16413481Sgiacomo.travaglini@arm.com // The c'tor. 16513481Sgiacomo.travaglini@arm.com GTestFlagSaver() { 16613481Sgiacomo.travaglini@arm.com also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests); 16713481Sgiacomo.travaglini@arm.com break_on_failure_ = GTEST_FLAG(break_on_failure); 16813481Sgiacomo.travaglini@arm.com catch_exceptions_ = GTEST_FLAG(catch_exceptions); 16913481Sgiacomo.travaglini@arm.com color_ = GTEST_FLAG(color); 17013481Sgiacomo.travaglini@arm.com death_test_style_ = GTEST_FLAG(death_test_style); 17113481Sgiacomo.travaglini@arm.com death_test_use_fork_ = GTEST_FLAG(death_test_use_fork); 17213481Sgiacomo.travaglini@arm.com filter_ = GTEST_FLAG(filter); 17313481Sgiacomo.travaglini@arm.com internal_run_death_test_ = GTEST_FLAG(internal_run_death_test); 17413481Sgiacomo.travaglini@arm.com list_tests_ = GTEST_FLAG(list_tests); 17513481Sgiacomo.travaglini@arm.com output_ = GTEST_FLAG(output); 17613481Sgiacomo.travaglini@arm.com print_time_ = GTEST_FLAG(print_time); 17713481Sgiacomo.travaglini@arm.com random_seed_ = GTEST_FLAG(random_seed); 17813481Sgiacomo.travaglini@arm.com repeat_ = GTEST_FLAG(repeat); 17913481Sgiacomo.travaglini@arm.com shuffle_ = GTEST_FLAG(shuffle); 18013481Sgiacomo.travaglini@arm.com stack_trace_depth_ = GTEST_FLAG(stack_trace_depth); 18113481Sgiacomo.travaglini@arm.com stream_result_to_ = GTEST_FLAG(stream_result_to); 18213481Sgiacomo.travaglini@arm.com throw_on_failure_ = GTEST_FLAG(throw_on_failure); 18313481Sgiacomo.travaglini@arm.com } 18413481Sgiacomo.travaglini@arm.com 18513481Sgiacomo.travaglini@arm.com // The d'tor is not virtual. DO NOT INHERIT FROM THIS CLASS. 18613481Sgiacomo.travaglini@arm.com ~GTestFlagSaver() { 18713481Sgiacomo.travaglini@arm.com GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_; 18813481Sgiacomo.travaglini@arm.com GTEST_FLAG(break_on_failure) = break_on_failure_; 18913481Sgiacomo.travaglini@arm.com GTEST_FLAG(catch_exceptions) = catch_exceptions_; 19013481Sgiacomo.travaglini@arm.com GTEST_FLAG(color) = color_; 19113481Sgiacomo.travaglini@arm.com GTEST_FLAG(death_test_style) = death_test_style_; 19213481Sgiacomo.travaglini@arm.com GTEST_FLAG(death_test_use_fork) = death_test_use_fork_; 19313481Sgiacomo.travaglini@arm.com GTEST_FLAG(filter) = filter_; 19413481Sgiacomo.travaglini@arm.com GTEST_FLAG(internal_run_death_test) = internal_run_death_test_; 19513481Sgiacomo.travaglini@arm.com GTEST_FLAG(list_tests) = list_tests_; 19613481Sgiacomo.travaglini@arm.com GTEST_FLAG(output) = output_; 19713481Sgiacomo.travaglini@arm.com GTEST_FLAG(print_time) = print_time_; 19813481Sgiacomo.travaglini@arm.com GTEST_FLAG(random_seed) = random_seed_; 19913481Sgiacomo.travaglini@arm.com GTEST_FLAG(repeat) = repeat_; 20013481Sgiacomo.travaglini@arm.com GTEST_FLAG(shuffle) = shuffle_; 20113481Sgiacomo.travaglini@arm.com GTEST_FLAG(stack_trace_depth) = stack_trace_depth_; 20213481Sgiacomo.travaglini@arm.com GTEST_FLAG(stream_result_to) = stream_result_to_; 20313481Sgiacomo.travaglini@arm.com GTEST_FLAG(throw_on_failure) = throw_on_failure_; 20413481Sgiacomo.travaglini@arm.com } 20513481Sgiacomo.travaglini@arm.com 20613481Sgiacomo.travaglini@arm.com private: 20713481Sgiacomo.travaglini@arm.com // Fields for saving the original values of flags. 20813481Sgiacomo.travaglini@arm.com bool also_run_disabled_tests_; 20913481Sgiacomo.travaglini@arm.com bool break_on_failure_; 21013481Sgiacomo.travaglini@arm.com bool catch_exceptions_; 21113481Sgiacomo.travaglini@arm.com std::string color_; 21213481Sgiacomo.travaglini@arm.com std::string death_test_style_; 21313481Sgiacomo.travaglini@arm.com bool death_test_use_fork_; 21413481Sgiacomo.travaglini@arm.com std::string filter_; 21513481Sgiacomo.travaglini@arm.com std::string internal_run_death_test_; 21613481Sgiacomo.travaglini@arm.com bool list_tests_; 21713481Sgiacomo.travaglini@arm.com std::string output_; 21813481Sgiacomo.travaglini@arm.com bool print_time_; 21913481Sgiacomo.travaglini@arm.com internal::Int32 random_seed_; 22013481Sgiacomo.travaglini@arm.com internal::Int32 repeat_; 22113481Sgiacomo.travaglini@arm.com bool shuffle_; 22213481Sgiacomo.travaglini@arm.com internal::Int32 stack_trace_depth_; 22313481Sgiacomo.travaglini@arm.com std::string stream_result_to_; 22413481Sgiacomo.travaglini@arm.com bool throw_on_failure_; 22513481Sgiacomo.travaglini@arm.com} GTEST_ATTRIBUTE_UNUSED_; 22613481Sgiacomo.travaglini@arm.com 22713481Sgiacomo.travaglini@arm.com// Converts a Unicode code point to a narrow string in UTF-8 encoding. 22813481Sgiacomo.travaglini@arm.com// code_point parameter is of type UInt32 because wchar_t may not be 22913481Sgiacomo.travaglini@arm.com// wide enough to contain a code point. 23013481Sgiacomo.travaglini@arm.com// If the code_point is not a valid Unicode code point 23113481Sgiacomo.travaglini@arm.com// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted 23213481Sgiacomo.travaglini@arm.com// to "(Invalid Unicode 0xXXXXXXXX)". 23313481Sgiacomo.travaglini@arm.comGTEST_API_ std::string CodePointToUtf8(UInt32 code_point); 23413481Sgiacomo.travaglini@arm.com 23513481Sgiacomo.travaglini@arm.com// Converts a wide string to a narrow string in UTF-8 encoding. 23613481Sgiacomo.travaglini@arm.com// The wide string is assumed to have the following encoding: 23713481Sgiacomo.travaglini@arm.com// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS) 23813481Sgiacomo.travaglini@arm.com// UTF-32 if sizeof(wchar_t) == 4 (on Linux) 23913481Sgiacomo.travaglini@arm.com// Parameter str points to a null-terminated wide string. 24013481Sgiacomo.travaglini@arm.com// Parameter num_chars may additionally limit the number 24113481Sgiacomo.travaglini@arm.com// of wchar_t characters processed. -1 is used when the entire string 24213481Sgiacomo.travaglini@arm.com// should be processed. 24313481Sgiacomo.travaglini@arm.com// If the string contains code points that are not valid Unicode code points 24413481Sgiacomo.travaglini@arm.com// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output 24513481Sgiacomo.travaglini@arm.com// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding 24613481Sgiacomo.travaglini@arm.com// and contains invalid UTF-16 surrogate pairs, values in those pairs 24713481Sgiacomo.travaglini@arm.com// will be encoded as individual Unicode characters from Basic Normal Plane. 24813481Sgiacomo.travaglini@arm.comGTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars); 24913481Sgiacomo.travaglini@arm.com 25013481Sgiacomo.travaglini@arm.com// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file 25113481Sgiacomo.travaglini@arm.com// if the variable is present. If a file already exists at this location, this 25213481Sgiacomo.travaglini@arm.com// function will write over it. If the variable is present, but the file cannot 25313481Sgiacomo.travaglini@arm.com// be created, prints an error and exits. 25413481Sgiacomo.travaglini@arm.comvoid WriteToShardStatusFileIfNeeded(); 25513481Sgiacomo.travaglini@arm.com 25613481Sgiacomo.travaglini@arm.com// Checks whether sharding is enabled by examining the relevant 25713481Sgiacomo.travaglini@arm.com// environment variable values. If the variables are present, 25813481Sgiacomo.travaglini@arm.com// but inconsistent (e.g., shard_index >= total_shards), prints 25913481Sgiacomo.travaglini@arm.com// an error and exits. If in_subprocess_for_death_test, sharding is 26013481Sgiacomo.travaglini@arm.com// disabled because it must only be applied to the original test 26113481Sgiacomo.travaglini@arm.com// process. Otherwise, we could filter out death tests we intended to execute. 26213481Sgiacomo.travaglini@arm.comGTEST_API_ bool ShouldShard(const char* total_shards_str, 26313481Sgiacomo.travaglini@arm.com const char* shard_index_str, 26413481Sgiacomo.travaglini@arm.com bool in_subprocess_for_death_test); 26513481Sgiacomo.travaglini@arm.com 26613481Sgiacomo.travaglini@arm.com// Parses the environment variable var as an Int32. If it is unset, 26713481Sgiacomo.travaglini@arm.com// returns default_val. If it is not an Int32, prints an error and 26813481Sgiacomo.travaglini@arm.com// and aborts. 26913481Sgiacomo.travaglini@arm.comGTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val); 27013481Sgiacomo.travaglini@arm.com 27113481Sgiacomo.travaglini@arm.com// Given the total number of shards, the shard index, and the test id, 27213481Sgiacomo.travaglini@arm.com// returns true iff the test should be run on this shard. The test id is 27313481Sgiacomo.travaglini@arm.com// some arbitrary but unique non-negative integer assigned to each test 27413481Sgiacomo.travaglini@arm.com// method. Assumes that 0 <= shard_index < total_shards. 27513481Sgiacomo.travaglini@arm.comGTEST_API_ bool ShouldRunTestOnShard( 27613481Sgiacomo.travaglini@arm.com int total_shards, int shard_index, int test_id); 27713481Sgiacomo.travaglini@arm.com 27813481Sgiacomo.travaglini@arm.com// STL container utilities. 27913481Sgiacomo.travaglini@arm.com 28013481Sgiacomo.travaglini@arm.com// Returns the number of elements in the given container that satisfy 28113481Sgiacomo.travaglini@arm.com// the given predicate. 28213481Sgiacomo.travaglini@arm.comtemplate <class Container, typename Predicate> 28313481Sgiacomo.travaglini@arm.cominline int CountIf(const Container& c, Predicate predicate) { 28413481Sgiacomo.travaglini@arm.com // Implemented as an explicit loop since std::count_if() in libCstd on 28513481Sgiacomo.travaglini@arm.com // Solaris has a non-standard signature. 28613481Sgiacomo.travaglini@arm.com int count = 0; 28713481Sgiacomo.travaglini@arm.com for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) { 28813481Sgiacomo.travaglini@arm.com if (predicate(*it)) 28913481Sgiacomo.travaglini@arm.com ++count; 29013481Sgiacomo.travaglini@arm.com } 29113481Sgiacomo.travaglini@arm.com return count; 29213481Sgiacomo.travaglini@arm.com} 29313481Sgiacomo.travaglini@arm.com 29413481Sgiacomo.travaglini@arm.com// Applies a function/functor to each element in the container. 29513481Sgiacomo.travaglini@arm.comtemplate <class Container, typename Functor> 29613481Sgiacomo.travaglini@arm.comvoid ForEach(const Container& c, Functor functor) { 29713481Sgiacomo.travaglini@arm.com std::for_each(c.begin(), c.end(), functor); 29813481Sgiacomo.travaglini@arm.com} 29913481Sgiacomo.travaglini@arm.com 30013481Sgiacomo.travaglini@arm.com// Returns the i-th element of the vector, or default_value if i is not 30113481Sgiacomo.travaglini@arm.com// in range [0, v.size()). 30213481Sgiacomo.travaglini@arm.comtemplate <typename E> 30313481Sgiacomo.travaglini@arm.cominline E GetElementOr(const std::vector<E>& v, int i, E default_value) { 30413481Sgiacomo.travaglini@arm.com return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i]; 30513481Sgiacomo.travaglini@arm.com} 30613481Sgiacomo.travaglini@arm.com 30713481Sgiacomo.travaglini@arm.com// Performs an in-place shuffle of a range of the vector's elements. 30813481Sgiacomo.travaglini@arm.com// 'begin' and 'end' are element indices as an STL-style range; 30913481Sgiacomo.travaglini@arm.com// i.e. [begin, end) are shuffled, where 'end' == size() means to 31013481Sgiacomo.travaglini@arm.com// shuffle to the end of the vector. 31113481Sgiacomo.travaglini@arm.comtemplate <typename E> 31213481Sgiacomo.travaglini@arm.comvoid ShuffleRange(internal::Random* random, int begin, int end, 31313481Sgiacomo.travaglini@arm.com std::vector<E>* v) { 31413481Sgiacomo.travaglini@arm.com const int size = static_cast<int>(v->size()); 31513481Sgiacomo.travaglini@arm.com GTEST_CHECK_(0 <= begin && begin <= size) 31613481Sgiacomo.travaglini@arm.com << "Invalid shuffle range start " << begin << ": must be in range [0, " 31713481Sgiacomo.travaglini@arm.com << size << "]."; 31813481Sgiacomo.travaglini@arm.com GTEST_CHECK_(begin <= end && end <= size) 31913481Sgiacomo.travaglini@arm.com << "Invalid shuffle range finish " << end << ": must be in range [" 32013481Sgiacomo.travaglini@arm.com << begin << ", " << size << "]."; 32113481Sgiacomo.travaglini@arm.com 32213481Sgiacomo.travaglini@arm.com // Fisher-Yates shuffle, from 32313481Sgiacomo.travaglini@arm.com // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle 32413481Sgiacomo.travaglini@arm.com for (int range_width = end - begin; range_width >= 2; range_width--) { 32513481Sgiacomo.travaglini@arm.com const int last_in_range = begin + range_width - 1; 32613481Sgiacomo.travaglini@arm.com const int selected = begin + random->Generate(range_width); 32713481Sgiacomo.travaglini@arm.com std::swap((*v)[selected], (*v)[last_in_range]); 32813481Sgiacomo.travaglini@arm.com } 32913481Sgiacomo.travaglini@arm.com} 33013481Sgiacomo.travaglini@arm.com 33113481Sgiacomo.travaglini@arm.com// Performs an in-place shuffle of the vector's elements. 33213481Sgiacomo.travaglini@arm.comtemplate <typename E> 33313481Sgiacomo.travaglini@arm.cominline void Shuffle(internal::Random* random, std::vector<E>* v) { 33413481Sgiacomo.travaglini@arm.com ShuffleRange(random, 0, static_cast<int>(v->size()), v); 33513481Sgiacomo.travaglini@arm.com} 33613481Sgiacomo.travaglini@arm.com 33713481Sgiacomo.travaglini@arm.com// A function for deleting an object. Handy for being used as a 33813481Sgiacomo.travaglini@arm.com// functor. 33913481Sgiacomo.travaglini@arm.comtemplate <typename T> 34013481Sgiacomo.travaglini@arm.comstatic void Delete(T* x) { 34113481Sgiacomo.travaglini@arm.com delete x; 34213481Sgiacomo.travaglini@arm.com} 34313481Sgiacomo.travaglini@arm.com 34413481Sgiacomo.travaglini@arm.com// A predicate that checks the key of a TestProperty against a known key. 34513481Sgiacomo.travaglini@arm.com// 34613481Sgiacomo.travaglini@arm.com// TestPropertyKeyIs is copyable. 34713481Sgiacomo.travaglini@arm.comclass TestPropertyKeyIs { 34813481Sgiacomo.travaglini@arm.com public: 34913481Sgiacomo.travaglini@arm.com // Constructor. 35013481Sgiacomo.travaglini@arm.com // 35113481Sgiacomo.travaglini@arm.com // TestPropertyKeyIs has NO default constructor. 35213481Sgiacomo.travaglini@arm.com explicit TestPropertyKeyIs(const std::string& key) : key_(key) {} 35313481Sgiacomo.travaglini@arm.com 35413481Sgiacomo.travaglini@arm.com // Returns true iff the test name of test property matches on key_. 35513481Sgiacomo.travaglini@arm.com bool operator()(const TestProperty& test_property) const { 35613481Sgiacomo.travaglini@arm.com return test_property.key() == key_; 35713481Sgiacomo.travaglini@arm.com } 35813481Sgiacomo.travaglini@arm.com 35913481Sgiacomo.travaglini@arm.com private: 36013481Sgiacomo.travaglini@arm.com std::string key_; 36113481Sgiacomo.travaglini@arm.com}; 36213481Sgiacomo.travaglini@arm.com 36313481Sgiacomo.travaglini@arm.com// Class UnitTestOptions. 36413481Sgiacomo.travaglini@arm.com// 36513481Sgiacomo.travaglini@arm.com// This class contains functions for processing options the user 36613481Sgiacomo.travaglini@arm.com// specifies when running the tests. It has only static members. 36713481Sgiacomo.travaglini@arm.com// 36813481Sgiacomo.travaglini@arm.com// In most cases, the user can specify an option using either an 36913481Sgiacomo.travaglini@arm.com// environment variable or a command line flag. E.g. you can set the 37013481Sgiacomo.travaglini@arm.com// test filter using either GTEST_FILTER or --gtest_filter. If both 37113481Sgiacomo.travaglini@arm.com// the variable and the flag are present, the latter overrides the 37213481Sgiacomo.travaglini@arm.com// former. 37313481Sgiacomo.travaglini@arm.comclass GTEST_API_ UnitTestOptions { 37413481Sgiacomo.travaglini@arm.com public: 37513481Sgiacomo.travaglini@arm.com // Functions for processing the gtest_output flag. 37613481Sgiacomo.travaglini@arm.com 37713481Sgiacomo.travaglini@arm.com // Returns the output format, or "" for normal printed output. 37813481Sgiacomo.travaglini@arm.com static std::string GetOutputFormat(); 37913481Sgiacomo.travaglini@arm.com 38013481Sgiacomo.travaglini@arm.com // Returns the absolute path of the requested output file, or the 38113481Sgiacomo.travaglini@arm.com // default (test_detail.xml in the original working directory) if 38213481Sgiacomo.travaglini@arm.com // none was explicitly specified. 38313481Sgiacomo.travaglini@arm.com static std::string GetAbsolutePathToOutputFile(); 38413481Sgiacomo.travaglini@arm.com 38513481Sgiacomo.travaglini@arm.com // Functions for processing the gtest_filter flag. 38613481Sgiacomo.travaglini@arm.com 38713481Sgiacomo.travaglini@arm.com // Returns true iff the wildcard pattern matches the string. The 38813481Sgiacomo.travaglini@arm.com // first ':' or '\0' character in pattern marks the end of it. 38913481Sgiacomo.travaglini@arm.com // 39013481Sgiacomo.travaglini@arm.com // This recursive algorithm isn't very efficient, but is clear and 39113481Sgiacomo.travaglini@arm.com // works well enough for matching test names, which are short. 39213481Sgiacomo.travaglini@arm.com static bool PatternMatchesString(const char *pattern, const char *str); 39313481Sgiacomo.travaglini@arm.com 39413481Sgiacomo.travaglini@arm.com // Returns true iff the user-specified filter matches the test case 39513481Sgiacomo.travaglini@arm.com // name and the test name. 39613481Sgiacomo.travaglini@arm.com static bool FilterMatchesTest(const std::string &test_case_name, 39713481Sgiacomo.travaglini@arm.com const std::string &test_name); 39813481Sgiacomo.travaglini@arm.com 39913481Sgiacomo.travaglini@arm.com#if GTEST_OS_WINDOWS 40013481Sgiacomo.travaglini@arm.com // Function for supporting the gtest_catch_exception flag. 40113481Sgiacomo.travaglini@arm.com 40213481Sgiacomo.travaglini@arm.com // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the 40313481Sgiacomo.travaglini@arm.com // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise. 40413481Sgiacomo.travaglini@arm.com // This function is useful as an __except condition. 40513481Sgiacomo.travaglini@arm.com static int GTestShouldProcessSEH(DWORD exception_code); 40613481Sgiacomo.travaglini@arm.com#endif // GTEST_OS_WINDOWS 40713481Sgiacomo.travaglini@arm.com 40813481Sgiacomo.travaglini@arm.com // Returns true if "name" matches the ':' separated list of glob-style 40913481Sgiacomo.travaglini@arm.com // filters in "filter". 41013481Sgiacomo.travaglini@arm.com static bool MatchesFilter(const std::string& name, const char* filter); 41113481Sgiacomo.travaglini@arm.com}; 41213481Sgiacomo.travaglini@arm.com 41313481Sgiacomo.travaglini@arm.com// Returns the current application's name, removing directory path if that 41413481Sgiacomo.travaglini@arm.com// is present. Used by UnitTestOptions::GetOutputFile. 41513481Sgiacomo.travaglini@arm.comGTEST_API_ FilePath GetCurrentExecutableName(); 41613481Sgiacomo.travaglini@arm.com 41713481Sgiacomo.travaglini@arm.com// The role interface for getting the OS stack trace as a string. 41813481Sgiacomo.travaglini@arm.comclass OsStackTraceGetterInterface { 41913481Sgiacomo.travaglini@arm.com public: 42013481Sgiacomo.travaglini@arm.com OsStackTraceGetterInterface() {} 42113481Sgiacomo.travaglini@arm.com virtual ~OsStackTraceGetterInterface() {} 42213481Sgiacomo.travaglini@arm.com 42313481Sgiacomo.travaglini@arm.com // Returns the current OS stack trace as an std::string. Parameters: 42413481Sgiacomo.travaglini@arm.com // 42513481Sgiacomo.travaglini@arm.com // max_depth - the maximum number of stack frames to be included 42613481Sgiacomo.travaglini@arm.com // in the trace. 42713481Sgiacomo.travaglini@arm.com // skip_count - the number of top frames to be skipped; doesn't count 42813481Sgiacomo.travaglini@arm.com // against max_depth. 42913481Sgiacomo.travaglini@arm.com virtual string CurrentStackTrace(int max_depth, int skip_count) = 0; 43013481Sgiacomo.travaglini@arm.com 43113481Sgiacomo.travaglini@arm.com // UponLeavingGTest() should be called immediately before Google Test calls 43213481Sgiacomo.travaglini@arm.com // user code. It saves some information about the current stack that 43313481Sgiacomo.travaglini@arm.com // CurrentStackTrace() will use to find and hide Google Test stack frames. 43413481Sgiacomo.travaglini@arm.com virtual void UponLeavingGTest() = 0; 43513481Sgiacomo.travaglini@arm.com 43613481Sgiacomo.travaglini@arm.com // This string is inserted in place of stack frames that are part of 43713481Sgiacomo.travaglini@arm.com // Google Test's implementation. 43813481Sgiacomo.travaglini@arm.com static const char* const kElidedFramesMarker; 43913481Sgiacomo.travaglini@arm.com 44013481Sgiacomo.travaglini@arm.com private: 44113481Sgiacomo.travaglini@arm.com GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface); 44213481Sgiacomo.travaglini@arm.com}; 44313481Sgiacomo.travaglini@arm.com 44413481Sgiacomo.travaglini@arm.com// A working implementation of the OsStackTraceGetterInterface interface. 44513481Sgiacomo.travaglini@arm.comclass OsStackTraceGetter : public OsStackTraceGetterInterface { 44613481Sgiacomo.travaglini@arm.com public: 44713481Sgiacomo.travaglini@arm.com OsStackTraceGetter() {} 44813481Sgiacomo.travaglini@arm.com 44913481Sgiacomo.travaglini@arm.com virtual string CurrentStackTrace(int max_depth, int skip_count); 45013481Sgiacomo.travaglini@arm.com virtual void UponLeavingGTest(); 45113481Sgiacomo.travaglini@arm.com 45213481Sgiacomo.travaglini@arm.com private: 45313481Sgiacomo.travaglini@arm.com GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter); 45413481Sgiacomo.travaglini@arm.com}; 45513481Sgiacomo.travaglini@arm.com 45613481Sgiacomo.travaglini@arm.com// Information about a Google Test trace point. 45713481Sgiacomo.travaglini@arm.comstruct TraceInfo { 45813481Sgiacomo.travaglini@arm.com const char* file; 45913481Sgiacomo.travaglini@arm.com int line; 46013481Sgiacomo.travaglini@arm.com std::string message; 46113481Sgiacomo.travaglini@arm.com}; 46213481Sgiacomo.travaglini@arm.com 46313481Sgiacomo.travaglini@arm.com// This is the default global test part result reporter used in UnitTestImpl. 46413481Sgiacomo.travaglini@arm.com// This class should only be used by UnitTestImpl. 46513481Sgiacomo.travaglini@arm.comclass DefaultGlobalTestPartResultReporter 46613481Sgiacomo.travaglini@arm.com : public TestPartResultReporterInterface { 46713481Sgiacomo.travaglini@arm.com public: 46813481Sgiacomo.travaglini@arm.com explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test); 46913481Sgiacomo.travaglini@arm.com // Implements the TestPartResultReporterInterface. Reports the test part 47013481Sgiacomo.travaglini@arm.com // result in the current test. 47113481Sgiacomo.travaglini@arm.com virtual void ReportTestPartResult(const TestPartResult& result); 47213481Sgiacomo.travaglini@arm.com 47313481Sgiacomo.travaglini@arm.com private: 47413481Sgiacomo.travaglini@arm.com UnitTestImpl* const unit_test_; 47513481Sgiacomo.travaglini@arm.com 47613481Sgiacomo.travaglini@arm.com GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter); 47713481Sgiacomo.travaglini@arm.com}; 47813481Sgiacomo.travaglini@arm.com 47913481Sgiacomo.travaglini@arm.com// This is the default per thread test part result reporter used in 48013481Sgiacomo.travaglini@arm.com// UnitTestImpl. This class should only be used by UnitTestImpl. 48113481Sgiacomo.travaglini@arm.comclass DefaultPerThreadTestPartResultReporter 48213481Sgiacomo.travaglini@arm.com : public TestPartResultReporterInterface { 48313481Sgiacomo.travaglini@arm.com public: 48413481Sgiacomo.travaglini@arm.com explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test); 48513481Sgiacomo.travaglini@arm.com // Implements the TestPartResultReporterInterface. The implementation just 48613481Sgiacomo.travaglini@arm.com // delegates to the current global test part result reporter of *unit_test_. 48713481Sgiacomo.travaglini@arm.com virtual void ReportTestPartResult(const TestPartResult& result); 48813481Sgiacomo.travaglini@arm.com 48913481Sgiacomo.travaglini@arm.com private: 49013481Sgiacomo.travaglini@arm.com UnitTestImpl* const unit_test_; 49113481Sgiacomo.travaglini@arm.com 49213481Sgiacomo.travaglini@arm.com GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter); 49313481Sgiacomo.travaglini@arm.com}; 49413481Sgiacomo.travaglini@arm.com 49513481Sgiacomo.travaglini@arm.com// The private implementation of the UnitTest class. We don't protect 49613481Sgiacomo.travaglini@arm.com// the methods under a mutex, as this class is not accessible by a 49713481Sgiacomo.travaglini@arm.com// user and the UnitTest class that delegates work to this class does 49813481Sgiacomo.travaglini@arm.com// proper locking. 49913481Sgiacomo.travaglini@arm.comclass GTEST_API_ UnitTestImpl { 50013481Sgiacomo.travaglini@arm.com public: 50113481Sgiacomo.travaglini@arm.com explicit UnitTestImpl(UnitTest* parent); 50213481Sgiacomo.travaglini@arm.com virtual ~UnitTestImpl(); 50313481Sgiacomo.travaglini@arm.com 50413481Sgiacomo.travaglini@arm.com // There are two different ways to register your own TestPartResultReporter. 50513481Sgiacomo.travaglini@arm.com // You can register your own repoter to listen either only for test results 50613481Sgiacomo.travaglini@arm.com // from the current thread or for results from all threads. 50713481Sgiacomo.travaglini@arm.com // By default, each per-thread test result repoter just passes a new 50813481Sgiacomo.travaglini@arm.com // TestPartResult to the global test result reporter, which registers the 50913481Sgiacomo.travaglini@arm.com // test part result for the currently running test. 51013481Sgiacomo.travaglini@arm.com 51113481Sgiacomo.travaglini@arm.com // Returns the global test part result reporter. 51213481Sgiacomo.travaglini@arm.com TestPartResultReporterInterface* GetGlobalTestPartResultReporter(); 51313481Sgiacomo.travaglini@arm.com 51413481Sgiacomo.travaglini@arm.com // Sets the global test part result reporter. 51513481Sgiacomo.travaglini@arm.com void SetGlobalTestPartResultReporter( 51613481Sgiacomo.travaglini@arm.com TestPartResultReporterInterface* reporter); 51713481Sgiacomo.travaglini@arm.com 51813481Sgiacomo.travaglini@arm.com // Returns the test part result reporter for the current thread. 51913481Sgiacomo.travaglini@arm.com TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread(); 52013481Sgiacomo.travaglini@arm.com 52113481Sgiacomo.travaglini@arm.com // Sets the test part result reporter for the current thread. 52213481Sgiacomo.travaglini@arm.com void SetTestPartResultReporterForCurrentThread( 52313481Sgiacomo.travaglini@arm.com TestPartResultReporterInterface* reporter); 52413481Sgiacomo.travaglini@arm.com 52513481Sgiacomo.travaglini@arm.com // Gets the number of successful test cases. 52613481Sgiacomo.travaglini@arm.com int successful_test_case_count() const; 52713481Sgiacomo.travaglini@arm.com 52813481Sgiacomo.travaglini@arm.com // Gets the number of failed test cases. 52913481Sgiacomo.travaglini@arm.com int failed_test_case_count() const; 53013481Sgiacomo.travaglini@arm.com 53113481Sgiacomo.travaglini@arm.com // Gets the number of all test cases. 53213481Sgiacomo.travaglini@arm.com int total_test_case_count() const; 53313481Sgiacomo.travaglini@arm.com 53413481Sgiacomo.travaglini@arm.com // Gets the number of all test cases that contain at least one test 53513481Sgiacomo.travaglini@arm.com // that should run. 53613481Sgiacomo.travaglini@arm.com int test_case_to_run_count() const; 53713481Sgiacomo.travaglini@arm.com 53813481Sgiacomo.travaglini@arm.com // Gets the number of successful tests. 53913481Sgiacomo.travaglini@arm.com int successful_test_count() const; 54013481Sgiacomo.travaglini@arm.com 54113481Sgiacomo.travaglini@arm.com // Gets the number of failed tests. 54213481Sgiacomo.travaglini@arm.com int failed_test_count() const; 54313481Sgiacomo.travaglini@arm.com 54413481Sgiacomo.travaglini@arm.com // Gets the number of disabled tests that will be reported in the XML report. 54513481Sgiacomo.travaglini@arm.com int reportable_disabled_test_count() const; 54613481Sgiacomo.travaglini@arm.com 54713481Sgiacomo.travaglini@arm.com // Gets the number of disabled tests. 54813481Sgiacomo.travaglini@arm.com int disabled_test_count() const; 54913481Sgiacomo.travaglini@arm.com 55013481Sgiacomo.travaglini@arm.com // Gets the number of tests to be printed in the XML report. 55113481Sgiacomo.travaglini@arm.com int reportable_test_count() const; 55213481Sgiacomo.travaglini@arm.com 55313481Sgiacomo.travaglini@arm.com // Gets the number of all tests. 55413481Sgiacomo.travaglini@arm.com int total_test_count() const; 55513481Sgiacomo.travaglini@arm.com 55613481Sgiacomo.travaglini@arm.com // Gets the number of tests that should run. 55713481Sgiacomo.travaglini@arm.com int test_to_run_count() const; 55813481Sgiacomo.travaglini@arm.com 55913481Sgiacomo.travaglini@arm.com // Gets the time of the test program start, in ms from the start of the 56013481Sgiacomo.travaglini@arm.com // UNIX epoch. 56113481Sgiacomo.travaglini@arm.com TimeInMillis start_timestamp() const { return start_timestamp_; } 56213481Sgiacomo.travaglini@arm.com 56313481Sgiacomo.travaglini@arm.com // Gets the elapsed time, in milliseconds. 56413481Sgiacomo.travaglini@arm.com TimeInMillis elapsed_time() const { return elapsed_time_; } 56513481Sgiacomo.travaglini@arm.com 56613481Sgiacomo.travaglini@arm.com // Returns true iff the unit test passed (i.e. all test cases passed). 56713481Sgiacomo.travaglini@arm.com bool Passed() const { return !Failed(); } 56813481Sgiacomo.travaglini@arm.com 56913481Sgiacomo.travaglini@arm.com // Returns true iff the unit test failed (i.e. some test case failed 57013481Sgiacomo.travaglini@arm.com // or something outside of all tests failed). 57113481Sgiacomo.travaglini@arm.com bool Failed() const { 57213481Sgiacomo.travaglini@arm.com return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed(); 57313481Sgiacomo.travaglini@arm.com } 57413481Sgiacomo.travaglini@arm.com 57513481Sgiacomo.travaglini@arm.com // Gets the i-th test case among all the test cases. i can range from 0 to 57613481Sgiacomo.travaglini@arm.com // total_test_case_count() - 1. If i is not in that range, returns NULL. 57713481Sgiacomo.travaglini@arm.com const TestCase* GetTestCase(int i) const { 57813481Sgiacomo.travaglini@arm.com const int index = GetElementOr(test_case_indices_, i, -1); 57913481Sgiacomo.travaglini@arm.com return index < 0 ? NULL : test_cases_[i]; 58013481Sgiacomo.travaglini@arm.com } 58113481Sgiacomo.travaglini@arm.com 58213481Sgiacomo.travaglini@arm.com // Gets the i-th test case among all the test cases. i can range from 0 to 58313481Sgiacomo.travaglini@arm.com // total_test_case_count() - 1. If i is not in that range, returns NULL. 58413481Sgiacomo.travaglini@arm.com TestCase* GetMutableTestCase(int i) { 58513481Sgiacomo.travaglini@arm.com const int index = GetElementOr(test_case_indices_, i, -1); 58613481Sgiacomo.travaglini@arm.com return index < 0 ? NULL : test_cases_[index]; 58713481Sgiacomo.travaglini@arm.com } 58813481Sgiacomo.travaglini@arm.com 58913481Sgiacomo.travaglini@arm.com // Provides access to the event listener list. 59013481Sgiacomo.travaglini@arm.com TestEventListeners* listeners() { return &listeners_; } 59113481Sgiacomo.travaglini@arm.com 59213481Sgiacomo.travaglini@arm.com // Returns the TestResult for the test that's currently running, or 59313481Sgiacomo.travaglini@arm.com // the TestResult for the ad hoc test if no test is running. 59413481Sgiacomo.travaglini@arm.com TestResult* current_test_result(); 59513481Sgiacomo.travaglini@arm.com 59613481Sgiacomo.travaglini@arm.com // Returns the TestResult for the ad hoc test. 59713481Sgiacomo.travaglini@arm.com const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; } 59813481Sgiacomo.travaglini@arm.com 59913481Sgiacomo.travaglini@arm.com // Sets the OS stack trace getter. 60013481Sgiacomo.travaglini@arm.com // 60113481Sgiacomo.travaglini@arm.com // Does nothing if the input and the current OS stack trace getter 60213481Sgiacomo.travaglini@arm.com // are the same; otherwise, deletes the old getter and makes the 60313481Sgiacomo.travaglini@arm.com // input the current getter. 60413481Sgiacomo.travaglini@arm.com void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter); 60513481Sgiacomo.travaglini@arm.com 60613481Sgiacomo.travaglini@arm.com // Returns the current OS stack trace getter if it is not NULL; 60713481Sgiacomo.travaglini@arm.com // otherwise, creates an OsStackTraceGetter, makes it the current 60813481Sgiacomo.travaglini@arm.com // getter, and returns it. 60913481Sgiacomo.travaglini@arm.com OsStackTraceGetterInterface* os_stack_trace_getter(); 61013481Sgiacomo.travaglini@arm.com 61113481Sgiacomo.travaglini@arm.com // Returns the current OS stack trace as an std::string. 61213481Sgiacomo.travaglini@arm.com // 61313481Sgiacomo.travaglini@arm.com // The maximum number of stack frames to be included is specified by 61413481Sgiacomo.travaglini@arm.com // the gtest_stack_trace_depth flag. The skip_count parameter 61513481Sgiacomo.travaglini@arm.com // specifies the number of top frames to be skipped, which doesn't 61613481Sgiacomo.travaglini@arm.com // count against the number of frames to be included. 61713481Sgiacomo.travaglini@arm.com // 61813481Sgiacomo.travaglini@arm.com // For example, if Foo() calls Bar(), which in turn calls 61913481Sgiacomo.travaglini@arm.com // CurrentOsStackTraceExceptTop(1), Foo() will be included in the 62013481Sgiacomo.travaglini@arm.com // trace but Bar() and CurrentOsStackTraceExceptTop() won't. 62113481Sgiacomo.travaglini@arm.com std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_; 62213481Sgiacomo.travaglini@arm.com 62313481Sgiacomo.travaglini@arm.com // Finds and returns a TestCase with the given name. If one doesn't 62413481Sgiacomo.travaglini@arm.com // exist, creates one and returns it. 62513481Sgiacomo.travaglini@arm.com // 62613481Sgiacomo.travaglini@arm.com // Arguments: 62713481Sgiacomo.travaglini@arm.com // 62813481Sgiacomo.travaglini@arm.com // test_case_name: name of the test case 62913481Sgiacomo.travaglini@arm.com // type_param: the name of the test's type parameter, or NULL if 63013481Sgiacomo.travaglini@arm.com // this is not a typed or a type-parameterized test. 63113481Sgiacomo.travaglini@arm.com // set_up_tc: pointer to the function that sets up the test case 63213481Sgiacomo.travaglini@arm.com // tear_down_tc: pointer to the function that tears down the test case 63313481Sgiacomo.travaglini@arm.com TestCase* GetTestCase(const char* test_case_name, 63413481Sgiacomo.travaglini@arm.com const char* type_param, 63513481Sgiacomo.travaglini@arm.com Test::SetUpTestCaseFunc set_up_tc, 63613481Sgiacomo.travaglini@arm.com Test::TearDownTestCaseFunc tear_down_tc); 63713481Sgiacomo.travaglini@arm.com 63813481Sgiacomo.travaglini@arm.com // Adds a TestInfo to the unit test. 63913481Sgiacomo.travaglini@arm.com // 64013481Sgiacomo.travaglini@arm.com // Arguments: 64113481Sgiacomo.travaglini@arm.com // 64213481Sgiacomo.travaglini@arm.com // set_up_tc: pointer to the function that sets up the test case 64313481Sgiacomo.travaglini@arm.com // tear_down_tc: pointer to the function that tears down the test case 64413481Sgiacomo.travaglini@arm.com // test_info: the TestInfo object 64513481Sgiacomo.travaglini@arm.com void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc, 64613481Sgiacomo.travaglini@arm.com Test::TearDownTestCaseFunc tear_down_tc, 64713481Sgiacomo.travaglini@arm.com TestInfo* test_info) { 64813481Sgiacomo.travaglini@arm.com // In order to support thread-safe death tests, we need to 64913481Sgiacomo.travaglini@arm.com // remember the original working directory when the test program 65013481Sgiacomo.travaglini@arm.com // was first invoked. We cannot do this in RUN_ALL_TESTS(), as 65113481Sgiacomo.travaglini@arm.com // the user may have changed the current directory before calling 65213481Sgiacomo.travaglini@arm.com // RUN_ALL_TESTS(). Therefore we capture the current directory in 65313481Sgiacomo.travaglini@arm.com // AddTestInfo(), which is called to register a TEST or TEST_F 65413481Sgiacomo.travaglini@arm.com // before main() is reached. 65513481Sgiacomo.travaglini@arm.com if (original_working_dir_.IsEmpty()) { 65613481Sgiacomo.travaglini@arm.com original_working_dir_.Set(FilePath::GetCurrentDir()); 65713481Sgiacomo.travaglini@arm.com GTEST_CHECK_(!original_working_dir_.IsEmpty()) 65813481Sgiacomo.travaglini@arm.com << "Failed to get the current working directory."; 65913481Sgiacomo.travaglini@arm.com } 66013481Sgiacomo.travaglini@arm.com 66113481Sgiacomo.travaglini@arm.com GetTestCase(test_info->test_case_name(), 66213481Sgiacomo.travaglini@arm.com test_info->type_param(), 66313481Sgiacomo.travaglini@arm.com set_up_tc, 66413481Sgiacomo.travaglini@arm.com tear_down_tc)->AddTestInfo(test_info); 66513481Sgiacomo.travaglini@arm.com } 66613481Sgiacomo.travaglini@arm.com 66713481Sgiacomo.travaglini@arm.com#if GTEST_HAS_PARAM_TEST 66813481Sgiacomo.travaglini@arm.com // Returns ParameterizedTestCaseRegistry object used to keep track of 66913481Sgiacomo.travaglini@arm.com // value-parameterized tests and instantiate and register them. 67013481Sgiacomo.travaglini@arm.com internal::ParameterizedTestCaseRegistry& parameterized_test_registry() { 67113481Sgiacomo.travaglini@arm.com return parameterized_test_registry_; 67213481Sgiacomo.travaglini@arm.com } 67313481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_PARAM_TEST 67413481Sgiacomo.travaglini@arm.com 67513481Sgiacomo.travaglini@arm.com // Sets the TestCase object for the test that's currently running. 67613481Sgiacomo.travaglini@arm.com void set_current_test_case(TestCase* a_current_test_case) { 67713481Sgiacomo.travaglini@arm.com current_test_case_ = a_current_test_case; 67813481Sgiacomo.travaglini@arm.com } 67913481Sgiacomo.travaglini@arm.com 68013481Sgiacomo.travaglini@arm.com // Sets the TestInfo object for the test that's currently running. If 68113481Sgiacomo.travaglini@arm.com // current_test_info is NULL, the assertion results will be stored in 68213481Sgiacomo.travaglini@arm.com // ad_hoc_test_result_. 68313481Sgiacomo.travaglini@arm.com void set_current_test_info(TestInfo* a_current_test_info) { 68413481Sgiacomo.travaglini@arm.com current_test_info_ = a_current_test_info; 68513481Sgiacomo.travaglini@arm.com } 68613481Sgiacomo.travaglini@arm.com 68713481Sgiacomo.travaglini@arm.com // Registers all parameterized tests defined using TEST_P and 68813481Sgiacomo.travaglini@arm.com // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter 68913481Sgiacomo.travaglini@arm.com // combination. This method can be called more then once; it has guards 69013481Sgiacomo.travaglini@arm.com // protecting from registering the tests more then once. If 69113481Sgiacomo.travaglini@arm.com // value-parameterized tests are disabled, RegisterParameterizedTests is 69213481Sgiacomo.travaglini@arm.com // present but does nothing. 69313481Sgiacomo.travaglini@arm.com void RegisterParameterizedTests(); 69413481Sgiacomo.travaglini@arm.com 69513481Sgiacomo.travaglini@arm.com // Runs all tests in this UnitTest object, prints the result, and 69613481Sgiacomo.travaglini@arm.com // returns true if all tests are successful. If any exception is 69713481Sgiacomo.travaglini@arm.com // thrown during a test, this test is considered to be failed, but 69813481Sgiacomo.travaglini@arm.com // the rest of the tests will still be run. 69913481Sgiacomo.travaglini@arm.com bool RunAllTests(); 70013481Sgiacomo.travaglini@arm.com 70113481Sgiacomo.travaglini@arm.com // Clears the results of all tests, except the ad hoc tests. 70213481Sgiacomo.travaglini@arm.com void ClearNonAdHocTestResult() { 70313481Sgiacomo.travaglini@arm.com ForEach(test_cases_, TestCase::ClearTestCaseResult); 70413481Sgiacomo.travaglini@arm.com } 70513481Sgiacomo.travaglini@arm.com 70613481Sgiacomo.travaglini@arm.com // Clears the results of ad-hoc test assertions. 70713481Sgiacomo.travaglini@arm.com void ClearAdHocTestResult() { 70813481Sgiacomo.travaglini@arm.com ad_hoc_test_result_.Clear(); 70913481Sgiacomo.travaglini@arm.com } 71013481Sgiacomo.travaglini@arm.com 71113481Sgiacomo.travaglini@arm.com // Adds a TestProperty to the current TestResult object when invoked in a 71213481Sgiacomo.travaglini@arm.com // context of a test or a test case, or to the global property set. If the 71313481Sgiacomo.travaglini@arm.com // result already contains a property with the same key, the value will be 71413481Sgiacomo.travaglini@arm.com // updated. 71513481Sgiacomo.travaglini@arm.com void RecordProperty(const TestProperty& test_property); 71613481Sgiacomo.travaglini@arm.com 71713481Sgiacomo.travaglini@arm.com enum ReactionToSharding { 71813481Sgiacomo.travaglini@arm.com HONOR_SHARDING_PROTOCOL, 71913481Sgiacomo.travaglini@arm.com IGNORE_SHARDING_PROTOCOL 72013481Sgiacomo.travaglini@arm.com }; 72113481Sgiacomo.travaglini@arm.com 72213481Sgiacomo.travaglini@arm.com // Matches the full name of each test against the user-specified 72313481Sgiacomo.travaglini@arm.com // filter to decide whether the test should run, then records the 72413481Sgiacomo.travaglini@arm.com // result in each TestCase and TestInfo object. 72513481Sgiacomo.travaglini@arm.com // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests 72613481Sgiacomo.travaglini@arm.com // based on sharding variables in the environment. 72713481Sgiacomo.travaglini@arm.com // Returns the number of tests that should run. 72813481Sgiacomo.travaglini@arm.com int FilterTests(ReactionToSharding shard_tests); 72913481Sgiacomo.travaglini@arm.com 73013481Sgiacomo.travaglini@arm.com // Prints the names of the tests matching the user-specified filter flag. 73113481Sgiacomo.travaglini@arm.com void ListTestsMatchingFilter(); 73213481Sgiacomo.travaglini@arm.com 73313481Sgiacomo.travaglini@arm.com const TestCase* current_test_case() const { return current_test_case_; } 73413481Sgiacomo.travaglini@arm.com TestInfo* current_test_info() { return current_test_info_; } 73513481Sgiacomo.travaglini@arm.com const TestInfo* current_test_info() const { return current_test_info_; } 73613481Sgiacomo.travaglini@arm.com 73713481Sgiacomo.travaglini@arm.com // Returns the vector of environments that need to be set-up/torn-down 73813481Sgiacomo.travaglini@arm.com // before/after the tests are run. 73913481Sgiacomo.travaglini@arm.com std::vector<Environment*>& environments() { return environments_; } 74013481Sgiacomo.travaglini@arm.com 74113481Sgiacomo.travaglini@arm.com // Getters for the per-thread Google Test trace stack. 74213481Sgiacomo.travaglini@arm.com std::vector<TraceInfo>& gtest_trace_stack() { 74313481Sgiacomo.travaglini@arm.com return *(gtest_trace_stack_.pointer()); 74413481Sgiacomo.travaglini@arm.com } 74513481Sgiacomo.travaglini@arm.com const std::vector<TraceInfo>& gtest_trace_stack() const { 74613481Sgiacomo.travaglini@arm.com return gtest_trace_stack_.get(); 74713481Sgiacomo.travaglini@arm.com } 74813481Sgiacomo.travaglini@arm.com 74913481Sgiacomo.travaglini@arm.com#if GTEST_HAS_DEATH_TEST 75013481Sgiacomo.travaglini@arm.com void InitDeathTestSubprocessControlInfo() { 75113481Sgiacomo.travaglini@arm.com internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag()); 75213481Sgiacomo.travaglini@arm.com } 75313481Sgiacomo.travaglini@arm.com // Returns a pointer to the parsed --gtest_internal_run_death_test 75413481Sgiacomo.travaglini@arm.com // flag, or NULL if that flag was not specified. 75513481Sgiacomo.travaglini@arm.com // This information is useful only in a death test child process. 75613481Sgiacomo.travaglini@arm.com // Must not be called before a call to InitGoogleTest. 75713481Sgiacomo.travaglini@arm.com const InternalRunDeathTestFlag* internal_run_death_test_flag() const { 75813481Sgiacomo.travaglini@arm.com return internal_run_death_test_flag_.get(); 75913481Sgiacomo.travaglini@arm.com } 76013481Sgiacomo.travaglini@arm.com 76113481Sgiacomo.travaglini@arm.com // Returns a pointer to the current death test factory. 76213481Sgiacomo.travaglini@arm.com internal::DeathTestFactory* death_test_factory() { 76313481Sgiacomo.travaglini@arm.com return death_test_factory_.get(); 76413481Sgiacomo.travaglini@arm.com } 76513481Sgiacomo.travaglini@arm.com 76613481Sgiacomo.travaglini@arm.com void SuppressTestEventsIfInSubprocess(); 76713481Sgiacomo.travaglini@arm.com 76813481Sgiacomo.travaglini@arm.com friend class ReplaceDeathTestFactory; 76913481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_DEATH_TEST 77013481Sgiacomo.travaglini@arm.com 77113481Sgiacomo.travaglini@arm.com // Initializes the event listener performing XML output as specified by 77213481Sgiacomo.travaglini@arm.com // UnitTestOptions. Must not be called before InitGoogleTest. 77313481Sgiacomo.travaglini@arm.com void ConfigureXmlOutput(); 77413481Sgiacomo.travaglini@arm.com 77513481Sgiacomo.travaglini@arm.com#if GTEST_CAN_STREAM_RESULTS_ 77613481Sgiacomo.travaglini@arm.com // Initializes the event listener for streaming test results to a socket. 77713481Sgiacomo.travaglini@arm.com // Must not be called before InitGoogleTest. 77813481Sgiacomo.travaglini@arm.com void ConfigureStreamingOutput(); 77913481Sgiacomo.travaglini@arm.com#endif 78013481Sgiacomo.travaglini@arm.com 78113481Sgiacomo.travaglini@arm.com // Performs initialization dependent upon flag values obtained in 78213481Sgiacomo.travaglini@arm.com // ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to 78313481Sgiacomo.travaglini@arm.com // ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest 78413481Sgiacomo.travaglini@arm.com // this function is also called from RunAllTests. Since this function can be 78513481Sgiacomo.travaglini@arm.com // called more than once, it has to be idempotent. 78613481Sgiacomo.travaglini@arm.com void PostFlagParsingInit(); 78713481Sgiacomo.travaglini@arm.com 78813481Sgiacomo.travaglini@arm.com // Gets the random seed used at the start of the current test iteration. 78913481Sgiacomo.travaglini@arm.com int random_seed() const { return random_seed_; } 79013481Sgiacomo.travaglini@arm.com 79113481Sgiacomo.travaglini@arm.com // Gets the random number generator. 79213481Sgiacomo.travaglini@arm.com internal::Random* random() { return &random_; } 79313481Sgiacomo.travaglini@arm.com 79413481Sgiacomo.travaglini@arm.com // Shuffles all test cases, and the tests within each test case, 79513481Sgiacomo.travaglini@arm.com // making sure that death tests are still run first. 79613481Sgiacomo.travaglini@arm.com void ShuffleTests(); 79713481Sgiacomo.travaglini@arm.com 79813481Sgiacomo.travaglini@arm.com // Restores the test cases and tests to their order before the first shuffle. 79913481Sgiacomo.travaglini@arm.com void UnshuffleTests(); 80013481Sgiacomo.travaglini@arm.com 80113481Sgiacomo.travaglini@arm.com // Returns the value of GTEST_FLAG(catch_exceptions) at the moment 80213481Sgiacomo.travaglini@arm.com // UnitTest::Run() starts. 80313481Sgiacomo.travaglini@arm.com bool catch_exceptions() const { return catch_exceptions_; } 80413481Sgiacomo.travaglini@arm.com 80513481Sgiacomo.travaglini@arm.com private: 80613481Sgiacomo.travaglini@arm.com friend class ::testing::UnitTest; 80713481Sgiacomo.travaglini@arm.com 80813481Sgiacomo.travaglini@arm.com // Used by UnitTest::Run() to capture the state of 80913481Sgiacomo.travaglini@arm.com // GTEST_FLAG(catch_exceptions) at the moment it starts. 81013481Sgiacomo.travaglini@arm.com void set_catch_exceptions(bool value) { catch_exceptions_ = value; } 81113481Sgiacomo.travaglini@arm.com 81213481Sgiacomo.travaglini@arm.com // The UnitTest object that owns this implementation object. 81313481Sgiacomo.travaglini@arm.com UnitTest* const parent_; 81413481Sgiacomo.travaglini@arm.com 81513481Sgiacomo.travaglini@arm.com // The working directory when the first TEST() or TEST_F() was 81613481Sgiacomo.travaglini@arm.com // executed. 81713481Sgiacomo.travaglini@arm.com internal::FilePath original_working_dir_; 81813481Sgiacomo.travaglini@arm.com 81913481Sgiacomo.travaglini@arm.com // The default test part result reporters. 82013481Sgiacomo.travaglini@arm.com DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_; 82113481Sgiacomo.travaglini@arm.com DefaultPerThreadTestPartResultReporter 82213481Sgiacomo.travaglini@arm.com default_per_thread_test_part_result_reporter_; 82313481Sgiacomo.travaglini@arm.com 82413481Sgiacomo.travaglini@arm.com // Points to (but doesn't own) the global test part result reporter. 82513481Sgiacomo.travaglini@arm.com TestPartResultReporterInterface* global_test_part_result_repoter_; 82613481Sgiacomo.travaglini@arm.com 82713481Sgiacomo.travaglini@arm.com // Protects read and write access to global_test_part_result_reporter_. 82813481Sgiacomo.travaglini@arm.com internal::Mutex global_test_part_result_reporter_mutex_; 82913481Sgiacomo.travaglini@arm.com 83013481Sgiacomo.travaglini@arm.com // Points to (but doesn't own) the per-thread test part result reporter. 83113481Sgiacomo.travaglini@arm.com internal::ThreadLocal<TestPartResultReporterInterface*> 83213481Sgiacomo.travaglini@arm.com per_thread_test_part_result_reporter_; 83313481Sgiacomo.travaglini@arm.com 83413481Sgiacomo.travaglini@arm.com // The vector of environments that need to be set-up/torn-down 83513481Sgiacomo.travaglini@arm.com // before/after the tests are run. 83613481Sgiacomo.travaglini@arm.com std::vector<Environment*> environments_; 83713481Sgiacomo.travaglini@arm.com 83813481Sgiacomo.travaglini@arm.com // The vector of TestCases in their original order. It owns the 83913481Sgiacomo.travaglini@arm.com // elements in the vector. 84013481Sgiacomo.travaglini@arm.com std::vector<TestCase*> test_cases_; 84113481Sgiacomo.travaglini@arm.com 84213481Sgiacomo.travaglini@arm.com // Provides a level of indirection for the test case list to allow 84313481Sgiacomo.travaglini@arm.com // easy shuffling and restoring the test case order. The i-th 84413481Sgiacomo.travaglini@arm.com // element of this vector is the index of the i-th test case in the 84513481Sgiacomo.travaglini@arm.com // shuffled order. 84613481Sgiacomo.travaglini@arm.com std::vector<int> test_case_indices_; 84713481Sgiacomo.travaglini@arm.com 84813481Sgiacomo.travaglini@arm.com#if GTEST_HAS_PARAM_TEST 84913481Sgiacomo.travaglini@arm.com // ParameterizedTestRegistry object used to register value-parameterized 85013481Sgiacomo.travaglini@arm.com // tests. 85113481Sgiacomo.travaglini@arm.com internal::ParameterizedTestCaseRegistry parameterized_test_registry_; 85213481Sgiacomo.travaglini@arm.com 85313481Sgiacomo.travaglini@arm.com // Indicates whether RegisterParameterizedTests() has been called already. 85413481Sgiacomo.travaglini@arm.com bool parameterized_tests_registered_; 85513481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_PARAM_TEST 85613481Sgiacomo.travaglini@arm.com 85713481Sgiacomo.travaglini@arm.com // Index of the last death test case registered. Initially -1. 85813481Sgiacomo.travaglini@arm.com int last_death_test_case_; 85913481Sgiacomo.travaglini@arm.com 86013481Sgiacomo.travaglini@arm.com // This points to the TestCase for the currently running test. It 86113481Sgiacomo.travaglini@arm.com // changes as Google Test goes through one test case after another. 86213481Sgiacomo.travaglini@arm.com // When no test is running, this is set to NULL and Google Test 86313481Sgiacomo.travaglini@arm.com // stores assertion results in ad_hoc_test_result_. Initially NULL. 86413481Sgiacomo.travaglini@arm.com TestCase* current_test_case_; 86513481Sgiacomo.travaglini@arm.com 86613481Sgiacomo.travaglini@arm.com // This points to the TestInfo for the currently running test. It 86713481Sgiacomo.travaglini@arm.com // changes as Google Test goes through one test after another. When 86813481Sgiacomo.travaglini@arm.com // no test is running, this is set to NULL and Google Test stores 86913481Sgiacomo.travaglini@arm.com // assertion results in ad_hoc_test_result_. Initially NULL. 87013481Sgiacomo.travaglini@arm.com TestInfo* current_test_info_; 87113481Sgiacomo.travaglini@arm.com 87213481Sgiacomo.travaglini@arm.com // Normally, a user only writes assertions inside a TEST or TEST_F, 87313481Sgiacomo.travaglini@arm.com // or inside a function called by a TEST or TEST_F. Since Google 87413481Sgiacomo.travaglini@arm.com // Test keeps track of which test is current running, it can 87513481Sgiacomo.travaglini@arm.com // associate such an assertion with the test it belongs to. 87613481Sgiacomo.travaglini@arm.com // 87713481Sgiacomo.travaglini@arm.com // If an assertion is encountered when no TEST or TEST_F is running, 87813481Sgiacomo.travaglini@arm.com // Google Test attributes the assertion result to an imaginary "ad hoc" 87913481Sgiacomo.travaglini@arm.com // test, and records the result in ad_hoc_test_result_. 88013481Sgiacomo.travaglini@arm.com TestResult ad_hoc_test_result_; 88113481Sgiacomo.travaglini@arm.com 88213481Sgiacomo.travaglini@arm.com // The list of event listeners that can be used to track events inside 88313481Sgiacomo.travaglini@arm.com // Google Test. 88413481Sgiacomo.travaglini@arm.com TestEventListeners listeners_; 88513481Sgiacomo.travaglini@arm.com 88613481Sgiacomo.travaglini@arm.com // The OS stack trace getter. Will be deleted when the UnitTest 88713481Sgiacomo.travaglini@arm.com // object is destructed. By default, an OsStackTraceGetter is used, 88813481Sgiacomo.travaglini@arm.com // but the user can set this field to use a custom getter if that is 88913481Sgiacomo.travaglini@arm.com // desired. 89013481Sgiacomo.travaglini@arm.com OsStackTraceGetterInterface* os_stack_trace_getter_; 89113481Sgiacomo.travaglini@arm.com 89213481Sgiacomo.travaglini@arm.com // True iff PostFlagParsingInit() has been called. 89313481Sgiacomo.travaglini@arm.com bool post_flag_parse_init_performed_; 89413481Sgiacomo.travaglini@arm.com 89513481Sgiacomo.travaglini@arm.com // The random number seed used at the beginning of the test run. 89613481Sgiacomo.travaglini@arm.com int random_seed_; 89713481Sgiacomo.travaglini@arm.com 89813481Sgiacomo.travaglini@arm.com // Our random number generator. 89913481Sgiacomo.travaglini@arm.com internal::Random random_; 90013481Sgiacomo.travaglini@arm.com 90113481Sgiacomo.travaglini@arm.com // The time of the test program start, in ms from the start of the 90213481Sgiacomo.travaglini@arm.com // UNIX epoch. 90313481Sgiacomo.travaglini@arm.com TimeInMillis start_timestamp_; 90413481Sgiacomo.travaglini@arm.com 90513481Sgiacomo.travaglini@arm.com // How long the test took to run, in milliseconds. 90613481Sgiacomo.travaglini@arm.com TimeInMillis elapsed_time_; 90713481Sgiacomo.travaglini@arm.com 90813481Sgiacomo.travaglini@arm.com#if GTEST_HAS_DEATH_TEST 90913481Sgiacomo.travaglini@arm.com // The decomposed components of the gtest_internal_run_death_test flag, 91013481Sgiacomo.travaglini@arm.com // parsed when RUN_ALL_TESTS is called. 91113481Sgiacomo.travaglini@arm.com internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_; 91213481Sgiacomo.travaglini@arm.com internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_; 91313481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_DEATH_TEST 91413481Sgiacomo.travaglini@arm.com 91513481Sgiacomo.travaglini@arm.com // A per-thread stack of traces created by the SCOPED_TRACE() macro. 91613481Sgiacomo.travaglini@arm.com internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_; 91713481Sgiacomo.travaglini@arm.com 91813481Sgiacomo.travaglini@arm.com // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests() 91913481Sgiacomo.travaglini@arm.com // starts. 92013481Sgiacomo.travaglini@arm.com bool catch_exceptions_; 92113481Sgiacomo.travaglini@arm.com 92213481Sgiacomo.travaglini@arm.com GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl); 92313481Sgiacomo.travaglini@arm.com}; // class UnitTestImpl 92413481Sgiacomo.travaglini@arm.com 92513481Sgiacomo.travaglini@arm.com// Convenience function for accessing the global UnitTest 92613481Sgiacomo.travaglini@arm.com// implementation object. 92713481Sgiacomo.travaglini@arm.cominline UnitTestImpl* GetUnitTestImpl() { 92813481Sgiacomo.travaglini@arm.com return UnitTest::GetInstance()->impl(); 92913481Sgiacomo.travaglini@arm.com} 93013481Sgiacomo.travaglini@arm.com 93113481Sgiacomo.travaglini@arm.com#if GTEST_USES_SIMPLE_RE 93213481Sgiacomo.travaglini@arm.com 93313481Sgiacomo.travaglini@arm.com// Internal helper functions for implementing the simple regular 93413481Sgiacomo.travaglini@arm.com// expression matcher. 93513481Sgiacomo.travaglini@arm.comGTEST_API_ bool IsInSet(char ch, const char* str); 93613481Sgiacomo.travaglini@arm.comGTEST_API_ bool IsAsciiDigit(char ch); 93713481Sgiacomo.travaglini@arm.comGTEST_API_ bool IsAsciiPunct(char ch); 93813481Sgiacomo.travaglini@arm.comGTEST_API_ bool IsRepeat(char ch); 93913481Sgiacomo.travaglini@arm.comGTEST_API_ bool IsAsciiWhiteSpace(char ch); 94013481Sgiacomo.travaglini@arm.comGTEST_API_ bool IsAsciiWordChar(char ch); 94113481Sgiacomo.travaglini@arm.comGTEST_API_ bool IsValidEscape(char ch); 94213481Sgiacomo.travaglini@arm.comGTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch); 94313481Sgiacomo.travaglini@arm.comGTEST_API_ bool ValidateRegex(const char* regex); 94413481Sgiacomo.travaglini@arm.comGTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str); 94513481Sgiacomo.travaglini@arm.comGTEST_API_ bool MatchRepetitionAndRegexAtHead( 94613481Sgiacomo.travaglini@arm.com bool escaped, char ch, char repeat, const char* regex, const char* str); 94713481Sgiacomo.travaglini@arm.comGTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str); 94813481Sgiacomo.travaglini@arm.com 94913481Sgiacomo.travaglini@arm.com#endif // GTEST_USES_SIMPLE_RE 95013481Sgiacomo.travaglini@arm.com 95113481Sgiacomo.travaglini@arm.com// Parses the command line for Google Test flags, without initializing 95213481Sgiacomo.travaglini@arm.com// other parts of Google Test. 95313481Sgiacomo.travaglini@arm.comGTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv); 95413481Sgiacomo.travaglini@arm.comGTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv); 95513481Sgiacomo.travaglini@arm.com 95613481Sgiacomo.travaglini@arm.com#if GTEST_HAS_DEATH_TEST 95713481Sgiacomo.travaglini@arm.com 95813481Sgiacomo.travaglini@arm.com// Returns the message describing the last system error, regardless of the 95913481Sgiacomo.travaglini@arm.com// platform. 96013481Sgiacomo.travaglini@arm.comGTEST_API_ std::string GetLastErrnoDescription(); 96113481Sgiacomo.travaglini@arm.com 96213481Sgiacomo.travaglini@arm.com// Attempts to parse a string into a positive integer pointed to by the 96313481Sgiacomo.travaglini@arm.com// number parameter. Returns true if that is possible. 96413481Sgiacomo.travaglini@arm.com// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use 96513481Sgiacomo.travaglini@arm.com// it here. 96613481Sgiacomo.travaglini@arm.comtemplate <typename Integer> 96713481Sgiacomo.travaglini@arm.combool ParseNaturalNumber(const ::std::string& str, Integer* number) { 96813481Sgiacomo.travaglini@arm.com // Fail fast if the given string does not begin with a digit; 96913481Sgiacomo.travaglini@arm.com // this bypasses strtoXXX's "optional leading whitespace and plus 97013481Sgiacomo.travaglini@arm.com // or minus sign" semantics, which are undesirable here. 97113481Sgiacomo.travaglini@arm.com if (str.empty() || !IsDigit(str[0])) { 97213481Sgiacomo.travaglini@arm.com return false; 97313481Sgiacomo.travaglini@arm.com } 97413481Sgiacomo.travaglini@arm.com errno = 0; 97513481Sgiacomo.travaglini@arm.com 97613481Sgiacomo.travaglini@arm.com char* end; 97713481Sgiacomo.travaglini@arm.com // BiggestConvertible is the largest integer type that system-provided 97813481Sgiacomo.travaglini@arm.com // string-to-number conversion routines can return. 97913481Sgiacomo.travaglini@arm.com 98013481Sgiacomo.travaglini@arm.com# if GTEST_OS_WINDOWS && !defined(__GNUC__) 98113481Sgiacomo.travaglini@arm.com 98213481Sgiacomo.travaglini@arm.com // MSVC and C++ Builder define __int64 instead of the standard long long. 98313481Sgiacomo.travaglini@arm.com typedef unsigned __int64 BiggestConvertible; 98413481Sgiacomo.travaglini@arm.com const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10); 98513481Sgiacomo.travaglini@arm.com 98613481Sgiacomo.travaglini@arm.com# else 98713481Sgiacomo.travaglini@arm.com 98813481Sgiacomo.travaglini@arm.com typedef unsigned long long BiggestConvertible; // NOLINT 98913481Sgiacomo.travaglini@arm.com const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10); 99013481Sgiacomo.travaglini@arm.com 99113481Sgiacomo.travaglini@arm.com# endif // GTEST_OS_WINDOWS && !defined(__GNUC__) 99213481Sgiacomo.travaglini@arm.com 99313481Sgiacomo.travaglini@arm.com const bool parse_success = *end == '\0' && errno == 0; 99413481Sgiacomo.travaglini@arm.com 99513481Sgiacomo.travaglini@arm.com // TODO(vladl@google.com): Convert this to compile time assertion when it is 99613481Sgiacomo.travaglini@arm.com // available. 99713481Sgiacomo.travaglini@arm.com GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed)); 99813481Sgiacomo.travaglini@arm.com 99913481Sgiacomo.travaglini@arm.com const Integer result = static_cast<Integer>(parsed); 100013481Sgiacomo.travaglini@arm.com if (parse_success && static_cast<BiggestConvertible>(result) == parsed) { 100113481Sgiacomo.travaglini@arm.com *number = result; 100213481Sgiacomo.travaglini@arm.com return true; 100313481Sgiacomo.travaglini@arm.com } 100413481Sgiacomo.travaglini@arm.com return false; 100513481Sgiacomo.travaglini@arm.com} 100613481Sgiacomo.travaglini@arm.com#endif // GTEST_HAS_DEATH_TEST 100713481Sgiacomo.travaglini@arm.com 100813481Sgiacomo.travaglini@arm.com// TestResult contains some private methods that should be hidden from 100913481Sgiacomo.travaglini@arm.com// Google Test user but are required for testing. This class allow our tests 101013481Sgiacomo.travaglini@arm.com// to access them. 101113481Sgiacomo.travaglini@arm.com// 101213481Sgiacomo.travaglini@arm.com// This class is supplied only for the purpose of testing Google Test's own 101313481Sgiacomo.travaglini@arm.com// constructs. Do not use it in user tests, either directly or indirectly. 101413481Sgiacomo.travaglini@arm.comclass TestResultAccessor { 101513481Sgiacomo.travaglini@arm.com public: 101613481Sgiacomo.travaglini@arm.com static void RecordProperty(TestResult* test_result, 101713481Sgiacomo.travaglini@arm.com const std::string& xml_element, 101813481Sgiacomo.travaglini@arm.com const TestProperty& property) { 101913481Sgiacomo.travaglini@arm.com test_result->RecordProperty(xml_element, property); 102013481Sgiacomo.travaglini@arm.com } 102113481Sgiacomo.travaglini@arm.com 102213481Sgiacomo.travaglini@arm.com static void ClearTestPartResults(TestResult* test_result) { 102313481Sgiacomo.travaglini@arm.com test_result->ClearTestPartResults(); 102413481Sgiacomo.travaglini@arm.com } 102513481Sgiacomo.travaglini@arm.com 102613481Sgiacomo.travaglini@arm.com static const std::vector<testing::TestPartResult>& test_part_results( 102713481Sgiacomo.travaglini@arm.com const TestResult& test_result) { 102813481Sgiacomo.travaglini@arm.com return test_result.test_part_results(); 102913481Sgiacomo.travaglini@arm.com } 103013481Sgiacomo.travaglini@arm.com}; 103113481Sgiacomo.travaglini@arm.com 103213481Sgiacomo.travaglini@arm.com#if GTEST_CAN_STREAM_RESULTS_ 103313481Sgiacomo.travaglini@arm.com 103413481Sgiacomo.travaglini@arm.com// Streams test results to the given port on the given host machine. 103513481Sgiacomo.travaglini@arm.comclass GTEST_API_ StreamingListener : public EmptyTestEventListener { 103613481Sgiacomo.travaglini@arm.com public: 103713481Sgiacomo.travaglini@arm.com // Abstract base class for writing strings to a socket. 103813481Sgiacomo.travaglini@arm.com class AbstractSocketWriter { 103913481Sgiacomo.travaglini@arm.com public: 104013481Sgiacomo.travaglini@arm.com virtual ~AbstractSocketWriter() {} 104113481Sgiacomo.travaglini@arm.com 104213481Sgiacomo.travaglini@arm.com // Sends a string to the socket. 104313481Sgiacomo.travaglini@arm.com virtual void Send(const string& message) = 0; 104413481Sgiacomo.travaglini@arm.com 104513481Sgiacomo.travaglini@arm.com // Closes the socket. 104613481Sgiacomo.travaglini@arm.com virtual void CloseConnection() {} 104713481Sgiacomo.travaglini@arm.com 104813481Sgiacomo.travaglini@arm.com // Sends a string and a newline to the socket. 104913481Sgiacomo.travaglini@arm.com void SendLn(const string& message) { 105013481Sgiacomo.travaglini@arm.com Send(message + "\n"); 105113481Sgiacomo.travaglini@arm.com } 105213481Sgiacomo.travaglini@arm.com }; 105313481Sgiacomo.travaglini@arm.com 105413481Sgiacomo.travaglini@arm.com // Concrete class for actually writing strings to a socket. 105513481Sgiacomo.travaglini@arm.com class SocketWriter : public AbstractSocketWriter { 105613481Sgiacomo.travaglini@arm.com public: 105713481Sgiacomo.travaglini@arm.com SocketWriter(const string& host, const string& port) 105813481Sgiacomo.travaglini@arm.com : sockfd_(-1), host_name_(host), port_num_(port) { 105913481Sgiacomo.travaglini@arm.com MakeConnection(); 106013481Sgiacomo.travaglini@arm.com } 106113481Sgiacomo.travaglini@arm.com 106213481Sgiacomo.travaglini@arm.com virtual ~SocketWriter() { 106313481Sgiacomo.travaglini@arm.com if (sockfd_ != -1) 106413481Sgiacomo.travaglini@arm.com CloseConnection(); 106513481Sgiacomo.travaglini@arm.com } 106613481Sgiacomo.travaglini@arm.com 106713481Sgiacomo.travaglini@arm.com // Sends a string to the socket. 106813481Sgiacomo.travaglini@arm.com virtual void Send(const string& message) { 106913481Sgiacomo.travaglini@arm.com GTEST_CHECK_(sockfd_ != -1) 107013481Sgiacomo.travaglini@arm.com << "Send() can be called only when there is a connection."; 107113481Sgiacomo.travaglini@arm.com 107213481Sgiacomo.travaglini@arm.com const int len = static_cast<int>(message.length()); 107313481Sgiacomo.travaglini@arm.com if (write(sockfd_, message.c_str(), len) != len) { 107413481Sgiacomo.travaglini@arm.com GTEST_LOG_(WARNING) 107513481Sgiacomo.travaglini@arm.com << "stream_result_to: failed to stream to " 107613481Sgiacomo.travaglini@arm.com << host_name_ << ":" << port_num_; 107713481Sgiacomo.travaglini@arm.com } 107813481Sgiacomo.travaglini@arm.com } 107913481Sgiacomo.travaglini@arm.com 108013481Sgiacomo.travaglini@arm.com private: 108113481Sgiacomo.travaglini@arm.com // Creates a client socket and connects to the server. 108213481Sgiacomo.travaglini@arm.com void MakeConnection(); 108313481Sgiacomo.travaglini@arm.com 108413481Sgiacomo.travaglini@arm.com // Closes the socket. 108513481Sgiacomo.travaglini@arm.com void CloseConnection() { 108613481Sgiacomo.travaglini@arm.com GTEST_CHECK_(sockfd_ != -1) 108713481Sgiacomo.travaglini@arm.com << "CloseConnection() can be called only when there is a connection."; 108813481Sgiacomo.travaglini@arm.com 108913481Sgiacomo.travaglini@arm.com close(sockfd_); 109013481Sgiacomo.travaglini@arm.com sockfd_ = -1; 109113481Sgiacomo.travaglini@arm.com } 109213481Sgiacomo.travaglini@arm.com 109313481Sgiacomo.travaglini@arm.com int sockfd_; // socket file descriptor 109413481Sgiacomo.travaglini@arm.com const string host_name_; 109513481Sgiacomo.travaglini@arm.com const string port_num_; 109613481Sgiacomo.travaglini@arm.com 109713481Sgiacomo.travaglini@arm.com GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter); 109813481Sgiacomo.travaglini@arm.com }; // class SocketWriter 109913481Sgiacomo.travaglini@arm.com 110013481Sgiacomo.travaglini@arm.com // Escapes '=', '&', '%', and '\n' characters in str as "%xx". 110113481Sgiacomo.travaglini@arm.com static string UrlEncode(const char* str); 110213481Sgiacomo.travaglini@arm.com 110313481Sgiacomo.travaglini@arm.com StreamingListener(const string& host, const string& port) 110413481Sgiacomo.travaglini@arm.com : socket_writer_(new SocketWriter(host, port)) { Start(); } 110513481Sgiacomo.travaglini@arm.com 110613481Sgiacomo.travaglini@arm.com explicit StreamingListener(AbstractSocketWriter* socket_writer) 110713481Sgiacomo.travaglini@arm.com : socket_writer_(socket_writer) { Start(); } 110813481Sgiacomo.travaglini@arm.com 110913481Sgiacomo.travaglini@arm.com void OnTestProgramStart(const UnitTest& /* unit_test */) { 111013481Sgiacomo.travaglini@arm.com SendLn("event=TestProgramStart"); 111113481Sgiacomo.travaglini@arm.com } 111213481Sgiacomo.travaglini@arm.com 111313481Sgiacomo.travaglini@arm.com void OnTestProgramEnd(const UnitTest& unit_test) { 111413481Sgiacomo.travaglini@arm.com // Note that Google Test current only report elapsed time for each 111513481Sgiacomo.travaglini@arm.com // test iteration, not for the entire test program. 111613481Sgiacomo.travaglini@arm.com SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed())); 111713481Sgiacomo.travaglini@arm.com 111813481Sgiacomo.travaglini@arm.com // Notify the streaming server to stop. 111913481Sgiacomo.travaglini@arm.com socket_writer_->CloseConnection(); 112013481Sgiacomo.travaglini@arm.com } 112113481Sgiacomo.travaglini@arm.com 112213481Sgiacomo.travaglini@arm.com void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) { 112313481Sgiacomo.travaglini@arm.com SendLn("event=TestIterationStart&iteration=" + 112413481Sgiacomo.travaglini@arm.com StreamableToString(iteration)); 112513481Sgiacomo.travaglini@arm.com } 112613481Sgiacomo.travaglini@arm.com 112713481Sgiacomo.travaglini@arm.com void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) { 112813481Sgiacomo.travaglini@arm.com SendLn("event=TestIterationEnd&passed=" + 112913481Sgiacomo.travaglini@arm.com FormatBool(unit_test.Passed()) + "&elapsed_time=" + 113013481Sgiacomo.travaglini@arm.com StreamableToString(unit_test.elapsed_time()) + "ms"); 113113481Sgiacomo.travaglini@arm.com } 113213481Sgiacomo.travaglini@arm.com 113313481Sgiacomo.travaglini@arm.com void OnTestCaseStart(const TestCase& test_case) { 113413481Sgiacomo.travaglini@arm.com SendLn(std::string("event=TestCaseStart&name=") + test_case.name()); 113513481Sgiacomo.travaglini@arm.com } 113613481Sgiacomo.travaglini@arm.com 113713481Sgiacomo.travaglini@arm.com void OnTestCaseEnd(const TestCase& test_case) { 113813481Sgiacomo.travaglini@arm.com SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed()) 113913481Sgiacomo.travaglini@arm.com + "&elapsed_time=" + StreamableToString(test_case.elapsed_time()) 114013481Sgiacomo.travaglini@arm.com + "ms"); 114113481Sgiacomo.travaglini@arm.com } 114213481Sgiacomo.travaglini@arm.com 114313481Sgiacomo.travaglini@arm.com void OnTestStart(const TestInfo& test_info) { 114413481Sgiacomo.travaglini@arm.com SendLn(std::string("event=TestStart&name=") + test_info.name()); 114513481Sgiacomo.travaglini@arm.com } 114613481Sgiacomo.travaglini@arm.com 114713481Sgiacomo.travaglini@arm.com void OnTestEnd(const TestInfo& test_info) { 114813481Sgiacomo.travaglini@arm.com SendLn("event=TestEnd&passed=" + 114913481Sgiacomo.travaglini@arm.com FormatBool((test_info.result())->Passed()) + 115013481Sgiacomo.travaglini@arm.com "&elapsed_time=" + 115113481Sgiacomo.travaglini@arm.com StreamableToString((test_info.result())->elapsed_time()) + "ms"); 115213481Sgiacomo.travaglini@arm.com } 115313481Sgiacomo.travaglini@arm.com 115413481Sgiacomo.travaglini@arm.com void OnTestPartResult(const TestPartResult& test_part_result) { 115513481Sgiacomo.travaglini@arm.com const char* file_name = test_part_result.file_name(); 115613481Sgiacomo.travaglini@arm.com if (file_name == NULL) 115713481Sgiacomo.travaglini@arm.com file_name = ""; 115813481Sgiacomo.travaglini@arm.com SendLn("event=TestPartResult&file=" + UrlEncode(file_name) + 115913481Sgiacomo.travaglini@arm.com "&line=" + StreamableToString(test_part_result.line_number()) + 116013481Sgiacomo.travaglini@arm.com "&message=" + UrlEncode(test_part_result.message())); 116113481Sgiacomo.travaglini@arm.com } 116213481Sgiacomo.travaglini@arm.com 116313481Sgiacomo.travaglini@arm.com private: 116413481Sgiacomo.travaglini@arm.com // Sends the given message and a newline to the socket. 116513481Sgiacomo.travaglini@arm.com void SendLn(const string& message) { socket_writer_->SendLn(message); } 116613481Sgiacomo.travaglini@arm.com 116713481Sgiacomo.travaglini@arm.com // Called at the start of streaming to notify the receiver what 116813481Sgiacomo.travaglini@arm.com // protocol we are using. 116913481Sgiacomo.travaglini@arm.com void Start() { SendLn("gtest_streaming_protocol_version=1.0"); } 117013481Sgiacomo.travaglini@arm.com 117113481Sgiacomo.travaglini@arm.com string FormatBool(bool value) { return value ? "1" : "0"; } 117213481Sgiacomo.travaglini@arm.com 117313481Sgiacomo.travaglini@arm.com const scoped_ptr<AbstractSocketWriter> socket_writer_; 117413481Sgiacomo.travaglini@arm.com 117513481Sgiacomo.travaglini@arm.com GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener); 117613481Sgiacomo.travaglini@arm.com}; // class StreamingListener 117713481Sgiacomo.travaglini@arm.com 117813481Sgiacomo.travaglini@arm.com#endif // GTEST_CAN_STREAM_RESULTS_ 117913481Sgiacomo.travaglini@arm.com 118013481Sgiacomo.travaglini@arm.com} // namespace internal 118113481Sgiacomo.travaglini@arm.com} // namespace testing 118213481Sgiacomo.travaglini@arm.com 118313481Sgiacomo.travaglini@arm.com#endif // GTEST_SRC_GTEST_INTERNAL_INL_H_ 1184