// Copyright 2007 Google Inc. All Rights Reserved. // juberti@google.com (Justin Uberti) // // A reuseable entry point for gunit tests. #ifdef WIN32 #include #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; }