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
22DEFINE_bool(help, false, "prints this message");
23DEFINE_string(log, "", "logging options to use");
24#if defined(WEBRTC_WIN)
25DEFINE_int(crt_break_alloc, -1, "memory allocation to break on");
26DEFINE_bool(default_error_handlers, false,
27            "leave the default exception/dbg handler functions in place");
28
29void TestInvalidParameterHandler(const wchar_t* expression,
30                                 const wchar_t* function,
31                                 const wchar_t* file,
32                                 unsigned int line,
33                                 uintptr_t pReserved) {
34  LOG(LS_ERROR) << "InvalidParameter Handler called.  Exiting.";
35  LOG(LS_ERROR) << expression << std::endl << function << std::endl << file
36                << std::endl << line;
37  exit(1);
38}
39void TestPureCallHandler() {
40  LOG(LS_ERROR) << "Purecall Handler called.  Exiting.";
41  exit(1);
42}
43int TestCrtReportHandler(int report_type, char* msg, int* retval) {
44    LOG(LS_ERROR) << "CrtReport Handler called...";
45    LOG(LS_ERROR) << msg;
46  if (report_type == _CRT_ASSERT) {
47    exit(1);
48  } else {
49    *retval = 0;
50    return TRUE;
51  }
52}
53#endif  // WEBRTC_WIN
54
55int main(int argc, char** argv) {
56  testing::InitGoogleTest(&argc, argv);
57  rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, false);
58  if (FLAG_help) {
59    rtc::FlagList::Print(NULL, false);
60    return 0;
61  }
62
63#if defined(WEBRTC_WIN)
64  if (!FLAG_default_error_handlers) {
65    // Make sure any errors don't throw dialogs hanging the test run.
66    _set_invalid_parameter_handler(TestInvalidParameterHandler);
67    _set_purecall_handler(TestPureCallHandler);
68    _CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestCrtReportHandler);
69  }
70
71#ifdef _DEBUG  // Turn on memory leak checking on Windows.
72  _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF |_CRTDBG_LEAK_CHECK_DF);
73  if (FLAG_crt_break_alloc >= 0) {
74    _crtBreakAlloc = FLAG_crt_break_alloc;
75  }
76#endif  // _DEBUG
77#endif  // WEBRTC_WIN
78
79  rtc::Filesystem::SetOrganizationName("google");
80  rtc::Filesystem::SetApplicationName("unittest");
81
82  // By default, log timestamps. Allow overrides by used of a --log flag.
83  rtc::LogMessage::LogTimestamps();
84  if (*FLAG_log != '\0') {
85    rtc::LogMessage::ConfigureLogging(FLAG_log, "unittest.log");
86  }
87
88  int res = RUN_ALL_TESTS();
89
90  // clean up logging so we don't appear to leak memory.
91  rtc::LogMessage::ConfigureLogging("", "");
92
93#if defined(WEBRTC_WIN)
94  // Unhook crt function so that we don't ever log after statics have been
95  // uninitialized.
96  if (!FLAG_default_error_handlers)
97    _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestCrtReportHandler);
98#endif
99
100  return res;
101}
102