blob: aa8a11bb5a9e16f421d8f4e45b4da35e9a88d820 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "rtc_base/flags.h"
18#include "rtc_base/gunit.h"
19#include "rtc_base/logging.h"
20#include "rtc_base/ssladapter.h"
21#include "rtc_base/sslstreamadapter.h"
Bjorn Tereliusedab3012018-01-31 17:23:40 +010022#include "system_wrappers/include/field_trial_default.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "test/field_trial.h"
24#include "test/testsupport/fileutils.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000025
Kári Tristan Helgasone2baffb2017-06-09 10:31:58 +020026#if defined(WEBRTC_IOS)
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020027#include "test/ios/test_support.h"
Kári Tristan Helgasone2baffb2017-06-09 10:31:58 +020028#endif
29
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000030DEFINE_bool(help, false, "prints this message");
31DEFINE_string(log, "", "logging options to use");
stefanc1aeaf02015-10-15 07:26:07 -070032DEFINE_string(
33 force_fieldtrials,
34 "",
35 "Field trials control experimental feature code which can be forced. "
36 "E.g. running with --force_fieldtrials=WebRTC-FooFeature/Enable/"
37 " will assign the group Enable to field trial WebRTC-FooFeature.");
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000038#if defined(WEBRTC_WIN)
39DEFINE_int(crt_break_alloc, -1, "memory allocation to break on");
40DEFINE_bool(default_error_handlers, false,
41 "leave the default exception/dbg handler functions in place");
42
43void TestInvalidParameterHandler(const wchar_t* expression,
44 const wchar_t* function,
45 const wchar_t* file,
46 unsigned int line,
47 uintptr_t pReserved) {
Mirko Bonadei675513b2017-11-09 11:09:25 +010048 RTC_LOG(LS_ERROR) << "InvalidParameter Handler called. Exiting.";
49 RTC_LOG(LS_ERROR) << expression << std::endl
50 << function << std::endl
51 << file << std::endl
52 << line;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000053 exit(1);
54}
55void TestPureCallHandler() {
Mirko Bonadei675513b2017-11-09 11:09:25 +010056 RTC_LOG(LS_ERROR) << "Purecall Handler called. Exiting.";
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000057 exit(1);
58}
59int TestCrtReportHandler(int report_type, char* msg, int* retval) {
Mirko Bonadei675513b2017-11-09 11:09:25 +010060 RTC_LOG(LS_ERROR) << "CrtReport Handler called...";
61 RTC_LOG(LS_ERROR) << msg;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000062 if (report_type == _CRT_ASSERT) {
63 exit(1);
64 } else {
65 *retval = 0;
66 return TRUE;
67 }
68}
Tommi0eefb4d2015-05-23 09:54:07 +020069#endif // WEBRTC_WIN
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000070
Robin Raymond1c62ffa2017-12-03 16:45:56 -050071int main(int argc, char* argv[]) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000072 testing::InitGoogleTest(&argc, argv);
henrike@webrtc.orgc50bf7c2014-05-14 18:24:13 +000073 rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000074 if (FLAG_help) {
deadbeef37f5ecf2017-02-27 14:06:41 -080075 rtc::FlagList::Print(nullptr, false);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000076 return 0;
77 }
78
Niels Möllerb00dc382016-06-16 12:44:30 +020079 webrtc::test::SetExecutablePath(argv[0]);
Bjorn Tereliusedab3012018-01-31 17:23:40 +010080 webrtc::test::ValidateFieldTrialsStringOrDie(FLAG_force_fieldtrials);
81 // InitFieldTrialsFromString stores the char*, so the char array must outlive
82 // the application.
83 webrtc::field_trial::InitFieldTrialsFromString(FLAG_force_fieldtrials);
stefanc1aeaf02015-10-15 07:26:07 -070084
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000085#if defined(WEBRTC_WIN)
86 if (!FLAG_default_error_handlers) {
87 // Make sure any errors don't throw dialogs hanging the test run.
88 _set_invalid_parameter_handler(TestInvalidParameterHandler);
89 _set_purecall_handler(TestPureCallHandler);
90 _CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestCrtReportHandler);
91 }
92
tfarinaa41ab932015-10-30 16:08:48 -070093#if !defined(NDEBUG) // Turn on memory leak checking on Windows.
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000094 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF |_CRTDBG_LEAK_CHECK_DF);
95 if (FLAG_crt_break_alloc >= 0) {
96 _crtBreakAlloc = FLAG_crt_break_alloc;
97 }
tfarinaa41ab932015-10-30 16:08:48 -070098#endif
Tommi0eefb4d2015-05-23 09:54:07 +020099#endif // WEBRTC_WIN
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000100
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000101 // By default, log timestamps. Allow overrides by used of a --log flag.
102 rtc::LogMessage::LogTimestamps();
103 if (*FLAG_log != '\0') {
Tommi0eefb4d2015-05-23 09:54:07 +0200104 rtc::LogMessage::ConfigureLogging(FLAG_log);
Peter Boströmdef58202015-11-27 17:53:22 +0100105 } else if (rtc::LogMessage::GetLogToDebug() > rtc::LS_INFO) {
106 // Default to LS_INFO, even for release builds to provide better test
107 // logging.
108 rtc::LogMessage::LogToDebug(rtc::LS_INFO);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000109 }
110
pbos@webrtc.org34f2a9e2014-09-28 11:36:45 +0000111 // Initialize SSL which are used by several tests.
112 rtc::InitializeSSL();
deadbeef6cf94a02016-11-28 17:38:34 -0800113 rtc::SSLStreamAdapter::enable_time_callback_for_testing();
pbos@webrtc.org34f2a9e2014-09-28 11:36:45 +0000114
Kári Tristan Helgasone2baffb2017-06-09 10:31:58 +0200115#if defined(WEBRTC_IOS)
Edward Lemure66572b2018-01-05 15:34:09 +0100116 rtc::test::InitTestSuite(RUN_ALL_TESTS, argc, argv, false);
Kári Tristan Helgasone2baffb2017-06-09 10:31:58 +0200117 rtc::test::RunTestsFromIOSApp();
118#endif
119 const int res = RUN_ALL_TESTS();
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000120
pbos@webrtc.org34f2a9e2014-09-28 11:36:45 +0000121 rtc::CleanupSSL();
122
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000123 // clean up logging so we don't appear to leak memory.
Tommi0eefb4d2015-05-23 09:54:07 +0200124 rtc::LogMessage::ConfigureLogging("");
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000125
126#if defined(WEBRTC_WIN)
127 // Unhook crt function so that we don't ever log after statics have been
128 // uninitialized.
129 if (!FLAG_default_error_handlers)
130 _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestCrtReportHandler);
131#endif
132
133 return res;
134}