Home | History | Annotate | Download | only in base
      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 
     22 DEFINE_bool(help, false, "prints this message");
     23 DEFINE_string(log, "", "logging options to use");
     24 #if defined(WEBRTC_WIN)
     25 DEFINE_int(crt_break_alloc, -1, "memory allocation to break on");
     26 DEFINE_bool(default_error_handlers, false,
     27             "leave the default exception/dbg handler functions in place");
     28 
     29 void 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 }
     39 void TestPureCallHandler() {
     40   LOG(LS_ERROR) << "Purecall Handler called.  Exiting.";
     41   exit(1);
     42 }
     43 int 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 
     55 int 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