diff options
Diffstat (limited to 'utils/unittest/googletest/gtest-port.cc')
-rw-r--r-- | utils/unittest/googletest/gtest-port.cc | 135 |
1 files changed, 83 insertions, 52 deletions
diff --git a/utils/unittest/googletest/gtest-port.cc b/utils/unittest/googletest/gtest-port.cc index abc7149168..675efe89a4 100644 --- a/utils/unittest/googletest/gtest-port.cc +++ b/utils/unittest/googletest/gtest-port.cc @@ -35,20 +35,20 @@ #include <stdlib.h> #include <stdio.h> -#if GTEST_OS_WINDOWS +#if GTEST_OS_WINDOWS_MOBILE +#include <windows.h> // For TerminateProcess() +#elif GTEST_OS_WINDOWS #include <io.h> #include <sys/stat.h> #else #include <unistd.h> -#endif // GTEST_OS_WINDOWS +#endif // GTEST_OS_WINDOWS_MOBILE -#if GTEST_USES_SIMPLE_RE -#include <string.h> -#endif - -#ifdef _WIN32_WCE -#include <windows.h> // For TerminateProcess() -#endif // _WIN32_WCE +#if GTEST_OS_MAC +#include <mach/mach_init.h> +#include <mach/task.h> +#include <mach/vm_map.h> +#endif // GTEST_OS_MAC #include <gtest/gtest-spi.h> #include <gtest/gtest-message.h> @@ -66,12 +66,43 @@ namespace testing { namespace internal { -#if GTEST_OS_WINDOWS -// Microsoft does not provide a definition of STDERR_FILENO. +#if defined(_MSC_VER) || defined(__BORLANDC__) +// MSVC and C++Builder do not provide a definition of STDERR_FILENO. const int kStdErrFileno = 2; #else const int kStdErrFileno = STDERR_FILENO; -#endif // GTEST_OS_WINDOWS +#endif // _MSC_VER + +#if GTEST_OS_MAC + +// Returns the number of threads running in the process, or 0 to indicate that +// we cannot detect it. +size_t GetThreadCount() { + const task_t task = mach_task_self(); + mach_msg_type_number_t thread_count; + thread_act_array_t thread_list; + const kern_return_t status = task_threads(task, &thread_list, &thread_count); + if (status == KERN_SUCCESS) { + // task_threads allocates resources in thread_list and we need to free them + // to avoid leaks. + vm_deallocate(task, + reinterpret_cast<vm_address_t>(thread_list), + sizeof(thread_t) * thread_count); + return static_cast<size_t>(thread_count); + } else { + return 0; + } +} + +#else + +size_t GetThreadCount() { + // There's no portable way to detect the number of threads, so we just + // return 0 to indicate that we cannot detect it. + return 0; +} + +#endif // GTEST_OS_MAC #if GTEST_USES_POSIX_RE @@ -102,7 +133,7 @@ bool RE::PartialMatch(const char* str, const RE& re) { // Initializes an RE from its string representation. void RE::Init(const char* regex) { - pattern_ = strdup(regex); + pattern_ = posix::StrDup(regex); // Reserves enough bytes to hold the regular expression used for a // full match. @@ -350,11 +381,7 @@ bool RE::PartialMatch(const char* str, const RE& re) { void RE::Init(const char* regex) { pattern_ = full_pattern_ = NULL; if (regex != NULL) { -#if GTEST_OS_WINDOWS - pattern_ = _strdup(regex); -#else - pattern_ = strdup(regex); -#endif + pattern_ = posix::StrDup(regex); } is_valid_ = ValidateRegex(regex); @@ -386,22 +413,25 @@ void RE::Init(const char* regex) { #endif // GTEST_USES_POSIX_RE -// Logs a message at the given severity level. -void GTestLog(GTestLogSeverity severity, const char* file, - int line, const char* msg) { + +GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line) + : severity_(severity) { const char* const marker = severity == GTEST_INFO ? "[ INFO ]" : severity == GTEST_WARNING ? "[WARNING]" : severity == GTEST_ERROR ? "[ ERROR ]" : "[ FATAL ]"; - fprintf(stderr, "\n%s %s:%d: %s\n", marker, file, line, msg); - if (severity == GTEST_FATAL) { - fflush(NULL); // abort() is not guaranteed to flush open file streams. - abort(); - } + GetStream() << ::std::endl << marker << " " + << FormatFileLocation(file, line).c_str() << ": "; } -#if GTEST_HAS_STD_STRING - +// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program. +GTestLog::~GTestLog() { + GetStream() << ::std::endl; + if (severity_ == GTEST_FATAL) { + fflush(stderr); + posix::Abort(); + } +} // Disable Microsoft deprecation warnings for POSIX functions called from // this class (creat, dup, dup2, and close) #ifdef _MSC_VER @@ -415,6 +445,10 @@ class CapturedStderr { public: // The ctor redirects stderr to a temporary file. CapturedStderr() { +#if GTEST_OS_WINDOWS_MOBILE + // Not supported on Windows CE. + posix::Abort(); +#else uncaptured_fd_ = dup(kStdErrFileno); #if GTEST_OS_WINDOWS @@ -436,19 +470,24 @@ class CapturedStderr { fflush(NULL); dup2(captured_fd, kStdErrFileno); close(captured_fd); +#endif // GTEST_OS_WINDOWS_MOBILE } ~CapturedStderr() { +#if !GTEST_OS_WINDOWS_MOBILE remove(filename_.c_str()); +#endif // !GTEST_OS_WINDOWS_MOBILE } // Stops redirecting stderr. void StopCapture() { +#if !GTEST_OS_WINDOWS_MOBILE // Restores the original stream. fflush(NULL); dup2(uncaptured_fd_, kStdErrFileno); close(uncaptured_fd_); uncaptured_fd_ = -1; +#endif // !GTEST_OS_WINDOWS_MOBILE } // Returns the name of the temporary file holding the stderr output. @@ -474,7 +513,7 @@ static size_t GetFileSize(FILE * file) { } // Reads the entire content of a file as a string. -static ::std::string ReadEntireFile(FILE * file) { +static String ReadEntireFile(FILE * file) { const size_t file_size = GetFileSize(file); char* const buffer = new char[file_size]; @@ -490,7 +529,7 @@ static ::std::string ReadEntireFile(FILE * file) { bytes_read += bytes_last_read; } while (bytes_last_read > 0 && bytes_read < file_size); - const ::std::string content(buffer, buffer+bytes_read); + const String content(buffer, bytes_read); delete[] buffer; return content; @@ -499,7 +538,7 @@ static ::std::string ReadEntireFile(FILE * file) { // Starts capturing stderr. void CaptureStderr() { if (g_captured_stderr != NULL) { - GTEST_LOG_(FATAL, "Only one stderr capturer can exist at one time."); + GTEST_LOG_(FATAL) << "Only one stderr capturer can exist at one time."; } g_captured_stderr = new CapturedStderr; } @@ -507,20 +546,12 @@ void CaptureStderr() { // Stops capturing stderr and returns the captured string. // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can // use it here. -::std::string GetCapturedStderr() { +String GetCapturedStderr() { g_captured_stderr->StopCapture(); -// Disables Microsoft deprecation warning for fopen and fclose. -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable: 4996) -#endif // _MSC_VER - FILE* const file = fopen(g_captured_stderr->filename().c_str(), "r"); - const ::std::string content = ReadEntireFile(file); - fclose(file); -#ifdef _MSC_VER -#pragma warning(pop) -#endif // _MSC_VER + FILE* const file = posix::FOpen(g_captured_stderr->filename().c_str(), "r"); + const String content = ReadEntireFile(file); + posix::FClose(file); delete g_captured_stderr; g_captured_stderr = NULL; @@ -528,8 +559,6 @@ void CaptureStderr() { return content; } -#endif // GTEST_HAS_STD_STRING - #if GTEST_HAS_DEATH_TEST // A copy of all command line arguments. Set by InitGoogleTest(). @@ -540,12 +569,14 @@ const ::std::vector<String>& GetArgvs() { return g_argvs; } #endif // GTEST_HAS_DEATH_TEST -#ifdef _WIN32_WCE -void abort() { +#if GTEST_OS_WINDOWS_MOBILE +namespace posix { +void Abort() { DebugBreak(); TerminateProcess(GetCurrentProcess(), 1); } -#endif // _WIN32_WCE +} // namespace posix +#endif // GTEST_OS_WINDOWS_MOBILE // Returns the name of the environment variable corresponding to the // given flag. For example, FlagToEnvVar("foo") will return @@ -555,7 +586,7 @@ static String FlagToEnvVar(const char* flag) { (Message() << GTEST_FLAG_PREFIX_ << flag).GetString(); Message env_var; - for (int i = 0; i != full_flag.GetLength(); i++) { + for (size_t i = 0; i != full_flag.length(); i++) { env_var << static_cast<char>(toupper(full_flag.c_str()[i])); } @@ -609,7 +640,7 @@ bool ParseInt32(const Message& src_text, const char* str, Int32* value) { // The value is considered true iff it's not "0". bool BoolFromGTestEnv(const char* flag, bool default_value) { const String env_var = FlagToEnvVar(flag); - const char* const string_value = GetEnv(env_var.c_str()); + const char* const string_value = posix::GetEnv(env_var.c_str()); return string_value == NULL ? default_value : strcmp(string_value, "0") != 0; } @@ -619,7 +650,7 @@ bool BoolFromGTestEnv(const char* flag, bool default_value) { // doesn't represent a valid 32-bit integer, returns default_value. Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) { const String env_var = FlagToEnvVar(flag); - const char* const string_value = GetEnv(env_var.c_str()); + const char* const string_value = posix::GetEnv(env_var.c_str()); if (string_value == NULL) { // The environment variable is not set. return default_value; @@ -641,7 +672,7 @@ Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) { // the given flag; if it's not set, returns default_value. const char* StringFromGTestEnv(const char* flag, const char* default_value) { const String env_var = FlagToEnvVar(flag); - const char* const value = GetEnv(env_var.c_str()); + const char* const value = posix::GetEnv(env_var.c_str()); return value == NULL ? default_value : value; } |