| Index: base/test/test_suite.cc
 | 
| ===================================================================
 | 
| --- base/test/test_suite.cc	(revision 55415)
 | 
| +++ base/test/test_suite.cc	(working copy)
 | 
| @@ -1,244 +0,0 @@
 | 
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved.
 | 
| -// Use of this source code is governed by a BSD-style license that can be
 | 
| -// found in the LICENSE file.
 | 
| -
 | 
| -#include "base/test/test_suite.h"
 | 
| -
 | 
| -#include "base/at_exit.h"
 | 
| -#include "base/base_paths.h"
 | 
| -#include "base/base_switches.h"
 | 
| -#include "base/command_line.h"
 | 
| -#include "base/debug_on_start.h"
 | 
| -#include "base/debug_util.h"
 | 
| -#include "base/file_path.h"
 | 
| -#include "base/i18n/icu_util.h"
 | 
| -#include "base/logging.h"
 | 
| -#include "base/nss_util.h"
 | 
| -#include "base/path_service.h"
 | 
| -#include "base/process_util.h"
 | 
| -#include "base/scoped_nsautorelease_pool.h"
 | 
| -#include "base/scoped_ptr.h"
 | 
| -#include "base/test/multiprocess_test.h"
 | 
| -#include "base/time.h"
 | 
| -#include "testing/gtest/include/gtest/gtest.h"
 | 
| -#include "testing/multiprocess_func_list.h"
 | 
| -
 | 
| -#if defined(OS_POSIX) && !defined(OS_MACOSX)
 | 
| -#include <gtk/gtk.h>
 | 
| -#endif
 | 
| -
 | 
| -namespace base {
 | 
| -
 | 
| -namespace {
 | 
| -
 | 
| -// By setting up a shadow AtExitManager, this test event listener ensures that
 | 
| -// no state is carried between tests (like singletons, lazy instances, etc).
 | 
| -// Of course it won't help if the code under test corrupts memory.
 | 
| -class TestIsolationEnforcer : public testing::EmptyTestEventListener {
 | 
| - public:
 | 
| -  virtual void OnTestStart(const testing::TestInfo& test_info) {
 | 
| -    ASSERT_FALSE(exit_manager_.get());
 | 
| -    exit_manager_.reset(new ShadowingAtExitManager());
 | 
| -  }
 | 
| -
 | 
| -  virtual void OnTestEnd(const testing::TestInfo& test_info) {
 | 
| -    ASSERT_TRUE(exit_manager_.get());
 | 
| -    exit_manager_.reset();
 | 
| -  }
 | 
| -
 | 
| - private:
 | 
| -  scoped_ptr<ShadowingAtExitManager> exit_manager_;
 | 
| -};
 | 
| -
 | 
| -class MaybeTestDisabler : public testing::EmptyTestEventListener {
 | 
| - public:
 | 
| -  virtual void OnTestStart(const testing::TestInfo& test_info) {
 | 
| -    ASSERT_FALSE(TestSuite::IsMarkedMaybe(test_info))
 | 
| -        << "Probably the OS #ifdefs don't include all of the necessary "
 | 
| -           "platforms. Please ensure that no tests have the MAYBE_ prefix "
 | 
| -           "after the code is preprocessed.";
 | 
| -  }
 | 
| -};
 | 
| -
 | 
| -}  // namespace
 | 
| -
 | 
| -// static
 | 
| -const char TestSuite::kStrictFailureHandling[] = "strict_failure_handling";
 | 
| -
 | 
| -TestSuite::TestSuite(int argc, char** argv) {
 | 
| -  EnableTerminationOnHeapCorruption();
 | 
| -  CommandLine::Init(argc, argv);
 | 
| -  testing::InitGoogleTest(&argc, argv);
 | 
| -#if defined(OS_POSIX) && !defined(OS_MACOSX)
 | 
| -  g_thread_init(NULL);
 | 
| -  gtk_init_check(&argc, &argv);
 | 
| -#endif  // defined(OS_LINUX)
 | 
| -  // Don't add additional code to this constructor.  Instead add it to
 | 
| -  // Initialize().  See bug 6436.
 | 
| -}
 | 
| -
 | 
| -TestSuite::~TestSuite() {
 | 
| -  CommandLine::Reset();
 | 
| -}
 | 
| -
 | 
| -// static
 | 
| -bool TestSuite::IsMarkedFlaky(const testing::TestInfo& test) {
 | 
| -  return strncmp(test.name(), "FLAKY_", 6) == 0;
 | 
| -}
 | 
| -
 | 
| -// static
 | 
| -bool TestSuite::IsMarkedFailing(const testing::TestInfo& test) {
 | 
| -  return strncmp(test.name(), "FAILS_", 6) == 0;
 | 
| -}
 | 
| -
 | 
| -// static
 | 
| -bool TestSuite::IsMarkedMaybe(const testing::TestInfo& test) {
 | 
| -  return strncmp(test.name(), "MAYBE_", 6) == 0;
 | 
| -}
 | 
| -
 | 
| -// static
 | 
| -bool TestSuite::ShouldIgnoreFailure(const testing::TestInfo& test) {
 | 
| -  if (CommandLine::ForCurrentProcess()->HasSwitch(kStrictFailureHandling))
 | 
| -    return false;
 | 
| -  return IsMarkedFlaky(test) || IsMarkedFailing(test);
 | 
| -}
 | 
| -
 | 
| -// static
 | 
| -bool TestSuite::NonIgnoredFailures(const testing::TestInfo& test) {
 | 
| -  return test.should_run() && test.result()->Failed() &&
 | 
| -      !ShouldIgnoreFailure(test);
 | 
| -}
 | 
| -
 | 
| -int TestSuite::GetTestCount(TestMatch test_match) {
 | 
| -  testing::UnitTest* instance = testing::UnitTest::GetInstance();
 | 
| -  int count = 0;
 | 
| -
 | 
| -  for (int i = 0; i < instance->total_test_case_count(); ++i) {
 | 
| -    const testing::TestCase& test_case = *instance->GetTestCase(i);
 | 
| -    for (int j = 0; j < test_case.total_test_count(); ++j) {
 | 
| -      if (test_match(*test_case.GetTestInfo(j))) {
 | 
| -        count++;
 | 
| -      }
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  return count;
 | 
| -}
 | 
| -
 | 
| -void TestSuite::EnforceTestIsolation() {
 | 
| -  testing::TestEventListeners& listeners =
 | 
| -      testing::UnitTest::GetInstance()->listeners();
 | 
| -  listeners.Append(new TestIsolationEnforcer);
 | 
| -}
 | 
| -
 | 
| -void TestSuite::CatchMaybeTests() {
 | 
| -  testing::TestEventListeners& listeners =
 | 
| -      testing::UnitTest::GetInstance()->listeners();
 | 
| -  listeners.Append(new MaybeTestDisabler);
 | 
| -}
 | 
| -
 | 
| -// Don't add additional code to this method.  Instead add it to
 | 
| -// Initialize().  See bug 6436.
 | 
| -int TestSuite::Run() {
 | 
| -  ScopedNSAutoreleasePool scoped_pool;
 | 
| -
 | 
| -  Initialize();
 | 
| -  std::string client_func =
 | 
| -      CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
 | 
| -          switches::kTestChildProcess);
 | 
| -  // Check to see if we are being run as a client process.
 | 
| -  if (!client_func.empty())
 | 
| -    return multi_process_function_list::InvokeChildProcessTest(client_func);
 | 
| -  int result = RUN_ALL_TESTS();
 | 
| -
 | 
| -  // If there are failed tests, see if we should ignore the failures.
 | 
| -  if (result != 0 && GetTestCount(&TestSuite::NonIgnoredFailures) == 0)
 | 
| -    result = 0;
 | 
| -
 | 
| -  // Display the number of flaky tests.
 | 
| -  int flaky_count = GetTestCount(&TestSuite::IsMarkedFlaky);
 | 
| -  if (flaky_count) {
 | 
| -    printf("  YOU HAVE %d FLAKY %s\n\n", flaky_count,
 | 
| -           flaky_count == 1 ? "TEST" : "TESTS");
 | 
| -  }
 | 
| -
 | 
| -  // Display the number of tests with ignored failures (FAILS).
 | 
| -  int failing_count = GetTestCount(&TestSuite::IsMarkedFailing);
 | 
| -  if (failing_count) {
 | 
| -    printf("  YOU HAVE %d %s with ignored failures (FAILS prefix)\n\n",
 | 
| -           failing_count, failing_count == 1 ? "test" : "tests");
 | 
| -  }
 | 
| -
 | 
| -  // This MUST happen before Shutdown() since Shutdown() tears down
 | 
| -  // objects (such as NotificationService::current()) that Cocoa
 | 
| -  // objects use to remove themselves as observers.
 | 
| -  scoped_pool.Recycle();
 | 
| -
 | 
| -  Shutdown();
 | 
| -
 | 
| -  return result;
 | 
| -}
 | 
| -
 | 
| -// static
 | 
| -void TestSuite::UnitTestAssertHandler(const std::string& str) {
 | 
| -  RAW_LOG(FATAL, str.c_str());
 | 
| -}
 | 
| -
 | 
| -void TestSuite::SuppressErrorDialogs() {
 | 
| -#if defined(OS_WIN)
 | 
| -  UINT new_flags = SEM_FAILCRITICALERRORS |
 | 
| -                   SEM_NOGPFAULTERRORBOX |
 | 
| -                   SEM_NOOPENFILEERRORBOX;
 | 
| -
 | 
| -  // Preserve existing error mode, as discussed at
 | 
| -  // http://blogs.msdn.com/oldnewthing/archive/2004/07/27/198410.aspx
 | 
| -  UINT existing_flags = SetErrorMode(new_flags);
 | 
| -  SetErrorMode(existing_flags | new_flags);
 | 
| -#endif  // defined(OS_WIN)
 | 
| -}
 | 
| -
 | 
| -void TestSuite::Initialize() {
 | 
| -  // Initialize logging.
 | 
| -  FilePath exe;
 | 
| -  PathService::Get(FILE_EXE, &exe);
 | 
| -  FilePath log_filename = exe.ReplaceExtension(FILE_PATH_LITERAL("log"));
 | 
| -  logging::InitLogging(log_filename.value().c_str(),
 | 
| -                       logging::LOG_TO_BOTH_FILE_AND_SYSTEM_DEBUG_LOG,
 | 
| -                       logging::LOCK_LOG_FILE,
 | 
| -                       logging::DELETE_OLD_LOG_FILE);
 | 
| -  // We want process and thread IDs because we may have multiple processes.
 | 
| -  // Note: temporarily enabled timestamps in an effort to catch bug 6361.
 | 
| -  logging::SetLogItems(true, true, true, true);
 | 
| -
 | 
| -  CHECK(EnableInProcessStackDumping());
 | 
| -#if defined(OS_WIN)
 | 
| -  // Make sure we run with high resolution timer to minimize differences
 | 
| -  // between production code and test code.
 | 
| -  Time::EnableHighResolutionTimer(true);
 | 
| -#endif  // defined(OS_WIN)
 | 
| -
 | 
| -  // In some cases, we do not want to see standard error dialogs.
 | 
| -  if (!DebugUtil::BeingDebugged() &&
 | 
| -      !CommandLine::ForCurrentProcess()->HasSwitch("show-error-dialogs")) {
 | 
| -    SuppressErrorDialogs();
 | 
| -    DebugUtil::SuppressDialogs();
 | 
| -    logging::SetLogAssertHandler(UnitTestAssertHandler);
 | 
| -  }
 | 
| -
 | 
| -  icu_util::Initialize();
 | 
| -
 | 
| -#if defined(USE_NSS)
 | 
| -  // Trying to repeatedly initialize and cleanup NSS and NSPR may result in
 | 
| -  // a deadlock. Such repeated initialization will happen when using test
 | 
| -  // isolation. Prevent problems by initializing NSS here, so that the cleanup
 | 
| -  // will be done only on process exit.
 | 
| -  EnsureNSSInit();
 | 
| -#endif  // defined(USE_NSS)
 | 
| -
 | 
| -  CatchMaybeTests();
 | 
| -}
 | 
| -
 | 
| -void TestSuite::Shutdown() {
 | 
| -}
 | 
| -
 | 
| -}  // namespace base
 | 
| 
 |