109 #ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
110 #define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
130 INTERCEPT_ALL_THREADS
174 const string& substr);
211 #define EXPECT_FATAL_FAILURE(statement, substr) \
213 class GTestExpectFatalFailureHelper {\
215 static void Execute() { statement; }\
217 ::testing::TestPartResultArray gtest_failures;\
218 ::testing::internal::SingleFailureChecker gtest_checker(\
219 >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
221 ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
222 ::testing::ScopedFakeTestPartResultReporter:: \
223 INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\
224 GTestExpectFatalFailureHelper::Execute();\
226 } while (::testing::internal::AlwaysFalse())
228 #define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
230 class GTestExpectFatalFailureHelper {\
232 static void Execute() { statement; }\
234 ::testing::TestPartResultArray gtest_failures;\
235 ::testing::internal::SingleFailureChecker gtest_checker(\
236 >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
238 ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
239 ::testing::ScopedFakeTestPartResultReporter:: \
240 INTERCEPT_ALL_THREADS, >est_failures);\
241 GTestExpectFatalFailureHelper::Execute();\
243 } while (::testing::internal::AlwaysFalse())
277 #define EXPECT_NONFATAL_FAILURE(statement, substr) \
279 ::testing::TestPartResultArray gtest_failures;\
280 ::testing::internal::SingleFailureChecker gtest_checker(\
281 >est_failures, ::testing::TestPartResult::kNonFatalFailure, \
284 ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
285 ::testing::ScopedFakeTestPartResultReporter:: \
286 INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\
287 if (::testing::internal::AlwaysTrue()) { statement; }\
289 } while (::testing::internal::AlwaysFalse())
291 #define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
293 ::testing::TestPartResultArray gtest_failures;\
294 ::testing::internal::SingleFailureChecker gtest_checker(\
295 >est_failures, ::testing::TestPartResult::kNonFatalFailure, \
298 ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
299 ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \
301 if (::testing::internal::AlwaysTrue()) { statement; }\
303 } while (::testing::internal::AlwaysFalse())
305 #endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
327 # define GTEST_HAS_GETTIMEOFDAY_ 1
333 # include <strings.h>
334 # include <sys/mman.h>
335 # include <sys/time.h>
339 #elif GTEST_OS_SYMBIAN
340 # define GTEST_HAS_GETTIMEOFDAY_ 1
341 # include <sys/time.h>
344 # define GTEST_HAS_GETTIMEOFDAY_ 1
345 # include <sys/time.h>
348 # include <strings.h>
350 #elif GTEST_OS_WINDOWS_MOBILE // We are on Windows CE.
352 # include <windows.h>
354 #elif GTEST_OS_WINDOWS // We are on Windows proper.
357 # include <sys/timeb.h>
358 # include <sys/types.h>
359 # include <sys/stat.h>
361 # if GTEST_OS_WINDOWS_MINGW
368 # define GTEST_HAS_GETTIMEOFDAY_ 1
369 # include <sys/time.h>
370 # endif // GTEST_OS_WINDOWS_MINGW
374 # include <windows.h>
381 # define GTEST_HAS_GETTIMEOFDAY_ 1
385 # include <sys/time.h>
388 #endif // GTEST_OS_LINUX
390 #if GTEST_HAS_EXCEPTIONS
391 # include <stdexcept>
394 #if GTEST_CAN_STREAM_RESULTS_
395 # include <arpa/inet.h>
404 #define GTEST_IMPLEMENTATION_ 1
441 #ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
442 #define GTEST_SRC_GTEST_INTERNAL_INL_H_
446 #if !GTEST_IMPLEMENTATION_
448 # error "gtest-internal-inl.h is part of Google Test's internal implementation."
449 # error "It must not be included except by Google Test itself."
450 #endif // GTEST_IMPLEMENTATION_
454 #endif // !_WIN32_WCE
464 #if GTEST_CAN_STREAM_RESULTS_
465 # include <arpa/inet.h>
470 # include <windows.h>
471 #endif // GTEST_OS_WINDOWS
532 const char* str,
const char* flag,
Int32* value);
537 const unsigned int raw_seed = (random_seed_flag == 0) ?
539 static_cast<unsigned int>(random_seed_flag);
543 const int normalized_seed =
544 static_cast<int>((raw_seed - 1U) %
546 return normalized_seed;
554 <<
"Invalid random seed " << seed <<
" - must be in [1, "
556 const int next_seed = seed + 1;
663 const char* shard_index_str,
664 bool in_subprocess_for_death_test);
676 int total_shards,
int shard_index,
int test_id);
682 template <
class Container,
typename Predicate>
683 inline int CountIf(
const Container& c, Predicate predicate) {
687 for (
typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {
695 template <
class Container,
typename Functor>
696 void ForEach(
const Container& c, Functor functor) {
697 std::for_each(c.begin(), c.end(), functor);
702 template <
typename E>
703 inline E
GetElementOr(
const std::vector<E>& v,
int i, E default_value) {
704 return (i < 0 || i >=
static_cast<int>(v.size())) ?
default_value : v[i];
711 template <
typename E>
714 const int size =
static_cast<int>(v->size());
716 <<
"Invalid shuffle range start " << begin <<
": must be in range [0, "
719 <<
"Invalid shuffle range finish " << end <<
": must be in range ["
720 << begin <<
", " << size <<
"].";
724 for (
int range_width = end - begin; range_width >= 2; range_width--) {
725 const int last_in_range = begin + range_width - 1;
726 const int selected = begin + random->
Generate(range_width);
727 std::swap((*v)[selected], (*v)[last_in_range]);
732 template <
typename E>
734 ShuffleRange(random, 0,
static_cast<int>(v->size()), v);
739 template <
typename T>
756 return test_property.
key() ==
key_;
792 static bool PatternMatchesString(
const char *pattern,
const char *str);
796 static bool FilterMatchesTest(
const std::string &test_case_name,
805 static int GTestShouldProcessSEH(DWORD exception_code);
806 #endif // GTEST_OS_WINDOWS
810 static bool MatchesFilter(
const std::string& name,
const char* filter);
925 void SetGlobalTestPartResultReporter(
932 void SetTestPartResultReporterForCurrentThread(
936 int successful_test_case_count()
const;
939 int failed_test_case_count()
const;
942 int total_test_case_count()
const;
946 int test_case_to_run_count()
const;
949 int successful_test_count()
const;
952 int failed_test_count()
const;
955 int reportable_disabled_test_count()
const;
958 int disabled_test_count()
const;
961 int reportable_test_count()
const;
964 int total_test_count()
const;
967 int test_to_run_count()
const;
977 bool Passed()
const {
return !Failed(); }
982 return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();
988 const int index =
GetElementOr(test_case_indices_, i, -1);
989 return index < 0 ? NULL : test_cases_[i];
995 const int index =
GetElementOr(test_case_indices_, i, -1);
996 return index < 0 ? NULL : test_cases_[index];
1043 TestCase* GetTestCase(
const char* test_case_name,
1044 const char* type_param,
1065 if (original_working_dir_.IsEmpty()) {
1068 <<
"Failed to get the current working directory.";
1074 tear_down_tc)->AddTestInfo(test_info);
1077 #if GTEST_HAS_PARAM_TEST
1081 return parameterized_test_registry_;
1083 #endif // GTEST_HAS_PARAM_TEST
1087 current_test_case_ = a_current_test_case;
1094 current_test_info_ = a_current_test_info;
1103 void RegisterParameterizedTests();
1118 ad_hoc_test_result_.Clear();
1125 void RecordProperty(
const TestProperty& test_property);
1129 IGNORE_SHARDING_PROTOCOL
1138 int FilterTests(ReactionToSharding shard_tests);
1141 void ListTestsMatchingFilter();
1153 return *(gtest_trace_stack_.pointer());
1156 return gtest_trace_stack_.get();
1159 #if GTEST_HAS_DEATH_TEST
1160 void InitDeathTestSubprocessControlInfo() {
1161 internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
1167 const InternalRunDeathTestFlag* internal_run_death_test_flag()
const {
1168 return internal_run_death_test_flag_.get();
1172 internal::DeathTestFactory* death_test_factory() {
1173 return death_test_factory_.get();
1176 void SuppressTestEventsIfInSubprocess();
1178 friend class ReplaceDeathTestFactory;
1179 #endif // GTEST_HAS_DEATH_TEST
1183 void ConfigureXmlOutput();
1185 #if GTEST_CAN_STREAM_RESULTS_
1188 void ConfigureStreamingOutput();
1196 void PostFlagParsingInit();
1206 void ShuffleTests();
1209 void UnshuffleTests();
1216 friend class ::testing::UnitTest;
1258 #if GTEST_HAS_PARAM_TEST
1264 bool parameterized_tests_registered_;
1265 #endif // GTEST_HAS_PARAM_TEST
1318 #if GTEST_HAS_DEATH_TEST
1323 #endif // GTEST_HAS_DEATH_TEST
1341 #if GTEST_USES_SIMPLE_RE
1345 GTEST_API_ bool IsInSet(
char ch,
const char* str);
1352 GTEST_API_ bool AtomMatchesChar(
bool escaped,
char pattern,
char ch);
1353 GTEST_API_ bool ValidateRegex(
const char* regex);
1354 GTEST_API_ bool MatchRegexAtHead(
const char* regex,
const char* str);
1355 GTEST_API_ bool MatchRepetitionAndRegexAtHead(
1356 bool escaped,
char ch,
char repeat,
const char* regex,
const char* str);
1357 GTEST_API_ bool MatchRegexAnywhere(
const char* regex,
const char* str);
1359 #endif // GTEST_USES_SIMPLE_RE
1366 #if GTEST_HAS_DEATH_TEST
1372 # if GTEST_OS_WINDOWS
1376 AutoHandle() : handle_(INVALID_HANDLE_VALUE) {}
1377 explicit AutoHandle(HANDLE handle) : handle_(handle) {}
1379 ~AutoHandle() { Reset(); }
1381 HANDLE Get()
const {
return handle_; }
1382 void Reset() { Reset(INVALID_HANDLE_VALUE); }
1383 void Reset(HANDLE handle) {
1384 if (handle != handle_) {
1385 if (handle_ != INVALID_HANDLE_VALUE)
1386 ::CloseHandle(handle_);
1396 # endif // GTEST_OS_WINDOWS
1402 template <
typename Integer>
1407 if (str.empty() || !
IsDigit(str[0])) {
1416 # if GTEST_OS_WINDOWS && !defined(__GNUC__)
1419 typedef unsigned __int64 BiggestConvertible;
1420 const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);
1424 typedef unsigned long long BiggestConvertible;
1425 const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
1427 # endif // GTEST_OS_WINDOWS && !defined(__GNUC__)
1429 const bool parse_success = *end ==
'\0' && errno == 0;
1435 const Integer result =
static_cast<Integer
>(parsed);
1436 if (parse_success &&
static_cast<BiggestConvertible
>(result) == parsed) {
1442 #endif // GTEST_HAS_DEATH_TEST
1468 #if GTEST_CAN_STREAM_RESULTS_
1474 class AbstractSocketWriter {
1476 virtual ~AbstractSocketWriter() {}
1479 virtual void Send(
const string& message) = 0;
1482 virtual void CloseConnection() {}
1485 void SendLn(
const string& message) {
1486 Send(message +
"\n");
1491 class SocketWriter :
public AbstractSocketWriter {
1493 SocketWriter(
const string& host,
const string& port)
1494 : sockfd_(-1), host_name_(host), port_num_(port) {
1498 virtual ~SocketWriter() {
1504 virtual void Send(
const string& message) {
1506 <<
"Send() can be called only when there is a connection.";
1508 const int len =
static_cast<int>(message.length());
1509 if (write(sockfd_, message.c_str(), len) != len) {
1511 <<
"stream_result_to: failed to stream to "
1512 << host_name_ <<
":" << port_num_;
1518 void MakeConnection();
1521 void CloseConnection() {
1523 <<
"CloseConnection() can be called only when there is a connection.";
1530 const string host_name_;
1531 const string port_num_;
1537 static string UrlEncode(
const char* str);
1539 StreamingListener(
const string& host,
const string& port)
1540 : socket_writer_(new SocketWriter(host, port)) { Start(); }
1542 explicit StreamingListener(AbstractSocketWriter* socket_writer)
1543 : socket_writer_(socket_writer) { Start(); }
1545 void OnTestProgramStart(
const UnitTest& ) {
1546 SendLn(
"event=TestProgramStart");
1549 void OnTestProgramEnd(
const UnitTest&
unit_test) {
1552 SendLn(
"event=TestProgramEnd&passed=" + FormatBool(
unit_test.Passed()));
1555 socket_writer_->CloseConnection();
1558 void OnTestIterationStart(
const UnitTest& ,
int iteration) {
1559 SendLn(
"event=TestIterationStart&iteration=" +
1563 void OnTestIterationEnd(
const UnitTest&
unit_test,
int ) {
1564 SendLn(
"event=TestIterationEnd&passed=" +
1565 FormatBool(
unit_test.Passed()) +
"&elapsed_time=" +
1569 void OnTestCaseStart(
const TestCase& test_case) {
1570 SendLn(
std::string(
"event=TestCaseStart&name=") + test_case.name());
1573 void OnTestCaseEnd(
const TestCase& test_case) {
1574 SendLn(
"event=TestCaseEnd&passed=" + FormatBool(test_case.Passed())
1579 void OnTestStart(
const TestInfo& test_info) {
1580 SendLn(
std::string(
"event=TestStart&name=") + test_info.name());
1583 void OnTestEnd(
const TestInfo& test_info) {
1584 SendLn(
"event=TestEnd&passed=" +
1585 FormatBool((test_info.result())->Passed()) +
1590 void OnTestPartResult(
const TestPartResult& test_part_result) {
1591 const char* file_name = test_part_result.file_name();
1592 if (file_name == NULL)
1594 SendLn(
"event=TestPartResult&file=" + UrlEncode(file_name) +
1596 "&message=" + UrlEncode(test_part_result.message()));
1601 void SendLn(
const string& message) { socket_writer_->SendLn(message); }
1605 void Start() { SendLn(
"gtest_streaming_protocol_version=1.0"); }
1607 string FormatBool(
bool value) {
return value ?
"1" :
"0"; }
1609 const scoped_ptr<AbstractSocketWriter> socket_writer_;
1614 #endif // GTEST_CAN_STREAM_RESULTS_
1619 #endif // GTEST_SRC_GTEST_INTERNAL_INL_H_
1620 #undef GTEST_IMPLEMENTATION_
1622 #if GTEST_OS_WINDOWS
1623 # define vsnprintf _vsnprintf
1624 #endif // GTEST_OS_WINDOWS
1657 namespace internal {
1674 also_run_disabled_tests,
1676 "Run disabled tests too, in addition to the tests normally being run.");
1681 "True iff a failed assertion should be a debugger break-point.");
1687 " should catch exceptions and treat them as test failures.");
1692 "Whether to use colors in the output. Valid values: yes, no, "
1693 "and auto. 'auto' means to use colors if the output is "
1694 "being sent to a terminal and the TERM environment variable "
1695 "is set to a terminal type that supports colors.");
1700 "A colon-separated list of glob (not regex) patterns "
1701 "for filtering the tests to run, optionally followed by a "
1702 "'-' and a : separated list of negative patterns (tests to "
1703 "exclude). A test is run if it matches one of the positive "
1704 "patterns and does not match any of the negative patterns.");
1707 "List all tests without running them.");
1712 "A format (currently must be \"xml\"), optionally followed "
1713 "by a colon and an output file name or directory. A directory "
1714 "is indicated by a trailing pathname separator. "
1715 "Examples: \"xml:filename.xml\", \"xml::directoryname/\". "
1716 "If a directory is specified, output files will be created "
1717 "within that directory, with file-names based on the test "
1718 "executable's name and, if necessary, made unique by adding "
1725 " should display elapsed time in text output.");
1730 "Random number seed to use when shuffling test orders. Must be in range "
1731 "[1, 99999], or 0 to use a seed based on the current time.");
1736 "How many times to repeat each test. Specify a negative number "
1737 "for repeating forever. Useful for shaking out flaky tests.");
1740 show_internal_stack_frames,
false,
1741 "True iff " GTEST_NAME_ " should include internal stack frames when "
1742 "printing test failure stack traces.");
1748 " should randomize tests' order on every run.");
1753 "The maximum number of stack frames to print when an "
1754 "assertion fails. The valid range is 0 through 100, inclusive.");
1759 "This flag specifies the host name and the port number on which to stream "
1760 "test results. Example: \"localhost:555\". The flag is effective only on "
1766 "When this flag is specified, a failed assertion will throw an exception "
1767 "if exceptions are enabled or exit the program with a non-zero code "
1770 namespace internal {
1780 <<
"Cannot generate a number in the range [0, 0).";
1782 <<
"Generation of a number in [0, " << range <<
") was requested, "
1783 <<
"but this can only generate numbers in [0, " <<
kMaxRange <<
").";
1808 for (
size_t i = 0; i < case_list.size(); i++) {
1809 sum += (case_list[i]->*method)();
1834 const char* message)
1864 #if GTEST_OS_WINDOWS
1868 #endif // GTEST_OS_WINDOWS
1877 const char*
const gtest_output_flag =
GTEST_FLAG(output).c_str();
1878 if (gtest_output_flag == NULL)
return std::string(
"");
1880 const char*
const colon = strchr(gtest_output_flag,
':');
1881 return (colon == NULL) ?
1883 std::string(gtest_output_flag, colon - gtest_output_flag);
1889 const char*
const gtest_output_flag =
GTEST_FLAG(output).c_str();
1890 if (gtest_output_flag == NULL)
1893 const char*
const colon = strchr(gtest_output_flag,
':');
1911 return output_name.
string();
1929 return *str ==
'\0';
1936 return *pattern == *str &&
1943 const char *cur_pattern = filter;
1950 cur_pattern = strchr(cur_pattern,
':');
1953 if (cur_pattern == NULL) {
1966 const std::string& full_name = test_case_name +
"." + test_name.c_str();
1970 const char*
const p =
GTEST_FLAG(filter).c_str();
1971 const char*
const dash = strchr(p,
'-');
1980 if (positive.empty()) {
1996 int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
2005 const DWORD kCxxExceptionCode = 0xe06d7363;
2007 bool should_handle =
true;
2010 should_handle =
false;
2011 else if (exception_code == EXCEPTION_BREAKPOINT)
2012 should_handle =
false;
2013 else if (exception_code == kCxxExceptionCode)
2014 should_handle =
false;
2016 return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
2018 #endif // GTEST_HAS_SEH
2027 : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),
2037 : intercept_mode_(intercept_mode),
2071 namespace internal {
2083 return GetTypeId<Test>();
2098 const string& substr) {
2101 "1 non-fatal failure");
2103 if (results.
size() != 1) {
2104 msg <<
"Expected: " << expected <<
"\n"
2105 <<
" Actual: " << results.
size() <<
" failures";
2106 for (
int i = 0; i < results.
size(); i++) {
2113 if (r.
type() != type) {
2119 if (strstr(r.
message(), substr.c_str()) == NULL) {
2135 const string& substr)
2136 : results_(results),
2265 #if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)
2270 const DWORD kTenthMicrosInMilliSecond = 10000;
2272 SYSTEMTIME now_systime;
2273 FILETIME now_filetime;
2274 ULARGE_INTEGER now_int64;
2277 GetSystemTime(&now_systime);
2278 if (SystemTimeToFileTime(&now_systime, &now_filetime)) {
2279 now_int64.LowPart = now_filetime.dwLowDateTime;
2280 now_int64.HighPart = now_filetime.dwHighDateTime;
2281 now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -
2282 kJavaEpochToWinFileTimeDelta;
2283 return now_int64.QuadPart;
2286 #elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_
2295 # pragma warning(push) // Saves the current warning state.
2296 # pragma warning(disable:4996) // Temporarily disables warning 4996.
2298 # pragma warning(pop) // Restores the warning state.
2305 return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;
2308 gettimeofday(&now, NULL);
2309 return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;
2311 # error
"Don't know how to get the current time on your system."
2319 #if GTEST_OS_WINDOWS_MOBILE
2324 LPCWSTR String::AnsiToUtf16(
const char* ansi) {
2325 if (!ansi)
return NULL;
2326 const int length = strlen(ansi);
2327 const int unicode_length =
2328 MultiByteToWideChar(CP_ACP, 0, ansi, length,
2330 WCHAR* unicode =
new WCHAR[unicode_length + 1];
2331 MultiByteToWideChar(CP_ACP, 0, ansi, length,
2332 unicode, unicode_length);
2333 unicode[unicode_length] = 0;
2341 const char* String::Utf16ToAnsi(LPCWSTR utf16_str) {
2342 if (!utf16_str)
return NULL;
2343 const int ansi_length =
2344 WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
2345 NULL, 0, NULL, NULL);
2346 char* ansi =
new char[ansi_length + 1];
2347 WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
2348 ansi, ansi_length, NULL, NULL);
2349 ansi[ansi_length] = 0;
2353 #endif // GTEST_OS_WINDOWS_MOBILE
2361 if ( lhs == NULL )
return rhs == NULL;
2363 if ( rhs == NULL )
return false;
2365 return strcmp(lhs, rhs) == 0;
2368 #if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
2372 static void StreamWideCharsToMessage(
const wchar_t* wstr,
size_t length,
2374 for (
size_t i = 0; i !=
length; ) {
2375 if (wstr[i] != L
'\0') {
2376 *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));
2377 while (i != length && wstr[i] != L
'\0')
2386 #endif // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
2398 *
ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
2410 #if GTEST_HAS_STD_WSTRING
2414 internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(),
this);
2417 #endif // GTEST_HAS_STD_WSTRING
2419 #if GTEST_HAS_GLOBAL_WSTRING
2423 internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(),
this);
2426 #endif // GTEST_HAS_GLOBAL_WSTRING
2437 : success_(other.success_),
2438 message_(other.message_.
get() != NULL ?
2467 namespace internal {
2485 const char* actual_expression,
2488 bool ignoring_case) {
2490 msg <<
"Value of: " << actual_expression;
2491 if (actual_value != actual_expression) {
2492 msg <<
"\n Actual: " << actual_value;
2495 msg <<
"\nExpected: " << expected_expression;
2496 if (ignoring_case) {
2497 msg <<
" (ignoring case)";
2499 if (expected_value != expected_expression) {
2500 msg <<
"\nWhich is: " << expected_value;
2509 const char* expression_text,
2510 const char* actual_predicate_value,
2511 const char* expected_predicate_value) {
2512 const char* actual_message = assertion_result.
message();
2514 msg <<
"Value of: " << expression_text
2515 <<
"\n Actual: " << actual_predicate_value;
2516 if (actual_message[0] !=
'\0')
2517 msg <<
" (" << actual_message <<
")";
2518 msg <<
"\nExpected: " << expected_predicate_value;
2525 const char* abs_error_expr,
2529 const double diff = fabs(val1 - val2);
2535 <<
"The difference between " << expr1 <<
" and " << expr2
2536 <<
" is " << diff <<
", which exceeds " << abs_error_expr <<
", where\n"
2537 << expr1 <<
" evaluates to " << val1 <<
",\n"
2538 << expr2 <<
" evaluates to " << val2 <<
", and\n"
2539 << abs_error_expr <<
" evaluates to " << abs_error <<
".";
2544 template <
typename RawType>
2556 if (lhs.AlmostEquals(rhs)) {
2564 ::std::stringstream val1_ss;
2565 val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
2568 ::std::stringstream val2_ss;
2569 val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
2573 <<
"Expected: (" << expr1 <<
") <= (" << expr2 <<
")\n"
2583 float val1,
float val2) {
2584 return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);
2590 double val1,
double val2) {
2591 return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);
2594 namespace internal {
2599 const char* actual_expression,
2602 if (expected == actual) {
2616 #define GTEST_IMPL_CMP_HELPER_(op_name, op)\
2617 AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
2618 BiggestInt val1, BiggestInt val2) {\
2619 if (val1 op val2) {\
2620 return AssertionSuccess();\
2622 return AssertionFailure() \
2623 << "Expected: (" << expr1 << ") " #op " (" << expr2\
2624 << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
2625 << " vs " << FormatForComparisonFailureMessage(val2, val1);\
2645 #undef GTEST_IMPL_CMP_HELPER_
2649 const char* actual_expression,
2650 const char* expected,
2651 const char* actual) {
2665 const char* actual_expression,
2666 const char* expected,
2667 const char* actual) {
2681 const char* s2_expression,
2688 << s2_expression <<
"), actual: \""
2689 << s1 <<
"\" vs \"" << s2 <<
"\"";
2695 const char* s2_expression,
2702 <<
"Expected: (" << s1_expression <<
") != ("
2703 << s2_expression <<
") (ignoring case), actual: \""
2704 << s1 <<
"\" vs \"" << s2 <<
"\"";
2718 bool IsSubstringPred(
const char* needle,
const char* haystack) {
2719 if (needle == NULL || haystack == NULL)
2720 return needle == haystack;
2722 return strstr(haystack, needle) != NULL;
2725 bool IsSubstringPred(
const wchar_t* needle,
const wchar_t* haystack) {
2726 if (needle == NULL || haystack == NULL)
2727 return needle == haystack;
2729 return wcsstr(haystack, needle) != NULL;
2733 template <
typename StringType>
2734 bool IsSubstringPred(
const StringType& needle,
2735 const StringType& haystack) {
2736 return haystack.find(needle) != StringType::npos;
2743 template <
typename StringType>
2744 AssertionResult IsSubstringImpl(
2745 bool expected_to_be_substring,
2746 const char* needle_expr,
const char* haystack_expr,
2747 const StringType& needle,
const StringType& haystack) {
2748 if (IsSubstringPred(needle, haystack) == expected_to_be_substring)
2751 const bool is_wide_string =
sizeof(needle[0]) > 1;
2752 const char*
const begin_string_quote = is_wide_string ?
"L\"" :
"\"";
2754 <<
"Value of: " << needle_expr <<
"\n"
2755 <<
" Actual: " << begin_string_quote << needle <<
"\"\n"
2756 <<
"Expected: " << (expected_to_be_substring ?
"" :
"not ")
2757 <<
"a substring of " << haystack_expr <<
"\n"
2758 <<
"Which is: " << begin_string_quote << haystack <<
"\"";
2768 const char* needle_expr,
const char* haystack_expr,
2769 const char* needle,
const char* haystack) {
2770 return IsSubstringImpl(
true, needle_expr, haystack_expr, needle, haystack);
2774 const char* needle_expr,
const char* haystack_expr,
2775 const wchar_t* needle,
const wchar_t* haystack) {
2776 return IsSubstringImpl(
true, needle_expr, haystack_expr, needle, haystack);
2780 const char* needle_expr,
const char* haystack_expr,
2781 const char* needle,
const char* haystack) {
2782 return IsSubstringImpl(
false, needle_expr, haystack_expr, needle, haystack);
2786 const char* needle_expr,
const char* haystack_expr,
2787 const wchar_t* needle,
const wchar_t* haystack) {
2788 return IsSubstringImpl(
false, needle_expr, haystack_expr, needle, haystack);
2792 const char* needle_expr,
const char* haystack_expr,
2794 return IsSubstringImpl(
true, needle_expr, haystack_expr, needle, haystack);
2798 const char* needle_expr,
const char* haystack_expr,
2800 return IsSubstringImpl(
false, needle_expr, haystack_expr, needle, haystack);
2803 #if GTEST_HAS_STD_WSTRING
2805 const char* needle_expr,
const char* haystack_expr,
2807 return IsSubstringImpl(
true, needle_expr, haystack_expr, needle, haystack);
2811 const char* needle_expr,
const char* haystack_expr,
2813 return IsSubstringImpl(
false, needle_expr, haystack_expr, needle, haystack);
2815 #endif // GTEST_HAS_STD_WSTRING
2817 namespace internal {
2819 #if GTEST_OS_WINDOWS
2824 AssertionResult HRESULTFailureHelper(
const char* expr,
2825 const char* expected,
2827 # if GTEST_OS_WINDOWS_MOBILE
2830 const char error_text[] =
"";
2837 const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
2838 FORMAT_MESSAGE_IGNORE_INSERTS;
2839 const DWORD kBufSize = 4096;
2841 char error_text[kBufSize] = {
'\0' };
2842 DWORD message_length = ::FormatMessageA(kFlags,
2850 for (; message_length &&
IsSpace(error_text[message_length - 1]);
2852 error_text[message_length - 1] =
'\0';
2855 # endif // GTEST_OS_WINDOWS_MOBILE
2859 <<
"Expected: " << expr <<
" " << expected <<
".\n"
2860 <<
" Actual: " << error_hex <<
" " << error_text <<
"\n";
2865 AssertionResult IsHRESULTSuccess(
const char* expr,
long hr) {
2866 if (SUCCEEDED(hr)) {
2869 return HRESULTFailureHelper(expr,
"succeeds", hr);
2872 AssertionResult IsHRESULTFailure(
const char* expr,
long hr) {
2876 return HRESULTFailureHelper(expr,
"fails", hr);
2879 #endif // GTEST_OS_WINDOWS
2909 const UInt32 low_bits = *bits & ((
static_cast<UInt32>(1) << n) - 1);
2928 str[0] =
static_cast<char>(code_point);
2931 str[1] =
static_cast<char>(0x80 |
ChopLowBits(&code_point, 6));
2932 str[0] =
static_cast<char>(0xC0 | code_point);
2935 str[2] =
static_cast<char>(0x80 |
ChopLowBits(&code_point, 6));
2936 str[1] =
static_cast<char>(0x80 |
ChopLowBits(&code_point, 6));
2937 str[0] =
static_cast<char>(0xE0 | code_point);
2940 str[3] =
static_cast<char>(0x80 |
ChopLowBits(&code_point, 6));
2941 str[2] =
static_cast<char>(0x80 |
ChopLowBits(&code_point, 6));
2942 str[1] =
static_cast<char>(0x80 |
ChopLowBits(&code_point, 6));
2943 str[0] =
static_cast<char>(0xF0 | code_point);
2956 return sizeof(wchar_t) == 2 &&
2957 (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;
2963 const UInt32 mask = (1 << 10) - 1;
2964 return (
sizeof(
wchar_t) == 2) ?
2965 (((first & mask) << 10) | (second & mask)) + 0x10000 :
2968 static_cast<UInt32>(first);
2985 if (num_chars == -1)
2986 num_chars =
static_cast<int>(wcslen(str));
2988 ::std::stringstream stream;
2989 for (
int i = 0; i < num_chars; ++i) {
2990 UInt32 unicode_code_point;
2992 if (str[i] == L
'\0') {
2999 unicode_code_point =
static_cast<UInt32>(str[i]);
3010 if (wide_c_str == NULL)
return "(null)";
3022 if (lhs == NULL)
return rhs == NULL;
3024 if (rhs == NULL)
return false;
3026 return wcscmp(lhs, rhs) == 0;
3031 const char* actual_expression,
3032 const wchar_t* expected,
3033 const wchar_t* actual) {
3047 const char* s2_expression,
3049 const wchar_t* s2) {
3055 << s2_expression <<
"), actual: "
3087 const wchar_t* rhs) {
3088 if (lhs == NULL)
return rhs == NULL;
3090 if (rhs == NULL)
return false;
3092 #if GTEST_OS_WINDOWS
3093 return _wcsicmp(lhs, rhs) == 0;
3094 #elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID
3095 return wcscasecmp(lhs, rhs) == 0;
3101 left = towlower(*lhs++);
3102 right = towlower(*rhs++);
3103 }
while (left && left == right);
3104 return left == right;
3105 #endif // OS selector
3112 const size_t str_len = str.length();
3113 const size_t suffix_len = suffix.length();
3114 return (str_len >= suffix_len) &&
3121 std::stringstream ss;
3122 ss << std::setfill(
'0') << std::setw(2) << value;
3128 std::stringstream ss;
3129 ss << std::hex << std::uppercase << value;
3135 std::stringstream ss;
3136 ss << std::setfill(
'0') << std::setw(2) << std::hex << std::uppercase
3137 <<
static_cast<unsigned int>(value);
3145 const char*
const start = str.c_str();
3146 const char*
const end =
start + str.length();
3149 result.reserve(2 * (end -
start));
3150 for (
const char* ch =
start; ch != end; ++ch) {
3166 if (user_msg_string.empty()) {
3170 return gtest_msg +
"\n" + user_msg_string;
3179 : death_test_count_(0),
3224 const std::vector<TestProperty>::iterator property_with_matching_key =
3231 property_with_matching_key->SetValue(test_property.
value());
3268 template <
int kSize>
3270 return std::vector<std::string>(array, array + kSize);
3275 if (xml_element ==
"testsuites") {
3277 }
else if (xml_element ==
"testsuite") {
3279 }
else if (xml_element ==
"testcase") {
3282 GTEST_CHECK_(
false) <<
"Unrecognized xml_element provided: " << xml_element;
3285 return std::vector<std::string>();
3290 for (
size_t i = 0; i < words.size(); ++i) {
3291 if (i > 0 && words.size() > 2) {
3294 if (i == words.size() - 1) {
3295 word_list <<
"and ";
3297 word_list <<
"'" << words[i] <<
"'";
3303 const std::vector<std::string>& reserved_names) {
3304 if (std::find(reserved_names.begin(), reserved_names.end(), property_name) !=
3305 reserved_names.end()) {
3306 ADD_FAILURE() <<
"Reserved key used in RecordProperty(): " << property_name
3376 : gtest_flag_saver_(new internal::GTestFlagSaver) {
3404 value_message << value;
3408 namespace internal {
3436 const char*
const first_test_name = first_test_info->
name();
3441 const char*
const this_test_name = this_test_info->
name();
3443 if (this_fixture_id != first_fixture_id) {
3449 if (first_is_TEST || this_is_TEST) {
3456 const char*
const TEST_name =
3457 first_is_TEST ? first_test_name : this_test_name;
3458 const char*
const TEST_F_name =
3459 first_is_TEST ? this_test_name : first_test_name;
3462 <<
"All tests in the same test case must use the same test fixture\n"
3463 <<
"class, so mixing TEST_F and TEST in the same test case is\n"
3466 <<
"test " << TEST_F_name <<
" is defined using TEST_F but\n"
3467 <<
"test " << TEST_name <<
" is defined using TEST. You probably\n"
3468 <<
"want to change the TEST to TEST_F or move it to another test\n"
3474 <<
"All tests in the same test case must use the same test fixture\n"
3475 <<
"class. However, in test case "
3477 <<
"you defined test " << first_test_name
3478 <<
" and test " << this_test_name <<
"\n"
3479 <<
"using two different test fixture classes. This can happen if\n"
3480 <<
"the two classes are from different namespaces or translation\n"
3481 <<
"units and have the same name. You should probably rename one\n"
3482 <<
"of the classes to put the tests into different test cases.";
3496 static std::string* FormatSehExceptionMessage(DWORD exception_code,
3497 const char* location) {
3499 message <<
"SEH exception with code 0x" << std::setbase(16) <<
3500 exception_code << std::setbase(10) <<
" thrown in " << location <<
".";
3505 #endif // GTEST_HAS_SEH
3507 namespace internal {
3509 #if GTEST_HAS_EXCEPTIONS
3512 static std::string FormatCxxExceptionMessage(
const char* description,
3513 const char* location) {
3515 if (description != NULL) {
3516 message <<
"C++ exception with description \"" << description <<
"\"";
3518 message <<
"Unknown C++ exception";
3520 message <<
" thrown in " << location <<
".";
3522 return message.GetString();
3526 const TestPartResult& test_part_result);
3528 GoogleTestFailureException::GoogleTestFailureException(
3529 const TestPartResult& failure)
3532 #endif // GTEST_HAS_EXCEPTIONS
3542 template <
class T,
typename Result>
3544 T*
object, Result (T::*method)(),
const char* location) {
3547 return (object->*method)();
3548 } __except (internal::UnitTestOptions::GTestShouldProcessSEH(
3549 GetExceptionCode())) {
3553 std::string* exception_message = FormatSehExceptionMessage(
3554 GetExceptionCode(), location);
3556 *exception_message);
3557 delete exception_message;
3558 return static_cast<Result
>(0);
3562 return (object->*method)();
3563 #endif // GTEST_HAS_SEH
3569 template <
class T,
typename Result>
3571 T*
object, Result (T::*method)(),
const char* location) {
3596 #if GTEST_HAS_EXCEPTIONS
3599 }
catch (
const internal::GoogleTestFailureException&) {
3604 }
catch (
const std::exception& e) {
3607 FormatCxxExceptionMessage(e.what(), location));
3611 FormatCxxExceptionMessage(NULL, location));
3613 return static_cast<Result
>(0);
3616 #endif // GTEST_HAS_EXCEPTIONS
3618 return (object->*method)();
3626 if (!HasSameFixtureClass())
return;
3632 if (!HasFatalFailure()) {
3635 this, &Test::TestBody,
"the test body");
3643 this, &Test::TearDown,
"TearDown()");
3647 bool Test::HasFatalFailure() {
3652 bool Test::HasNonfatalFailure() {
3654 HasNonfatalFailure();
3663 const char* a_type_param,
3664 const char* a_value_param,
3667 : test_case_name_(a_test_case_name),
3669 type_param_(a_type_param ? new
std::
string(a_type_param) : NULL),
3670 value_param_(a_value_param ? new
std::
string(a_value_param) : NULL),
3671 fixture_class_id_(fixture_class_id),
3673 is_disabled_(false),
3674 matches_filter_(false),
3681 namespace internal {
3701 const char* test_case_name,
3703 const char* type_param,
3704 const char* value_param,
3710 new TestInfo(test_case_name, name, type_param, value_param,
3711 fixture_class_id, factory);
3716 #if GTEST_HAS_PARAM_TEST
3718 const char* file,
int line) {
3721 <<
"Attempted redefinition of test case " << test_case_name <<
".\n"
3722 <<
"All tests in the same test case must use the same test fixture\n"
3723 <<
"class. However, in test case " << test_case_name <<
", you tried\n"
3724 <<
"to define a test using a fixture class different from the one\n"
3725 <<
"used earlier. This can happen if the two fixture classes are\n"
3726 <<
"from different namespaces and have the same name. You should\n"
3727 <<
"probably rename one of the classes to put the tests into different\n"
3733 #endif // GTEST_HAS_PARAM_TEST
3752 explicit TestNameIs(
const char* name)
3756 bool operator()(
const TestInfo * test_info)
const {
3757 return test_info && test_info->name() ==
name_;
3766 namespace internal {
3772 #if GTEST_HAS_PARAM_TEST
3773 if (!parameterized_tests_registered_) {
3774 parameterized_test_registry_.RegisterTests();
3775 parameterized_tests_registered_ =
true;
3803 "the test fixture's constructor");
3878 type_param_(a_type_param ? new
std::
string(a_type_param) : NULL),
3879 set_up_tc_(set_up_tc),
3880 tear_down_tc_(tear_down_tc),
3964 const char * singular_form,
3965 const char * plural_form) {
3967 (count == 1 ? singular_form : plural_form);
3997 return "Unknown result type";
4001 namespace internal {
4010 << test_part_result.
message()).GetString();
4017 printf(
"%s\n", result.c_str());
4023 #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
4027 ::OutputDebugStringA(result.c_str());
4028 ::OutputDebugStringA(
"\n");
4041 #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
4048 case COLOR_YELLOW:
return FOREGROUND_RED | FOREGROUND_GREEN;
4062 default:
return NULL;
4066 #endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
4070 const char*
const gtest_color =
GTEST_FLAG(color).c_str();
4073 #if GTEST_OS_WINDOWS
4076 return stdout_is_tty;
4080 const bool term_supports_color =
4088 return stdout_is_tty && term_supports_color;
4089 #endif // GTEST_OS_WINDOWS
4107 va_start(args, fmt);
4109 #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS || GTEST_OS_IOS
4110 const bool use_color =
false;
4112 static const bool in_color_mode =
4114 const bool use_color = in_color_mode && (color !=
COLOR_DEFAULT);
4115 #endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
4124 #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
4125 const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
4128 CONSOLE_SCREEN_BUFFER_INFO buffer_info;
4129 GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);
4130 const WORD old_color_attrs = buffer_info.wAttributes;
4136 SetConsoleTextAttribute(stdout_handle,
4137 GetColorAttribute(color) | FOREGROUND_INTENSITY);
4142 SetConsoleTextAttribute(stdout_handle, old_color_attrs);
4147 #endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
4157 const char*
const type_param = test_info.
type_param();
4158 const char*
const value_param = test_info.
value_param();
4160 if (type_param != NULL || value_param != NULL) {
4162 if (type_param != NULL) {
4164 if (value_param != NULL)
4167 if (value_param != NULL) {
4180 printf(
"%s.%s", test_case,
test);
4206 printf(
"\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1);
4208 const char*
const filter =
GTEST_FLAG(filter).c_str();
4220 "Note: This is test shard %d of %s.\n",
4221 static_cast<int>(shard_index) + 1,
4227 "Note: Randomizing tests' orders with a seed of %d .\n",
4232 printf(
"Running %s from %s.\n",
4241 printf(
"Global test environment set-up.\n");
4249 printf(
"%s from %s", counts.c_str(), test_case.
name());
4302 printf(
"%s from %s (%s ms total)\n\n",
4303 counts.c_str(), test_case.
name(),
4311 printf(
"Global test environment tear-down\n");
4317 const int failed_test_count =
unit_test.failed_test_count();
4318 if (failed_test_count == 0) {
4322 for (
int i = 0; i <
unit_test.total_test_case_count(); ++i) {
4333 printf(
"%s.%s", test_case.
name(), test_info.
name());
4343 printf(
"%s from %s ran.",
4347 printf(
" (%s ms total)",
4354 int num_failures =
unit_test.failed_test_count();
4356 const int failed_test_count =
unit_test.failed_test_count();
4358 printf(
"%s, listed below:\n",
FormatTestCount(failed_test_count).c_str());
4360 printf(
"\n%2d FAILED %s\n", num_failures,
4361 num_failures == 1 ?
"TEST" :
"TESTS");
4364 int num_disabled =
unit_test.reportable_disabled_test_count();
4365 if (num_disabled && !
GTEST_FLAG(also_run_disabled_tests)) {
4366 if (!num_failures) {
4370 " YOU HAVE %d DISABLED %s\n\n",
4372 num_disabled == 1 ?
"TEST" :
"TESTS");
4429 for (
size_t i = 0; i <
listeners_.size(); ++i) {
4441 #define GTEST_REPEATER_METHOD_(Name, Type) \
4442 void TestEventRepeater::Name(const Type& parameter) { \
4443 if (forwarding_enabled_) { \
4444 for (size_t i = 0; i < listeners_.size(); i++) { \
4445 listeners_[i]->Name(parameter); \
4451 #define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \
4452 void TestEventRepeater::Name(const Type& parameter) { \
4453 if (forwarding_enabled_) { \
4454 for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \
4455 listeners_[i]->Name(parameter); \
4472 #undef GTEST_REPEATER_METHOD_
4473 #undef GTEST_REVERSE_REPEATER_METHOD_
4478 for (
size_t i = 0; i <
listeners_.size(); i++) {
4487 for (
int i =
static_cast<int>(
listeners_.size()) - 1; i >= 0; i--) {
4506 return c == 0x9 || c == 0xA || c == 0xD;
4545 const char* test_case_name,
4570 : output_file_(output_file) {
4572 fprintf(stderr,
"XML output file may not be null\n");
4581 FILE* xmlout = NULL;
4588 if (xmlout == NULL) {
4600 "Unable to open file \"%s\"\n",
4605 std::stringstream stream;
4627 for (
size_t i = 0; i < str.size(); ++i) {
4628 const char ch = str[i];
4672 output.reserve(str.size());
4673 for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)
4675 output.push_back(*it);
4698 ::std::stringstream ss;
4707 time_t seconds =
static_cast<time_t
>(ms / 1000);
4709 # pragma warning(push) // Saves the current warning state.
4710 # pragma warning(disable:4996) // Temporarily disables warning 4996
4712 const struct tm*
const time_struct = localtime(&seconds);
4713 # pragma warning(pop) // Restores the warning state again.
4715 const struct tm*
const time_struct = localtime(&seconds);
4717 if (time_struct == NULL)
4732 const char* segment = data;
4733 *stream <<
"<![CDATA[";
4735 const char*
const next_segment = strstr(segment,
"]]>");
4736 if (next_segment != NULL) {
4738 segment,
static_cast<std::streamsize
>(next_segment - segment));
4739 *stream <<
"]]>]]><![CDATA[";
4740 segment = next_segment + strlen(
"]]>");
4750 std::ostream* stream,
4754 const std::vector<std::string>& allowed_names =
4757 GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=
4758 allowed_names.end())
4759 <<
"Attribute " << name <<
" is not allowed for element <" << element_name
4768 const char* test_case_name,
4773 *stream <<
" <testcase";
4795 if (++failures == 1) {
4800 const string summary = location +
"\n" + part.
summary();
4801 *stream <<
" <failure message=\""
4804 const string detail = location +
"\n" + part.
message();
4806 *stream <<
"</failure>\n";
4813 *stream <<
" </testcase>\n";
4820 *stream <<
" <" << kTestsuite;
4827 stream, kTestsuite,
"disabled",
4839 *stream <<
" </" << kTestsuite <<
">\n";
4847 *stream <<
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
4848 *stream <<
"<" << kTestsuites;
4855 stream, kTestsuites,
"disabled",
4859 stream, kTestsuites,
"timestamp",
4874 for (
int i = 0; i <
unit_test.total_test_case_count(); ++i) {
4875 if (
unit_test.GetTestCase(i)->reportable_test_count() > 0)
4878 *stream <<
"</" << kTestsuites <<
">\n";
4888 attributes <<
" " <<
property.key() <<
"="
4896 #if GTEST_CAN_STREAM_RESULTS_
4903 string StreamingListener::UrlEncode(
const char* str) {
4905 result.reserve(strlen(str) + 1);
4906 for (
char ch = *str; ch !=
'\0'; ch = *++str) {
4915 result.push_back(ch);
4922 void StreamingListener::SocketWriter::MakeConnection() {
4924 <<
"MakeConnection() can't be called when there is already a connection.";
4927 memset(&hints, 0,
sizeof(hints));
4928 hints.ai_family = AF_UNSPEC;
4929 hints.ai_socktype = SOCK_STREAM;
4930 addrinfo* servinfo = NULL;
4934 const int error_num = getaddrinfo(
4935 host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);
4936 if (error_num != 0) {
4937 GTEST_LOG_(WARNING) <<
"stream_result_to: getaddrinfo() failed: "
4938 << gai_strerror(error_num);
4942 for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;
4943 cur_addr = cur_addr->ai_next) {
4945 cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);
4946 if (sockfd_ != -1) {
4948 if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {
4955 freeaddrinfo(servinfo);
4957 if (sockfd_ == -1) {
4958 GTEST_LOG_(WARNING) <<
"stream_result_to: failed to connect to "
4959 << host_name_ <<
":" << port_num_;
4964 #endif // GTEST_CAN_STREAM_RESULTS__
4975 trace.
message = message.GetString();
5017 if (premature_exit_filepath != NULL && *premature_exit_filepath !=
'\0') {
5021 FILE* pfile =
posix::FOpen(premature_exit_filepath,
"w");
5022 fwrite(
"0", 1, 1, pfile);
5044 : repeater_(new internal::TestEventRepeater()),
5045 default_result_printer_(NULL),
5046 default_xml_generator_(NULL) {
5085 if (listener != NULL)
5101 if (listener != NULL)
5137 #if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
5143 #endif // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
5263 const char* file_name,
5271 if (impl_->gtest_trace_stack().size() > 0) {
5274 for (
int i =
static_cast<int>(impl_->gtest_trace_stack().size());
5282 if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {
5289 impl_->GetTestPartResultReporterForCurrentThread()->
5290 ReportTestPartResult(result);
5299 #if GTEST_OS_WINDOWS
5309 *
static_cast<volatile int*
>(NULL) = 1;
5310 #endif // GTEST_OS_WINDOWS
5312 #if GTEST_HAS_EXCEPTIONS
5313 throw internal::GoogleTestFailureException(result);
5339 const bool in_death_test_child_process =
5364 in_death_test_child_process ?
5376 if (
impl()->catch_exceptions() || in_death_test_child_process) {
5377 # if !GTEST_OS_WINDOWS_MOBILE
5379 SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
5380 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
5381 # endif // !GTEST_OS_WINDOWS_MOBILE
5383 # if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE
5387 _set_error_mode(_OUT_TO_STDERR);
5390 # if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
5403 _set_abort_behavior(
5405 _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
5408 #endif // GTEST_HAS_SEH
5413 "auxiliary test code (environments or event listeners)") ? 0 : 1;
5441 #if GTEST_HAS_PARAM_TEST
5447 return impl_->parameterized_test_registry();
5449 #endif // GTEST_HAS_PARAM_TEST
5466 impl_->gtest_trace_stack().push_back(trace);
5476 namespace internal {
5481 # pragma warning(push)
5482 # pragma warning(disable:4355)
5484 default_global_test_part_result_reporter_(this),
5485 default_per_thread_test_part_result_reporter_(this),
5486 # pragma warning(pop)
5488 default_global_test_part_result_reporter_(this),
5489 default_per_thread_test_part_result_reporter_(this),
5491 global_test_part_result_repoter_(
5492 &default_global_test_part_result_reporter_),
5493 per_thread_test_part_result_reporter_(
5494 &default_per_thread_test_part_result_reporter_),
5496 parameterized_test_registry_(),
5497 parameterized_tests_registered_(false),
5499 last_death_test_case_(-1),
5500 current_test_case_(NULL),
5501 current_test_info_(NULL),
5502 ad_hoc_test_result_(),
5503 os_stack_trace_getter_(NULL),
5504 post_flag_parse_init_performed_(false),
5507 start_timestamp_(0),
5509 #if GTEST_HAS_DEATH_TEST
5510 death_test_factory_(new DefaultDeathTestFactory),
5513 catch_exceptions_(false) {
5537 xml_element =
"testcase";
5540 xml_element =
"testsuite";
5543 xml_element =
"testsuites";
5549 #if GTEST_HAS_DEATH_TEST
5552 void UnitTestImpl::SuppressTestEventsIfInSubprocess() {
5553 if (internal_run_death_test_flag_.get() != NULL)
5556 #endif // GTEST_HAS_DEATH_TEST
5562 if (output_format ==
"xml") {
5565 }
else if (output_format !=
"") {
5566 printf(
"WARNING: unrecognized output format \"%s\" ignored.\n",
5567 output_format.c_str());
5572 #if GTEST_CAN_STREAM_RESULTS_
5575 void UnitTestImpl::ConfigureStreamingOutput() {
5577 if (!target.empty()) {
5578 const size_t pos = target.find(
':');
5579 if (pos != std::string::npos) {
5581 target.substr(pos+1)));
5583 printf(
"WARNING: unrecognized streaming target \"%s\" ignored.\n",
5589 #endif // GTEST_CAN_STREAM_RESULTS_
5601 #if GTEST_HAS_DEATH_TEST
5602 InitDeathTestSubprocessControlInfo();
5603 SuppressTestEventsIfInSubprocess();
5604 #endif // GTEST_HAS_DEATH_TEST
5615 #if GTEST_CAN_STREAM_RESULTS_
5617 ConfigureStreamingOutput();
5618 #endif // GTEST_CAN_STREAM_RESULTS_
5638 return test_case != NULL && strcmp(test_case->
name(),
name_.c_str()) == 0;
5658 const char* type_param,
5662 const std::vector<TestCase*>::const_iterator test_case =
5671 new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);
5689 return new_test_case;
5710 "\nThis test program did NOT call ::testing::InitGoogleTest "
5711 "before calling RUN_ALL_TESTS(). Please fix it.\n");
5730 bool in_subprocess_for_death_test =
false;
5732 #if GTEST_HAS_DEATH_TEST
5733 in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);
5734 #endif // GTEST_HAS_DEATH_TEST
5737 in_subprocess_for_death_test);
5741 const bool has_tests_to_run =
FilterTests(should_shard
5756 bool failed =
false;
5765 const int repeat = in_subprocess_for_death_test ? 1 :
GTEST_FLAG(repeat);
5767 const bool forever = repeat < 0;
5768 for (
int i = 0; forever || i != repeat; i++) {
5776 if (has_tests_to_run &&
GTEST_FLAG(shuffle)) {
5788 if (has_tests_to_run) {
5845 if (test_shard_file != NULL) {
5849 "Could not write to the test shard status file \"%s\" "
5850 "specified by the %s environment variable.\n",
5866 const char* shard_index_env,
5867 bool in_subprocess_for_death_test) {
5868 if (in_subprocess_for_death_test) {
5875 if (total_shards == -1 && shard_index == -1) {
5877 }
else if (total_shards == -1 && shard_index != -1) {
5879 <<
"Invalid environment variables: you have "
5885 }
else if (total_shards != -1 && shard_index == -1) {
5887 <<
"Invalid environment variables: you have "
5893 }
else if (shard_index < 0 || shard_index >= total_shards) {
5895 <<
"Invalid environment variables: we require 0 <= "
5904 return total_shards > 1;
5912 if (str_val == NULL) {
5918 str_val, &result)) {
5929 return (test_id % total_shards) == shard_index;
5949 int num_runnable_tests = 0;
5950 int num_selected_tests = 0;
5956 for (
size_t j = 0; j < test_case->
test_info_list().size(); j++) {
5961 const bool is_disabled =
5968 const bool matches_filter =
5973 const bool is_runnable =
5974 (
GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&
5977 const bool is_selected = is_runnable &&
5980 num_runnable_tests));
5982 num_runnable_tests += is_runnable;
5983 num_selected_tests += is_selected;
5989 return num_selected_tests;
5998 for (
int i = 0; *str !=
'\0'; ++str) {
5999 if (i >= max_length) {
6017 const int kMaxParamLength = 250;
6021 bool printed_test_case_name =
false;
6023 for (
size_t j = 0; j < test_case->
test_info_list().size(); j++) {
6027 if (!printed_test_case_name) {
6028 printed_test_case_name =
true;
6029 printf(
"%s.", test_case->
name());
6038 printf(
" %s", test_info->
name());
6129 class ClassUniqueToAlwaysTrue {};
6132 bool IsTrue(
bool condition) {
return condition; }
6135 #if GTEST_HAS_EXCEPTIONS
6139 throw ClassUniqueToAlwaysTrue();
6140 #endif // GTEST_HAS_EXCEPTIONS
6148 const size_t prefix_len = strlen(prefix);
6149 if (strncmp(*pstr, prefix, prefix_len) == 0) {
6150 *pstr += prefix_len;
6163 bool def_optional) {
6165 if (str == NULL || flag == NULL)
return NULL;
6169 const size_t flag_len = flag_str.length();
6170 if (strncmp(str, flag_str.c_str(), flag_len) != 0)
return NULL;
6173 const char* flag_end = str + flag_len;
6176 if (def_optional && (flag_end[0] ==
'\0')) {
6183 if (flag_end[0] !=
'=')
return NULL;
6186 return flag_end + 1;
6204 if (value_str == NULL)
return false;
6207 *value = !(*value_str ==
'0' || *value_str ==
'f' || *value_str ==
'F');
6221 if (value_str == NULL)
return false;
6238 if (value_str == NULL)
return false;
6279 const char* p = strchr(str,
'@');
6287 const char ch = p[1];
6291 }
else if (ch ==
'D') {
6293 }
else if (ch ==
'R') {
6295 }
else if (ch ==
'G') {
6297 }
else if (ch ==
'Y') {
6306 "This program contains tests written using " GTEST_NAME_ ". You can use the\n"
6307 "following command line flags to control its behavior:\n"
6311 " List the names of all tests instead of running them. The name of\n"
6312 " TEST(Foo, Bar) is \"Foo.Bar\".\n"
6314 "[@G-@YNEGATIVE_PATTERNS]@D\n"
6315 " Run only the tests whose name matches one of the positive patterns but\n"
6316 " none of the negative patterns. '?' matches any single character; '*'\n"
6317 " matches any substring; ':' separates two patterns.\n"
6319 " Run all disabled tests too.\n"
6323 " Run the tests repeatedly; use a negative count to repeat forever.\n"
6325 " Randomize tests' orders on every iteration.\n"
6327 " Random number seed to use for shuffling test orders (between 1 and\n"
6328 " 99999, or 0 to use a seed based on the current time).\n"
6332 " Enable/disable colored output. The default is @Gauto@D.\n"
6334 " Don't print the elapsed time of each test.\n"
6337 " Generate an XML report in the given directory or with the given file\n"
6338 " name. @YFILE_PATH@D defaults to @Gtest_details.xml@D.\n"
6339 #if GTEST_CAN_STREAM_RESULTS_
6341 " Stream test results to the given server.\n"
6342 #endif // GTEST_CAN_STREAM_RESULTS_
6344 "Assertion Behavior:\n"
6345 #if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
6347 " Set the default death test style.\n"
6348 #endif // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
6350 " Turn assertion failures into debugger break-points.\n"
6352 " Turn assertion failures into C++ exceptions.\n"
6354 " Do not report exceptions as test failures. Instead, allow them\n"
6355 " to crash the program or throw a pop-up (on Windows).\n"
6358 "the corresponding\n"
6359 "environment variable of a flag (all letters in upper-case). For example, to\n"
6361 "color=no@D or set\n"
6364 "For more information, please read the " GTEST_NAME_ " documentation at\n"
6366 "(not one in your own code or tests), please report it to\n"
6372 template <
typename CharType>
6374 for (
int i = 1; i < *argc; i++) {
6376 const char*
const arg = arg_string.c_str();
6414 for (
int j = i; j != *argc; j++) {
6415 argv[j] = argv[j + 1];
6424 }
else if (arg_string ==
"--help" || arg_string ==
"-h" ||
6425 arg_string ==
"-?" || arg_string ==
"/?" ||
6454 template <
typename CharType>
6461 if (*argc <= 0)
return;
6465 #if GTEST_HAS_DEATH_TEST
6468 for (
int i = 0; i != *argc; i++) {
6472 #endif // GTEST_HAS_DEATH_TEST
6534 #if GTEST_HAS_DEATH_TEST
6537 # include <crt_externs.h>
6538 # endif // GTEST_OS_MAC
6542 # include <limits.h>
6545 # include <signal.h>
6546 # endif // GTEST_OS_LINUX
6548 # include <stdarg.h>
6550 # if GTEST_OS_WINDOWS
6551 # include <windows.h>
6553 # include <sys/mman.h>
6554 # include <sys/wait.h>
6555 # endif // GTEST_OS_WINDOWS
6559 # endif // GTEST_OS_QNX
6561 #endif // GTEST_HAS_DEATH_TEST
6569 #define GTEST_IMPLEMENTATION_ 1
6570 #undef GTEST_IMPLEMENTATION_
6582 "Indicates how to run a death test in a forked child process: "
6583 "\"threadsafe\" (child process re-executes the test binary "
6584 "from the beginning, running only the specific death test) or "
6585 "\"fast\" (child process runs the death test immediately "
6589 death_test_use_fork,
6591 "Instructs to use fork()/_exit() instead of clone() in death tests. "
6592 "Ignored and always uses fork() on POSIX systems where clone() is not "
6593 "implemented. Useful when running under valgrind or similar tools if "
6594 "those do not support clone(). Valgrind 3.3.1 will just fail if "
6595 "it sees an unsupported combination of clone() flags. "
6596 "It is not recommended to use this flag w/o valgrind though it will "
6597 "work in 99% of the cases. Once valgrind is fixed, this flag will "
6598 "most likely be removed.");
6600 namespace internal {
6602 internal_run_death_test,
"",
6603 "Indicates the file, line number, temporal index of "
6604 "the single death test to run, and a file descriptor to "
6605 "which a success code may be sent, all separated by "
6606 "the '|' characters. This flag is specified if and only if the current "
6607 "process is a sub-process launched for running a thread-safe "
6608 "death test. FOR INTERNAL USE ONLY.");
6611 #if GTEST_HAS_DEATH_TEST
6613 namespace internal {
6617 static bool g_in_fast_death_test_child =
false;
6624 bool InDeathTestChild() {
6625 # if GTEST_OS_WINDOWS
6629 return !
GTEST_FLAG(internal_run_death_test).empty();
6633 if (
GTEST_FLAG(death_test_style) ==
"threadsafe")
6634 return !
GTEST_FLAG(internal_run_death_test).empty();
6636 return g_in_fast_death_test_child;
6643 ExitedWithCode::ExitedWithCode(
int exit_code) : exit_code_(exit_code) {
6647 bool ExitedWithCode::operator()(
int exit_status)
const {
6648 # if GTEST_OS_WINDOWS
6650 return exit_status == exit_code_;
6654 return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
6656 # endif // GTEST_OS_WINDOWS
6659 # if !GTEST_OS_WINDOWS
6661 KilledBySignal::KilledBySignal(
int signum) : signum_(signum) {
6665 bool KilledBySignal::operator()(
int exit_status)
const {
6666 return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
6668 # endif // !GTEST_OS_WINDOWS
6670 namespace internal {
6679 # if GTEST_OS_WINDOWS
6681 m <<
"Exited with exit status " << exit_code;
6685 if (WIFEXITED(exit_code)) {
6686 m <<
"Exited with exit status " << WEXITSTATUS(exit_code);
6687 }
else if (WIFSIGNALED(exit_code)) {
6688 m <<
"Terminated by signal " << WTERMSIG(exit_code);
6691 if (WCOREDUMP(exit_code)) {
6692 m <<
" (core dumped)";
6695 # endif // GTEST_OS_WINDOWS
6697 return m.GetString();
6702 bool ExitedUnsuccessfully(
int exit_status) {
6703 return !ExitedWithCode(0)(exit_status);
6706 # if !GTEST_OS_WINDOWS
6711 static std::string DeathTestThreadWarning(
size_t thread_count) {
6713 msg <<
"Death tests use fork(), which is unsafe particularly"
6714 <<
" in a threaded context. For this test, " <<
GTEST_NAME_ <<
" ";
6715 if (thread_count == 0)
6716 msg <<
"couldn't detect the number of threads.";
6718 msg <<
"detected " << thread_count <<
" threads.";
6719 return msg.GetString();
6721 # endif // !GTEST_OS_WINDOWS
6724 static const char kDeathTestLived =
'L';
6725 static const char kDeathTestReturned =
'R';
6726 static const char kDeathTestThrew =
'T';
6727 static const char kDeathTestInternalError =
'I';
6738 enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
6749 const InternalRunDeathTestFlag*
const flag =
6753 fputc(kDeathTestInternalError, parent);
6754 fprintf(parent,
"%s", message.c_str());
6758 fprintf(stderr,
"%s", message.c_str());
6766 # define GTEST_DEATH_TEST_CHECK_(expression) \
6768 if (!::testing::internal::IsTrue(expression)) { \
6770 ::std::string("CHECK failed: File ") + __FILE__ + ", line " \
6771 + ::testing::internal::StreamableToString(__LINE__) + ": " \
6774 } while (::testing::internal::AlwaysFalse())
6783 # define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
6787 gtest_retval = (expression); \
6788 } while (gtest_retval == -1 && errno == EINTR); \
6789 if (gtest_retval == -1) { \
6791 ::std::string("CHECK failed: File ") + __FILE__ + ", line " \
6792 + ::testing::internal::StreamableToString(__LINE__) + ": " \
6793 + #expression + " != -1"); \
6795 } while (::testing::internal::AlwaysFalse())
6806 static void FailFromInternalError(
int fd) {
6812 while ((num_read = posix::Read(fd, buffer, 255)) > 0) {
6813 buffer[num_read] =
'\0';
6816 }
while (num_read == -1 && errno == EINTR);
6818 if (num_read == 0) {
6821 const int last_error = errno;
6822 GTEST_LOG_(FATAL) <<
"Error while reading death test internal: "
6823 << GetLastErrnoDescription() <<
" [" << last_error <<
"]";
6829 DeathTest::DeathTest() {
6832 DeathTestAbort(
"Cannot run a death test outside of a TEST or "
6833 "TEST_F construct");
6839 bool DeathTest::Create(
const char* statement,
const RE* regex,
6840 const char* file,
int line, DeathTest**
test) {
6842 statement, regex, file, line,
test);
6845 const char* DeathTest::LastMessage() {
6846 return last_death_test_message_.c_str();
6849 void DeathTest::set_last_death_test_message(
const std::string& message) {
6850 last_death_test_message_ = message;
6856 class DeathTestImpl :
public DeathTest {
6858 DeathTestImpl(
const char* a_statement,
const RE* a_regex)
6859 : statement_(a_statement),
6863 outcome_(IN_PROGRESS),
6868 ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
6870 void Abort(AbortReason reason);
6871 virtual bool Passed(
bool status_ok);
6873 const char* statement()
const {
return statement_; }
6874 const RE* regex()
const {
return regex_; }
6875 bool spawned()
const {
return spawned_; }
6876 void set_spawned(
bool is_spawned) { spawned_ = is_spawned; }
6877 int status()
const {
return status_; }
6878 void set_status(
int a_status) { status_ = a_status; }
6879 DeathTestOutcome outcome()
const {
return outcome_; }
6880 void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
6881 int read_fd()
const {
return read_fd_; }
6882 void set_read_fd(
int fd) { read_fd_ = fd; }
6883 int write_fd()
const {
return write_fd_; }
6884 void set_write_fd(
int fd) { write_fd_ = fd; }
6890 void ReadAndInterpretStatusByte();
6895 const char*
const statement_;
6898 const RE*
const regex_;
6904 DeathTestOutcome outcome_;
6919 void DeathTestImpl::ReadAndInterpretStatusByte() {
6928 bytes_read = posix::Read(read_fd(), &flag, 1);
6929 }
while (bytes_read == -1 && errno == EINTR);
6931 if (bytes_read == 0) {
6933 }
else if (bytes_read == 1) {
6935 case kDeathTestReturned:
6936 set_outcome(RETURNED);
6938 case kDeathTestThrew:
6941 case kDeathTestLived:
6944 case kDeathTestInternalError:
6945 FailFromInternalError(read_fd());
6948 GTEST_LOG_(FATAL) <<
"Death test child process reported "
6949 <<
"unexpected status byte ("
6950 <<
static_cast<unsigned int>(flag) <<
")";
6953 GTEST_LOG_(FATAL) <<
"Read from death test child process failed: "
6954 << GetLastErrnoDescription();
6956 GTEST_DEATH_TEST_CHECK_SYSCALL_(
posix::Close(read_fd()));
6968 const char status_ch =
6969 reason == TEST_DID_NOT_DIE ? kDeathTestLived :
6970 reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;
6972 GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));
6989 for (
size_t at = 0; ; ) {
6990 const size_t line_end = output.find(
'\n', at);
6991 ret +=
"[ DEATH ] ";
6992 if (line_end == ::std::string::npos) {
6993 ret += output.substr(at);
6996 ret += output.substr(at, line_end + 1 - at);
7024 bool DeathTestImpl::Passed(
bool status_ok) {
7030 bool success =
false;
7033 buffer <<
"Death test: " << statement() <<
"\n";
7034 switch (outcome()) {
7036 buffer <<
" Result: failed to die.\n"
7037 <<
" Error msg:\n" << FormatDeathTestOutput(error_message);
7040 buffer <<
" Result: threw an exception.\n"
7041 <<
" Error msg:\n" << FormatDeathTestOutput(error_message);
7044 buffer <<
" Result: illegal return in test statement.\n"
7045 <<
" Error msg:\n" << FormatDeathTestOutput(error_message);
7049 const bool matched = RE::PartialMatch(error_message.c_str(), *regex());
7053 buffer <<
" Result: died but not with expected error.\n"
7054 <<
" Expected: " << regex()->pattern() <<
"\n"
7055 <<
"Actual msg:\n" << FormatDeathTestOutput(error_message);
7058 buffer <<
" Result: died but not with expected exit code:\n"
7059 <<
" " << ExitSummary(status()) <<
"\n"
7060 <<
"Actual msg:\n" << FormatDeathTestOutput(error_message);
7066 <<
"DeathTest::Passed somehow called before conclusion of test";
7069 DeathTest::set_last_death_test_message(buffer.GetString());
7073 # if GTEST_OS_WINDOWS
7102 class WindowsDeathTest :
public DeathTestImpl {
7104 WindowsDeathTest(
const char* a_statement,
7108 : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}
7112 virtual TestRole AssumeRole();
7116 const char*
const file_;
7120 AutoHandle write_handle_;
7122 AutoHandle child_handle_;
7127 AutoHandle event_handle_;
7133 int WindowsDeathTest::Wait() {
7139 const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };
7140 switch (::WaitForMultipleObjects(2,
7145 case WAIT_OBJECT_0 + 1:
7148 GTEST_DEATH_TEST_CHECK_(
false);
7153 write_handle_.Reset();
7154 event_handle_.Reset();
7156 ReadAndInterpretStatusByte();
7162 GTEST_DEATH_TEST_CHECK_(
7163 WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),
7166 GTEST_DEATH_TEST_CHECK_(
7167 ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);
7168 child_handle_.Reset();
7169 set_status(
static_cast<int>(status_code));
7178 DeathTest::TestRole WindowsDeathTest::AssumeRole() {
7180 const InternalRunDeathTestFlag*
const flag =
7181 impl->internal_run_death_test_flag();
7182 const TestInfo*
const info = impl->current_test_info();
7183 const int death_test_index = info->result()->death_test_count();
7188 set_write_fd(flag->write_fd());
7189 return EXECUTE_TEST;
7194 SECURITY_ATTRIBUTES handles_are_inheritable = {
7195 sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
7196 HANDLE read_handle, write_handle;
7197 GTEST_DEATH_TEST_CHECK_(
7198 ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,
7201 set_read_fd(::_open_osfhandle(
reinterpret_cast<intptr_t
>(read_handle),
7203 write_handle_.Reset(write_handle);
7204 event_handle_.Reset(::CreateEvent(
7205 &handles_are_inheritable,
7209 GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);
7212 info->test_case_name() +
"." + info->name();
7224 char executable_path[_MAX_PATH + 1];
7225 GTEST_DEATH_TEST_CHECK_(
7226 _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,
7231 std::string(::GetCommandLineA()) +
" " + filter_flag +
" \"" +
7232 internal_flag +
"\"";
7234 DeathTest::set_last_death_test_message(
"");
7241 STARTUPINFOA startup_info;
7242 memset(&startup_info, 0,
sizeof(STARTUPINFO));
7243 startup_info.dwFlags = STARTF_USESTDHANDLES;
7244 startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
7245 startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
7246 startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
7248 PROCESS_INFORMATION process_info;
7249 GTEST_DEATH_TEST_CHECK_(::CreateProcessA(
7251 const_cast<char*
>(command_line.c_str()),
7257 UnitTest::GetInstance()->original_working_dir(),
7259 &process_info) != FALSE);
7260 child_handle_.Reset(process_info.hProcess);
7261 ::CloseHandle(process_info.hThread);
7263 return OVERSEE_TEST;
7265 # else // We are not on Windows.
7270 class ForkingDeathTest :
public DeathTestImpl {
7272 ForkingDeathTest(
const char* statement,
const RE* regex);
7278 void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
7286 ForkingDeathTest::ForkingDeathTest(
const char* a_statement,
const RE* a_regex)
7287 : DeathTestImpl(a_statement, a_regex),
7293 int ForkingDeathTest::Wait() {
7297 ReadAndInterpretStatusByte();
7300 GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
7301 set_status(status_value);
7302 return status_value;
7307 class NoExecDeathTest :
public ForkingDeathTest {
7309 NoExecDeathTest(
const char* a_statement,
const RE* a_regex) :
7310 ForkingDeathTest(a_statement, a_regex) { }
7311 virtual TestRole AssumeRole();
7316 DeathTest::TestRole NoExecDeathTest::AssumeRole() {
7318 if (thread_count != 1) {
7319 GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
7323 GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
7325 DeathTest::set_last_death_test_message(
"");
7336 const pid_t child_pid = fork();
7337 GTEST_DEATH_TEST_CHECK_(child_pid != -1);
7338 set_child_pid(child_pid);
7339 if (child_pid == 0) {
7340 GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
7341 set_write_fd(pipe_fd[1]);
7349 g_in_fast_death_test_child =
true;
7350 return EXECUTE_TEST;
7352 GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
7353 set_read_fd(pipe_fd[0]);
7355 return OVERSEE_TEST;
7362 class ExecDeathTest :
public ForkingDeathTest {
7364 ExecDeathTest(
const char* a_statement,
const RE* a_regex,
7365 const char* file,
int line) :
7366 ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
7367 virtual TestRole AssumeRole();
7369 static ::std::vector<testing::internal::string>
7370 GetArgvsForDeathTestChildProcess() {
7371 ::std::vector<testing::internal::string> args = GetInjectableArgvs();
7375 const char*
const file_;
7384 args_.push_back(NULL);
7388 for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
7393 void AddArgument(
const char* argument) {
7397 template <
typename Str>
7398 void AddArguments(const ::std::vector<Str>& arguments) {
7399 for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
7400 i != arguments.end();
7405 char*
const* Argv() {
7410 std::vector<char*> args_;
7415 struct ExecDeathTestArgs {
7421 inline char** GetEnviron() {
7425 return *_NSGetEnviron();
7430 extern "C" char** environ;
7431 inline char** GetEnviron() {
return environ; }
7432 # endif // GTEST_OS_MAC
7438 static int ExecDeathTestChildMain(
void* child_arg) {
7439 ExecDeathTestArgs*
const args =
static_cast<ExecDeathTestArgs*
>(child_arg);
7440 GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
7445 const char*
const original_dir =
7446 UnitTest::GetInstance()->original_working_dir();
7448 if (chdir(original_dir) != 0) {
7449 DeathTestAbort(
std::string(
"chdir(\"") + original_dir +
"\") failed: " +
7450 GetLastErrnoDescription());
7451 return EXIT_FAILURE;
7459 execve(args->argv[0], args->argv, GetEnviron());
7460 DeathTestAbort(
std::string(
"execve(") + args->argv[0] +
", ...) in " +
7461 original_dir +
" failed: " +
7462 GetLastErrnoDescription());
7463 return EXIT_FAILURE;
7465 # endif // !GTEST_OS_QNX
7476 void StackLowerThanAddress(
const void* ptr,
bool* result)
GTEST_NO_INLINE_;
7477 void StackLowerThanAddress(
const void* ptr,
bool* result) {
7479 *result = (&dummy < ptr);
7482 bool StackGrowsDown() {
7485 StackLowerThanAddress(&dummy, &result);
7496 static pid_t ExecDeathTestSpawnChild(
char*
const* argv,
int close_fd) {
7497 ExecDeathTestArgs args = { argv,
close_fd };
7498 pid_t child_pid = -1;
7503 const int cwd_fd = open(
".", O_RDONLY);
7504 GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);
7505 GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));
7509 const char*
const original_dir =
7510 UnitTest::GetInstance()->original_working_dir();
7512 if (chdir(original_dir) != 0) {
7513 DeathTestAbort(
std::string(
"chdir(\"") + original_dir +
"\") failed: " +
7514 GetLastErrnoDescription());
7515 return EXIT_FAILURE;
7520 GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));
7521 GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,
7522 fd_flags | FD_CLOEXEC));
7523 struct inheritance inherit = {0};
7525 child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());
7527 GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
7528 GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
7530 # else // GTEST_OS_QNX
7535 struct sigaction saved_sigprof_action;
7536 struct sigaction ignore_sigprof_action;
7537 memset(&ignore_sigprof_action, 0,
sizeof(ignore_sigprof_action));
7538 sigemptyset(&ignore_sigprof_action.sa_mask);
7539 ignore_sigprof_action.sa_handler = SIG_IGN;
7540 GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(
7541 SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));
7542 # endif // GTEST_OS_LINUX
7544 # if GTEST_HAS_CLONE
7545 const bool use_fork =
GTEST_FLAG(death_test_use_fork);
7548 static const bool stack_grows_down = StackGrowsDown();
7549 const size_t stack_size = getpagesize();
7551 void*
const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
7552 MAP_ANON | MAP_PRIVATE, -1, 0);
7553 GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
7561 const size_t kMaxStackAlignment = 64;
7562 void*
const stack_top =
7563 static_cast<char*
>(stack) +
7564 (stack_grows_down ? stack_size - kMaxStackAlignment : 0);
7565 GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment &&
7566 reinterpret_cast<intptr_t
>(stack_top) % kMaxStackAlignment == 0);
7568 child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
7570 GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
7573 const bool use_fork =
true;
7574 # endif // GTEST_HAS_CLONE
7576 if (use_fork && (child_pid = fork()) == 0) {
7577 ExecDeathTestChildMain(&args);
7580 # endif // GTEST_OS_QNX
7582 GTEST_DEATH_TEST_CHECK_SYSCALL_(
7583 sigaction(SIGPROF, &saved_sigprof_action, NULL));
7584 # endif // GTEST_OS_LINUX
7586 GTEST_DEATH_TEST_CHECK_(child_pid != -1);
7594 DeathTest::TestRole ExecDeathTest::AssumeRole() {
7596 const InternalRunDeathTestFlag*
const flag =
7597 impl->internal_run_death_test_flag();
7598 const TestInfo*
const info = impl->current_test_info();
7599 const int death_test_index = info->result()->death_test_count();
7602 set_write_fd(flag->write_fd());
7603 return EXECUTE_TEST;
7607 GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
7610 GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
7614 + info->test_case_name() +
"." + info->name();
7621 args.AddArguments(GetArgvsForDeathTestChildProcess());
7622 args.AddArgument(filter_flag.c_str());
7623 args.AddArgument(internal_flag.c_str());
7625 DeathTest::set_last_death_test_message(
"");
7632 const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);
7633 GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
7634 set_child_pid(child_pid);
7635 set_read_fd(pipe_fd[0]);
7637 return OVERSEE_TEST;
7640 # endif // !GTEST_OS_WINDOWS
7647 bool DefaultDeathTestFactory::Create(
const char* statement,
const RE* regex,
7648 const char* file,
int line,
7651 const InternalRunDeathTestFlag*
const flag =
7652 impl->internal_run_death_test_flag();
7653 const int death_test_index = impl->current_test_info()
7654 ->increment_death_test_count();
7657 if (death_test_index > flag->index()) {
7658 DeathTest::set_last_death_test_message(
7660 +
") somehow exceeded expected maximum ("
7665 if (!(flag->file() == file && flag->line() == line &&
7666 flag->index() == death_test_index)) {
7672 # if GTEST_OS_WINDOWS
7674 if (
GTEST_FLAG(death_test_style) ==
"threadsafe" ||
7676 *
test =
new WindowsDeathTest(statement, regex, file, line);
7681 if (
GTEST_FLAG(death_test_style) ==
"threadsafe") {
7682 *
test =
new ExecDeathTest(statement, regex, file, line);
7683 }
else if (
GTEST_FLAG(death_test_style) ==
"fast") {
7684 *
test =
new NoExecDeathTest(statement, regex);
7687 # endif // GTEST_OS_WINDOWS
7690 DeathTest::set_last_death_test_message(
7691 "Unknown death test style \"" +
GTEST_FLAG(death_test_style)
7692 +
"\" encountered");
7703 ::std::vector< ::std::string>* dest) {
7704 ::std::vector< ::std::string> parsed;
7705 ::std::string::size_type pos = 0;
7707 const ::std::string::size_type colon = str.find(delimiter, pos);
7708 if (colon == ::std::string::npos) {
7709 parsed.push_back(str.substr(pos));
7712 parsed.push_back(str.substr(pos, colon - pos));
7719 # if GTEST_OS_WINDOWS
7723 int GetStatusFileDescriptor(
unsigned int parent_process_id,
7724 size_t write_handle_as_size_t,
7725 size_t event_handle_as_size_t) {
7726 AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
7728 parent_process_id));
7729 if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
7730 DeathTestAbort(
"Unable to open parent process " +
7738 const HANDLE write_handle =
7739 reinterpret_cast<HANDLE
>(write_handle_as_size_t);
7740 HANDLE dup_write_handle;
7745 if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
7746 ::GetCurrentProcess(), &dup_write_handle,
7750 DUPLICATE_SAME_ACCESS)) {
7751 DeathTestAbort(
"Unable to duplicate the pipe handle " +
7753 " from the parent process " +
7757 const HANDLE event_handle =
reinterpret_cast<HANDLE
>(event_handle_as_size_t);
7758 HANDLE dup_event_handle;
7760 if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
7761 ::GetCurrentProcess(), &dup_event_handle,
7764 DUPLICATE_SAME_ACCESS)) {
7765 DeathTestAbort(
"Unable to duplicate the event handle " +
7767 " from the parent process " +
7771 const int write_fd =
7772 ::_open_osfhandle(
reinterpret_cast<intptr_t
>(dup_write_handle), O_APPEND);
7773 if (write_fd == -1) {
7774 DeathTestAbort(
"Unable to convert pipe handle " +
7776 " to a file descriptor");
7781 ::SetEvent(dup_event_handle);
7785 # endif // GTEST_OS_WINDOWS
7790 InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
7791 if (
GTEST_FLAG(internal_run_death_test) ==
"")
return NULL;
7797 ::std::vector< ::std::string> fields;
7798 SplitString(
GTEST_FLAG(internal_run_death_test).c_str(),
'|', &fields);
7801 # if GTEST_OS_WINDOWS
7803 unsigned int parent_process_id = 0;
7804 size_t write_handle_as_size_t = 0;
7805 size_t event_handle_as_size_t = 0;
7807 if (fields.size() != 6
7808 || !ParseNaturalNumber(fields[1], &line)
7809 || !ParseNaturalNumber(fields[2], &index)
7810 || !ParseNaturalNumber(fields[3], &parent_process_id)
7811 || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
7812 || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
7813 DeathTestAbort(
"Bad --gtest_internal_run_death_test flag: " +
7816 write_fd = GetStatusFileDescriptor(parent_process_id,
7817 write_handle_as_size_t,
7818 event_handle_as_size_t);
7821 if (fields.size() != 4
7822 || !ParseNaturalNumber(fields[1], &line)
7823 || !ParseNaturalNumber(fields[2], &index)
7824 || !ParseNaturalNumber(fields[3], &write_fd)) {
7825 DeathTestAbort(
"Bad --gtest_internal_run_death_test flag: "
7829 # endif // GTEST_OS_WINDOWS
7831 return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
7836 #endif // GTEST_HAS_DEATH_TEST
7873 #if GTEST_OS_WINDOWS_MOBILE
7874 # include <windows.h>
7875 #elif GTEST_OS_WINDOWS
7876 # include <direct.h>
7878 #elif GTEST_OS_SYMBIAN
7880 # include <sys/syslimits.h>
7882 # include <limits.h>
7884 #endif // GTEST_OS_WINDOWS_MOBILE
7886 #if GTEST_OS_WINDOWS
7887 # define GTEST_PATH_MAX_ _MAX_PATH
7888 #elif defined(PATH_MAX)
7889 # define GTEST_PATH_MAX_ PATH_MAX
7890 #elif defined(_XOPEN_PATH_MAX)
7891 # define GTEST_PATH_MAX_ _XOPEN_PATH_MAX
7893 # define GTEST_PATH_MAX_ _POSIX_PATH_MAX
7894 #endif // GTEST_OS_WINDOWS
7898 namespace internal {
7900 #if GTEST_OS_WINDOWS
7906 const char kAlternatePathSeparator =
'/';
7908 const char kAlternatePathSeparatorString[] =
"/";
7909 # if GTEST_OS_WINDOWS_MOBILE
7915 const DWORD kInvalidFileAttributes = 0xffffffff;
7918 # endif // GTEST_OS_WINDOWS_MOBILE
7923 #endif // GTEST_OS_WINDOWS
7927 #if GTEST_HAS_ALT_PATH_SEP_
7936 #if GTEST_OS_WINDOWS_MOBILE
7940 #elif GTEST_OS_WINDOWS
7942 return FilePath(_getcwd(cwd,
sizeof(cwd)) == NULL ?
"" : cwd);
7945 return FilePath(getcwd(cwd,
sizeof(cwd)) == NULL ?
"" : cwd);
7946 #endif // GTEST_OS_WINDOWS_MOBILE
7957 0,
pathname_.length() - dot_extension.length()));
7967 #if GTEST_HAS_ALT_PATH_SEP_
7968 const char*
const last_alt_sep = strrchr(
c_str(), kAlternatePathSeparator);
7970 if (last_alt_sep != NULL &&
7971 (last_sep == NULL || last_alt_sep > last_sep)) {
7972 return last_alt_sep;
7986 return last_sep ?
FilePath(last_sep + 1) : *
this;
8015 const char* extension) {
8018 file = base_name.
string() +
"." + extension;
8031 return relative_path;
8039 #if GTEST_OS_WINDOWS_MOBILE
8040 LPCWSTR unicode = String::AnsiToUtf16(
pathname_.c_str());
8041 const DWORD attributes = GetFileAttributes(unicode);
8043 return attributes != kInvalidFileAttributes;
8047 #endif // GTEST_OS_WINDOWS_MOBILE
8053 bool result =
false;
8054 #if GTEST_OS_WINDOWS
8063 #if GTEST_OS_WINDOWS_MOBILE
8064 LPCWSTR unicode = String::AnsiToUtf16(path.
c_str());
8065 const DWORD attributes = GetFileAttributes(unicode);
8067 if ((attributes != kInvalidFileAttributes) &&
8068 (attributes & FILE_ATTRIBUTE_DIRECTORY)) {
8075 #endif // GTEST_OS_WINDOWS_MOBILE
8083 #if GTEST_OS_WINDOWS
8095 const char*
const name =
pathname_.c_str();
8096 #if GTEST_OS_WINDOWS
8098 ((name[0] >=
'a' && name[0] <=
'z') ||
8099 (name[0] >=
'A' && name[0] <=
'Z')) &&
8117 const char* extension) {
8121 full_pathname.
Set(
MakeFileName(directory, base_name, number++, extension));
8123 return full_pathname;
8142 if (
pathname_.length() == 0 || this->DirectoryExists()) {
8155 #if GTEST_OS_WINDOWS_MOBILE
8157 LPCWSTR unicode = String::AnsiToUtf16(removed_sep.
c_str());
8158 int result = CreateDirectory(unicode, NULL) ? 0 : -1;
8160 #elif GTEST_OS_WINDOWS
8163 int result = mkdir(
pathname_.c_str(), 0777);
8164 #endif // GTEST_OS_WINDOWS_MOBILE
8191 char*
const dest =
new char[
pathname_.length() + 1];
8192 char* dest_ptr = dest;
8193 memset(dest_ptr, 0,
pathname_.length() + 1);
8195 while (*src !=
'\0') {
8200 #if GTEST_HAS_ALT_PATH_SEP_
8201 if (*dest_ptr == kAlternatePathSeparator) {
8254 #if GTEST_OS_WINDOWS_MOBILE
8255 # include <windows.h>
8256 #elif GTEST_OS_WINDOWS
8258 # include <sys/stat.h>
8260 # include <unistd.h>
8261 #endif // GTEST_OS_WINDOWS_MOBILE
8264 # include <mach/mach_init.h>
8265 # include <mach/task.h>
8266 # include <mach/vm_map.h>
8267 #endif // GTEST_OS_MAC
8270 # include <devctl.h>
8271 # include <sys/procfs.h>
8272 #endif // GTEST_OS_QNX
8280 #define GTEST_IMPLEMENTATION_ 1
8281 #undef GTEST_IMPLEMENTATION_
8284 namespace internal {
8286 #if defined(_MSC_VER) || defined(__BORLANDC__)
8300 const task_t task = mach_task_self();
8301 mach_msg_type_number_t thread_count;
8302 thread_act_array_t thread_list;
8303 const kern_return_t status = task_threads(task, &thread_list, &thread_count);
8304 if (status == KERN_SUCCESS) {
8308 reinterpret_cast<vm_address_t
>(thread_list),
8309 sizeof(thread_t) * thread_count);
8310 return static_cast<size_t>(thread_count);
8321 const int fd = open(
"/proc/self/as", O_RDONLY);
8325 procfs_info process_info;
8327 devctl(fd, DCMD_PROC_INFO, &process_info,
sizeof(process_info), NULL);
8329 if (status == EOK) {
8330 return static_cast<size_t>(process_info.num_threads);
8344 #endif // GTEST_OS_MAC
8346 #if GTEST_USES_POSIX_RE
8364 if (!re.is_valid_)
return false;
8367 return regexec(&re.full_regex_, str, 1, &match, 0) == 0;
8373 if (!re.is_valid_)
return false;
8376 return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;
8385 const size_t full_regex_len = strlen(regex) + 10;
8386 char*
const full_pattern =
new char[full_regex_len];
8388 snprintf(full_pattern, full_regex_len,
"^(%s)$", regex);
8399 const char*
const partial_regex = (*regex ==
'\0') ?
"()" : regex;
8403 <<
"Regular expression \"" << regex
8404 <<
"\" is not a valid POSIX Extended regular expression.";
8406 delete[] full_pattern;
8409 #elif GTEST_USES_SIMPLE_RE
8413 bool IsInSet(
char ch,
const char* str) {
8414 return ch !=
'\0' && strchr(str, ch) != NULL;
8420 bool IsAsciiDigit(
char ch) {
return '0' <= ch && ch <=
'9'; }
8421 bool IsAsciiPunct(
char ch) {
8422 return IsInSet(ch,
"^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~");
8424 bool IsRepeat(
char ch) {
return IsInSet(ch,
"?*+"); }
8425 bool IsAsciiWhiteSpace(
char ch) {
return IsInSet(ch,
" \f\n\r\t\v"); }
8426 bool IsAsciiWordChar(
char ch) {
8427 return (
'a' <= ch && ch <=
'z') || (
'A' <= ch && ch <=
'Z') ||
8428 (
'0' <= ch && ch <=
'9') || ch ==
'_';
8432 bool IsValidEscape(
char c) {
8433 return (IsAsciiPunct(c) || IsInSet(c,
"dDfnrsStvwW"));
8438 bool AtomMatchesChar(
bool escaped,
char pattern_char,
char ch) {
8440 switch (pattern_char) {
8441 case 'd':
return IsAsciiDigit(ch);
8442 case 'D':
return !IsAsciiDigit(ch);
8443 case 'f':
return ch ==
'\f';
8444 case 'n':
return ch ==
'\n';
8445 case 'r':
return ch ==
'\r';
8446 case 's':
return IsAsciiWhiteSpace(ch);
8447 case 'S':
return !IsAsciiWhiteSpace(ch);
8448 case 't':
return ch ==
'\t';
8449 case 'v':
return ch ==
'\v';
8450 case 'w':
return IsAsciiWordChar(ch);
8451 case 'W':
return !IsAsciiWordChar(ch);
8453 return IsAsciiPunct(pattern_char) && pattern_char == ch;
8456 return (pattern_char ==
'.' && ch !=
'\n') || pattern_char == ch;
8460 std::string FormatRegexSyntaxError(
const char* regex,
int index) {
8461 return (Message() <<
"Syntax error at index " << index
8462 <<
" in simple regular expression \"" << regex <<
"\": ").GetString();
8467 bool ValidateRegex(
const char* regex) {
8468 if (regex == NULL) {
8472 ADD_FAILURE() <<
"NULL is not a valid simple regular expression.";
8476 bool is_valid =
true;
8479 bool prev_repeatable =
false;
8480 for (
int i = 0; regex[i]; i++) {
8481 if (regex[i] ==
'\\') {
8483 if (regex[i] ==
'\0') {
8484 ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
8485 <<
"'\\' cannot appear at the end.";
8489 if (!IsValidEscape(regex[i])) {
8490 ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
8491 <<
"invalid escape sequence \"\\" << regex[i] <<
"\".";
8494 prev_repeatable =
true;
8496 const char ch = regex[i];
8498 if (ch ==
'^' && i > 0) {
8500 <<
"'^' can only appear at the beginning.";
8502 }
else if (ch ==
'$' && regex[i + 1] !=
'\0') {
8504 <<
"'$' can only appear at the end.";
8506 }
else if (IsInSet(ch,
"()[]{}|")) {
8508 <<
"'" << ch <<
"' is unsupported.";
8510 }
else if (IsRepeat(ch) && !prev_repeatable) {
8512 <<
"'" << ch <<
"' can only follow a repeatable token.";
8516 prev_repeatable = !IsInSet(ch,
"^$?*+");
8530 bool MatchRepetitionAndRegexAtHead(
8531 bool escaped,
char c,
char repeat,
const char* regex,
8533 const size_t min_count = (repeat ==
'+') ? 1 : 0;
8534 const size_t max_count = (repeat ==
'?') ? 1 :
8535 static_cast<size_t>(-1) - 1;
8539 for (
size_t i = 0; i <= max_count; ++i) {
8541 if (i >= min_count && MatchRegexAtHead(regex, str + i)) {
8548 if (str[i] ==
'\0' || !AtomMatchesChar(escaped, c, str[i]))
8557 bool MatchRegexAtHead(
const char* regex,
const char* str) {
8564 return *str ==
'\0';
8567 const bool escaped = *regex ==
'\\';
8570 if (IsRepeat(regex[1])) {
8574 return MatchRepetitionAndRegexAtHead(
8575 escaped, regex[0], regex[1], regex + 2, str);
8580 return (*str !=
'\0') && AtomMatchesChar(escaped, *regex, *str) &&
8581 MatchRegexAtHead(regex + 1, str + 1);
8593 bool MatchRegexAnywhere(
const char* regex,
const char* str) {
8594 if (regex == NULL || str == NULL)
8598 return MatchRegexAtHead(regex + 1, str);
8602 if (MatchRegexAtHead(regex, str))
8604 }
while (*str++ !=
'\0');
8612 free(
const_cast<char*
>(full_pattern_));
8617 return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);
8623 return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);
8629 if (regex != NULL) {
8639 const size_t len = strlen(regex);
8643 char* buffer =
static_cast<char*
>(malloc(len + 3));
8644 full_pattern_ = buffer;
8651 memcpy(buffer, regex, len);
8654 if (len == 0 || regex[len - 1] !=
'$')
8660 #endif // GTEST_USES_POSIX_RE
8670 return file_name +
":";
8685 const char* file,
int line) {
8696 : severity_(severity) {
8697 const char*
const marker =
8700 severity ==
GTEST_ERROR ?
"[ ERROR ]" :
"[ FATAL ]";
8701 GetStream() << ::std::endl << marker <<
" "
8716 # pragma warning(push)
8717 # pragma warning(disable: 4996)
8720 #if GTEST_HAS_STREAM_REDIRECTION
8723 class CapturedStream {
8726 explicit CapturedStream(
int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
8727 # if GTEST_OS_WINDOWS
8728 char temp_dir_path[MAX_PATH + 1] = {
'\0' };
8729 char temp_file_path[MAX_PATH + 1] = {
'\0' };
8731 ::GetTempPathA(
sizeof(temp_dir_path), temp_dir_path);
8732 const UINT success = ::GetTempFileNameA(temp_dir_path,
8737 <<
"Unable to create a temporary file in " << temp_dir_path;
8738 const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);
8739 GTEST_CHECK_(captured_fd != -1) <<
"Unable to open temporary file "
8741 filename_ = temp_file_path;
8747 # if GTEST_OS_LINUX_ANDROID
8762 char name_template[] =
"/sdcard/gtest_captured_stream.XXXXXX";
8764 char name_template[] =
"/tmp/captured_stream.XXXXXX";
8765 # endif // GTEST_OS_LINUX_ANDROID
8766 const int captured_fd = mkstemp(name_template);
8767 filename_ = name_template;
8768 # endif // GTEST_OS_WINDOWS
8770 dup2(captured_fd, fd_);
8775 remove(filename_.c_str());
8779 if (uncaptured_fd_ != -1) {
8782 dup2(uncaptured_fd_, fd_);
8783 close(uncaptured_fd_);
8784 uncaptured_fd_ = -1;
8787 FILE*
const file =
posix::FOpen(filename_.c_str(),
"r");
8798 static size_t GetFileSize(FILE* file);
8809 size_t CapturedStream::GetFileSize(FILE* file) {
8810 fseek(file, 0, SEEK_END);
8811 return static_cast<size_t>(ftell(file));
8815 std::string CapturedStream::ReadEntireFile(FILE* file) {
8816 const size_t file_size = GetFileSize(file);
8817 char*
const buffer =
new char[file_size];
8819 size_t bytes_last_read = 0;
8820 size_t bytes_read = 0;
8822 fseek(file, 0, SEEK_SET);
8827 bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
8828 bytes_read += bytes_last_read;
8829 }
while (bytes_last_read > 0 && bytes_read < file_size);
8838 # pragma warning(pop)
8841 static CapturedStream* g_captured_stderr = NULL;
8842 static CapturedStream* g_captured_stdout = NULL;
8845 void CaptureStream(
int fd,
const char* stream_name, CapturedStream** stream) {
8846 if (*stream != NULL) {
8847 GTEST_LOG_(FATAL) <<
"Only one " << stream_name
8848 <<
" capturer can exist at a time.";
8850 *stream =
new CapturedStream(fd);
8854 std::string GetCapturedStream(CapturedStream** captured_stream) {
8855 const std::string content = (*captured_stream)->GetCapturedString();
8857 delete *captured_stream;
8858 *captured_stream = NULL;
8875 return GetCapturedStream(&g_captured_stdout);
8880 return GetCapturedStream(&g_captured_stderr);
8883 #endif // GTEST_HAS_STREAM_REDIRECTION
8885 #if GTEST_HAS_DEATH_TEST
8888 ::std::vector<testing::internal::string> g_argvs;
8890 static const ::std::vector<testing::internal::string>* g_injected_test_argvs =
8893 void SetInjectableArgvs(const ::std::vector<testing::internal::string>* argvs) {
8894 if (g_injected_test_argvs != argvs)
8895 delete g_injected_test_argvs;
8896 g_injected_test_argvs = argvs;
8899 const ::std::vector<testing::internal::string>& GetInjectableArgvs() {
8900 if (g_injected_test_argvs != NULL) {
8901 return *g_injected_test_argvs;
8905 #endif // GTEST_HAS_DEATH_TEST
8907 #if GTEST_OS_WINDOWS_MOBILE
8911 TerminateProcess(GetCurrentProcess(), 1);
8914 #endif // GTEST_OS_WINDOWS_MOBILE
8924 for (
size_t i = 0; i != full_flag.length(); i++) {
8925 env_var <<
ToUpper(full_flag.c_str()[i]);
8937 const long long_value = strtol(str, &end, 10);
8943 msg <<
"WARNING: " << src_text
8944 <<
" is expected to be a 32-bit integer, but actually"
8945 <<
" has value \"" << str <<
"\".\n";
8952 const Int32 result =
static_cast<Int32>(long_value);
8953 if (long_value == LONG_MAX || long_value == LONG_MIN ||
8956 result != long_value
8960 msg <<
"WARNING: " << src_text
8961 <<
" is expected to be a 32-bit integer, but actually"
8962 <<
" has value " << str <<
", which overflows.\n";
8978 const char*
const string_value =
posix::GetEnv(env_var.c_str());
8979 return string_value == NULL ?
8988 const char*
const string_value =
posix::GetEnv(env_var.c_str());
8989 if (string_value == NULL) {
8996 string_value, &result)) {
8997 printf(
"The default value %s is used.\n",
9069 using ::std::ostream;
9072 void PrintByteSegmentInObjectTo(
const unsigned char* obj_bytes,
size_t start,
9073 size_t count, ostream* os) {
9075 for (
size_t i = 0; i != count; i++) {
9076 const size_t j =
start + i;
9091 void PrintBytesInObjectToImpl(
const unsigned char* obj_bytes,
size_t count,
9094 *os << count <<
"-byte object <";
9096 const size_t kThreshold = 132;
9097 const size_t kChunkSize = 64;
9102 if (count < kThreshold) {
9103 PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);
9105 PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);
9108 const size_t resume_pos = (count - kChunkSize + 1)/2*2;
9109 PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);
9116 namespace internal2 {
9125 PrintBytesInObjectToImpl(obj_bytes, count, os);
9130 namespace internal {
9147 return 0x20 <= c && c <= 0x7E;
9154 template <
typename Un
signedChar,
typename Char>
9156 switch (
static_cast<wchar_t>(c)) {
9189 *os << static_cast<char>(c);
9210 return PrintAsCharLiteralTo<wchar_t>(c, os);
9218 static_cast<wchar_t>(
static_cast<unsigned char>(c)), os);
9225 template <
typename Un
signedChar,
typename Char>
9228 *os << ((
sizeof(c) > 1) ?
"L'" :
"'");
9229 const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os);
9237 *os <<
" (" <<
static_cast<int>(c);
9242 if (format ==
kHexEscape || (1 <= c && c <= 9)) {
9250 void PrintTo(
unsigned char c, ::std::ostream* os) {
9251 PrintCharAndCodeTo<unsigned char>(c, os);
9254 PrintCharAndCodeTo<unsigned char>(c, os);
9260 PrintCharAndCodeTo<wchar_t>(wc, os);
9267 template <
typename CharType>
9269 const CharType* begin,
size_t len, ostream* os) {
9270 const char*
const kQuoteBegin =
sizeof(CharType) == 1 ?
"\"" :
"L\"";
9272 bool is_previous_hex =
false;
9273 for (
size_t index = 0; index < len; ++index) {
9274 const CharType cur = begin[index];
9275 if (is_previous_hex &&
IsXDigit(cur)) {
9279 *os <<
"\" " << kQuoteBegin;
9288 template <
typename CharType>
9290 const CharType* begin,
size_t len, ostream* os) {
9298 if (len > 0 && begin[len - 1] ==
'\0') {
9308 *os <<
" (no terminating NUL)";
9327 *os << ImplicitCast_<const void*>(
s) <<
" pointing to ";
9338 #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
9344 *os << ImplicitCast_<const void*>(
s) <<
" pointing to ";
9348 #endif // wchar_t is native
9351 #if GTEST_HAS_GLOBAL_STRING
9355 #endif // GTEST_HAS_GLOBAL_STRING
9362 #if GTEST_HAS_GLOBAL_WSTRING
9366 #endif // GTEST_HAS_GLOBAL_WSTRING
9368 #if GTEST_HAS_STD_WSTRING
9372 #endif // GTEST_HAS_STD_WSTRING
9416 #define GTEST_IMPLEMENTATION_ 1
9417 #undef GTEST_IMPLEMENTATION_
9427 return stack_trace == NULL ?
message :
9437 "Non-fatal failure") <<
":\n"
9438 << result.
message() << std::endl;
9443 array_.push_back(result);
9448 if (index < 0 || index >=
size()) {
9449 printf(
"\nInvalid index (%d) into TestPartResultArray.\n", index);
9458 return static_cast<int>(
array_.size());
9461 namespace internal {
9464 : has_new_fatal_failure_(false),
9466 GetTestPartResultReporterForCurrentThread()) {
9518 namespace internal {
9520 #if GTEST_HAS_TYPED_TEST_P
9524 static const char* SkipSpaces(
const char* str) {
9533 const char* TypedTestCasePState::VerifyRegisteredTestNames(
9534 const char* file,
int line,
const char* registered_tests) {
9535 typedef ::std::set<const char*>::const_iterator DefinedTestIter;
9540 registered_tests = SkipSpaces(registered_tests);
9543 ::std::set<std::string> tests;
9544 for (
const char* names = registered_tests; names != NULL;
9545 names = SkipComma(names)) {
9546 const std::string name = GetPrefixUntilComma(names);
9547 if (tests.count(name) != 0) {
9548 errors <<
"Test " << name <<
" is listed more than once.\n";
9553 for (DefinedTestIter it = defined_test_names_.begin();
9554 it != defined_test_names_.end();
9565 errors <<
"No test named " << name
9566 <<
" can be found in this test case.\n";
9570 for (DefinedTestIter it = defined_test_names_.begin();
9571 it != defined_test_names_.end();
9573 if (tests.count(*it) == 0) {
9574 errors <<
"You forgot to list test " << *it <<
".\n";
9578 const std::string& errors_str = errors.GetString();
9579 if (errors_str !=
"") {
9581 errors_str.c_str());
9586 return registered_tests;
9589 #endif // GTEST_HAS_TYPED_TEST_P