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