Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(151)

Side by Side Diff: chrome_frame/test/net/fake_external_tab.cc

Issue 8894008: Make CF net tests a content::BrowserMainParts. (Closed) Base URL: ssh://joi@192.168.1.201/home/joi/c/chrome/src@cfnettests
Patch Set: Mostly functional, but needs polish. Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome_frame/test/net/fake_external_tab.h" 5 #include "chrome_frame/test/net/fake_external_tab.h"
6 6
7 #include <atlbase.h> 7 #include <atlbase.h>
8 #include <atlcom.h> 8 #include <atlcom.h>
9 #include <exdisp.h> 9 #include <exdisp.h>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/command_line.h" 12 #include "base/command_line.h"
13 #include "base/debug/debugger.h" 13 #include "base/debug/debugger.h"
14 #include "base/file_util.h" 14 #include "base/file_util.h"
15 #include "base/file_version_info.h" 15 #include "base/file_version_info.h"
16 #include "base/i18n/icu_util.h" 16 #include "base/i18n/icu_util.h"
17 #include "base/lazy_instance.h" 17 #include "base/lazy_instance.h"
18 #include "base/memory/scoped_ptr.h" 18 #include "base/memory/scoped_ptr.h"
19 #include "base/path_service.h" 19 #include "base/path_service.h"
20 #include "base/scoped_temp_dir.h" 20 #include "base/scoped_temp_dir.h"
21 #include "base/string_util.h" 21 #include "base/string_util.h"
22 #include "base/stringprintf.h" 22 #include "base/stringprintf.h"
23 #include "base/system_monitor/system_monitor.h" 23 #include "base/system_monitor/system_monitor.h"
24 #include "base/test/test_timeouts.h" 24 #include "base/test/test_timeouts.h"
25 #include "base/threading/platform_thread.h" 25 #include "base/threading/platform_thread.h"
26 #include "base/threading/thread.h" 26 #include "base/threading/thread.h"
27 #include "base/win/scoped_com_initializer.h" 27 #include "base/win/scoped_com_initializer.h"
28 #include "base/win/scoped_comptr.h" 28 #include "base/win/scoped_comptr.h"
29 #include "base/win/scoped_handle.h" 29 #include "base/win/scoped_handle.h"
30 #include "chrome/app/chrome_main_delegate.h"
30 #include "chrome/browser/automation/automation_provider_list.h" 31 #include "chrome/browser/automation/automation_provider_list.h"
31 #include "chrome/browser/browser_process_impl.h" // TODO(joi): Remove
32 #include "chrome/browser/chrome_content_browser_client.h" 32 #include "chrome/browser/chrome_content_browser_client.h"
33 #include "chrome/browser/prefs/browser_prefs.h" 33 #include "chrome/browser/prefs/browser_prefs.h"
34 #include "chrome/browser/prefs/pref_service.h" 34 #include "chrome/browser/prefs/pref_service.h"
35 #include "chrome/browser/prefs/proxy_config_dictionary.h" 35 #include "chrome/browser/prefs/proxy_config_dictionary.h"
36 #include "chrome/browser/process_singleton.h" 36 #include "chrome/browser/process_singleton.h"
37 #include "chrome/browser/profiles/profile_manager.h" 37 #include "chrome/browser/profiles/profile_manager.h"
38 #include "chrome/browser/renderer_host/web_cache_manager.h" 38 #include "chrome/browser/renderer_host/web_cache_manager.h"
39 #include "chrome/common/chrome_constants.h" 39 #include "chrome/common/chrome_constants.h"
40 #include "chrome/common/chrome_content_client.h" 40 #include "chrome/common/chrome_content_client.h"
41 #include "chrome/common/chrome_paths.h" 41 #include "chrome/common/chrome_paths.h"
42 #include "chrome/common/chrome_paths_internal.h" 42 #include "chrome/common/chrome_paths_internal.h"
43 #include "chrome/common/chrome_switches.h" 43 #include "chrome/common/chrome_switches.h"
44 #include "chrome/common/pref_names.h" 44 #include "chrome/common/pref_names.h"
45 #include "chrome/renderer/chrome_content_renderer_client.h" 45 #include "chrome/renderer/chrome_content_renderer_client.h"
46 #include "chrome_frame/crash_server_init.h" 46 #include "chrome_frame/crash_server_init.h"
47 #include "chrome_frame/test/chrome_frame_test_utils.h" 47 #include "chrome_frame/test/chrome_frame_test_utils.h"
48 #include "chrome_frame/test/net/test_automation_resource_message_filter.h" 48 #include "chrome_frame/test/net/test_automation_resource_message_filter.h"
49 #include "chrome_frame/test/simulate_input.h" 49 #include "chrome_frame/test/simulate_input.h"
50 #include "chrome_frame/test/win_event_receiver.h" 50 #include "chrome_frame/test/win_event_receiver.h"
51 #include "chrome_frame/utils.h" 51 #include "chrome_frame/utils.h"
52 #include "content/app/content_main.h"
52 #include "content/browser/plugin_service.h" 53 #include "content/browser/plugin_service.h"
53 #include "content/browser/notification_service_impl.h" 54 #include "content/browser/notification_service_impl.h"
55 #include "content/public/app/startup_helper_win.h"
56 #include "content/public/browser/browser_thread.h"
54 #include "content/public/browser/render_process_host.h" 57 #include "content/public/browser/render_process_host.h"
55 #include "content/public/common/content_client.h" 58 #include "content/public/common/content_client.h"
56 #include "content/public/common/content_paths.h" 59 #include "content/public/common/content_paths.h"
57 #include "content/test/test_browser_thread.h" // TODO(joi): Remove 60 #include "sandbox/src/sandbox_types.h"
58 #include "testing/gtest/include/gtest/gtest.h" 61 #include "testing/gtest/include/gtest/gtest.h"
59 #include "ui/base/resource/resource_bundle.h" 62 #include "ui/base/resource/resource_bundle.h"
60 #include "ui/base/ui_base_paths.h" 63 #include "ui/base/ui_base_paths.h"
61 64
62 using content::BrowserThread; 65 using content::BrowserThread;
63 66
64 namespace { 67 namespace {
65 68
69 // We must store this globally so that our main delegate can set it.
70 static CFUrlRequestUnittestRunner* g_test_suite = NULL;
71
72 // Copied here for access by CreateBrowserMainParts and InitGoogleTest.
73 int g_argc = 0;
74 char** g_argv = NULL;
robertshield 2011/12/12 04:05:49 nit: should mark these as static
Jói 2011/12/12 14:09:02 Done.
75
66 // A special command line switch to allow developers to manually launch the 76 // A special command line switch to allow developers to manually launch the
67 // browser and debug CF inside the browser. 77 // browser and debug CF inside the browser.
68 const char kManualBrowserLaunch[] = "manual-browser"; 78 const char kManualBrowserLaunch[] = "manual-browser";
69 79
70 // Pops up a message box after the test environment has been set up 80 // Pops up a message box after the test environment has been set up
71 // and before tearing it down. Useful for when debugging tests and not 81 // and before tearing it down. Useful for when debugging tests and not
72 // the test environment that's been set up. 82 // the test environment that's been set up.
73 const char kPromptAfterSetup[] = "prompt-after-setup"; 83 const char kPromptAfterSetup[] = "prompt-after-setup";
74 84
75 const int kTestServerPort = 4666; 85 const int kTestServerPort = 4666;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 } 124 }
115 125
116 // Same as BrowserProcessImpl, but uses custom profile manager. 126 // Same as BrowserProcessImpl, but uses custom profile manager.
117 class FakeBrowserProcessImpl : public BrowserProcessImpl { 127 class FakeBrowserProcessImpl : public BrowserProcessImpl {
118 public: 128 public:
119 explicit FakeBrowserProcessImpl(const CommandLine& command_line) 129 explicit FakeBrowserProcessImpl(const CommandLine& command_line)
120 : BrowserProcessImpl(command_line) { 130 : BrowserProcessImpl(command_line) {
121 profiles_dir_.CreateUniqueTempDir(); 131 profiles_dir_.CreateUniqueTempDir();
122 } 132 }
123 133
124 virtual ProfileManager* profile_manager() { 134 virtual ~FakeBrowserProcessImpl() {}
135
136 virtual ProfileManager* profile_manager() OVERRIDE {
125 if (!profile_manager_.get()) { 137 if (!profile_manager_.get()) {
126 profile_manager_.reset( 138 profile_manager_.reset(
127 new ProfileManagerWithoutInit(profiles_dir_.path())); 139 new ProfileManagerWithoutInit(profiles_dir_.path()));
128 } 140 }
129 return profile_manager_.get(); 141 return profile_manager_.get();
130 } 142 }
131 143
132 virtual MetricsService* metrics_service() { 144 virtual MetricsService* metrics_service() OVERRIDE {
133 return NULL; 145 return NULL;
134 } 146 }
135 147
148 void DestroyProfileManager() {
149 profile_manager_.reset();
150 }
151
136 private: 152 private:
137 ScopedTempDir profiles_dir_; 153 ScopedTempDir profiles_dir_;
138 scoped_ptr<ProfileManager> profile_manager_; 154 scoped_ptr<ProfileManager> profile_manager_;
139 }; 155 };
140 156
157 class FakeContentBrowserClient : public chrome::ChromeContentBrowserClient {
158 public:
159 virtual ~FakeContentBrowserClient() {}
160
161 virtual content::BrowserMainParts* CreateBrowserMainParts(
162 const content::MainFunctionParams& parameters) OVERRIDE;
163 };
164
141 base::LazyInstance<chrome::ChromeContentClient> 165 base::LazyInstance<chrome::ChromeContentClient>
142 g_chrome_content_client = LAZY_INSTANCE_INITIALIZER; 166 g_chrome_content_client = LAZY_INSTANCE_INITIALIZER;
143 167
144 // Override the default ContentBrowserClient to let Chrome participate in 168 // Override the default ContentBrowserClient to let Chrome participate in
145 // content logic. Must be done before any tabs are created. 169 // content logic. Must be done before any tabs are created.
146 base::LazyInstance<chrome::ChromeContentBrowserClient> 170 base::LazyInstance<FakeContentBrowserClient>
147 g_browser_client = LAZY_INSTANCE_INITIALIZER; 171 g_browser_client = LAZY_INSTANCE_INITIALIZER;
148 172
149 base::LazyInstance<chrome::ChromeContentRendererClient> 173 base::LazyInstance<chrome::ChromeContentRendererClient>
150 g_renderer_client = LAZY_INSTANCE_INITIALIZER; 174 g_renderer_client = LAZY_INSTANCE_INITIALIZER;
151 175
176 class FakeMainDelegate : public content::ContentMainDelegate {
177 public:
178 virtual ~FakeMainDelegate() {}
179
180 virtual bool BasicStartupComplete(int* exit_code) OVERRIDE {
181 return false;
182 }
183
184 virtual void PreSandboxStartup() OVERRIDE {
185 // Initialize the content client which that code uses to talk to Chrome.
robertshield 2011/12/12 04:05:49 nit: which code?
Jói 2011/12/12 14:09:02 Removed the comment, it added nothing to what you
186 content::SetContentClient(&g_chrome_content_client.Get());
187
188 // Override the default ContentBrowserClient to let Chrome participate in
189 // content logic. Must be done before any tabs are created.
190 content::GetContentClient()->set_browser(&g_browser_client.Get());
191
192 content::GetContentClient()->set_renderer(&g_renderer_client.Get());
193 }
194
195 virtual void SandboxInitialized(const std::string& process_type) OVERRIDE {}
196
197 virtual int RunProcess(
198 const std::string& process_type,
199 const content::MainFunctionParams& main_function_params) OVERRIDE {
200 return -1;
201 }
202 virtual void ProcessExiting(const std::string& process_type) OVERRIDE {}
203 };
204
205 void FilterDisabledTests() {
206 if (::testing::FLAGS_gtest_filter.length() &&
207 ::testing::FLAGS_gtest_filter.Compare("*") != 0) {
208 // Don't override user specified filters.
209 return;
210 }
211
212 const char* disabled_tests[] = {
213 // Tests disabled since they're testing the same functionality used
214 // by the TestAutomationProvider.
215 "URLRequestTest.Intercept",
216 "URLRequestTest.InterceptNetworkError",
217 "URLRequestTest.InterceptRestartRequired",
218 "URLRequestTest.InterceptRespectsCancelMain",
219 "URLRequestTest.InterceptRespectsCancelRedirect",
220 "URLRequestTest.InterceptRespectsCancelFinal",
221 "URLRequestTest.InterceptRespectsCancelInRestart",
222 "URLRequestTest.InterceptRedirect",
223 "URLRequestTest.InterceptServerError",
224 "URLRequestTestFTP.*",
225
226 // Tests that are currently not working:
227
228 // Temporarily disabled because they needs user input (login dialog).
229 "URLRequestTestHTTP.BasicAuth",
230 "URLRequestTestHTTP.BasicAuthWithCookies",
231
232 // HTTPS tests temporarily disabled due to the certificate error dialog.
233 // TODO(tommi): The tests currently fail though, so need to fix.
234 "HTTPSRequestTest.HTTPSMismatchedTest",
235 "HTTPSRequestTest.HTTPSExpiredTest",
236 "HTTPSRequestTest.ClientAuthTest",
237
238 // Tests chrome's network stack's cache (might not apply to CF).
239 "URLRequestTestHTTP.VaryHeader",
240 "URLRequestTestHTTP.GetZippedTest",
241
242 // I suspect we can only get this one to work (if at all) on IE8 and
243 // later by using the new INTERNET_OPTION_SUPPRESS_BEHAVIOR flags
244 // See http://msdn.microsoft.com/en-us/library/aa385328(VS.85).aspx
245 "URLRequestTest.DoNotSaveCookies",
246 "URLRequestTest.DelayedCookieCallback",
247
248 // TODO(ananta): This test has been consistently failing. Disabling it for
249 // now.
250 "URLRequestTestHTTP.GetTest_NoCache",
251
252 // These tests have been disabled as the Chrome cookie policies don't make
253 // sense or have not been implemented for the host network stack.
254 "URLRequestTest.DoNotSaveCookies_ViaPolicy",
255 "URLRequestTest.DoNotSendCookies_ViaPolicy",
256 "URLRequestTest.DoNotSaveCookies_ViaPolicy_Async",
257 "URLRequestTest.CookiePolicy_ForceSession",
258 "URLRequestTest.DoNotSendCookies",
259 "URLRequestTest.DoNotSendCookies_ViaPolicy_Async",
260 "URLRequestTest.CancelTest_During_OnGetCookies",
261 "URLRequestTest.CancelTest_During_OnSetCookie",
262
263 // These tests are disabled as the rely on functionality provided by
264 // Chrome's HTTP stack like the ability to set the proxy for a URL, etc.
265 "URLRequestTestHTTP.ProxyTunnelRedirectTest",
266 "URLRequestTestHTTP.UnexpectedServerAuthTest",
267
268 // This test is disabled as it expects an empty UA to be echoed back from
269 // the server which is not the case in ChromeFrame.
270 "URLRequestTestHTTP.DefaultUserAgent",
271 // This test modifies the UploadData object after it has been marshaled to
272 // ChromeFrame. We don't support this.
273 "URLRequestTestHTTP.TestPostChunkedDataAfterStart",
274
275 // Do not work in CF, it may well be that IE is unconditionally
276 // adding Accept-Encoding header by default to outgoing requests.
277 "URLRequestTestHTTP.DefaultAcceptEncoding",
278 "URLRequestTestHTTP.OverrideAcceptEncoding",
279
280 // Not supported in ChromeFrame as we use IE's network stack.
281 "URLRequestTest.NetworkDelegateProxyError",
282
283 // URLRequestAutomationJob needs to support NeedsAuth.
284 // http://crbug.com/98446
285 "URLRequestTestHTTP.NetworkDelegateOnAuthRequiredSyncNoAction",
286 "URLRequestTestHTTP.NetworkDelegateOnAuthRequiredSyncSetAuth",
287 "URLRequestTestHTTP.NetworkDelegateOnAuthRequiredSyncCancel",
288 "URLRequestTestHTTP.NetworkDelegateOnAuthRequiredAsyncNoAction",
289 "URLRequestTestHTTP.NetworkDelegateOnAuthRequiredAsyncSetAuth",
290 "URLRequestTestHTTP.NetworkDelegateOnAuthRequiredAsyncCancel",
291
292 // Flaky on the tryservers, http://crbug.com/103097
293 "URLRequestTestHTTP.MultipleRedirectTest",
294 "URLRequestTestHTTP.NetworkDelegateRedirectRequest",
295
296 // These don't work on Joi's box with IE9, http://crbug.com/105435.
297 //
298 // Note that URLRequestTestHTTP.CancelTest2 and
299 // URLRequestTestHTTP.CancelTest3 also frequently hang.
300 "URLRequestTestHTTP.NetworkDelegateRedirectRequestPost",
301 "URLRequestTestHTTP.GetTest",
302 "HTTPSRequestTest.HTTPSPreloadedHSTSTest",
303 };
304
305 std::string filter("-"); // All following filters will be negative.
306 for (int i = 0; i < arraysize(disabled_tests); ++i) {
307 if (i > 0)
308 filter += ":";
309 filter += disabled_tests[i];
310 }
311
312 ::testing::FLAGS_gtest_filter = filter;
313 }
314
152 } // namespace 315 } // namespace
153 316
154 317
155 class SupplyProxyCredentials : public WindowObserver { 318 class SupplyProxyCredentials : public WindowObserver {
156 public: 319 public:
157 SupplyProxyCredentials(const char* username, const char* password); 320 SupplyProxyCredentials(const char* username, const char* password);
158 321
159 protected: 322 protected:
160 struct DialogProps { 323 struct DialogProps {
161 HWND username_; 324 HWND username_;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 394
232 FakeExternalTab::~FakeExternalTab() { 395 FakeExternalTab::~FakeExternalTab() {
233 if (!overridden_user_dir_.empty()) { 396 if (!overridden_user_dir_.empty()) {
234 PathService::Override(chrome::DIR_USER_DATA, overridden_user_dir_); 397 PathService::Override(chrome::DIR_USER_DATA, overridden_user_dir_);
235 } 398 }
236 } 399 }
237 400
238 void FakeExternalTab::Initialize() { 401 void FakeExternalTab::Initialize() {
239 DCHECK(g_browser_process == NULL); 402 DCHECK(g_browser_process == NULL);
240 403
241 notificaton_service_.reset(new NotificationServiceImpl);
242
243 base::SystemMonitor system_monitor;
244
245 icu_util::Initialize();
246 TestTimeouts::Initialize(); 404 TestTimeouts::Initialize();
247 405
248 // Do not call chrome::RegisterPathProvider() since it is also called by our
249 // test runner, CFUrlRequestUnittestRunner, and calling it twice unfortunately
250 // causes a DCHECK().
251 content::RegisterPathProvider();
252 ui::RegisterPathProvider();
253
254 // Load Chrome.dll as our resource dll. 406 // Load Chrome.dll as our resource dll.
255 FilePath dll; 407 FilePath dll;
256 PathService::Get(base::DIR_MODULE, &dll); 408 PathService::Get(base::DIR_MODULE, &dll);
257 dll = dll.Append(chrome::kBrowserResourcesDll); 409 dll = dll.Append(chrome::kBrowserResourcesDll);
258 HMODULE res_mod = ::LoadLibraryExW(dll.value().c_str(), 410 HMODULE res_mod = ::LoadLibraryExW(dll.value().c_str(),
259 NULL, LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE); 411 NULL, LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE);
260 DCHECK(res_mod); 412 DCHECK(res_mod);
261 _AtlBaseModule.SetResourceInstance(res_mod); 413 _AtlBaseModule.SetResourceInstance(res_mod);
262 414
263 ResourceBundle::InitSharedInstance("en-US"); 415 ResourceBundle::InitSharedInstance("en-US");
264 416
265 CommandLine* cmd = CommandLine::ForCurrentProcess(); 417 CommandLine* cmd = CommandLine::ForCurrentProcess();
266 cmd->AppendSwitch(switches::kDisableWebResources); 418 cmd->AppendSwitch(switches::kDisableWebResources);
267 cmd->AppendSwitch(switches::kSingleProcess); 419 cmd->AppendSwitch(switches::kSingleProcess);
268 420
269 browser_process_.reset(new FakeBrowserProcessImpl(*cmd)); 421 browser_process_.reset(new FakeBrowserProcessImpl(*cmd));
270 // BrowserProcessImpl's constructor should set g_browser_process. 422 // BrowserProcessImpl's constructor should set g_browser_process.
271 DCHECK(g_browser_process); 423 DCHECK(g_browser_process);
272 g_browser_process->SetApplicationLocale("en-US"); 424 g_browser_process->SetApplicationLocale("en-US");
273 425
274 content::RenderProcessHost::set_run_renderer_in_process(true); 426 content::RenderProcessHost::set_run_renderer_in_process(true);
275 427
276 browser_process_->local_state()->RegisterBooleanPref( 428 browser_process_->local_state()->RegisterBooleanPref(
277 prefs::kMetricsReportingEnabled, false); 429 prefs::kMetricsReportingEnabled, false);
278
279 // Initialize the content client which that code uses to talk to Chrome.
280 content::SetContentClient(&g_chrome_content_client.Get());
281
282 // Override the default ContentBrowserClient to let Chrome participate in
283 // content logic. Must be done before any tabs are created.
284 content::GetContentClient()->set_browser(&g_browser_client.Get());
285
286 content::GetContentClient()->set_renderer(&g_renderer_client.Get());
287 } 430 }
288 431
289 void FakeExternalTab::InitializePostThreadsCreated() { 432 void FakeExternalTab::InitializePostThreadsCreated() {
290 FilePath profile_path(ProfileManager::GetDefaultProfileDir(user_data())); 433 FilePath profile_path(ProfileManager::GetDefaultProfileDir(user_data()));
291 Profile* profile = 434 Profile* profile =
292 g_browser_process->profile_manager()->GetProfile(profile_path); 435 g_browser_process->profile_manager()->GetProfile(profile_path);
293 } 436 }
294 437
295 void FakeExternalTab::Shutdown() { 438 void FakeExternalTab::Shutdown() {
296 browser_process_.reset(); 439 browser_process_.reset();
297 g_browser_process = NULL; 440 g_browser_process = NULL;
298 process_singleton_.reset(); 441 process_singleton_.reset();
299 442
300 ResourceBundle::CleanupSharedInstance(); 443 ResourceBundle::CleanupSharedInstance();
301 } 444 }
302 445
303 // TODO(joi): Remove!
304 class ChromeFrameFriendOfBrowserProcessImpl {
305 public:
306 static void CreateIOThreadState() {
307 reinterpret_cast<BrowserProcessImpl*>(
308 g_browser_process)->CreateIOThreadState();
309 }
310 };
311
312 CFUrlRequestUnittestRunner::CFUrlRequestUnittestRunner(int argc, char** argv) 446 CFUrlRequestUnittestRunner::CFUrlRequestUnittestRunner(int argc, char** argv)
313 : NetTestSuite(argc, argv), 447 : NetTestSuite(argc, argv),
314 chrome_frame_html_("/chrome_frame", kChromeFrameHtml), 448 chrome_frame_html_("/chrome_frame", kChromeFrameHtml),
315 registrar_(chrome_frame_test::GetTestBedType()), 449 registrar_(chrome_frame_test::GetTestBedType()),
316 test_result_(0) { 450 test_result_(0) {
317 // Register the main thread by instantiating it, but don't call any methods.
318 main_thread_.reset(new content::TestBrowserThread(
319 BrowserThread::UI, MessageLoop::current()));
320 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
321 fake_chrome_.Initialize();
322
323 db_thread_.reset(new content::TestBrowserThread(BrowserThread::DB));
324 db_thread_->Start();
325
326 file_thread_.reset(new content::TestBrowserThread(BrowserThread::FILE));
327 file_thread_->Start();
328
329 ChromeFrameFriendOfBrowserProcessImpl::CreateIOThreadState();
330
331 io_thread_.reset(new content::TestBrowserThread(BrowserThread::IO));
332 io_thread_->StartIOThread();
333
334 fake_chrome_.InitializePostThreadsCreated();
335
336 pss_subclass_.reset(new ProcessSingletonSubclass(this));
337 EXPECT_TRUE(pss_subclass_->Subclass(fake_chrome_.user_data()));
338 StartChromeFrameInHostBrowser();
339 } 451 }
340 452
341 CFUrlRequestUnittestRunner::~CFUrlRequestUnittestRunner() { 453 CFUrlRequestUnittestRunner::~CFUrlRequestUnittestRunner() {
342 fake_chrome_.Shutdown();
343 } 454 }
344 455
345 void CFUrlRequestUnittestRunner::StartChromeFrameInHostBrowser() { 456 void CFUrlRequestUnittestRunner::StartChromeFrameInHostBrowser() {
346 if (!ShouldLaunchBrowser()) 457 if (!ShouldLaunchBrowser())
347 return; 458 return;
348 459
349 base::win::ScopedCOMInitializer com; 460 base::win::ScopedCOMInitializer com;
350 chrome_frame_test::CloseAllIEWindows(); 461 chrome_frame_test::CloseAllIEWindows();
351 462
352 test_http_server_.reset(new test_server::SimpleWebServer(kTestServerPort)); 463 test_http_server_.reset(new test_server::SimpleWebServer(kTestServerPort));
(...skipping 22 matching lines...) Expand all
375 486
376 // Override virtual void Initialize to not call icu initialize 487 // Override virtual void Initialize to not call icu initialize
377 void CFUrlRequestUnittestRunner::Initialize() { 488 void CFUrlRequestUnittestRunner::Initialize() {
378 DCHECK(::GetCurrentThreadId() == test_thread_id_); 489 DCHECK(::GetCurrentThreadId() == test_thread_id_);
379 490
380 // Start by replicating some of the steps that would otherwise be 491 // Start by replicating some of the steps that would otherwise be
381 // done by TestSuite::Initialize. We can't call the base class 492 // done by TestSuite::Initialize. We can't call the base class
382 // directly because it will attempt to initialize some things such as 493 // directly because it will attempt to initialize some things such as
383 // ICU that have already been initialized for this process. 494 // ICU that have already been initialized for this process.
384 CFUrlRequestUnittestRunner::InitializeLogging(); 495 CFUrlRequestUnittestRunner::InitializeLogging();
385 base::Time::EnableHighResolutionTimer(true);
386 496
387 SuppressErrorDialogs(); 497 SuppressErrorDialogs();
388 base::debug::SetSuppressDebugUI(true); 498 base::debug::SetSuppressDebugUI(true);
389 logging::SetLogAssertHandler(UnitTestAssertHandler); 499 logging::SetLogAssertHandler(UnitTestAssertHandler);
390 500
391 // Next, do some initialization for NetTestSuite. 501 // Next, do some initialization for NetTestSuite.
392 NetTestSuite::InitializeTestThread(); 502 NetTestSuite::InitializeTestThread();
393 } 503 }
394 504
395 void CFUrlRequestUnittestRunner::Shutdown() { 505 void CFUrlRequestUnittestRunner::Shutdown() {
396 DCHECK(::GetCurrentThreadId() == test_thread_id_); 506 DCHECK(::GetCurrentThreadId() == test_thread_id_);
397 NetTestSuite::Shutdown(); 507 NetTestSuite::Shutdown();
398 OleUninitialize(); 508 OleUninitialize();
399 } 509 }
400 510
401 void CFUrlRequestUnittestRunner::OnConnectAutomationProviderToChannel( 511 void CFUrlRequestUnittestRunner::OnConnectAutomationProviderToChannel(
402 const std::string& channel_id) { 512 const std::string& channel_id) {
403 Profile* profile = g_browser_process->profile_manager()-> 513 Profile* profile = g_browser_process->profile_manager()->
404 GetDefaultProfile(fake_chrome_.user_data()); 514 GetDefaultProfile(fake_chrome_->user_data());
405 515
406 AutomationProviderList* list = g_browser_process->GetAutomationProviderList(); 516 AutomationProviderList* list = g_browser_process->GetAutomationProviderList();
407 DCHECK(list); 517 DCHECK(list);
408 list->AddProvider( 518 list->AddProvider(
409 TestAutomationProvider::NewAutomationProvider(profile, channel_id, this)); 519 TestAutomationProvider::NewAutomationProvider(profile, channel_id, this));
410 } 520 }
411 521
412 void CFUrlRequestUnittestRunner::OnInitialTabLoaded() { 522 void CFUrlRequestUnittestRunner::OnInitialTabLoaded() {
413 test_http_server_.reset(); 523 test_http_server_.reset();
414 StartTests(); 524 StartTests();
415 } 525 }
416 526
417 void CFUrlRequestUnittestRunner::RunMainUIThread() {
418 DCHECK(MessageLoop::current());
419 DCHECK(MessageLoop::current()->type() == MessageLoop::TYPE_UI);
420 MessageLoop::current()->Run();
421 }
422
423 void CFUrlRequestUnittestRunner::StartTests() { 527 void CFUrlRequestUnittestRunner::StartTests() {
424 if (PromptAfterSetup()) 528 if (PromptAfterSetup())
425 MessageBoxA(NULL, "click ok to run", "", MB_OK); 529 MessageBoxA(NULL, "click ok to run", "", MB_OK);
426 530
427 DCHECK_EQ(test_thread_.IsValid(), false); 531 DCHECK_EQ(test_thread_.IsValid(), false);
428 test_thread_.Set(::CreateThread(NULL, 0, RunAllUnittests, this, 0, 532 test_thread_.Set(::CreateThread(NULL, 0, RunAllUnittests, this, 0,
429 &test_thread_id_)); 533 &test_thread_id_));
430 DCHECK(test_thread_.IsValid()); 534 DCHECK(test_thread_.IsValid());
431 } 535 }
432 536
433 // static 537 // static
434 DWORD CFUrlRequestUnittestRunner::RunAllUnittests(void* param) { 538 DWORD CFUrlRequestUnittestRunner::RunAllUnittests(void* param) {
435 base::PlatformThread::SetName("CFUrlRequestUnittestRunner"); 539 base::PlatformThread::SetName("CFUrlRequestUnittestRunner");
436 // Needed for some url request tests like the intercept job tests, etc.
437 NotificationServiceImpl service;
438 CFUrlRequestUnittestRunner* me = 540 CFUrlRequestUnittestRunner* me =
439 reinterpret_cast<CFUrlRequestUnittestRunner*>(param); 541 reinterpret_cast<CFUrlRequestUnittestRunner*>(param);
440 me->test_result_ = me->Run(); 542 me->test_result_ = me->Run();
441 me->fake_chrome_.ui_loop()->PostTask(FROM_HERE, 543 BrowserThread::PostTask(BrowserThread::UI,
442 base::Bind(TakeDownBrowser, me)); 544 FROM_HERE,
545 base::Bind(TakeDownBrowser, me));
443 return 0; 546 return 0;
444 } 547 }
445 548
446 // static 549 // static
447 void CFUrlRequestUnittestRunner::TakeDownBrowser( 550 void CFUrlRequestUnittestRunner::TakeDownBrowser(
448 CFUrlRequestUnittestRunner* me) { 551 CFUrlRequestUnittestRunner* me) {
449 if (PromptAfterSetup()) 552 if (PromptAfterSetup())
450 MessageBoxA(NULL, "click ok to exit", "", MB_OK); 553 MessageBoxA(NULL, "click ok to exit", "", MB_OK);
451 554
452 me->ShutDownHostBrowser(); 555 me->ShutDownHostBrowser();
453 me->fake_chrome_.ui_loop()->PostDelayedTask(FROM_HERE, 556 BrowserThread::PostDelayedTask(BrowserThread::UI,
454 new MessageLoop::QuitTask, 557 FROM_HERE,
455 TestTimeouts::tiny_timeout_ms()); 558 new MessageLoop::QuitTask,
559 TestTimeouts::tiny_timeout_ms());
456 } 560 }
457 561
458 void CFUrlRequestUnittestRunner::InitializeLogging() { 562 void CFUrlRequestUnittestRunner::InitializeLogging() {
459 FilePath exe; 563 FilePath exe;
460 PathService::Get(base::FILE_EXE, &exe); 564 PathService::Get(base::FILE_EXE, &exe);
461 FilePath log_filename = exe.ReplaceExtension(FILE_PATH_LITERAL("log")); 565 FilePath log_filename = exe.ReplaceExtension(FILE_PATH_LITERAL("log"));
462 logging::InitLogging( 566 logging::InitLogging(
463 log_filename.value().c_str(), 567 log_filename.value().c_str(),
464 logging::LOG_TO_BOTH_FILE_AND_SYSTEM_DEBUG_LOG, 568 logging::LOG_TO_BOTH_FILE_AND_SYSTEM_DEBUG_LOG,
465 logging::LOCK_LOG_FILE, 569 logging::LOCK_LOG_FILE,
466 logging::DELETE_OLD_LOG_FILE, 570 logging::DELETE_OLD_LOG_FILE,
467 logging::DISABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS); 571 logging::DISABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS);
468 // We want process and thread IDs because we may have multiple processes. 572 // We want process and thread IDs because we may have multiple processes.
469 // Note: temporarily enabled timestamps in an effort to catch bug 6361. 573 // Note: temporarily enabled timestamps in an effort to catch bug 6361.
470 logging::SetLogItems(true, true, true, true); 574 logging::SetLogItems(true, true, true, true);
471 } 575 }
472 576
473 void FilterDisabledTests() { 577 void CFUrlRequestUnittestRunner::PreEarlyInitialization() {
474 if (::testing::FLAGS_gtest_filter.length() && 578 testing::InitGoogleTest(&g_argc, g_argv);
475 ::testing::FLAGS_gtest_filter.Compare("*") != 0) { 579 FilterDisabledTests();
476 // Don't override user specified filters. 580 }
477 return;
478 }
479 581
480 const char* disabled_tests[] = { 582 void CFUrlRequestUnittestRunner::PreCreateThreads() {
481 // Tests disabled since they're testing the same functionality used 583 fake_chrome_.reset(new FakeExternalTab());
482 // by the TestAutomationProvider. 584 fake_chrome_->Initialize();
483 "URLRequestTest.Intercept",
484 "URLRequestTest.InterceptNetworkError",
485 "URLRequestTest.InterceptRestartRequired",
486 "URLRequestTest.InterceptRespectsCancelMain",
487 "URLRequestTest.InterceptRespectsCancelRedirect",
488 "URLRequestTest.InterceptRespectsCancelFinal",
489 "URLRequestTest.InterceptRespectsCancelInRestart",
490 "URLRequestTest.InterceptRedirect",
491 "URLRequestTest.InterceptServerError",
492 "URLRequestTestFTP.*",
493 585
494 // Tests that are currently not working: 586 pss_subclass_.reset(new ProcessSingletonSubclass(this));
587 EXPECT_TRUE(pss_subclass_->Subclass(fake_chrome_->user_data()));
588 StartChromeFrameInHostBrowser();
589 }
495 590
496 // Temporarily disabled because they needs user input (login dialog). 591 void CFUrlRequestUnittestRunner::PreStartThread(BrowserThread::ID identifier) {
497 "URLRequestTestHTTP.BasicAuth", 592 reinterpret_cast<FakeBrowserProcessImpl*>(g_browser_process)->PreStartThread(
robertshield 2011/12/12 04:05:49 nit: why the casts here and below?
Jói 2011/12/12 14:09:02 Because g_browser_process (a variable created in t
498 "URLRequestTestHTTP.BasicAuthWithCookies", 593 identifier);
594 }
499 595
500 // HTTPS tests temporarily disabled due to the certificate error dialog. 596 void CFUrlRequestUnittestRunner::PostStartThread(BrowserThread::ID identifier) {
501 // TODO(tommi): The tests currently fail though, so need to fix. 597 reinterpret_cast<FakeBrowserProcessImpl*>(g_browser_process)->PostStartThread(
502 "HTTPSRequestTest.HTTPSMismatchedTest", 598 identifier);
503 "HTTPSRequestTest.HTTPSExpiredTest", 599 }
504 "HTTPSRequestTest.ClientAuthTest",
505 600
506 // Tests chrome's network stack's cache (might not apply to CF). 601 void CFUrlRequestUnittestRunner::PreMainMessageLoopRun() {
507 "URLRequestTestHTTP.VaryHeader", 602 fake_chrome_->InitializePostThreadsCreated();
508 "URLRequestTestHTTP.GetZippedTest", 603 }
509 604
510 // I suspect we can only get this one to work (if at all) on IE8 and 605 bool CFUrlRequestUnittestRunner::MainMessageLoopRun(int* result_code) {
511 // later by using the new INTERNET_OPTION_SUPPRESS_BEHAVIOR flags 606 DCHECK(MessageLoop::current());
512 // See http://msdn.microsoft.com/en-us/library/aa385328(VS.85).aspx 607 DCHECK(MessageLoop::current()->type() == MessageLoop::TYPE_UI);
513 "URLRequestTest.DoNotSaveCookies",
514 "URLRequestTest.DelayedCookieCallback",
515 608
516 // TODO(ananta): This test has been consistently failing. Disabling it for 609 // We need to allow IO on the main thread for these tests.
517 // now. 610 base::ThreadRestrictions::SetIOAllowed(true);
518 "URLRequestTestHTTP.GetTest_NoCache",
519 611
520 // These tests have been disabled as the Chrome cookie policies don't make 612 return false;
521 // sense or have not been implemented for the host network stack. 613 }
522 "URLRequestTest.DoNotSaveCookies_ViaPolicy",
523 "URLRequestTest.DoNotSendCookies_ViaPolicy",
524 "URLRequestTest.DoNotSaveCookies_ViaPolicy_Async",
525 "URLRequestTest.CookiePolicy_ForceSession",
526 "URLRequestTest.DoNotSendCookies",
527 "URLRequestTest.DoNotSendCookies_ViaPolicy_Async",
528 "URLRequestTest.CancelTest_During_OnGetCookies",
529 "URLRequestTest.CancelTest_During_OnSetCookie",
530 614
531 // These tests are disabled as the rely on functionality provided by 615 void CFUrlRequestUnittestRunner::PostMainMessageLoopRun() {
532 // Chrome's HTTP stack like the ability to set the proxy for a URL, etc. 616 reinterpret_cast<FakeBrowserProcessImpl*>(g_browser_process)->StartTearDown();
533 "URLRequestTestHTTP.ProxyTunnelRedirectTest",
534 "URLRequestTestHTTP.UnexpectedServerAuthTest",
535 617
536 // This test is disabled as it expects an empty UA to be echoed back from 618 // Must do this separately as the mock profile_manager_ is not the
537 // the server which is not the case in ChromeFrame. 619 // same member as BrowserProcessImpl::StartTearDown resets.
538 "URLRequestTestHTTP.DefaultUserAgent", 620 reinterpret_cast<FakeBrowserProcessImpl*>(
539 // This test modifies the UploadData object after it has been marshaled to 621 g_browser_process)->DestroyProfileManager();
540 // ChromeFrame. We don't support this.
541 "URLRequestTestHTTP.TestPostChunkedDataAfterStart",
542 622
543 // Do not work in CF, it may well be that IE is unconditionally 623 if (crash_service_)
544 // adding Accept-Encoding header by default to outgoing requests. 624 base::KillProcess(crash_service_, 0, false);
545 "URLRequestTestHTTP.DefaultAcceptEncoding",
546 "URLRequestTestHTTP.OverrideAcceptEncoding",
547 625
548 // Not supported in ChromeFrame as we use IE's network stack. 626 base::KillProcesses(chrome_frame_test::kIEImageName, 0, NULL);
549 "URLRequestTest.NetworkDelegateProxyError", 627 base::KillProcesses(chrome_frame_test::kIEBrokerImageName, 0, NULL);
628 }
550 629
551 // URLRequestAutomationJob needs to support NeedsAuth. 630 void CFUrlRequestUnittestRunner::PreStopThread(
552 // http://crbug.com/98446 631 content::BrowserThread::ID identifier) {
553 "URLRequestTestHTTP.NetworkDelegateOnAuthRequiredSyncNoAction", 632 reinterpret_cast<FakeBrowserProcessImpl*>(g_browser_process)->PreStopThread(
554 "URLRequestTestHTTP.NetworkDelegateOnAuthRequiredSyncSetAuth", 633 identifier);
555 "URLRequestTestHTTP.NetworkDelegateOnAuthRequiredSyncCancel", 634 }
556 "URLRequestTestHTTP.NetworkDelegateOnAuthRequiredAsyncNoAction",
557 "URLRequestTestHTTP.NetworkDelegateOnAuthRequiredAsyncSetAuth",
558 "URLRequestTestHTTP.NetworkDelegateOnAuthRequiredAsyncCancel",
559 635
560 // Flaky on the tryservers, http://crbug.com/103097 636 void CFUrlRequestUnittestRunner::PostStopThread(
561 "URLRequestTestHTTP.MultipleRedirectTest", 637 content::BrowserThread::ID identifier) {
562 "URLRequestTestHTTP.NetworkDelegateRedirectRequest", 638 reinterpret_cast<FakeBrowserProcessImpl*>(g_browser_process)->PostStopThread(
563 }; 639 identifier);
640 }
564 641
565 std::string filter("-"); // All following filters will be negative. 642 void CFUrlRequestUnittestRunner::PostDestroyThreads() {
566 for (int i = 0; i < arraysize(disabled_tests); ++i) { 643 fake_chrome_->Shutdown();
567 if (i > 0) 644 fake_chrome_.reset();
568 filter += ":";
569 filter += disabled_tests[i];
570 }
571 645
572 ::testing::FLAGS_gtest_filter = filter; 646 #ifndef NDEBUG
647 // Avoid CRT cleanup in debug test runs to ensure that webkit ASSERTs which
648 // check if globals are created and destroyed on the same thread don't fire.
649 // Webkit global objects are created on the inproc renderer thread.
650 ExitProcess(test_result());
robertshield 2011/12/12 04:05:49 How much more of what is now content is being run
Jói 2011/12/12 14:09:02 I don't think a lot more code gets run than before
651 #endif
573 } 652 }
574 653
575 // We need a module since some of the accessibility code that gets pulled 654 // We need a module since some of the accessibility code that gets pulled
576 // in here uses ATL. 655 // in here uses ATL.
577 class ObligatoryModule: public CAtlExeModuleT<ObligatoryModule> { 656 class ObligatoryModule: public CAtlExeModuleT<ObligatoryModule> {
578 public: 657 public:
579 static HRESULT InitializeCom() { 658 static HRESULT InitializeCom() {
580 return OleInitialize(NULL); 659 return OleInitialize(NULL);
581 } 660 }
582 661
(...skipping 18 matching lines...) Expand all
601 return "IE10"; 680 return "IE10";
602 case IE_UNSUPPORTED: 681 case IE_UNSUPPORTED:
603 return "Unknown IE Version"; 682 return "Unknown IE Version";
604 case NON_IE: 683 case NON_IE:
605 return "Could not find IE"; 684 return "Could not find IE";
606 default: 685 default:
607 return "Error."; 686 return "Error.";
608 } 687 }
609 } 688 }
610 689
690 content::BrowserMainParts* FakeContentBrowserClient::CreateBrowserMainParts(
691 const content::MainFunctionParams& parameters) {
692 // We never delete this, as the content module takes ownership.
693 //
694 // We must not construct this earlier, or we will have out-of-order
695 // AtExitManager creation/destruction.
696 g_test_suite = new CFUrlRequestUnittestRunner(g_argc, g_argv);
697 g_test_suite->set_crash_service(chrome_frame_test::StartCrashService());
698 return g_test_suite;
699 }
700
611 int main(int argc, char** argv) { 701 int main(int argc, char** argv) {
612 // TODO(joi): Remove the "true" part here and fix the log statement below. 702 g_argc = argc;
613 if (true || chrome_frame_test::GetInstalledIEVersion() >= IE_9) { 703 g_argv = argv;
704
705 if (false && chrome_frame_test::GetInstalledIEVersion() >= IE_9) {
614 // Adding this here as the command line and the logging stuff gets 706 // Adding this here as the command line and the logging stuff gets
615 // initialized in the NetTestSuite constructor. Did not want to break that. 707 // initialized in the NetTestSuite constructor. Did not want to break that.
616 base::AtExitManager at_exit_manager; 708 base::AtExitManager at_exit_manager;
617 CommandLine::Init(argc, argv); 709 CommandLine::Init(argc, argv);
618 CFUrlRequestUnittestRunner::InitializeLogging(); 710 CFUrlRequestUnittestRunner::InitializeLogging();
619 LOG(INFO) << "Temporarily not running any ChromeFrame " 711 LOG(INFO) << "Not running ChromeFrame net tests on IE9+";
620 << "net tests (http://crbug.com/105435)";
621 return 0; 712 return 0;
622 } 713 }
623 714
715 // DO NOT SUBMIT
624 google_breakpad::scoped_ptr<google_breakpad::ExceptionHandler> breakpad( 716 google_breakpad::scoped_ptr<google_breakpad::ExceptionHandler> breakpad(
625 InitializeCrashReporting(HEADLESS)); 717 InitializeCrashReporting(HEADLESS));
626 718
627 // TODO(tommi): Stuff be broke. Needs a fixin'.
628 // This is awkward: the TestSuite derived CFUrlRequestUnittestRunner contains
629 // the instance of the AtExitManager that RegisterPathProvider() and others
630 // below require. So we have to instantiate this first.
631 CFUrlRequestUnittestRunner test_suite(argc, argv);
632
633 // Display the IE version we run with. This must be done after 719 // Display the IE version we run with. This must be done after
634 // CFUrlRequestUnittestRunner is constructed since that initializes logging. 720 // CFUrlRequestUnittestRunner is constructed since that initializes logging.
635 IEVersion ie_version = chrome_frame_test::GetInstalledIEVersion(); 721 IEVersion ie_version = chrome_frame_test::GetInstalledIEVersion();
636 LOG(INFO) << "Running CF net tests with IE version: " 722 LOG(INFO) << "Running CF net tests with IE version: "
637 << IEVersionToString(ie_version); 723 << IEVersionToString(ie_version);
638 724
639 base::ProcessHandle crash_service = chrome_frame_test::StartCrashService();
640
641 WindowWatchdog watchdog;
642 // See url_request_unittest.cc for these credentials. 725 // See url_request_unittest.cc for these credentials.
643 SupplyProxyCredentials credentials("user", "secret"); 726 SupplyProxyCredentials credentials("user", "secret");
727 WindowWatchdog watchdog;
644 watchdog.AddObserver(&credentials, "Windows Security", ""); 728 watchdog.AddObserver(&credentials, "Windows Security", "");
645 testing::InitGoogleTest(&argc, argv);
646 FilterDisabledTests();
647 test_suite.RunMainUIThread();
648 729
649 if (crash_service) 730 sandbox::SandboxInterfaceInfo sandbox_info = {0};
650 base::KillProcess(crash_service, 0, false); 731 // This would normally be done, but is probably not needed for these tests.
732 //content::InitializeSandboxInfo(&sandbox_info);
733 FakeMainDelegate delegate;
734 content::ContentMain(
735 reinterpret_cast<HINSTANCE>(GetModuleHandle(NULL)),
736 &sandbox_info,
737 &delegate);
651 738
652 base::KillProcesses(chrome_frame_test::kIEImageName, 0, NULL); 739 // Note: In debug builds, we ExitProcess during PostDestroyThreads.
653 base::KillProcesses(chrome_frame_test::kIEBrokerImageName, 0, NULL); 740 return g_test_suite->test_result();
654 // Avoid CRT cleanup in debug test runs to ensure that webkit ASSERTs which
655 // check if globals are created and destroyed on the same thread don't fire.
656 // Webkit global objects are created on the inproc renderer thread.
657 #if !defined(NDEBUG)
658 ExitProcess(test_suite.test_result());
659 #endif // NDEBUG
660 return test_suite.test_result();
661 } 741 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698