1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/test/base/chrome_unit_test_suite.h" 6 7 #include "base/path_service.h" 8 #include "base/process/process_handle.h" 9 #include "base/strings/stringprintf.h" 10 #include "chrome/browser/chrome_content_browser_client.h" 11 #include "chrome/common/chrome_content_client.h" 12 #include "chrome/common/chrome_paths.h" 13 #include "chrome/test/base/testing_browser_process.h" 14 #include "chrome/utility/chrome_content_utility_client.h" 15 #include "content/public/common/content_paths.h" 16 #include "testing/gtest/include/gtest/gtest.h" 17 #include "ui/base/resource/resource_bundle.h" 18 #include "ui/base/resource/resource_handle.h" 19 #include "ui/base/ui_base_paths.h" 20 21 #if defined(OS_CHROMEOS) 22 #include "chromeos/chromeos_paths.h" 23 #endif 24 25 #if !defined(OS_IOS) 26 #include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h" 27 #include "chrome/common/extensions/chrome_extensions_client.h" 28 #include "extensions/common/extension_paths.h" 29 #include "ui/gl/gl_surface.h" 30 #endif 31 32 #if defined(OS_POSIX) 33 #include "base/memory/shared_memory.h" 34 #endif 35 36 namespace { 37 38 // Creates a TestingBrowserProcess for each test. 39 class ChromeUnitTestSuiteInitializer : public testing::EmptyTestEventListener { 40 public: 41 ChromeUnitTestSuiteInitializer() {} 42 virtual ~ChromeUnitTestSuiteInitializer() {} 43 44 virtual void OnTestStart(const testing::TestInfo& test_info) OVERRIDE { 45 content_client_.reset(new ChromeContentClient); 46 content::SetContentClient(content_client_.get()); 47 // TODO(ios): Bring this back once ChromeContentBrowserClient is building. 48 #if !defined(OS_IOS) 49 browser_content_client_.reset(new chrome::ChromeContentBrowserClient()); 50 content::SetBrowserClientForTesting(browser_content_client_.get()); 51 utility_content_client_.reset(new ChromeContentUtilityClient()); 52 content::SetUtilityClientForTesting(utility_content_client_.get()); 53 #endif 54 55 TestingBrowserProcess::CreateInstance(); 56 } 57 58 virtual void OnTestEnd(const testing::TestInfo& test_info) OVERRIDE { 59 // TODO(ios): Bring this back once ChromeContentBrowserClient is building. 60 #if !defined(OS_IOS) 61 browser_content_client_.reset(); 62 utility_content_client_.reset(); 63 #endif 64 content_client_.reset(); 65 content::SetContentClient(NULL); 66 67 TestingBrowserProcess::DeleteInstance(); 68 } 69 70 private: 71 // Client implementations for the content module. 72 scoped_ptr<ChromeContentClient> content_client_; 73 // TODO(ios): Bring this back once ChromeContentBrowserClient is building. 74 #if !defined(OS_IOS) 75 scoped_ptr<chrome::ChromeContentBrowserClient> browser_content_client_; 76 scoped_ptr<ChromeContentUtilityClient> utility_content_client_; 77 #endif 78 79 DISALLOW_COPY_AND_ASSIGN(ChromeUnitTestSuiteInitializer); 80 }; 81 82 } // namespace 83 84 ChromeUnitTestSuite::ChromeUnitTestSuite(int argc, char** argv) 85 : ChromeTestSuite(argc, argv) {} 86 87 ChromeUnitTestSuite::~ChromeUnitTestSuite() {} 88 89 void ChromeUnitTestSuite::Initialize() { 90 // Add an additional listener to do the extra initialization for unit tests. 91 // It will be started before the base class listeners and ended after the 92 // base class listeners. 93 testing::TestEventListeners& listeners = 94 testing::UnitTest::GetInstance()->listeners(); 95 listeners.Append(new ChromeUnitTestSuiteInitializer); 96 97 InitializeProviders(); 98 RegisterInProcessThreads(); 99 100 ChromeTestSuite::Initialize(); 101 102 // This needs to run after ChromeTestSuite::Initialize which calls content's 103 // intialization which calls base's which initializes ICU. 104 InitializeResourceBundle(); 105 } 106 107 void ChromeUnitTestSuite::Shutdown() { 108 ResourceBundle::CleanupSharedInstance(); 109 ChromeTestSuite::Shutdown(); 110 } 111 112 void ChromeUnitTestSuite::InitializeProviders() { 113 { 114 ChromeContentClient content_client; 115 RegisterContentSchemes(&content_client); 116 } 117 118 chrome::RegisterPathProvider(); 119 content::RegisterPathProvider(); 120 ui::RegisterPathProvider(); 121 122 #if defined(OS_CHROMEOS) 123 chromeos::RegisterPathProvider(); 124 #endif 125 126 #if !defined(OS_IOS) 127 extensions::RegisterPathProvider(); 128 129 extensions::ExtensionsClient::Set( 130 extensions::ChromeExtensionsClient::GetInstance()); 131 132 content::WebUIControllerFactory::RegisterFactory( 133 ChromeWebUIControllerFactory::GetInstance()); 134 135 gfx::GLSurface::InitializeOneOffForTests(); 136 #endif 137 } 138 139 void ChromeUnitTestSuite::InitializeResourceBundle() { 140 // Force unittests to run using en-US so if we test against string 141 // output, it'll pass regardless of the system language. 142 ResourceBundle::InitSharedInstanceWithLocale("en-US", NULL); 143 base::FilePath resources_pack_path; 144 #if defined(OS_MACOSX) && !defined(OS_IOS) 145 PathService::Get(base::DIR_MODULE, &resources_pack_path); 146 resources_pack_path = 147 resources_pack_path.Append(FILE_PATH_LITERAL("resources.pak")); 148 #else 149 PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path); 150 #endif 151 ResourceBundle::GetSharedInstance().AddDataPackFromPath( 152 resources_pack_path, ui::SCALE_FACTOR_NONE); 153 } 154