1/* 2 * Copyright 2007 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10// 11// A reuseable entry point for gunit tests. 12 13#if defined(WEBRTC_WIN) 14#include <crtdbg.h> 15#endif 16 17#include "webrtc/base/flags.h" 18#include "webrtc/base/fileutils.h" 19#include "webrtc/base/gunit.h" 20#include "webrtc/base/logging.h" 21#include "webrtc/base/ssladapter.h" 22#include "webrtc/test/field_trial.h" 23 24DEFINE_bool(help, false, "prints this message"); 25DEFINE_string(log, "", "logging options to use"); 26DEFINE_string( 27 force_fieldtrials, 28 "", 29 "Field trials control experimental feature code which can be forced. " 30 "E.g. running with --force_fieldtrials=WebRTC-FooFeature/Enable/" 31 " will assign the group Enable to field trial WebRTC-FooFeature."); 32#if defined(WEBRTC_WIN) 33DEFINE_int(crt_break_alloc, -1, "memory allocation to break on"); 34DEFINE_bool(default_error_handlers, false, 35 "leave the default exception/dbg handler functions in place"); 36 37void TestInvalidParameterHandler(const wchar_t* expression, 38 const wchar_t* function, 39 const wchar_t* file, 40 unsigned int line, 41 uintptr_t pReserved) { 42 LOG(LS_ERROR) << "InvalidParameter Handler called. Exiting."; 43 LOG(LS_ERROR) << expression << std::endl << function << std::endl << file 44 << std::endl << line; 45 exit(1); 46} 47void TestPureCallHandler() { 48 LOG(LS_ERROR) << "Purecall Handler called. Exiting."; 49 exit(1); 50} 51int TestCrtReportHandler(int report_type, char* msg, int* retval) { 52 LOG(LS_ERROR) << "CrtReport Handler called..."; 53 LOG(LS_ERROR) << msg; 54 if (report_type == _CRT_ASSERT) { 55 exit(1); 56 } else { 57 *retval = 0; 58 return TRUE; 59 } 60} 61#endif // WEBRTC_WIN 62 63int main(int argc, char** argv) { 64 testing::InitGoogleTest(&argc, argv); 65 rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, false); 66 if (FLAG_help) { 67 rtc::FlagList::Print(NULL, false); 68 return 0; 69 } 70 71 webrtc::test::InitFieldTrialsFromString(FLAG_force_fieldtrials); 72 73#if defined(WEBRTC_WIN) 74 if (!FLAG_default_error_handlers) { 75 // Make sure any errors don't throw dialogs hanging the test run. 76 _set_invalid_parameter_handler(TestInvalidParameterHandler); 77 _set_purecall_handler(TestPureCallHandler); 78 _CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestCrtReportHandler); 79 } 80 81#if !defined(NDEBUG) // Turn on memory leak checking on Windows. 82 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF |_CRTDBG_LEAK_CHECK_DF); 83 if (FLAG_crt_break_alloc >= 0) { 84 _crtBreakAlloc = FLAG_crt_break_alloc; 85 } 86#endif 87#endif // WEBRTC_WIN 88 89 rtc::Filesystem::SetOrganizationName("google"); 90 rtc::Filesystem::SetApplicationName("unittest"); 91 92 // By default, log timestamps. Allow overrides by used of a --log flag. 93 rtc::LogMessage::LogTimestamps(); 94 if (*FLAG_log != '\0') { 95 rtc::LogMessage::ConfigureLogging(FLAG_log); 96 } else if (rtc::LogMessage::GetLogToDebug() > rtc::LS_INFO) { 97 // Default to LS_INFO, even for release builds to provide better test 98 // logging. 99 rtc::LogMessage::LogToDebug(rtc::LS_INFO); 100 } 101 102 // Initialize SSL which are used by several tests. 103 rtc::InitializeSSL(); 104 105 int res = RUN_ALL_TESTS(); 106 107 rtc::CleanupSSL(); 108 109 // clean up logging so we don't appear to leak memory. 110 rtc::LogMessage::ConfigureLogging(""); 111 112#if defined(WEBRTC_WIN) 113 // Unhook crt function so that we don't ever log after statics have been 114 // uninitialized. 115 if (!FLAG_default_error_handlers) 116 _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestCrtReportHandler); 117#endif 118 119 return res; 120} 121