| // Copyright 2007 Google Inc. All Rights Reserved. |
| |
| // juberti@google.com (Justin Uberti) |
| // |
| // A reuseable entry point for gunit tests. |
| |
| #ifdef WIN32 |
| #include <crtdbg.h> |
| #endif |
| |
| #include "talk/base/flags.h" |
| #include "talk/base/fileutils.h" |
| #include "talk/base/gunit.h" |
| #include "talk/base/logging.h" |
| #include "talk/base/pathutils.h" |
| |
| DEFINE_bool(help, false, "prints this message"); |
| DEFINE_string(log, "", "logging options to use"); |
| #ifdef WIN32 |
| DEFINE_int(crt_break_alloc, -1, "memory allocation to break on"); |
| DEFINE_bool(default_error_handlers, false, |
| "leave the default exception/dbg handler functions in place"); |
| |
| void TestInvalidParameterHandler(const wchar_t* expression, |
| const wchar_t* function, |
| const wchar_t* file, |
| unsigned int line, |
| uintptr_t pReserved) { |
| LOG(LS_ERROR) << "InvalidParameter Handler called. Exiting."; |
| LOG(LS_ERROR) << expression << std::endl << function << std::endl << file |
| << std::endl << line; |
| exit(1); |
| } |
| void TestPureCallHandler() { |
| LOG(LS_ERROR) << "Purecall Handler called. Exiting."; |
| exit(1); |
| } |
| int TestCrtReportHandler(int report_type, char* msg, int* retval) { |
| LOG(LS_ERROR) << "CrtReport Handler called..."; |
| LOG(LS_ERROR) << msg; |
| if (report_type == _CRT_ASSERT) { |
| exit(1); |
| } else { |
| *retval = 0; |
| return TRUE; |
| } |
| } |
| #endif // WIN32 |
| |
| talk_base::Pathname GetTalkDirectory() { |
| // Locate talk directory. |
| talk_base::Pathname path = talk_base::Filesystem::GetCurrentDirectory(); |
| std::string talk_folder_name("talk"); |
| talk_folder_name += path.folder_delimiter(); |
| while (path.folder_name() != talk_folder_name && !path.empty()) { |
| path.SetFolder(path.parent_folder()); |
| } |
| |
| // If not running inside "talk" folder, then assume running in its parent |
| // folder. |
| if (path.empty()) { |
| path = talk_base::Filesystem::GetCurrentDirectory(); |
| path.AppendFolder("talk"); |
| // Make sure the folder exist. |
| if (!talk_base::Filesystem::IsFolder(path)) { |
| path.clear(); |
| } |
| } |
| return path; |
| } |
| |
| int main(int argc, char** argv) { |
| testing::InitGoogleTest(&argc, argv); |
| FlagList::SetFlagsFromCommandLine(&argc, argv, false); |
| if (FLAG_help) { |
| FlagList::Print(NULL, false); |
| return 0; |
| } |
| |
| #ifdef WIN32 |
| if (!FLAG_default_error_handlers) { |
| // Make sure any errors don't throw dialogs hanging the test run. |
| _set_invalid_parameter_handler(TestInvalidParameterHandler); |
| _set_purecall_handler(TestPureCallHandler); |
| _CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestCrtReportHandler); |
| } |
| |
| #ifdef _DEBUG // Turn on memory leak checking on Windows. |
| _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF |_CRTDBG_LEAK_CHECK_DF); |
| if (FLAG_crt_break_alloc >= 0) { |
| _crtBreakAlloc = FLAG_crt_break_alloc; |
| } |
| #endif // _DEBUG |
| #endif // WIN32 |
| |
| talk_base::Filesystem::SetOrganizationName("google"); |
| talk_base::Filesystem::SetApplicationName("unittest"); |
| |
| // By default, log timestamps. Allow overrides by used of a --log flag. |
| talk_base::LogMessage::LogTimestamps(); |
| if (*FLAG_log != '\0') { |
| talk_base::LogMessage::ConfigureLogging(FLAG_log, "unittest.log"); |
| } |
| |
| int res = RUN_ALL_TESTS(); |
| |
| // clean up logging so we don't appear to leak memory. |
| talk_base::LogMessage::ConfigureLogging("", ""); |
| |
| #ifdef WIN32 |
| // Unhook crt function so that we don't ever log after statics have been |
| // uninitialized. |
| if (!FLAG_default_error_handlers) |
| _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestCrtReportHandler); |
| #endif |
| |
| return res; |
| } |