1 // Copyright (c) 2011 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.
5 #include "chrome/test/unit/chrome_test_suite.h"
7 #include "app/app_paths.h"
8 #include "base/command_line.h"
9 #include "base/mac/scoped_nsautorelease_pool.h"
10 #include "base/metrics/stats_table.h"
11 #include "base/process_util.h"
12 #include "base/stringprintf.h"
13 #include "base/utf_string_conversions.h"
14 #include "chrome/browser/browser_process.h"
15 #include "chrome/common/chrome_constants.h"
16 #include "chrome/common/chrome_content_client.h"
17 #include "chrome/common/chrome_paths.h"
18 #include "chrome/common/url_constants.h"
19 #include "chrome/test/testing_browser_process.h"
20 #include "content/common/content_paths.h"
21 #include "net/base/net_errors.h"
22 #include "ui/base/resource/resource_bundle.h"
23 #include "ui/base/ui_base_paths.h"
24 #if defined(TOOLKIT_VIEWS)
25 #include "views/view.h"
28 #if defined(OS_MACOSX)
29 #include "base/mac/mac_util.h"
30 #include "content/common/chrome_application_mac.h"
34 #include "base/shared_memory.h"
37 static void RemoveSharedMemoryFile(const std::string
& filename
) {
38 // Stats uses SharedMemory under the hood. On posix, this results in a file
41 base::SharedMemory memory
;
42 memory
.Delete(filename
);
46 LocalHostResolverProc::LocalHostResolverProc()
47 : HostResolverProc(NULL
) {
50 LocalHostResolverProc::~LocalHostResolverProc() {
53 int LocalHostResolverProc::Resolve(const std::string
& host
,
54 net::AddressFamily address_family
,
55 net::HostResolverFlags host_resolver_flags
,
56 net::AddressList
* addrlist
,
58 const char* kLocalHostNames
[] = {"localhost", "127.0.0.1", "::1"};
61 if (host
== net::GetHostName()) {
64 for (size_t i
= 0; i
< arraysize(kLocalHostNames
); i
++)
65 if (host
== kLocalHostNames
[i
]) {
71 // To avoid depending on external resources and to reduce (if not preclude)
72 // network interactions from tests, we simulate failure for non-local DNS
73 // queries, rather than perform them.
74 // If you really need to make an external DNS query, use
75 // net::RuleBasedHostResolverProc and its AllowDirectLookup method.
77 DVLOG(1) << "To avoid external dependencies, simulating failure for "
78 "external DNS lookup of " << host
;
79 return net::ERR_NOT_IMPLEMENTED
;
82 return ResolveUsingPrevious(host
, address_family
, host_resolver_flags
,
86 ChromeTestSuite::ChromeTestSuite(int argc
, char** argv
)
87 : base::TestSuite(argc
, argv
),
91 ChromeTestSuite::~ChromeTestSuite() {
94 void ChromeTestSuite::Initialize() {
95 #if defined(OS_MACOSX)
96 chrome_application_mac::RegisterCrApp();
99 base::mac::ScopedNSAutoreleasePool autorelease_pool
;
101 base::TestSuite::Initialize();
103 // Initialize the content client which that code uses to talk to Chrome.
104 content::SetContentClient(&chrome_content_client_
);
105 content::GetContentClient()->set_browser(&chrome_browser_content_client_
);
107 chrome::RegisterChromeSchemes();
108 host_resolver_proc_
= new LocalHostResolverProc();
109 scoped_host_resolver_proc_
.Init(host_resolver_proc_
.get());
111 chrome::RegisterPathProvider();
112 app::RegisterPathProvider();
113 content::RegisterPathProvider();
114 ui::RegisterPathProvider();
115 g_browser_process
= new TestingBrowserProcess
;
117 if (!browser_dir_
.empty()) {
118 PathService::Override(base::DIR_EXE
, browser_dir_
);
119 PathService::Override(base::DIR_MODULE
, browser_dir_
);
122 #if defined(OS_MACOSX)
123 // Look in the framework bundle for resources.
125 PathService::Get(base::DIR_EXE
, &path
);
126 path
= path
.Append(chrome::kFrameworkName
);
127 base::mac::SetOverrideAppBundlePath(path
);
130 // Force unittests to run using en-US so if we test against string
131 // output, it'll pass regardless of the system language.
132 ResourceBundle::InitSharedInstance("en-US");
133 FilePath resources_pack_path
;
134 PathService::Get(base::DIR_MODULE
, &resources_pack_path
);
135 resources_pack_path
=
136 resources_pack_path
.Append(FILE_PATH_LITERAL("resources.pak"));
137 ResourceBundle::AddDataPackToSharedInstance(resources_pack_path
);
139 // initialize the global StatsTable for unit_tests (make sure the file
140 // doesn't exist before opening it so the test gets a clean slate)
141 stats_filename_
= "unit_tests";
142 std::string pid_string
= base::StringPrintf("-%d", base::GetCurrentProcId());
143 stats_filename_
+= pid_string
;
144 RemoveSharedMemoryFile(stats_filename_
);
145 stats_table_
= new base::StatsTable(stats_filename_
, 20, 200);
146 base::StatsTable::set_current(stats_table_
);
148 #if defined(TOOLKIT_VIEWS) && defined(OS_LINUX)
149 // Turn of GPU compositing in browser during unit tests.
150 views::View::set_use_acceleration_when_possible(false);
154 void ChromeTestSuite::Shutdown() {
155 ResourceBundle::CleanupSharedInstance();
157 #if defined(OS_MACOSX)
158 base::mac::SetOverrideAppBundle(NULL
);
161 delete g_browser_process
;
162 g_browser_process
= NULL
;
164 // Tear down shared StatsTable; prevents unit_tests from leaking it.
165 base::StatsTable::set_current(NULL
);
167 RemoveSharedMemoryFile(stats_filename_
);
169 base::TestSuite::Shutdown();