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