| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/test/base/in_process_browser_test.h" | 5 #include "chrome/test/base/in_process_browser_test.h" |
| 6 | 6 |
| 7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 | 68 |
| 69 #if !defined(OS_ANDROID) && !defined(OS_IOS) | 69 #if !defined(OS_ANDROID) && !defined(OS_IOS) |
| 70 #include "components/storage_monitor/test_storage_monitor.h" | 70 #include "components/storage_monitor/test_storage_monitor.h" |
| 71 #endif | 71 #endif |
| 72 | 72 |
| 73 namespace { | 73 namespace { |
| 74 | 74 |
| 75 // Passed as value of kTestType. | 75 // Passed as value of kTestType. |
| 76 const char kBrowserTestType[] = "browser"; | 76 const char kBrowserTestType[] = "browser"; |
| 77 | 77 |
| 78 // Used when running in single-process mode. | |
| 79 base::LazyInstance<ChromeContentRendererClient>::Leaky | |
| 80 g_chrome_content_renderer_client = LAZY_INSTANCE_INITIALIZER; | |
| 81 | |
| 82 // A BrowserListObserver that makes sure that all browsers created are on the | 78 // A BrowserListObserver that makes sure that all browsers created are on the |
| 83 // |allowed_desktop_|. | 79 // |allowed_desktop_|. |
| 84 class SingleDesktopTestObserver : public chrome::BrowserListObserver, | 80 class SingleDesktopTestObserver : public chrome::BrowserListObserver, |
| 85 public base::NonThreadSafe { | 81 public base::NonThreadSafe { |
| 86 public: | 82 public: |
| 87 explicit SingleDesktopTestObserver(chrome::HostDesktopType allowed_desktop); | 83 explicit SingleDesktopTestObserver(chrome::HostDesktopType allowed_desktop); |
| 88 virtual ~SingleDesktopTestObserver(); | 84 virtual ~SingleDesktopTestObserver(); |
| 89 | 85 |
| 90 // chrome::BrowserListObserver: | 86 // chrome::BrowserListObserver: |
| 91 virtual void OnBrowserAdded(Browser* browser) OVERRIDE; | 87 virtual void OnBrowserAdded(Browser* browser) OVERRIDE; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 // Before we run the browser, we have to hack the path to the exe to match | 122 // Before we run the browser, we have to hack the path to the exe to match |
| 127 // what it would be if Chrome was running, because it is used to fork renderer | 123 // what it would be if Chrome was running, because it is used to fork renderer |
| 128 // processes, on Linux at least (failure to do so will cause a browser_test to | 124 // processes, on Linux at least (failure to do so will cause a browser_test to |
| 129 // be run instead of a renderer). | 125 // be run instead of a renderer). |
| 130 base::FilePath chrome_path; | 126 base::FilePath chrome_path; |
| 131 CHECK(PathService::Get(base::FILE_EXE, &chrome_path)); | 127 CHECK(PathService::Get(base::FILE_EXE, &chrome_path)); |
| 132 chrome_path = chrome_path.DirName(); | 128 chrome_path = chrome_path.DirName(); |
| 133 chrome_path = chrome_path.Append(chrome::kBrowserProcessExecutablePath); | 129 chrome_path = chrome_path.Append(chrome::kBrowserProcessExecutablePath); |
| 134 CHECK(PathService::Override(base::FILE_EXE, chrome_path)); | 130 CHECK(PathService::Override(base::FILE_EXE, chrome_path)); |
| 135 #endif // defined(OS_MACOSX) | 131 #endif // defined(OS_MACOSX) |
| 132 |
| 136 CreateTestServer(base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); | 133 CreateTestServer(base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); |
| 137 base::FilePath src_dir; | 134 base::FilePath src_dir; |
| 138 CHECK(PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)); | 135 CHECK(PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)); |
| 139 embedded_test_server()->ServeFilesFromDirectory( | 136 base::FilePath test_data_dir = src_dir.AppendASCII("chrome/test/data"); |
| 140 src_dir.AppendASCII("chrome/test/data")); | 137 embedded_test_server()->ServeFilesFromDirectory(test_data_dir); |
| 138 |
| 139 // chrome::DIR_TEST_DATA isn't going to be setup until after we call |
| 140 // ContentMain. However that is after tests' constructors or SetUp methods, |
| 141 // which sometimes need it. So just override it. |
| 142 CHECK(PathService::Override(chrome::DIR_TEST_DATA, test_data_dir)); |
| 141 } | 143 } |
| 142 | 144 |
| 143 InProcessBrowserTest::~InProcessBrowserTest() { | 145 InProcessBrowserTest::~InProcessBrowserTest() { |
| 144 } | 146 } |
| 145 | 147 |
| 146 void InProcessBrowserTest::SetUp() { | 148 void InProcessBrowserTest::SetUp() { |
| 147 // Browser tests will create their own g_browser_process later. | 149 // Browser tests will create their own g_browser_process later. |
| 148 DCHECK(!g_browser_process); | 150 DCHECK(!g_browser_process); |
| 149 | 151 |
| 150 CommandLine* command_line = CommandLine::ForCurrentProcess(); | 152 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| 151 // Allow subclasses to change the command line before running any tests. | 153 // Allow subclasses to change the command line before running any tests. |
| 152 SetUpCommandLine(command_line); | 154 SetUpCommandLine(command_line); |
| 153 // Add command line arguments that are used by all InProcessBrowserTests. | 155 // Add command line arguments that are used by all InProcessBrowserTests. |
| 154 PrepareTestCommandLine(command_line); | 156 PrepareTestCommandLine(command_line); |
| 155 | 157 |
| 156 // Create a temporary user data directory if required. | 158 // Create a temporary user data directory if required. |
| 157 ASSERT_TRUE(CreateUserDataDirectory()) | 159 ASSERT_TRUE(CreateUserDataDirectory()) |
| 158 << "Could not create user data directory."; | 160 << "Could not create user data directory."; |
| 159 | 161 |
| 160 // Allow subclasses the opportunity to make changes to the default user data | 162 // Allow subclasses the opportunity to make changes to the default user data |
| 161 // dir before running any tests. | 163 // dir before running any tests. |
| 162 ASSERT_TRUE(SetUpUserDataDirectory()) | 164 ASSERT_TRUE(SetUpUserDataDirectory()) |
| 163 << "Could not set up user data directory."; | 165 << "Could not set up user data directory."; |
| 164 | 166 |
| 165 // Single-process mode is not set in BrowserMain, so process it explicitly, | |
| 166 // and set up renderer. | |
| 167 if (command_line->HasSwitch(switches::kSingleProcess)) { | |
| 168 content::SetRendererClientForTesting( | |
| 169 g_chrome_content_renderer_client.Pointer()); | |
| 170 } | |
| 171 | |
| 172 #if defined(OS_CHROMEOS) | 167 #if defined(OS_CHROMEOS) |
| 173 // Make sure that the log directory exists. | 168 // Make sure that the log directory exists. |
| 174 base::FilePath log_dir = logging::GetSessionLogFile(*command_line).DirName(); | 169 base::FilePath log_dir = logging::GetSessionLogFile(*command_line).DirName(); |
| 175 base::CreateDirectory(log_dir); | 170 base::CreateDirectory(log_dir); |
| 176 #endif // defined(OS_CHROMEOS) | 171 #endif // defined(OS_CHROMEOS) |
| 177 | 172 |
| 178 #if defined(OS_MACOSX) | 173 #if defined(OS_MACOSX) |
| 179 // On Mac, without the following autorelease pool, code which is directly | |
| 180 // executed (as opposed to executed inside a message loop) would autorelease | |
| 181 // objects into a higher-level pool. This pool is not recycled in-sync with | |
| 182 // the message loops' pools and causes problems with code relying on | |
| 183 // deallocation via an autorelease pool (such as browser window closure and | |
| 184 // browser shutdown). To avoid this, the following pool is recycled after each | |
| 185 // time code is directly executed. | |
| 186 autorelease_pool_ = new base::mac::ScopedNSAutoreleasePool; | |
| 187 | |
| 188 // Always use the MockKeychain if OS encription is used (which is when | 174 // Always use the MockKeychain if OS encription is used (which is when |
| 189 // anything sensitive gets stored, including Cookies). Without this, | 175 // anything sensitive gets stored, including Cookies). Without this, |
| 190 // many tests will hang waiting for a user to approve KeyChain access. | 176 // many tests will hang waiting for a user to approve KeyChain access. |
| 191 OSCrypt::UseMockKeychain(true); | 177 OSCrypt::UseMockKeychain(true); |
| 192 #endif | 178 #endif |
| 193 | 179 |
| 194 #if defined(ENABLE_CAPTIVE_PORTAL_DETECTION) | 180 #if defined(ENABLE_CAPTIVE_PORTAL_DETECTION) |
| 195 captive_portal::CaptivePortalService::set_state_for_testing( | 181 captive_portal::CaptivePortalService::set_state_for_testing( |
| 196 captive_portal::CaptivePortalService::DISABLED_FOR_TESTING); | 182 captive_portal::CaptivePortalService::DISABLED_FOR_TESTING); |
| 197 #endif | 183 #endif |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 375 new_command_line.AppendSwitchNative((*iter).first, (*iter).second); | 361 new_command_line.AppendSwitchNative((*iter).first, (*iter).second); |
| 376 } | 362 } |
| 377 return new_command_line; | 363 return new_command_line; |
| 378 } | 364 } |
| 379 #endif | 365 #endif |
| 380 | 366 |
| 381 void InProcessBrowserTest::RunTestOnMainThreadLoop() { | 367 void InProcessBrowserTest::RunTestOnMainThreadLoop() { |
| 382 // Pump startup related events. | 368 // Pump startup related events. |
| 383 content::RunAllPendingInMessageLoop(); | 369 content::RunAllPendingInMessageLoop(); |
| 384 | 370 |
| 385 #if defined(OS_MACOSX) | |
| 386 autorelease_pool_->Recycle(); | |
| 387 #endif | |
| 388 | |
| 389 chrome::HostDesktopType active_desktop = chrome::GetActiveDesktop(); | 371 chrome::HostDesktopType active_desktop = chrome::GetActiveDesktop(); |
| 390 // Self-adds/removes itself from the BrowserList observers. | 372 // Self-adds/removes itself from the BrowserList observers. |
| 391 scoped_ptr<SingleDesktopTestObserver> single_desktop_test_observer; | 373 scoped_ptr<SingleDesktopTestObserver> single_desktop_test_observer; |
| 392 if (!multi_desktop_test_) { | 374 if (!multi_desktop_test_) { |
| 393 single_desktop_test_observer.reset( | 375 single_desktop_test_observer.reset( |
| 394 new SingleDesktopTestObserver(active_desktop)); | 376 new SingleDesktopTestObserver(active_desktop)); |
| 395 } | 377 } |
| 396 | 378 |
| 397 const BrowserList* active_browser_list = | 379 const BrowserList* active_browser_list = |
| 398 BrowserList::GetInstance(active_desktop); | 380 BrowserList::GetInstance(active_desktop); |
| 399 if (!active_browser_list->empty()) { | 381 if (!active_browser_list->empty()) { |
| 400 browser_ = active_browser_list->get(0); | 382 browser_ = active_browser_list->get(0); |
| 401 #if defined(USE_ASH) | 383 #if defined(USE_ASH) |
| 402 // There are cases where windows get created maximized by default. | 384 // There are cases where windows get created maximized by default. |
| 403 if (browser_->window()->IsMaximized()) | 385 if (browser_->window()->IsMaximized()) |
| 404 browser_->window()->Restore(); | 386 browser_->window()->Restore(); |
| 405 #endif | 387 #endif |
| 406 content::WaitForLoadStop( | 388 content::WaitForLoadStop( |
| 407 browser_->tab_strip_model()->GetActiveWebContents()); | 389 browser_->tab_strip_model()->GetActiveWebContents()); |
| 408 } | 390 } |
| 409 | 391 |
| 410 #if !defined(OS_ANDROID) && !defined(OS_IOS) | 392 #if !defined(OS_ANDROID) && !defined(OS_IOS) |
| 411 // Do not use the real StorageMonitor for tests, which introduces another | 393 // Do not use the real StorageMonitor for tests, which introduces another |
| 412 // source of variability and potential slowness. | 394 // source of variability and potential slowness. |
| 413 ASSERT_TRUE(storage_monitor::TestStorageMonitor::CreateForBrowserTests()); | 395 ASSERT_TRUE(storage_monitor::TestStorageMonitor::CreateForBrowserTests()); |
| 414 #endif | 396 #endif |
| 415 | 397 |
| 398 #if defined(OS_MACOSX) |
| 399 // On Mac, without the following autorelease pool, code which is directly |
| 400 // executed (as opposed to executed inside a message loop) would autorelease |
| 401 // objects into a higher-level pool. This pool is not recycled in-sync with |
| 402 // the message loops' pools and causes problems with code relying on |
| 403 // deallocation via an autorelease pool (such as browser window closure and |
| 404 // browser shutdown). To avoid this, the following pool is recycled after each |
| 405 // time code is directly executed. |
| 406 autorelease_pool_ = new base::mac::ScopedNSAutoreleasePool; |
| 407 #endif |
| 408 |
| 416 // Pump any pending events that were created as a result of creating a | 409 // Pump any pending events that were created as a result of creating a |
| 417 // browser. | 410 // browser. |
| 418 content::RunAllPendingInMessageLoop(); | 411 content::RunAllPendingInMessageLoop(); |
| 419 | 412 |
| 420 SetUpOnMainThread(); | 413 SetUpOnMainThread(); |
| 421 #if defined(OS_MACOSX) | 414 #if defined(OS_MACOSX) |
| 422 autorelease_pool_->Recycle(); | 415 autorelease_pool_->Recycle(); |
| 423 #endif | 416 #endif |
| 424 | 417 |
| 425 if (!HasFatalFailure()) | 418 if (!HasFatalFailure()) |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 471 // On the Mac, this eventually reaches | 464 // On the Mac, this eventually reaches |
| 472 // -[BrowserWindowController windowWillClose:], which will post a deferred | 465 // -[BrowserWindowController windowWillClose:], which will post a deferred |
| 473 // -autorelease on itself to ultimately destroy the Browser object. The line | 466 // -autorelease on itself to ultimately destroy the Browser object. The line |
| 474 // below is necessary to pump these pending messages to ensure all Browsers | 467 // below is necessary to pump these pending messages to ensure all Browsers |
| 475 // get deleted. | 468 // get deleted. |
| 476 content::RunAllPendingInMessageLoop(); | 469 content::RunAllPendingInMessageLoop(); |
| 477 delete autorelease_pool_; | 470 delete autorelease_pool_; |
| 478 autorelease_pool_ = NULL; | 471 autorelease_pool_ = NULL; |
| 479 #endif | 472 #endif |
| 480 } | 473 } |
| OLD | NEW |