13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
27f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen// Use of this source code is governed by a BSD-style license that can be
37f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen// found in the LICENSE file.
47f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
57f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#include "base/test/test_suite.h"
67f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
77f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#include "base/at_exit.h"
87f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#include "base/base_paths.h"
97f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#include "base/base_switches.h"
107f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#include "base/command_line.h"
113f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/debug/debug_on_start_win.h"
12513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/debug/debugger.h"
137f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#include "base/file_path.h"
147f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#include "base/i18n/icu_util.h"
157f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#include "base/logging.h"
16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/mac/scoped_nsautorelease_pool.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
187f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#include "base/path_service.h"
197f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#include "base/process_util.h"
207f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#include "base/test/multiprocess_test.h"
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/test/test_timeouts.h"
227f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#include "base/time.h"
237f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#include "testing/gtest/include/gtest/gtest.h"
247f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#include "testing/multiprocess_func_list.h"
257f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if defined(OS_MACOSX)
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/test/mock_chrome_application_mac.h"
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
307f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#if defined(TOOLKIT_USES_GTK)
317f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#include <gtk/gtk.h>
327f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#endif
337f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
347f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsennamespace {
357f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
367f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsenclass MaybeTestDisabler : public testing::EmptyTestEventListener {
377f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen public:
387f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  virtual void OnTestStart(const testing::TestInfo& test_info) {
397f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen    ASSERT_FALSE(TestSuite::IsMarkedMaybe(test_info))
407f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen        << "Probably the OS #ifdefs don't include all of the necessary "
417f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen           "platforms.\nPlease ensure that no tests have the MAYBE_ prefix "
427f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen           "after the code is preprocessed.";
437f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  }
447f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen};
457f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
467f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen}  // namespace
477f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
487f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsenconst char TestSuite::kStrictFailureHandling[] = "strict_failure_handling";
497f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
507f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian MonsenTestSuite::TestSuite(int argc, char** argv) {
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_WIN)
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  testing::GTEST_FLAG(catch_exceptions) = false;
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif
547f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  base::EnableTerminationOnHeapCorruption();
557f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  CommandLine::Init(argc, argv);
567f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  testing::InitGoogleTest(&argc, argv);
577f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#if defined(TOOLKIT_USES_GTK)
587f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  g_thread_init(NULL);
597f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  gtk_init_check(&argc, &argv);
607f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#endif  // defined(TOOLKIT_USES_GTK)
617f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  // Don't add additional code to this constructor.  Instead add it to
627f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  // Initialize().  See bug 6436.
637f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen}
647f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
657f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian MonsenTestSuite::~TestSuite() {
667f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  CommandLine::Reset();
677f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen}
687f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
697f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen// static
707f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsenbool TestSuite::IsMarkedFlaky(const testing::TestInfo& test) {
717f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  return strncmp(test.name(), "FLAKY_", 6) == 0;
727f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen}
737f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
747f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen// static
757f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsenbool TestSuite::IsMarkedFailing(const testing::TestInfo& test) {
767f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  return strncmp(test.name(), "FAILS_", 6) == 0;
777f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen}
787f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
797f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen// static
807f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsenbool TestSuite::IsMarkedMaybe(const testing::TestInfo& test) {
817f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  return strncmp(test.name(), "MAYBE_", 6) == 0;
827f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen}
837f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
847f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen// static
857f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsenbool TestSuite::ShouldIgnoreFailure(const testing::TestInfo& test) {
867f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  if (CommandLine::ForCurrentProcess()->HasSwitch(kStrictFailureHandling))
877f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen    return false;
887f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  return IsMarkedFlaky(test) || IsMarkedFailing(test);
897f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen}
907f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
917f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen// static
927f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsenbool TestSuite::NonIgnoredFailures(const testing::TestInfo& test) {
937f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  return test.should_run() && test.result()->Failed() &&
947f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen      !ShouldIgnoreFailure(test);
957f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen}
967f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
977f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsenint TestSuite::GetTestCount(TestMatch test_match) {
987f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  testing::UnitTest* instance = testing::UnitTest::GetInstance();
997f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  int count = 0;
1007f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
1017f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  for (int i = 0; i < instance->total_test_case_count(); ++i) {
1027f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen    const testing::TestCase& test_case = *instance->GetTestCase(i);
1037f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen    for (int j = 0; j < test_case.total_test_count(); ++j) {
1047f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen      if (test_match(*test_case.GetTestInfo(j))) {
1057f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen        count++;
1067f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen      }
1077f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen    }
1087f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  }
1097f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
1107f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  return count;
1117f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen}
1127f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
1137f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsenvoid TestSuite::CatchMaybeTests() {
1147f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  testing::TestEventListeners& listeners =
1157f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen      testing::UnitTest::GetInstance()->listeners();
1167f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  listeners.Append(new MaybeTestDisabler);
1177f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen}
1187f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
1197f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen// Don't add additional code to this method.  Instead add it to
1207f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen// Initialize().  See bug 6436.
1217f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsenint TestSuite::Run() {
122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  base::mac::ScopedNSAutoreleasePool scoped_pool;
1237f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
1247f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  Initialize();
1257f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  std::string client_func =
1267f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen      CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
1277f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen          switches::kTestChildProcess);
1287f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  // Check to see if we are being run as a client process.
1297f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  if (!client_func.empty())
1307f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen    return multi_process_function_list::InvokeChildProcessTest(client_func);
1317f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  int result = RUN_ALL_TESTS();
1327f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
1337f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  // If there are failed tests, see if we should ignore the failures.
1347f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  if (result != 0 && GetTestCount(&TestSuite::NonIgnoredFailures) == 0)
1357f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen    result = 0;
1367f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
1377f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  // Display the number of flaky tests.
1387f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  int flaky_count = GetTestCount(&TestSuite::IsMarkedFlaky);
1397f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  if (flaky_count) {
1407f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen    printf("  YOU HAVE %d FLAKY %s\n\n", flaky_count,
1417f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen           flaky_count == 1 ? "TEST" : "TESTS");
1427f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  }
1437f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
1447f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  // Display the number of tests with ignored failures (FAILS).
1457f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  int failing_count = GetTestCount(&TestSuite::IsMarkedFailing);
1467f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  if (failing_count) {
1477f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen    printf("  YOU HAVE %d %s with ignored failures (FAILS prefix)\n\n",
1487f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen           failing_count, failing_count == 1 ? "test" : "tests");
1497f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  }
1507f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
1517f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  // This MUST happen before Shutdown() since Shutdown() tears down
1527f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  // objects (such as NotificationService::current()) that Cocoa
1537f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  // objects use to remove themselves as observers.
1547f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  scoped_pool.Recycle();
1557f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
1567f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  Shutdown();
1577f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
1587f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  return result;
1597f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen}
1607f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
1617f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen// static
1627f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsenvoid TestSuite::UnitTestAssertHandler(const std::string& str) {
1637f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  RAW_LOG(FATAL, str.c_str());
1647f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen}
1657f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
1667f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsenvoid TestSuite::SuppressErrorDialogs() {
1677f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#if defined(OS_WIN)
1687f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  UINT new_flags = SEM_FAILCRITICALERRORS |
1697f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen                   SEM_NOGPFAULTERRORBOX |
1707f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen                   SEM_NOOPENFILEERRORBOX;
1717f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
1727f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  // Preserve existing error mode, as discussed at
1737f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  // http://blogs.msdn.com/oldnewthing/archive/2004/07/27/198410.aspx
1747f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  UINT existing_flags = SetErrorMode(new_flags);
1757f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  SetErrorMode(existing_flags | new_flags);
1767f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#endif  // defined(OS_WIN)
1777f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen}
1787f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
1797f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsenvoid TestSuite::Initialize() {
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if defined(OS_MACOSX)
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Some of the app unit tests spin runloops.
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  mock_cr_app::RegisterMockCrApp();
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1857f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  // Initialize logging.
1867f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  FilePath exe;
1877f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  PathService::Get(base::FILE_EXE, &exe);
1887f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  FilePath log_filename = exe.ReplaceExtension(FILE_PATH_LITERAL("log"));
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  logging::InitLogging(
19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      log_filename.value().c_str(),
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      logging::LOG_TO_BOTH_FILE_AND_SYSTEM_DEBUG_LOG,
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      logging::LOCK_LOG_FILE,
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      logging::DELETE_OLD_LOG_FILE,
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      logging::DISABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS);
1957f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  // We want process and thread IDs because we may have multiple processes.
1967f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  // Note: temporarily enabled timestamps in an effort to catch bug 6361.
1977f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  logging::SetLogItems(true, true, true, true);
1987f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
1997f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  CHECK(base::EnableInProcessStackDumping());
2007f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#if defined(OS_WIN)
2017f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  // Make sure we run with high resolution timer to minimize differences
2027f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  // between production code and test code.
2037f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  base::Time::EnableHighResolutionTimer(true);
2047f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen#endif  // defined(OS_WIN)
2057f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
2067f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  // In some cases, we do not want to see standard error dialogs.
207513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!base::debug::BeingDebugged() &&
2087f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen      !CommandLine::ForCurrentProcess()->HasSwitch("show-error-dialogs")) {
2097f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen    SuppressErrorDialogs();
2103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    base::debug::SetSuppressDebugUI(true);
2117f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen    logging::SetLogAssertHandler(UnitTestAssertHandler);
2127f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  }
2137f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
2147f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  icu_util::Initialize();
2157f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
2167f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen  CatchMaybeTests();
217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TestTimeouts::Initialize();
2197f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen}
2207f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen
2217f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsenvoid TestSuite::Shutdown() {
2227f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aaKristian Monsen}
223