34#ifndef GOOGLETEST_SRC_GTEST_INTERNAL_INL_H_
35#define GOOGLETEST_SRC_GTEST_INTERNAL_INL_H_
53#if GTEST_CAN_STREAM_RESULTS_
58#ifdef GTEST_OS_WINDOWS
83const int kMaxRandomSeed = 99999;
93GTEST_API_ bool ShouldUseColor(
bool stdout_is_tty);
109GTEST_API_ bool ParseFlag(
const char* str,
const char* flag, int32_t*
value);
113inline int GetRandomSeedFromFlag(int32_t random_seed_flag) {
114 const unsigned int raw_seed =
115 (random_seed_flag == 0) ?
static_cast<unsigned int>(GetTimeInMillis())
116 :
static_cast<unsigned int>(random_seed_flag);
120 const int normalized_seed =
121 static_cast<int>((raw_seed - 1U) %
122 static_cast<unsigned int>(kMaxRandomSeed)) +
124 return normalized_seed;
130inline int GetNextRandomSeed(
int seed) {
132 <<
"Invalid random seed " << seed <<
" - must be in [1, "
133 << kMaxRandomSeed <<
"].";
134 const int next_seed = seed + 1;
135 return (next_seed > kMaxRandomSeed) ? 1 : next_seed;
144 also_run_disabled_tests_ =
GTEST_FLAG_GET(also_run_disabled_tests);
152 internal_run_death_test_ =
GTEST_FLAG_GET(internal_run_death_test);
160 recreate_environments_when_repeating_ =
170 GTEST_FLAG_SET(also_run_disabled_tests, also_run_disabled_tests_);
178 GTEST_FLAG_SET(internal_run_death_test, internal_run_death_test_);
187 recreate_environments_when_repeating_);
196 bool also_run_disabled_tests_;
197 bool break_on_failure_;
198 bool catch_exceptions_;
200 std::string death_test_style_;
201 bool death_test_use_fork_;
204 std::string internal_run_death_test_;
210 int32_t random_seed_;
212 bool recreate_environments_when_repeating_;
214 int32_t stack_trace_depth_;
215 std::string stream_result_to_;
216 bool throw_on_failure_;
225GTEST_API_ std::string CodePointToUtf8(uint32_t code_point);
240GTEST_API_ std::string WideStringToUtf8(
const wchar_t* str,
int num_chars);
254GTEST_API_ bool ShouldShard(
const char* total_shards_str,
255 const char* shard_index_str,
256 bool in_subprocess_for_death_test);
261GTEST_API_ int32_t Int32FromEnvOrDie(
const char* env_var, int32_t default_val);
267GTEST_API_ bool ShouldRunTestOnShard(
int total_shards,
int shard_index,
274template <
class Container,
typename Predicate>
275inline int CountIf(
const Container& c, Predicate predicate) {
279 for (
auto it = c.begin(); it != c.end(); ++it) {
280 if (predicate(*it)) ++
count;
286template <
class Container,
typename Functor>
287void ForEach(
const Container& c, Functor functor) {
288 std::for_each(c.begin(), c.end(), functor);
294inline E GetElementOr(
const std::vector<E>& v,
int i, E default_value) {
295 return (
i < 0 || i >=
static_cast<int>(v.size())) ? default_value
296 : v[
static_cast<size_t>(
i)];
306 const int size =
static_cast<int>(v->size());
308 <<
"Invalid shuffle range start " << begin <<
": must be in range [0, "
311 <<
"Invalid shuffle range finish " << end <<
": must be in range ["
312 << begin <<
", " << size <<
"].";
316 for (
int range_width = end - begin; range_width >= 2; range_width--) {
317 const int last_in_range = begin + range_width - 1;
320 static_cast<int>(random->
Generate(
static_cast<uint32_t
>(range_width)));
321 std::swap((*v)[
static_cast<size_t>(selected)],
322 (*v)[
static_cast<size_t>(last_in_range)]);
329 ShuffleRange(random, 0,
static_cast<int>(v->size()), v);
351 return test_property.
key() == key_;
373 static std::string GetOutputFormat();
384 static bool FilterMatchesTest(
const std::string& test_suite_name,
385 const std::string& test_name);
387#ifdef GTEST_OS_WINDOWS
393 static int GTestProcessSEH(DWORD seh_code,
const char* location);
398 static bool MatchesFilter(
const std::string& name,
const char* filter);
401#if GTEST_HAS_FILE_SYSTEM
404GTEST_API_ FilePath GetCurrentExecutableName();
441 std::string CurrentStackTrace(
int max_depth,
int skip_count)
override;
442 void UponLeavingGTest()
override;
452 void* caller_frame_ =
nullptr;
469 :
public TestPartResultReporterInterface {
474 void ReportTestPartResult(
const TestPartResult& result)
override;
488 :
public TestPartResultReporterInterface {
493 void ReportTestPartResult(
const TestPartResult& result)
override;
521 TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
524 void SetGlobalTestPartResultReporter(
525 TestPartResultReporterInterface* reporter);
528 TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
531 void SetTestPartResultReporterForCurrentThread(
532 TestPartResultReporterInterface* reporter);
535 int successful_test_suite_count()
const;
538 int failed_test_suite_count()
const;
541 int total_test_suite_count()
const;
545 int test_suite_to_run_count()
const;
548 int successful_test_count()
const;
551 int skipped_test_count()
const;
554 int failed_test_count()
const;
557 int reportable_disabled_test_count()
const;
560 int disabled_test_count()
const;
563 int reportable_test_count()
const;
566 int total_test_count()
const;
569 int test_to_run_count()
const;
580 bool Passed()
const {
return !Failed(); }
585 return failed_test_suite_count() > 0 || ad_hoc_test_result()->Failed();
591 const int index = GetElementOr(test_suite_indices_,
i, -1);
592 return index < 0 ? nullptr : test_suites_[static_cast<size_t>(
i)];
596#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
603 const int index = GetElementOr(test_suite_indices_,
i, -1);
604 return index < 0 ? nullptr : test_suites_[static_cast<size_t>(index)];
639 std::string CurrentOsStackTraceExceptTop(
int skip_count)
652 TestSuite* GetTestSuite(
const char* test_suite_name,
const char* type_param,
657#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
661 return GetTestSuite(test_case_name, type_param, set_up_tc, tear_down_tc);
675#if GTEST_HAS_FILE_SYSTEM
686 <<
"Failed to get the current working directory.";
691 set_up_tc, tear_down_tc)
692 ->AddTestInfo(test_info);
698 return parameterized_test_registry_;
702 return &ignored_parameterized_test_suites_;
709 return type_parameterized_test_registry_;
714 current_test_suite_ = a_current_test_suite;
721 current_test_info_ = a_current_test_info;
730 void RegisterParameterizedTests();
740 ForEach(test_suites_, TestSuite::ClearTestSuiteResult);
760 int FilterTests(ReactionToSharding shard_tests);
763 void ListTestsMatchingFilter();
775 return *(gtest_trace_stack_.pointer());
778 return gtest_trace_stack_.get();
781#ifdef GTEST_HAS_DEATH_TEST
782 void InitDeathTestSubprocessControlInfo() {
783 internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
789 const InternalRunDeathTestFlag* internal_run_death_test_flag()
const {
790 return internal_run_death_test_flag_.get();
794 internal::DeathTestFactory* death_test_factory() {
795 return death_test_factory_.get();
798 void SuppressTestEventsIfInSubprocess();
800 friend class ReplaceDeathTestFactory;
805 void ConfigureXmlOutput();
807#if GTEST_CAN_STREAM_RESULTS_
810 void ConfigureStreamingOutput();
818 void PostFlagParsingInit();
831 void UnshuffleTests();
838 friend class ::testing::UnitTest;
842 void set_catch_exceptions(
bool value) { catch_exceptions_ =
value; }
847#if GTEST_HAS_FILE_SYSTEM
856 default_per_thread_test_part_result_reporter_;
859 TestPartResultReporterInterface* global_test_part_result_reporter_;
866 per_thread_test_part_result_reporter_;
870 std::vector<Environment*> environments_;
874 std::vector<TestSuite*> test_suites_;
880 std::vector<int> test_suite_indices_;
886 type_parameterized_test_registry_;
890 std::set<std::string> ignored_parameterized_test_suites_;
893 bool parameterized_tests_registered_;
896 int last_death_test_suite_;
931 bool post_flag_parse_init_performed_;
946#ifdef GTEST_HAS_DEATH_TEST
949 std::unique_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
950 std::unique_ptr<internal::DeathTestFactory> death_test_factory_;
958 bool catch_exceptions_;
967 return UnitTest::GetInstance()->impl();
970#ifdef GTEST_USES_SIMPLE_RE
981GTEST_API_ bool AtomMatchesChar(
bool escaped,
char pattern,
char ch);
982GTEST_API_ bool ValidateRegex(
const char* regex);
983GTEST_API_ bool MatchRegexAtHead(
const char* regex,
const char* str);
984GTEST_API_ bool MatchRepetitionAndRegexAtHead(
bool escaped,
char ch,
985 char repeat,
const char* regex,
987GTEST_API_ bool MatchRegexAnywhere(
const char* regex,
const char* str);
993GTEST_API_ void ParseGoogleTestFlagsOnly(
int* argc,
char** argv);
994GTEST_API_ void ParseGoogleTestFlagsOnly(
int* argc,
wchar_t** argv);
996#ifdef GTEST_HAS_DEATH_TEST
1000GTEST_API_ std::string GetLastErrnoDescription();
1006template <
typename Integer>
1007bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
1011 if (str.empty() || !IsDigit(str[0])) {
1019 using BiggestConvertible =
unsigned long long;
1021 const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
1022 const bool parse_success = *end ==
'\0' && errno == 0;
1026 const Integer result =
static_cast<Integer
>(parsed);
1027 if (parse_success &&
static_cast<BiggestConvertible
>(result) == parsed) {
1044 const std::string& xml_element,
1046 test_result->RecordProperty(xml_element, property);
1050 test_result->ClearTestPartResults();
1055 return test_result.test_part_results();
1059#if GTEST_CAN_STREAM_RESULTS_
1065 class AbstractSocketWriter {
1067 virtual ~AbstractSocketWriter() =
default;
1070 virtual void Send(
const std::string& message) = 0;
1073 virtual void CloseConnection() {}
1076 void SendLn(
const std::string& message) { Send(message +
"\n"); }
1080 class SocketWriter :
public AbstractSocketWriter {
1082 SocketWriter(
const std::string& host,
const std::string& port)
1083 : sockfd_(-1), host_name_(host), port_num_(port) {
1087 ~SocketWriter()
override {
1088 if (sockfd_ != -1) CloseConnection();
1092 void Send(
const std::string& message)
override {
1094 <<
"Send() can be called only when there is a connection.";
1096 const auto len =
static_cast<size_t>(
message.length());
1097 if (write(sockfd_,
message.c_str(), len) !=
static_cast<ssize_t
>(len)) {
1098 GTEST_LOG_(WARNING) <<
"stream_result_to: failed to stream to "
1099 << host_name_ <<
":" << port_num_;
1105 void MakeConnection();
1108 void CloseConnection()
override {
1110 <<
"CloseConnection() can be called only when there is a connection.";
1117 const std::string host_name_;
1118 const std::string port_num_;
1120 SocketWriter(
const SocketWriter&) =
delete;
1121 SocketWriter& operator=(
const SocketWriter&) =
delete;
1125 static std::string UrlEncode(
const char* str);
1127 StreamingListener(
const std::string& host,
const std::string& port)
1128 : socket_writer_(new SocketWriter(host, port)) {
1132 explicit StreamingListener(AbstractSocketWriter* socket_writer)
1133 : socket_writer_(socket_writer) {
1137 void OnTestProgramStart(
const UnitTest& )
override {
1138 SendLn(
"event=TestProgramStart");
1141 void OnTestProgramEnd(
const UnitTest& unit_test)
override {
1144 SendLn(
"event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed()));
1147 socket_writer_->CloseConnection();
1150 void OnTestIterationStart(
const UnitTest& ,
1151 int iteration)
override {
1152 SendLn(
"event=TestIterationStart&iteration=" +
1153 StreamableToString(iteration));
1156 void OnTestIterationEnd(
const UnitTest& unit_test,
1158 SendLn(
"event=TestIterationEnd&passed=" + FormatBool(unit_test.Passed()) +
1159 "&elapsed_time=" + StreamableToString(unit_test.elapsed_time()) +
1165 void OnTestSuiteStart(
const TestSuite& test_suite)
override {
1166 SendLn(std::string(
"event=TestCaseStart&name=") + test_suite.name());
1171 void OnTestSuiteEnd(
const TestSuite& test_suite)
override {
1172 SendLn(
"event=TestCaseEnd&passed=" + FormatBool(test_suite.Passed()) +
1173 "&elapsed_time=" + StreamableToString(test_suite.elapsed_time()) +
1177 void OnTestStart(
const TestInfo& test_info)
override {
1178 SendLn(std::string(
"event=TestStart&name=") + test_info.name());
1181 void OnTestEnd(
const TestInfo& test_info)
override {
1182 SendLn(
"event=TestEnd&passed=" +
1183 FormatBool((test_info.result())->Passed()) +
"&elapsed_time=" +
1184 StreamableToString((test_info.result())->elapsed_time()) +
"ms");
1187 void OnTestPartResult(
const TestPartResult& test_part_result)
override {
1188 const char* file_name = test_part_result.file_name();
1189 if (file_name ==
nullptr) file_name =
"";
1190 SendLn(
"event=TestPartResult&file=" + UrlEncode(file_name) +
1191 "&line=" + StreamableToString(test_part_result.line_number()) +
1192 "&message=" + UrlEncode(test_part_result.message()));
1197 void SendLn(
const std::string& message) { socket_writer_->SendLn(message); }
1201 void Start() { SendLn(
"gtest_streaming_protocol_version=1.0"); }
1203 std::string FormatBool(
bool value) {
return value ?
"1" :
"0"; }
1205 const std::unique_ptr<AbstractSocketWriter> socket_writer_;
1207 StreamingListener(
const StreamingListener&) =
delete;
1208 StreamingListener& operator=(
const StreamingListener&) =
delete;
const char * type_param() const
Definition gtest.h:553
const char * test_suite_name() const
Definition gtest.h:541
const char * key() const
Definition gtest.h:379
Definition gtest-internal-inl.h:469
Definition gtest-internal-inl.h:488
Definition gtest-internal-inl.h:140
~GTestFlagSaver()
Definition gtest-internal-inl.h:169
GTestFlagSaver()
Definition gtest-internal-inl.h:143
Definition gtest-port.h:1869
Definition gtest-internal-inl.h:408
virtual std::string CurrentStackTrace(int max_depth, int skip_count)=0
virtual ~OsStackTraceGetterInterface()=default
static const char *const kElidedFramesMarker
Definition gtest-internal-inl.h:428
OsStackTraceGetterInterface()=default
virtual void UponLeavingGTest()=0
Definition gtest-internal-inl.h:437
OsStackTraceGetter()=default
Definition gtest-param-util.h:692
Definition gtest-internal.h:855
uint32_t Generate(uint32_t range)
Definition gtest.cc:400
Definition gtest-internal-inl.h:342
TestPropertyKeyIs(const std::string &key)
Definition gtest-internal-inl.h:347
bool operator()(const TestProperty &test_property) const
Definition gtest-internal-inl.h:350
Definition gtest-internal-inl.h:1041
static void ClearTestPartResults(TestResult *test_result)
Definition gtest-internal-inl.h:1049
static const std::vector< testing::TestPartResult > & test_part_results(const TestResult &test_result)
Definition gtest-internal-inl.h:1053
static void RecordProperty(TestResult *test_result, const std::string &xml_element, const TestProperty &property)
Definition gtest-internal-inl.h:1043
Definition gtest-port.h:1895
Definition gtest-param-util.h:761
Definition gtest-internal-inl.h:508
internal::ParameterizedTestSuiteRegistry & parameterized_test_registry()
Definition gtest-internal-inl.h:697
const std::vector< TraceInfo > & gtest_trace_stack() const
Definition gtest-internal-inl.h:777
bool Failed() const
Definition gtest-internal-inl.h:584
internal::Random * random()
Definition gtest-internal-inl.h:824
TestEventListeners * listeners()
Definition gtest-internal-inl.h:608
const TestSuite * current_test_suite() const
Definition gtest-internal-inl.h:765
TimeInMillis elapsed_time() const
Definition gtest-internal-inl.h:576
TestSuite * GetMutableSuiteCase(int i)
Definition gtest-internal-inl.h:602
std::set< std::string > * ignored_parameterized_test_suites()
Definition gtest-internal-inl.h:701
int random_seed() const
Definition gtest-internal-inl.h:821
const TestResult * ad_hoc_test_result() const
Definition gtest-internal-inl.h:615
void ClearNonAdHocTestResult()
Definition gtest-internal-inl.h:739
bool catch_exceptions() const
Definition gtest-internal-inl.h:835
void AddTestInfo(internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc, TestInfo *test_info)
Definition gtest-internal-inl.h:672
TestInfo * current_test_info()
Definition gtest-internal-inl.h:766
const TestInfo * current_test_info() const
Definition gtest-internal-inl.h:767
void set_current_test_info(TestInfo *a_current_test_info)
Definition gtest-internal-inl.h:720
TimeInMillis start_timestamp() const
Definition gtest-internal-inl.h:573
void set_current_test_suite(TestSuite *a_current_test_suite)
Definition gtest-internal-inl.h:713
const TestCase * GetTestCase(int i) const
Definition gtest-internal-inl.h:597
std::vector< Environment * > & environments()
Definition gtest-internal-inl.h:771
internal::TypeParameterizedTestSuiteRegistry & type_parameterized_test_registry()
Definition gtest-internal-inl.h:708
void ClearAdHocTestResult()
Definition gtest-internal-inl.h:744
std::vector< TraceInfo > & gtest_trace_stack()
Definition gtest-internal-inl.h:774
ReactionToSharding
Definition gtest-internal-inl.h:752
@ HONOR_SHARDING_PROTOCOL
Definition gtest-internal-inl.h:752
bool Passed() const
Definition gtest-internal-inl.h:580
const TestSuite * GetTestSuite(int i) const
Definition gtest-internal-inl.h:590
TestCase * GetTestCase(const char *test_case_name, const char *type_param, internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc)
Definition gtest-internal-inl.h:658
Definition gtest-internal-inl.h:368
static std::string GetAbsolutePathToOutputFile()
int value
Definition gmock-actions_test.cc:1714
int i
Definition gmock-matchers-comparisons_test.cc:603
int x
Definition gmock-matchers-containers_test.cc:376
char ch
Definition gmock-matchers-containers_test.cc:384
int * count
Definition gmock_stress_test.cc:90
FilePath original_working_dir_
Definition googletest-options-test.cc:142
int RunAllTests()
Definition googletest-output-test_.cc:350
#define GTEST_DECLARE_bool_(name)
Definition gtest-port.h:2275
#define GTEST_NO_TAIL_CALL_
Definition gtest-port.h:864
#define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings)
Definition gtest-port.h:360
#define GTEST_LOG_(severity)
Definition gtest-port.h:1053
#define GTEST_NO_INLINE_
Definition gtest-port.h:853
#define GTEST_API_
Definition gtest-port.h:842
#define GTEST_FLAG_SET(name, value)
Definition gtest-port.h:2294
#define GTEST_DISABLE_MSC_WARNINGS_POP_()
Definition gtest-port.h:361
#define GTEST_CHECK_(condition)
Definition gtest-port.h:1078
#define GTEST_FLAG_GET(name)
Definition gtest-port.h:2293
str message
Definition googletest-output-test.py:377
void WriteToShardStatusFileIfNeeded()
static void Delete(T *x)
Definition gtest-internal-inl.h:335
int64_t TimeInMillis
Definition gtest-port.h:2219
GTEST_API_ bool g_help_flag
Definition gtest.cc:205
const void * TypeId
Definition gtest-internal.h:401
void(*)() SetUpTestSuiteFunc
Definition gtest-internal.h:474
void(*)() TearDownTestSuiteFunc
Definition gtest-internal.h:475
Definition gmock-actions.h:151
Definition gtest-internal-inl.h:460
std::string message
Definition gtest-internal-inl.h:463
const char * file
Definition gtest-internal-inl.h:461
int line
Definition gtest-internal-inl.h:462