1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// found in the LICENSE file. 4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/test/base/chrome_unit_test_suite.h" 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/path_service.h" 823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/process/process_handle.h" 923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/strings/stringprintf.h" 1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/browser/chrome_content_browser_client.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/omaha_query_params/chrome_omaha_query_params_delegate.h" 1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/common/chrome_content_client.h" 1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/common/chrome_paths.h" 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/utility/chrome_content_utility_client.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/component_updater/component_updater_paths.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/omaha_query_params/omaha_query_params.h" 1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/public/common/content_paths.h" 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/base/resource/resource_handle.h" 2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/base/ui_base_paths.h" 2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(OS_CHROMEOS) 2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chromeos/chromeos_paths.h" 2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif 2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if !defined(OS_IOS) 2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h" 3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/common/extensions/chrome_extensions_client.h" 3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "extensions/common/extension_paths.h" 3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/gl/gl_surface.h" 3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif 3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(OS_POSIX) 3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "base/memory/shared_memory.h" 3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace { 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Creates a TestingBrowserProcess for each test. 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class ChromeUnitTestSuiteInitializer : public testing::EmptyTestEventListener { 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public: 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ChromeUnitTestSuiteInitializer() {} 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual ~ChromeUnitTestSuiteInitializer() {} 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnTestStart(const testing::TestInfo& test_info) OVERRIDE { 4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content_client_.reset(new ChromeContentClient); 4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content::SetContentClient(content_client_.get()); 5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // TODO(ios): Bring this back once ChromeContentBrowserClient is building. 5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if !defined(OS_IOS) 5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) browser_content_client_.reset(new chrome::ChromeContentBrowserClient()); 5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content::SetBrowserClientForTesting(browser_content_client_.get()); 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) utility_content_client_.reset(new ChromeContentUtilityClient()); 5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content::SetUtilityClientForTesting(utility_content_client_.get()); 5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif 5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TestingBrowserProcess::CreateInstance(); 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnTestEnd(const testing::TestInfo& test_info) OVERRIDE { 6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // TODO(ios): Bring this back once ChromeContentBrowserClient is building. 6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if !defined(OS_IOS) 6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) browser_content_client_.reset(); 6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) utility_content_client_.reset(); 6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif 6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content_client_.reset(); 6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content::SetContentClient(NULL); 6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) TestingBrowserProcess::DeleteInstance(); 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private: 7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Client implementations for the content module. 7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<ChromeContentClient> content_client_; 7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // TODO(ios): Bring this back once ChromeContentBrowserClient is building. 7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if !defined(OS_IOS) 7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<chrome::ChromeContentBrowserClient> browser_content_client_; 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<ChromeContentUtilityClient> utility_content_client_; 8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif 8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ChromeUnitTestSuiteInitializer); 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace 86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)ChromeUnitTestSuite::ChromeUnitTestSuite(int argc, char** argv) 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : ChromeTestSuite(argc, argv) {} 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)ChromeUnitTestSuite::~ChromeUnitTestSuite() {} 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ChromeUnitTestSuite::Initialize() { 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Add an additional listener to do the extra initialization for unit tests. 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // It will be started before the base class listeners and ended after the 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // base class listeners. 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) testing::TestEventListeners& listeners = 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) testing::UnitTest::GetInstance()->listeners(); 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) listeners.Append(new ChromeUnitTestSuiteInitializer); 99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 10023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) InitializeProviders(); 10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) RegisterInProcessThreads(); 10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ChromeTestSuite::Initialize(); 10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 10523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // This needs to run after ChromeTestSuite::Initialize which calls content's 10623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // intialization which calls base's which initializes ICU. 10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) InitializeResourceBundle(); 108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 11023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void ChromeUnitTestSuite::Shutdown() { 11123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ResourceBundle::CleanupSharedInstance(); 11223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ChromeTestSuite::Shutdown(); 11323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 11423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 11523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void ChromeUnitTestSuite::InitializeProviders() { 11623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) { 11723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ChromeContentClient content_client; 11823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) RegisterContentSchemes(&content_client); 11923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 12023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 12123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) chrome::RegisterPathProvider(); 12223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content::RegisterPathProvider(); 12323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ui::RegisterPathProvider(); 1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) component_updater::RegisterPathProvider(chrome::DIR_USER_DATA); 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 12623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(OS_CHROMEOS) 12723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) chromeos::RegisterPathProvider(); 12823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif 12923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 13023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if !defined(OS_IOS) 13123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) extensions::RegisterPathProvider(); 13223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 13323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) extensions::ExtensionsClient::Set( 13423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) extensions::ChromeExtensionsClient::GetInstance()); 13523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 13623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content::WebUIControllerFactory::RegisterFactory( 13723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ChromeWebUIControllerFactory::GetInstance()); 13823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 13923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) gfx::GLSurface::InitializeOneOffForTests(); 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch omaha_query_params::OmahaQueryParams::SetDelegate( 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ChromeOmahaQueryParamsDelegate::GetInstance()); 14323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif 14423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 14523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 14623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void ChromeUnitTestSuite::InitializeResourceBundle() { 14723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Force unittests to run using en-US so if we test against string 14823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // output, it'll pass regardless of the system language. 1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::ResourceBundle::InitSharedInstanceWithLocale( 1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "en-US", NULL, ui::ResourceBundle::LOAD_COMMON_RESOURCES); 15123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::FilePath resources_pack_path; 15223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(OS_MACOSX) && !defined(OS_IOS) 15323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) PathService::Get(base::DIR_MODULE, &resources_pack_path); 15423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) resources_pack_path = 15523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) resources_pack_path.Append(FILE_PATH_LITERAL("resources.pak")); 15623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#else 15723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path); 15823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif 15923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ResourceBundle::GetSharedInstance().AddDataPackFromPath( 16023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) resources_pack_path, ui::SCALE_FACTOR_NONE); 16123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 162