34#ifndef GOOGLETEST_SRC_GTEST_INTERNAL_INL_H_
35#define GOOGLETEST_SRC_GTEST_INTERNAL_INL_H_
50#include "gtest/internal/gtest-port.h"
52#if GTEST_CAN_STREAM_RESULTS_
61#include "gtest/gtest-spi.h"
62#include "gtest/gtest.h"
72GTEST_DECLARE_bool_(death_test_use_fork);
107GTEST_API_
bool ParseFlag(
const char* str,
const char* flag, int32_t* value);
112 const unsigned int raw_seed =
114 :
static_cast<unsigned int>(random_seed_flag);
118 const int normalized_seed =
119 static_cast<int>((raw_seed - 1U) %
122 return normalized_seed;
130 <<
"Invalid random seed " << seed <<
" - must be in [1, "
132 const int next_seed = seed + 1;
142 also_run_disabled_tests_ = GTEST_FLAG_GET(also_run_disabled_tests);
143 break_on_failure_ = GTEST_FLAG_GET(break_on_failure);
144 catch_exceptions_ = GTEST_FLAG_GET(catch_exceptions);
145 color_ = GTEST_FLAG_GET(color);
146 death_test_style_ = GTEST_FLAG_GET(death_test_style);
147 death_test_use_fork_ = GTEST_FLAG_GET(death_test_use_fork);
148 fail_fast_ = GTEST_FLAG_GET(fail_fast);
149 filter_ = GTEST_FLAG_GET(filter);
150 internal_run_death_test_ = GTEST_FLAG_GET(internal_run_death_test);
151 list_tests_ = GTEST_FLAG_GET(list_tests);
152 output_ = GTEST_FLAG_GET(output);
153 brief_ = GTEST_FLAG_GET(brief);
154 print_time_ = GTEST_FLAG_GET(print_time);
155 print_utf8_ = GTEST_FLAG_GET(print_utf8);
156 random_seed_ = GTEST_FLAG_GET(random_seed);
157 repeat_ = GTEST_FLAG_GET(repeat);
158 recreate_environments_when_repeating_ =
159 GTEST_FLAG_GET(recreate_environments_when_repeating);
160 shuffle_ = GTEST_FLAG_GET(shuffle);
161 stack_trace_depth_ = GTEST_FLAG_GET(stack_trace_depth);
162 stream_result_to_ = GTEST_FLAG_GET(stream_result_to);
163 throw_on_failure_ = GTEST_FLAG_GET(throw_on_failure);
168 GTEST_FLAG_SET(also_run_disabled_tests, also_run_disabled_tests_);
169 GTEST_FLAG_SET(break_on_failure, break_on_failure_);
170 GTEST_FLAG_SET(catch_exceptions, catch_exceptions_);
171 GTEST_FLAG_SET(color, color_);
172 GTEST_FLAG_SET(death_test_style, death_test_style_);
173 GTEST_FLAG_SET(death_test_use_fork, death_test_use_fork_);
174 GTEST_FLAG_SET(filter, filter_);
175 GTEST_FLAG_SET(fail_fast, fail_fast_);
176 GTEST_FLAG_SET(internal_run_death_test, internal_run_death_test_);
177 GTEST_FLAG_SET(list_tests, list_tests_);
178 GTEST_FLAG_SET(output, output_);
179 GTEST_FLAG_SET(brief, brief_);
180 GTEST_FLAG_SET(print_time, print_time_);
181 GTEST_FLAG_SET(print_utf8, print_utf8_);
182 GTEST_FLAG_SET(random_seed, random_seed_);
183 GTEST_FLAG_SET(repeat, repeat_);
184 GTEST_FLAG_SET(recreate_environments_when_repeating,
185 recreate_environments_when_repeating_);
186 GTEST_FLAG_SET(shuffle, shuffle_);
187 GTEST_FLAG_SET(stack_trace_depth, stack_trace_depth_);
188 GTEST_FLAG_SET(stream_result_to, stream_result_to_);
189 GTEST_FLAG_SET(throw_on_failure, throw_on_failure_);
194 bool also_run_disabled_tests_;
195 bool break_on_failure_;
196 bool catch_exceptions_;
198 std::string death_test_style_;
199 bool death_test_use_fork_;
202 std::string internal_run_death_test_;
208 int32_t random_seed_;
210 bool recreate_environments_when_repeating_;
212 int32_t stack_trace_depth_;
213 std::string stream_result_to_;
214 bool throw_on_failure_;
215} GTEST_ATTRIBUTE_UNUSED_;
223GTEST_API_ std::string CodePointToUtf8(uint32_t code_point);
238GTEST_API_ std::string WideStringToUtf8(
const wchar_t* str,
int num_chars);
244void WriteToShardStatusFileIfNeeded();
252GTEST_API_
bool ShouldShard(
const char* total_shards_str,
253 const char* shard_index_str,
254 bool in_subprocess_for_death_test);
259GTEST_API_ int32_t Int32FromEnvOrDie(
const char* env_var, int32_t default_val);
265GTEST_API_
bool ShouldRunTestOnShard(
int total_shards,
int shard_index,
272template <
class Container,
typename Predicate>
273inline int CountIf(
const Container& c, Predicate predicate) {
277 for (
auto it = c.begin(); it != c.end(); ++it) {
278 if (predicate(*it)) ++count;
273inline int CountIf(
const Container& c, Predicate predicate) {
…}
284template <
class Container,
typename Functor>
285void ForEach(
const Container& c, Functor functor) {
286 std::for_each(c.begin(), c.end(), functor);
285void ForEach(
const Container& c, Functor functor) {
…}
292inline E GetElementOr(
const std::vector<E>& v,
int i, E default_value) {
293 return (i < 0 || i >=
static_cast<int>(v.size())) ? default_value
294 : v[
static_cast<size_t>(i)];
292inline E GetElementOr(
const std::vector<E>& v,
int i, E default_value) {
…}
304 const int size =
static_cast<int>(v->size());
305 GTEST_CHECK_(0 <= begin && begin <= size)
306 <<
"Invalid shuffle range start " << begin <<
": must be in range [0, "
308 GTEST_CHECK_(begin <= end && end <= size)
309 <<
"Invalid shuffle range finish " << end <<
": must be in range ["
310 << begin <<
", " << size <<
"].";
314 for (
int range_width = end - begin; range_width >= 2; range_width--) {
315 const int last_in_range = begin + range_width - 1;
318 static_cast<int>(random->Generate(
static_cast<uint32_t
>(range_width)));
319 std::swap((*v)[
static_cast<size_t>(selected)],
320 (*v)[
static_cast<size_t>(last_in_range)]);
326inline void Shuffle(internal::Random* random, std::vector<E>* v) {
327 ShuffleRange(random, 0,
static_cast<int>(v->size()), v);
326inline void Shuffle(internal::Random* random, std::vector<E>* v) {
…}
349 return test_property.key() == key_;
371 static std::string GetOutputFormat();
376 static std::string GetAbsolutePathToOutputFile();
382 static bool FilterMatchesTest(
const std::string& test_suite_name,
383 const std::string& test_name);
391 static int GTestShouldProcessSEH(DWORD exception_code);
396 static bool MatchesFilter(
const std::string& name,
const char* filter);
437 std::string CurrentStackTrace(
int max_depth,
int skip_count)
override;
438 void UponLeavingGTest()
override;
448 void* caller_frame_ =
nullptr;
465 :
public TestPartResultReporterInterface {
470 void ReportTestPartResult(
const TestPartResult& result)
override;
484 :
public TestPartResultReporterInterface {
489 void ReportTestPartResult(
const TestPartResult& result)
override;
517 TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
520 void SetGlobalTestPartResultReporter(
521 TestPartResultReporterInterface* reporter);
524 TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
527 void SetTestPartResultReporterForCurrentThread(
528 TestPartResultReporterInterface* reporter);
531 int successful_test_suite_count()
const;
534 int failed_test_suite_count()
const;
537 int total_test_suite_count()
const;
541 int test_suite_to_run_count()
const;
544 int successful_test_count()
const;
547 int skipped_test_count()
const;
550 int failed_test_count()
const;
553 int reportable_disabled_test_count()
const;
556 int disabled_test_count()
const;
559 int reportable_test_count()
const;
562 int total_test_count()
const;
565 int test_to_run_count()
const;
576 bool Passed()
const {
return !Failed(); }
581 return failed_test_suite_count() > 0 || ad_hoc_test_result()->Failed();
587 const int index = GetElementOr(test_suite_indices_, i, -1);
588 return index < 0 ? nullptr : test_suites_[static_cast<size_t>(i)];
592#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
593 const TestCase*
GetTestCase(
int i)
const {
return GetTestSuite(i); }
599 const int index = GetElementOr(test_suite_indices_, i, -1);
600 return index < 0 ? nullptr : test_suites_[static_cast<size_t>(index)];
608 TestResult* current_test_result();
635 std::string CurrentOsStackTraceExceptTop(
int skip_count)
636 GTEST_NO_INLINE_ GTEST_NO_TAIL_CALL_;
648 TestSuite* GetTestSuite(
const char* test_suite_name,
const char* type_param,
649 internal::SetUpTestSuiteFunc set_up_tc,
650 internal::TearDownTestSuiteFunc tear_down_tc);
653#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
654 TestCase*
GetTestCase(
const char* test_case_name,
const char* type_param,
655 internal::SetUpTestSuiteFunc set_up_tc,
656 internal::TearDownTestSuiteFunc tear_down_tc) {
657 return GetTestSuite(test_case_name, type_param, set_up_tc, tear_down_tc);
654 TestCase*
GetTestCase(
const char* test_case_name,
const char* type_param, {
…}
669 internal::TearDownTestSuiteFunc tear_down_tc,
670 TestInfo* test_info) {
671#if GTEST_HAS_DEATH_TEST
679 if (original_working_dir_.IsEmpty()) {
680 original_working_dir_.Set(FilePath::GetCurrentDir());
681 GTEST_CHECK_(!original_working_dir_.IsEmpty())
682 <<
"Failed to get the current working directory.";
686 GetTestSuite(test_info->test_suite_name(), test_info->type_param(),
687 set_up_tc, tear_down_tc)
688 ->AddTestInfo(test_info);
694 return parameterized_test_registry_;
698 return &ignored_parameterized_test_suites_;
703 internal::TypeParameterizedTestSuiteRegistry&
705 return type_parameterized_test_registry_;
710 current_test_suite_ = a_current_test_suite;
717 current_test_info_ = a_current_test_info;
726 void RegisterParameterizedTests();
736 ForEach(test_suites_, TestSuite::ClearTestSuiteResult);
746 void RecordProperty(
const TestProperty& test_property);
756 int FilterTests(ReactionToSharding shard_tests);
759 void ListTestsMatchingFilter();
771 return *(gtest_trace_stack_.pointer());
774 return gtest_trace_stack_.get();
777#if GTEST_HAS_DEATH_TEST
778 void InitDeathTestSubprocessControlInfo() {
779 internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
785 const InternalRunDeathTestFlag* internal_run_death_test_flag()
const {
786 return internal_run_death_test_flag_.get();
790 internal::DeathTestFactory* death_test_factory() {
791 return death_test_factory_.get();
794 void SuppressTestEventsIfInSubprocess();
796 friend class ReplaceDeathTestFactory;
801 void ConfigureXmlOutput();
803#if GTEST_CAN_STREAM_RESULTS_
806 void ConfigureStreamingOutput();
814 void PostFlagParsingInit();
820 internal::Random*
random() {
return &random_; }
827 void UnshuffleTests();
834 friend class ::testing::UnitTest;
838 void set_catch_exceptions(
bool value) { catch_exceptions_ = value; }
841 UnitTest*
const parent_;
845 internal::FilePath original_working_dir_;
850 default_per_thread_test_part_result_reporter_;
853 TestPartResultReporterInterface* global_test_part_result_repoter_;
856 internal::Mutex global_test_part_result_reporter_mutex_;
859 internal::ThreadLocal<TestPartResultReporterInterface*>
860 per_thread_test_part_result_reporter_;
864 std::vector<Environment*> environments_;
868 std::vector<TestSuite*> test_suites_;
874 std::vector<int> test_suite_indices_;
878 internal::ParameterizedTestSuiteRegistry parameterized_test_registry_;
879 internal::TypeParameterizedTestSuiteRegistry
880 type_parameterized_test_registry_;
884 std::set<std::string> ignored_parameterized_test_suites_;
887 bool parameterized_tests_registered_;
890 int last_death_test_suite_;
896 TestSuite* current_test_suite_;
902 TestInfo* current_test_info_;
912 TestResult ad_hoc_test_result_;
916 TestEventListeners listeners_;
925 bool post_flag_parse_init_performed_;
931 internal::Random random_;
935 TimeInMillis start_timestamp_;
938 TimeInMillis elapsed_time_;
940#if GTEST_HAS_DEATH_TEST
943 std::unique_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
944 std::unique_ptr<internal::DeathTestFactory> death_test_factory_;
948 internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;
952 bool catch_exceptions_;
961 return UnitTest::GetInstance()->impl();
964#if GTEST_USES_SIMPLE_RE
968GTEST_API_
bool IsInSet(
char ch,
const char* str);
969GTEST_API_
bool IsAsciiDigit(
char ch);
970GTEST_API_
bool IsAsciiPunct(
char ch);
971GTEST_API_
bool IsRepeat(
char ch);
972GTEST_API_
bool IsAsciiWhiteSpace(
char ch);
973GTEST_API_
bool IsAsciiWordChar(
char ch);
974GTEST_API_
bool IsValidEscape(
char ch);
975GTEST_API_
bool AtomMatchesChar(
bool escaped,
char pattern,
char ch);
976GTEST_API_
bool ValidateRegex(
const char* regex);
977GTEST_API_
bool MatchRegexAtHead(
const char* regex,
const char* str);
978GTEST_API_
bool MatchRepetitionAndRegexAtHead(
bool escaped,
char ch,
979 char repeat,
const char* regex,
981GTEST_API_
bool MatchRegexAnywhere(
const char* regex,
const char* str);
987GTEST_API_
void ParseGoogleTestFlagsOnly(
int* argc,
char** argv);
988GTEST_API_
void ParseGoogleTestFlagsOnly(
int* argc,
wchar_t** argv);
990#if GTEST_HAS_DEATH_TEST
994GTEST_API_ std::string GetLastErrnoDescription();
1000template <
typename Integer>
1001bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
1005 if (str.empty() || !IsDigit(str[0])) {
1013 using BiggestConvertible =
unsigned long long;
1015 const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
1016 const bool parse_success = *end ==
'\0' && errno == 0;
1018 GTEST_CHECK_(
sizeof(Integer) <=
sizeof(parsed));
1020 const Integer result =
static_cast<Integer
>(parsed);
1021 if (parse_success &&
static_cast<BiggestConvertible
>(result) == parsed) {
1038 const std::string& xml_element,
1039 const TestProperty& property) {
1040 test_result->RecordProperty(xml_element, property);
1044 test_result->ClearTestPartResults();
1048 const TestResult& test_result) {
1049 return test_result.test_part_results();
1053#if GTEST_CAN_STREAM_RESULTS_
1056class StreamingListener :
public EmptyTestEventListener {
1059 class AbstractSocketWriter {
1061 virtual ~AbstractSocketWriter() {}
1064 virtual void Send(
const std::string& message) = 0;
1067 virtual void CloseConnection() {}
1070 void SendLn(
const std::string& message) { Send(message +
"\n"); }
1074 class SocketWriter :
public AbstractSocketWriter {
1076 SocketWriter(
const std::string& host,
const std::string& port)
1077 : sockfd_(-1), host_name_(host), port_num_(port) {
1081 ~SocketWriter()
override {
1082 if (sockfd_ != -1) CloseConnection();
1086 void Send(
const std::string& message)
override {
1087 GTEST_CHECK_(sockfd_ != -1)
1088 <<
"Send() can be called only when there is a connection.";
1090 const auto len =
static_cast<size_t>(message.length());
1091 if (write(sockfd_, message.c_str(), len) !=
static_cast<ssize_t
>(len)) {
1092 GTEST_LOG_(WARNING) <<
"stream_result_to: failed to stream to "
1093 << host_name_ <<
":" << port_num_;
1099 void MakeConnection();
1102 void CloseConnection()
override {
1103 GTEST_CHECK_(sockfd_ != -1)
1104 <<
"CloseConnection() can be called only when there is a connection.";
1111 const std::string host_name_;
1112 const std::string port_num_;
1114 SocketWriter(
const SocketWriter&) =
delete;
1115 SocketWriter& operator=(
const SocketWriter&) =
delete;
1119 static std::string UrlEncode(
const char* str);
1121 StreamingListener(
const std::string& host,
const std::string& port)
1122 : socket_writer_(new SocketWriter(host, port)) {
1126 explicit StreamingListener(AbstractSocketWriter* socket_writer)
1127 : socket_writer_(socket_writer) {
1131 void OnTestProgramStart(
const UnitTest& )
override {
1132 SendLn(
"event=TestProgramStart");
1135 void OnTestProgramEnd(
const UnitTest& unit_test)
override {
1138 SendLn(
"event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed()));
1141 socket_writer_->CloseConnection();
1144 void OnTestIterationStart(
const UnitTest& ,
1145 int iteration)
override {
1146 SendLn(
"event=TestIterationStart&iteration=" +
1147 StreamableToString(iteration));
1150 void OnTestIterationEnd(
const UnitTest& unit_test,
1152 SendLn(
"event=TestIterationEnd&passed=" + FormatBool(unit_test.Passed()) +
1153 "&elapsed_time=" + StreamableToString(unit_test.elapsed_time()) +
1159 void OnTestSuiteStart(
const TestSuite& test_suite)
override {
1160 SendLn(std::string(
"event=TestCaseStart&name=") + test_suite.name());
1165 void OnTestSuiteEnd(
const TestSuite& test_suite)
override {
1166 SendLn(
"event=TestCaseEnd&passed=" + FormatBool(test_suite.Passed()) +
1167 "&elapsed_time=" + StreamableToString(test_suite.elapsed_time()) +
1171 void OnTestStart(
const TestInfo& test_info)
override {
1172 SendLn(std::string(
"event=TestStart&name=") + test_info.name());
1175 void OnTestEnd(
const TestInfo& test_info)
override {
1176 SendLn(
"event=TestEnd&passed=" +
1177 FormatBool((test_info.result())->Passed()) +
"&elapsed_time=" +
1178 StreamableToString((test_info.result())->elapsed_time()) +
"ms");
1181 void OnTestPartResult(
const TestPartResult& test_part_result)
override {
1182 const char* file_name = test_part_result.file_name();
1183 if (file_name ==
nullptr) file_name =
"";
1184 SendLn(
"event=TestPartResult&file=" + UrlEncode(file_name) +
1185 "&line=" + StreamableToString(test_part_result.line_number()) +
1186 "&message=" + UrlEncode(test_part_result.message()));
1191 void SendLn(
const std::string& message) { socket_writer_->SendLn(message); }
1195 void Start() { SendLn(
"gtest_streaming_protocol_version=1.0"); }
1197 std::string FormatBool(
bool value) {
return value ?
"1" :
"0"; }
1199 const std::unique_ptr<AbstractSocketWriter> socket_writer_;
1201 StreamingListener(
const StreamingListener&) =
delete;
1202 StreamingListener& operator=(
const StreamingListener&) =
delete;
1210GTEST_DISABLE_MSC_WARNINGS_POP_()
virtual std::string CurrentStackTrace(int max_depth, int skip_count)=0
virtual ~OsStackTraceGetterInterface()
static const char *const kElidedFramesMarker
virtual void UponLeavingGTest()=0
OsStackTraceGetterInterface()
TestPropertyKeyIs(const std::string &key)
bool operator()(const TestProperty &test_property) const
static void ClearTestPartResults(TestResult *test_result)
static const std::vector< testing::TestPartResult > & test_part_results(const TestResult &test_result)
static void RecordProperty(TestResult *test_result, const std::string &xml_element, const TestProperty &property)
internal::ParameterizedTestSuiteRegistry & parameterized_test_registry()
const std::vector< TraceInfo > & gtest_trace_stack() const
internal::Random * random()
TestEventListeners * listeners()
const TestSuite * current_test_suite() const
TimeInMillis elapsed_time() const
TestSuite * GetMutableSuiteCase(int i)
std::set< std::string > * ignored_parameterized_test_suites()
const TestResult * ad_hoc_test_result() const
void ClearNonAdHocTestResult()
bool catch_exceptions() const
void AddTestInfo(internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc, TestInfo *test_info)
TestInfo * current_test_info()
const TestInfo * current_test_info() const
void set_current_test_info(TestInfo *a_current_test_info)
TimeInMillis start_timestamp() const
void set_current_test_suite(TestSuite *a_current_test_suite)
const TestCase * GetTestCase(int i) const
std::vector< Environment * > & environments()
internal::TypeParameterizedTestSuiteRegistry & type_parameterized_test_registry()
void ClearAdHocTestResult()
std::vector< TraceInfo > & gtest_trace_stack()
@ HONOR_SHARDING_PROTOCOL
const TestSuite * GetTestSuite(int i) const
TestCase * GetTestCase(const char *test_case_name, const char *type_param, internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc)
GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251) GTEST_DECLARE_bool_(death_test_use_fork)
void ShuffleRange(internal::Random *random, int begin, int end, std::vector< E > *v)
int GetRandomSeedFromFlag(int32_t random_seed_flag)
GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms)
int GetNextRandomSeed(int seed)
GTEST_API_ FilePath GetCurrentExecutableName()
GTEST_API_ bool ParseFlag(const char *str, const char *flag, int32_t *value)
GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms)
GTEST_API_ bool g_help_flag
GTEST_API_ bool ShouldUseColor(bool stdout_is_tty)
GTEST_API_ const TypeId kTestTypeIdInGoogleTest
GTEST_API_ TimeInMillis GetTimeInMillis()