119 lines
3.5 KiB
C++
119 lines
3.5 KiB
C++
|
// Copyright 2007 Google Inc. All Rights Reserved.
|
||
|
|
||
|
// juberti@google.com (Justin Uberti)
|
||
|
//
|
||
|
// A reuseable entry point for gunit tests.
|
||
|
|
||
|
#ifdef WIN32
|
||
|
#include <crtdbg.h>
|
||
|
#endif
|
||
|
|
||
|
#include "talk/base/flags.h"
|
||
|
#include "talk/base/fileutils.h"
|
||
|
#include "talk/base/gunit.h"
|
||
|
#include "talk/base/logging.h"
|
||
|
#include "talk/base/pathutils.h"
|
||
|
|
||
|
DEFINE_bool(help, false, "prints this message");
|
||
|
DEFINE_string(log, "", "logging options to use");
|
||
|
#ifdef WIN32
|
||
|
DEFINE_int(crt_break_alloc, -1, "memory allocation to break on");
|
||
|
DEFINE_bool(default_error_handlers, false,
|
||
|
"leave the default exception/dbg handler functions in place");
|
||
|
|
||
|
void TestInvalidParameterHandler(const wchar_t* expression,
|
||
|
const wchar_t* function,
|
||
|
const wchar_t* file,
|
||
|
unsigned int line,
|
||
|
uintptr_t pReserved) {
|
||
|
LOG(LS_ERROR) << "InvalidParameter Handler called. Exiting.";
|
||
|
LOG(LS_ERROR) << expression << std::endl << function << std::endl << file
|
||
|
<< std::endl << line;
|
||
|
exit(1);
|
||
|
}
|
||
|
void TestPureCallHandler() {
|
||
|
LOG(LS_ERROR) << "Purecall Handler called. Exiting.";
|
||
|
exit(1);
|
||
|
}
|
||
|
int TestCrtReportHandler(int report_type, char* msg, int* retval) {
|
||
|
LOG(LS_ERROR) << "CrtReport Handler called...";
|
||
|
LOG(LS_ERROR) << msg;
|
||
|
if (report_type == _CRT_ASSERT) {
|
||
|
exit(1);
|
||
|
} else {
|
||
|
*retval = 0;
|
||
|
return TRUE;
|
||
|
}
|
||
|
}
|
||
|
#endif // WIN32
|
||
|
|
||
|
talk_base::Pathname GetTalkDirectory() {
|
||
|
// Locate talk directory.
|
||
|
talk_base::Pathname path = talk_base::Filesystem::GetCurrentDirectory();
|
||
|
std::string talk_folder_name("talk");
|
||
|
talk_folder_name += path.folder_delimiter();
|
||
|
while (path.folder_name() != talk_folder_name && !path.empty()) {
|
||
|
path.SetFolder(path.parent_folder());
|
||
|
}
|
||
|
|
||
|
// If not running inside "talk" folder, then assume running in its parent
|
||
|
// folder.
|
||
|
if (path.empty()) {
|
||
|
path = talk_base::Filesystem::GetCurrentDirectory();
|
||
|
path.AppendFolder("talk");
|
||
|
// Make sure the folder exist.
|
||
|
if (!talk_base::Filesystem::IsFolder(path)) {
|
||
|
path.clear();
|
||
|
}
|
||
|
}
|
||
|
return path;
|
||
|
}
|
||
|
|
||
|
int main(int argc, char** argv) {
|
||
|
testing::InitGoogleTest(&argc, argv);
|
||
|
FlagList::SetFlagsFromCommandLine(&argc, argv, false);
|
||
|
if (FLAG_help) {
|
||
|
FlagList::Print(NULL, false);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
#ifdef WIN32
|
||
|
if (!FLAG_default_error_handlers) {
|
||
|
// Make sure any errors don't throw dialogs hanging the test run.
|
||
|
_set_invalid_parameter_handler(TestInvalidParameterHandler);
|
||
|
_set_purecall_handler(TestPureCallHandler);
|
||
|
_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestCrtReportHandler);
|
||
|
}
|
||
|
|
||
|
#ifdef _DEBUG // Turn on memory leak checking on Windows.
|
||
|
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF |_CRTDBG_LEAK_CHECK_DF);
|
||
|
if (FLAG_crt_break_alloc >= 0) {
|
||
|
_crtBreakAlloc = FLAG_crt_break_alloc;
|
||
|
}
|
||
|
#endif // _DEBUG
|
||
|
#endif // WIN32
|
||
|
|
||
|
talk_base::Filesystem::SetOrganizationName("google");
|
||
|
talk_base::Filesystem::SetApplicationName("unittest");
|
||
|
|
||
|
// By default, log timestamps. Allow overrides by used of a --log flag.
|
||
|
talk_base::LogMessage::LogTimestamps();
|
||
|
if (*FLAG_log != '\0') {
|
||
|
talk_base::LogMessage::ConfigureLogging(FLAG_log, "unittest.log");
|
||
|
}
|
||
|
|
||
|
int res = RUN_ALL_TESTS();
|
||
|
|
||
|
// clean up logging so we don't appear to leak memory.
|
||
|
talk_base::LogMessage::ConfigureLogging("", "");
|
||
|
|
||
|
#ifdef WIN32
|
||
|
// Unhook crt function so that we don't ever log after statics have been
|
||
|
// uninitialized.
|
||
|
if (!FLAG_default_error_handlers)
|
||
|
_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestCrtReportHandler);
|
||
|
#endif
|
||
|
|
||
|
return res;
|
||
|
}
|