test_suite.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_suite.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/at_exit.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_paths.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_switches.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/debug_on_start_win.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/debugger.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/stack_trace.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_path.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/icu_util.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/process_util.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/multiprocess_test.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/multiprocess_func_list.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/scoped_nsautorelease_pool.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_IOS) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_listener_ios.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/mock_chrome_application_mac.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_IOS 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_MACOSX 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_support_android.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_IOS) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_support_ios.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_GTK) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtk/gtk.h> 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MaybeTestDisabler : public testing::EmptyTestEventListener { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnTestStart(const testing::TestInfo& test_info) OVERRIDE { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TestSuite::IsMarkedMaybe(test_info)) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Probably the OS #ifdefs don't include all of the necessary " 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "platforms.\nPlease ensure that no tests have the MAYBE_ prefix " 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "after the code is preprocessed."; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestClientInitializer : public testing::EmptyTestEventListener { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestClientInitializer() 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : old_command_line_(CommandLine::NO_PROGRAM) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnTestStart(const testing::TestInfo& test_info) OVERRIDE { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_command_line_ = *CommandLine::ForCurrentProcess(); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnTestEnd(const testing::TestInfo& test_info) OVERRIDE { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *CommandLine::ForCurrentProcess() = old_command_line_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine old_command_line_; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestClientInitializer); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char TestSuite::kStrictFailureHandling[] = "strict_failure_handling"; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestSuite::TestSuite(int argc, char** argv) : initialized_command_line_(false) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PreInitialize(argc, argv, true); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestSuite::TestSuite(int argc, char** argv, bool create_at_exit_manager) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : initialized_command_line_(false) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PreInitialize(argc, argv, create_at_exit_manager); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestSuite::~TestSuite() { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (initialized_command_line_) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::Reset(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestSuite::PreInitialize(int argc, char** argv, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool create_at_exit_manager) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::GTEST_FLAG(catch_exceptions) = false; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::EnableTerminationOnHeapCorruption(); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initialized_command_line_ = CommandLine::Init(argc, argv); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::InitGoogleTest(&argc, argv); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) && defined(USE_AURA) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When calling native char conversion functions (e.g wrctomb) we need to 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have the locale set. In the absence of such a call the "C" locale is the 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // default. In the gtk code (below) gtk_init() implicitly sets a locale. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setlocale(LC_ALL, ""); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(TOOLKIT_GTK) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_init_check(&argc, &argv); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(TOOLKIT_GTK) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Android, AtExitManager is created in 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // testing/android/native_test_wrapper.cc before main() is called. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_ANDROID) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (create_at_exit_manager) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) at_exit_manager_.reset(new base::AtExitManager); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't add additional code to this function. Instead add it to 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize(). See bug 6436. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestSuite::IsMarkedFlaky(const testing::TestInfo& test) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return strncmp(test.name(), "FLAKY_", 6) == 0; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestSuite::IsMarkedMaybe(const testing::TestInfo& test) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return strncmp(test.name(), "MAYBE_", 6) == 0; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestSuite::ShouldIgnoreFailure(const testing::TestInfo& test) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(kStrictFailureHandling)) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IsMarkedFlaky(test); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestSuite::NonIgnoredFailures(const testing::TestInfo& test) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return test.should_run() && test.result()->Failed() && 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !ShouldIgnoreFailure(test); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TestSuite::GetTestCount(TestMatch test_match) { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::UnitTest* instance = testing::UnitTest::GetInstance(); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count = 0; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < instance->total_test_case_count(); ++i) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const testing::TestCase& test_case = *instance->GetTestCase(i); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int j = 0; j < test_case.total_test_count(); ++j) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test_match(*test_case.GetTestInfo(j))) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count++; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return count; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestSuite::CatchMaybeTests() { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::TestEventListeners& listeners = 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::UnitTest::GetInstance()->listeners(); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listeners.Append(new MaybeTestDisabler); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestSuite::ResetCommandLine() { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::TestEventListeners& listeners = 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::UnitTest::GetInstance()->listeners(); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listeners.Append(new TestClientInitializer); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Don't add additional code to this method. Instead add it to 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initialize(). See bug 6436. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TestSuite::Run() { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::mac::ScopedNSAutoreleasePool scoped_pool; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Initialize(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string client_func = 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::ForCurrentProcess()->GetSwitchValueASCII( 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kTestChildProcess); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check to see if we are being run as a client process. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!client_func.empty()) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return multi_process_function_list::InvokeChildProcessTest(client_func); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_IOS) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::test_listener_ios::RegisterTestEndListener(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = RUN_ALL_TESTS(); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there are failed tests, see if we should ignore the failures. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result != 0 && GetTestCount(&TestSuite::NonIgnoredFailures) == 0) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = 0; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Display the number of flaky tests. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flaky_count = GetTestCount(&TestSuite::IsMarkedFlaky); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flaky_count) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf(" YOU HAVE %d FLAKY %s\n\n", flaky_count, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flaky_count == 1 ? "TEST" : "TESTS"); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This MUST happen before Shutdown() since Shutdown() tears down 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // objects (such as NotificationService::current()) that Cocoa 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // objects use to remove themselves as observers. 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_pool.Recycle(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shutdown(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestSuite::UnitTestAssertHandler(const std::string& str) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RAW_LOG(FATAL, str.c_str()); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestSuite::SuppressErrorDialogs() { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UINT new_flags = SEM_FAILCRITICALERRORS | 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SEM_NOGPFAULTERRORBOX | 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SEM_NOOPENFILEERRORBOX; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Preserve existing error mode, as discussed at 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://blogs.msdn.com/oldnewthing/archive/2004/07/27/198410.aspx 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UINT existing_flags = SetErrorMode(new_flags); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetErrorMode(existing_flags | new_flags); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_DEBUG) && defined(_HAS_EXCEPTIONS) && (_HAS_EXCEPTIONS == 1) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Suppress the "Debug Assertion Failed" dialog. 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(hbono): remove this code when gtest has it. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://groups.google.com/d/topic/googletestframework/OjuwNlXy5ac/discussion 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(_DEBUG) && defined(_HAS_EXCEPTIONS) && (_HAS_EXCEPTIONS == 1) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestSuite::Initialize() { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) && !defined(OS_IOS) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Some of the app unit tests spin runloops. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_cr_app::RegisterMockCrApp(); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_IOS) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitIOSTestMessageLoop(); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_IOS 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitAndroidTest(); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize logging. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath exe; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::FILE_EXE, &exe); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath log_filename = exe.ReplaceExtension(FILE_PATH_LITERAL("log")); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logging::InitLogging( 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_filename.value().c_str(), 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logging::LOG_TO_BOTH_FILE_AND_SYSTEM_DEBUG_LOG, 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logging::LOCK_LOG_FILE, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logging::DELETE_OLD_LOG_FILE, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logging::DISABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We want process and thread IDs because we may have multiple processes. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: temporarily enabled timestamps in an effort to catch bug 6361. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logging::SetLogItems(true, true, true, true); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // else defined(OS_ANDROID) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(base::debug::EnableInProcessStackDumping()); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we run with high resolution timer to minimize differences 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // between production code and test code. 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::EnableHighResolutionTimer(true); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In some cases, we do not want to see standard error dialogs. 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!base::debug::BeingDebugged() && 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !CommandLine::ForCurrentProcess()->HasSwitch("show-error-dialogs")) { 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SuppressErrorDialogs(); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::debug::SetSuppressDebugUI(true); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logging::SetLogAssertHandler(UnitTestAssertHandler); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icu_util::Initialize(); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CatchMaybeTests(); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetCommandLine(); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestTimeouts::Initialize(); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestSuite::Shutdown() { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 299