147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2007 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// A reuseable entry point for gunit tests. 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN) 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <crtdbg.h> 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/flags.h" 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/fileutils.h" 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/gunit.h" 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/logging.h" 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgDEFINE_bool(help, false, "prints this message"); 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgDEFINE_string(log, "", "logging options to use"); 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN) 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgDEFINE_int(crt_break_alloc, -1, "memory allocation to break on"); 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgDEFINE_bool(default_error_handlers, false, 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org "leave the default exception/dbg handler functions in place"); 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid TestInvalidParameterHandler(const wchar_t* expression, 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const wchar_t* function, 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const wchar_t* file, 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org unsigned int line, 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org uintptr_t pReserved) { 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_ERROR) << "InvalidParameter Handler called. Exiting."; 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_ERROR) << expression << std::endl << function << std::endl << file 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org << std::endl << line; 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org exit(1); 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid TestPureCallHandler() { 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_ERROR) << "Purecall Handler called. Exiting."; 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org exit(1); 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgint TestCrtReportHandler(int report_type, char* msg, int* retval) { 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_ERROR) << "CrtReport Handler called..."; 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_ERROR) << msg; 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (report_type == _CRT_ASSERT) { 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org exit(1); 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } else { 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *retval = 0; 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return TRUE; 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_WIN 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgint main(int argc, char** argv) { 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org testing::InitGoogleTest(&argc, argv); 57b2eea5cf51211d6d4fd735380705f9626a1ebff9henrike@webrtc.org rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, false); 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (FLAG_help) { 59b2eea5cf51211d6d4fd735380705f9626a1ebff9henrike@webrtc.org rtc::FlagList::Print(NULL, false); 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return 0; 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN) 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!FLAG_default_error_handlers) { 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Make sure any errors don't throw dialogs hanging the test run. 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org _set_invalid_parameter_handler(TestInvalidParameterHandler); 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org _set_purecall_handler(TestPureCallHandler); 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org _CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestCrtReportHandler); 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifdef _DEBUG // Turn on memory leak checking on Windows. 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF |_CRTDBG_LEAK_CHECK_DF); 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (FLAG_crt_break_alloc >= 0) { 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org _crtBreakAlloc = FLAG_crt_break_alloc; 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // _DEBUG 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_WIN 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::Filesystem::SetOrganizationName("google"); 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::Filesystem::SetApplicationName("unittest"); 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // By default, log timestamps. Allow overrides by used of a --log flag. 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::LogMessage::LogTimestamps(); 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (*FLAG_log != '\0') { 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::LogMessage::ConfigureLogging(FLAG_log, "unittest.log"); 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int res = RUN_ALL_TESTS(); 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // clean up logging so we don't appear to leak memory. 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::LogMessage::ConfigureLogging("", ""); 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN) 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Unhook crt function so that we don't ever log after statics have been 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // uninitialized. 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!FLAG_default_error_handlers) 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestCrtReportHandler); 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return res; 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 102