OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/ui/ui_test.h" | 5 #include "chrome/test/ui/ui_test.h" |
6 | 6 |
7 #if defined(OS_POSIX) | 7 #if defined(OS_POSIX) |
8 #include <signal.h> | 8 #include <signal.h> |
9 #include <sys/types.h> | 9 #include <sys/types.h> |
10 #endif | 10 #endif |
(...skipping 25 matching lines...) Expand all Loading... |
36 #include "chrome/common/chrome_constants.h" | 36 #include "chrome/common/chrome_constants.h" |
37 #include "chrome/common/chrome_paths.h" | 37 #include "chrome/common/chrome_paths.h" |
38 #include "chrome/common/chrome_switches.h" | 38 #include "chrome/common/chrome_switches.h" |
39 #include "chrome/common/debug_flags.h" | 39 #include "chrome/common/debug_flags.h" |
40 #include "chrome/common/logging_chrome.h" | 40 #include "chrome/common/logging_chrome.h" |
41 #include "chrome/common/json_value_serializer.h" | 41 #include "chrome/common/json_value_serializer.h" |
42 #include "chrome/common/url_constants.h" | 42 #include "chrome/common/url_constants.h" |
43 #include "chrome/test/automation/automation_proxy.h" | 43 #include "chrome/test/automation/automation_proxy.h" |
44 #include "chrome/test/automation/browser_proxy.h" | 44 #include "chrome/test/automation/browser_proxy.h" |
45 #include "chrome/test/automation/javascript_execution_controller.h" | 45 #include "chrome/test/automation/javascript_execution_controller.h" |
| 46 #include "chrome/test/automation/proxy_launcher.h" |
46 #include "chrome/test/automation/tab_proxy.h" | 47 #include "chrome/test/automation/tab_proxy.h" |
47 #include "chrome/test/automation/window_proxy.h" | 48 #include "chrome/test/automation/window_proxy.h" |
48 #include "chrome/test/chrome_process_util.h" | 49 #include "chrome/test/chrome_process_util.h" |
49 #include "chrome/test/test_launcher_utils.h" | 50 #include "chrome/test/test_launcher_utils.h" |
50 #include "chrome/test/test_switches.h" | 51 #include "chrome/test/test_switches.h" |
51 #include "googleurl/src/gurl.h" | 52 #include "googleurl/src/gurl.h" |
52 #include "net/base/net_util.h" | 53 #include "net/base/net_util.h" |
53 | 54 |
54 #if defined(OS_WIN) | 55 #if defined(OS_WIN) |
55 #include "base/win/windows_version.h" | 56 #include "base/win/windows_version.h" |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 UITestBase::~UITestBase() { | 134 UITestBase::~UITestBase() { |
134 } | 135 } |
135 | 136 |
136 void UITestBase::SetUp() { | 137 void UITestBase::SetUp() { |
137 AssertAppNotRunning(L"Please close any other instances " | 138 AssertAppNotRunning(L"Please close any other instances " |
138 L"of the app before testing."); | 139 L"of the app before testing."); |
139 | 140 |
140 JavaScriptExecutionController::set_timeout( | 141 JavaScriptExecutionController::set_timeout( |
141 TestTimeouts::action_max_timeout_ms()); | 142 TestTimeouts::action_max_timeout_ms()); |
142 test_start_time_ = Time::NowFromSystemTime(); | 143 test_start_time_ = Time::NowFromSystemTime(); |
143 LaunchBrowserAndServer(); | 144 |
| 145 launcher_.reset(CreateProxyLauncher()); |
| 146 launcher_->InitializeConnection(this); |
144 } | 147 } |
145 | 148 |
146 void UITestBase::TearDown() { | 149 void UITestBase::TearDown() { |
147 CloseBrowserAndServer(); | 150 CloseBrowserAndServer(); |
148 | 151 |
149 // Make sure that we didn't encounter any assertion failures | 152 // Make sure that we didn't encounter any assertion failures |
150 logging::AssertionList assertions; | 153 logging::AssertionList assertions; |
151 logging::GetFatalAssertions(&assertions); | 154 logging::GetFatalAssertions(&assertions); |
152 | 155 |
153 // If there were errors, get all the error strings for display. | 156 // If there were errors, get all the error strings for display. |
(...skipping 14 matching lines...) Expand all Loading... |
168 L"Encountered an unexpected crash in the program during this test."; | 171 L"Encountered an unexpected crash in the program during this test."; |
169 if (expected_crashes_ > 0 && actual_crashes == 0) { | 172 if (expected_crashes_ > 0 && actual_crashes == 0) { |
170 error_msg += L" "; | 173 error_msg += L" "; |
171 error_msg += kFailedNoCrashService; | 174 error_msg += kFailedNoCrashService; |
172 } | 175 } |
173 EXPECT_EQ(expected_crashes_, actual_crashes) << error_msg; | 176 EXPECT_EQ(expected_crashes_, actual_crashes) << error_msg; |
174 } | 177 } |
175 | 178 |
176 // TODO(phajdan.jr): get rid of set_command_execution_timeout_ms. | 179 // TODO(phajdan.jr): get rid of set_command_execution_timeout_ms. |
177 void UITestBase::set_command_execution_timeout_ms(int timeout) { | 180 void UITestBase::set_command_execution_timeout_ms(int timeout) { |
178 server_->set_command_execution_timeout_ms(timeout); | 181 automation_proxy_->set_command_execution_timeout_ms(timeout); |
179 VLOG(1) << "Automation command execution timeout set to " << timeout << " ms"; | 182 VLOG(1) << "Automation command execution timeout set to " << timeout << " ms"; |
180 } | 183 } |
181 | 184 |
182 AutomationProxy* UITestBase::CreateAutomationProxy(int execution_timeout) { | 185 ProxyLauncher* UITestBase::CreateProxyLauncher() { |
183 return new AutomationProxy(execution_timeout, false); | 186 return new AnonymousProxyLauncher(false); |
| 187 } |
| 188 |
| 189 void UITestBase::LaunchBrowser() { |
| 190 LaunchBrowser(launch_arguments_, clear_profile_); |
184 } | 191 } |
185 | 192 |
186 void UITestBase::LaunchBrowserAndServer() { | 193 void UITestBase::LaunchBrowserAndServer() { |
187 // Set up IPC testing interface server. | 194 // Set up IPC testing interface as a server. |
188 server_.reset(CreateAutomationProxy( | 195 automation_proxy_.reset(launcher_->CreateAutomationProxy( |
189 TestTimeouts::command_execution_timeout_ms())); | 196 TestTimeouts::command_execution_timeout_ms())); |
190 | 197 |
191 LaunchBrowser(launch_arguments_, clear_profile_); | 198 LaunchBrowser(launch_arguments_, clear_profile_); |
192 ASSERT_EQ(AUTOMATION_SUCCESS, server_->WaitForAppLaunch()) | 199 WaitForBrowserLaunch(); |
| 200 } |
| 201 |
| 202 void UITestBase::ConnectToRunningBrowser() { |
| 203 // Set up IPC testing interface as a client. |
| 204 automation_proxy_.reset(launcher_->CreateAutomationProxy( |
| 205 TestTimeouts::command_execution_timeout_ms())); |
| 206 WaitForBrowserLaunch(); |
| 207 } |
| 208 |
| 209 void UITestBase::WaitForBrowserLaunch() { |
| 210 ASSERT_EQ(AUTOMATION_SUCCESS, automation_proxy_->WaitForAppLaunch()) |
193 << "Error while awaiting automation ping from browser process"; | 211 << "Error while awaiting automation ping from browser process"; |
194 if (wait_for_initial_loads_) | 212 if (wait_for_initial_loads_) |
195 ASSERT_TRUE(server_->WaitForInitialLoads()); | 213 ASSERT_TRUE(automation_proxy_->WaitForInitialLoads()); |
196 else | 214 else |
197 PlatformThread::Sleep(sleep_timeout_ms()); | 215 PlatformThread::Sleep(sleep_timeout_ms()); |
198 | 216 |
199 EXPECT_TRUE(automation()->SetFilteredInet(ShouldFilterInet())); | 217 EXPECT_TRUE(automation()->SetFilteredInet(ShouldFilterInet())); |
200 } | 218 } |
201 | 219 |
202 void UITestBase::CloseBrowserAndServer() { | 220 void UITestBase::CloseBrowserAndServer() { |
203 QuitBrowser(); | 221 QuitBrowser(); |
204 CleanupAppProcesses(); | 222 CleanupAppProcesses(); |
205 | 223 |
206 // Suppress spammy failures that seem to be occurring when running | 224 // Suppress spammy failures that seem to be occurring when running |
207 // the UI tests in single-process mode. | 225 // the UI tests in single-process mode. |
208 // TODO(jhughes): figure out why this is necessary at all, and fix it | 226 // TODO(jhughes): figure out why this is necessary at all, and fix it |
209 if (!in_process_renderer_) | 227 if (!in_process_renderer_) |
210 AssertAppNotRunning(StringPrintf( | 228 AssertAppNotRunning(StringPrintf( |
211 L"Unable to quit all browser processes. Original PID %d", process_id_)); | 229 L"Unable to quit all browser processes. Original PID %d", process_id_)); |
212 | 230 |
213 server_.reset(); // Shut down IPC testing interface. | 231 automation_proxy_.reset(); // Shut down IPC testing interface. |
214 } | 232 } |
215 | 233 |
216 void UITestBase::LaunchBrowser(const CommandLine& arguments, | 234 void UITestBase::LaunchBrowser(const CommandLine& arguments, |
217 bool clear_profile) { | 235 bool clear_profile) { |
218 if (clear_profile || !temp_profile_dir_->IsValid()) { | 236 if (clear_profile || !temp_profile_dir_->IsValid()) { |
219 temp_profile_dir_.reset(new ScopedTempDir()); | 237 temp_profile_dir_.reset(new ScopedTempDir()); |
220 ASSERT_TRUE(temp_profile_dir_->CreateUniqueTempDir()); | 238 ASSERT_TRUE(temp_profile_dir_->CreateUniqueTempDir()); |
221 | 239 |
222 ASSERT_TRUE( | 240 ASSERT_TRUE( |
223 test_launcher_utils::OverrideUserDataDir(temp_profile_dir_->path())); | 241 test_launcher_utils::OverrideUserDataDir(temp_profile_dir_->path())); |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
560 EXPECT_TRUE(tab_proxy.get()); | 578 EXPECT_TRUE(tab_proxy.get()); |
561 if (!tab_proxy.get()) | 579 if (!tab_proxy.get()) |
562 return FilePath(); | 580 return FilePath(); |
563 | 581 |
564 FilePath download_directory; | 582 FilePath download_directory; |
565 EXPECT_TRUE(tab_proxy->GetDownloadDirectory(&download_directory)); | 583 EXPECT_TRUE(tab_proxy->GetDownloadDirectory(&download_directory)); |
566 return download_directory; | 584 return download_directory; |
567 } | 585 } |
568 | 586 |
569 void UITestBase::CloseBrowserAsync(BrowserProxy* browser) const { | 587 void UITestBase::CloseBrowserAsync(BrowserProxy* browser) const { |
570 ASSERT_TRUE(server_->Send( | 588 ASSERT_TRUE(automation_proxy_->Send( |
571 new AutomationMsg_CloseBrowserRequestAsync(0, browser->handle()))); | 589 new AutomationMsg_CloseBrowserRequestAsync(0, browser->handle()))); |
572 } | 590 } |
573 | 591 |
574 bool UITestBase::CloseBrowser(BrowserProxy* browser, | 592 bool UITestBase::CloseBrowser(BrowserProxy* browser, |
575 bool* application_closed) const { | 593 bool* application_closed) const { |
576 DCHECK(application_closed); | 594 DCHECK(application_closed); |
577 if (!browser->is_valid() || !browser->handle()) | 595 if (!browser->is_valid() || !browser->handle()) |
578 return false; | 596 return false; |
579 | 597 |
580 bool result = true; | 598 bool result = true; |
581 | 599 |
582 bool succeeded = server_->Send(new AutomationMsg_CloseBrowser( | 600 bool succeeded = automation_proxy_->Send(new AutomationMsg_CloseBrowser( |
583 0, browser->handle(), &result, application_closed)); | 601 0, browser->handle(), &result, application_closed)); |
584 | 602 |
585 if (!succeeded) | 603 if (!succeeded) |
586 return false; | 604 return false; |
587 | 605 |
588 if (*application_closed) { | 606 if (*application_closed) { |
589 // Let's wait until the process dies (if it is not gone already). | 607 // Let's wait until the process dies (if it is not gone already). |
590 bool success = base::WaitForSingleProcess(process_, base::kNoTimeout); | 608 bool success = base::WaitForSingleProcess(process_, base::kNoTimeout); |
591 EXPECT_TRUE(success); | 609 EXPECT_TRUE(success); |
592 } | 610 } |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
687 // Tell the browser to use a temporary directory just for this test. | 705 // Tell the browser to use a temporary directory just for this test. |
688 command_line->AppendSwitchPath(switches::kUserDataDir, user_data_dir()); | 706 command_line->AppendSwitchPath(switches::kUserDataDir, user_data_dir()); |
689 | 707 |
690 // We need cookies on file:// for things like the page cycler. | 708 // We need cookies on file:// for things like the page cycler. |
691 if (enable_file_cookies_) | 709 if (enable_file_cookies_) |
692 command_line->AppendSwitch(switches::kEnableFileCookies); | 710 command_line->AppendSwitch(switches::kEnableFileCookies); |
693 | 711 |
694 if (dom_automation_enabled_) | 712 if (dom_automation_enabled_) |
695 command_line->AppendSwitch(switches::kDomAutomationController); | 713 command_line->AppendSwitch(switches::kDomAutomationController); |
696 | 714 |
697 if (include_testing_id_) { | 715 if (include_testing_id_) |
698 command_line->AppendSwitchASCII(switches::kTestingChannelID, | 716 command_line->AppendSwitchASCII(switches::kTestingChannelID, |
699 server_->channel_id()); | 717 launcher_->PrefixedChannelID()); |
700 } | |
701 | 718 |
702 if (!show_error_dialogs_ && | 719 if (!show_error_dialogs_ && |
703 !CommandLine::ForCurrentProcess()->HasSwitch( | 720 !CommandLine::ForCurrentProcess()->HasSwitch( |
704 switches::kEnableErrorDialogs)) { | 721 switches::kEnableErrorDialogs)) { |
705 command_line->AppendSwitch(switches::kNoErrorDialogs); | 722 command_line->AppendSwitch(switches::kNoErrorDialogs); |
706 } | 723 } |
707 if (in_process_renderer_) | 724 if (in_process_renderer_) |
708 command_line->AppendSwitch(switches::kSingleProcess); | 725 command_line->AppendSwitch(switches::kSingleProcess); |
709 if (no_sandbox_) | 726 if (no_sandbox_) |
710 command_line->AppendSwitch(switches::kNoSandbox); | 727 command_line->AppendSwitch(switches::kNoSandbox); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
779 // (e.g. valgrind) without also running the test harness (e.g. python) | 796 // (e.g. valgrind) without also running the test harness (e.g. python) |
780 // under the special environment. Provide a way to wrap the browser | 797 // under the special environment. Provide a way to wrap the browser |
781 // commandline with a special prefix to invoke the special environment. | 798 // commandline with a special prefix to invoke the special environment. |
782 const char* browser_wrapper = getenv("BROWSER_WRAPPER"); | 799 const char* browser_wrapper = getenv("BROWSER_WRAPPER"); |
783 if (browser_wrapper) { | 800 if (browser_wrapper) { |
784 command_line.PrependWrapper(browser_wrapper); | 801 command_line.PrependWrapper(browser_wrapper); |
785 VLOG(1) << "BROWSER_WRAPPER was set, prefixing command_line with " | 802 VLOG(1) << "BROWSER_WRAPPER was set, prefixing command_line with " |
786 << browser_wrapper; | 803 << browser_wrapper; |
787 } | 804 } |
788 | 805 |
789 bool started = base::LaunchApp(command_line.argv(), | 806 base::file_handle_mapping_vector fds; |
790 server_->fds_to_map(), | 807 if (automation_proxy_.get()) |
791 wait, | 808 fds = automation_proxy_->fds_to_map(); |
792 process); | 809 |
| 810 bool started = base::LaunchApp(command_line.argv(), fds, wait, process); |
793 #endif | 811 #endif |
794 | 812 |
795 return started; | 813 return started; |
796 } | 814 } |
797 | 815 |
798 void UITestBase::UpdateHistoryDates() { | 816 void UITestBase::UpdateHistoryDates() { |
799 // Migrate the times in the segment_usage table to yesterday so we get | 817 // Migrate the times in the segment_usage table to yesterday so we get |
800 // actual thumbnails on the NTP. | 818 // actual thumbnails on the NTP. |
801 sql::Connection db; | 819 sql::Connection db; |
802 FilePath history = | 820 FilePath history = |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
860 | 878 |
861 UITestBase::SetUp(); | 879 UITestBase::SetUp(); |
862 PlatformTest::SetUp(); | 880 PlatformTest::SetUp(); |
863 } | 881 } |
864 | 882 |
865 void UITest::TearDown() { | 883 void UITest::TearDown() { |
866 UITestBase::TearDown(); | 884 UITestBase::TearDown(); |
867 PlatformTest::TearDown(); | 885 PlatformTest::TearDown(); |
868 } | 886 } |
869 | 887 |
870 AutomationProxy* UITest::CreateAutomationProxy(int execution_timeout) { | 888 ProxyLauncher* UITest::CreateProxyLauncher() { |
871 // Make the AutomationProxy disconnect the channel on the first error, | 889 // Make the AutomationProxy disconnect the channel on the first error, |
872 // so that we avoid spending a lot of time in timeouts. The browser is likely | 890 // so that we avoid spending a lot of time in timeouts. The browser is likely |
873 // hosed if we hit those errors. | 891 // hosed if we hit those errors. |
874 return new AutomationProxy(execution_timeout, true); | 892 return new AnonymousProxyLauncher(true); |
875 } | 893 } |
876 | 894 |
877 static CommandLine* CreatePythonCommandLine() { | 895 static CommandLine* CreatePythonCommandLine() { |
878 return new CommandLine(FilePath(FILE_PATH_LITERAL("python"))); | 896 return new CommandLine(FilePath(FILE_PATH_LITERAL("python"))); |
879 } | 897 } |
880 | 898 |
881 static CommandLine* CreateHttpServerCommandLine() { | 899 static CommandLine* CreateHttpServerCommandLine() { |
882 FilePath src_path; | 900 FilePath src_path; |
883 // Get to 'src' dir. | 901 // Get to 'src' dir. |
884 PathService::Get(base::DIR_SOURCE_ROOT, &src_path); | 902 PathService::Get(base::DIR_SOURCE_ROOT, &src_path); |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1190 incorrect_state_count++; | 1208 incorrect_state_count++; |
1191 } | 1209 } |
1192 | 1210 |
1193 LOG(INFO) << "Elapsed time: " << (base::Time::Now() - start).InSecondsF() | 1211 LOG(INFO) << "Elapsed time: " << (base::Time::Now() - start).InSecondsF() |
1194 << " seconds" | 1212 << " seconds" |
1195 << " call failed " << fail_count << " times" | 1213 << " call failed " << fail_count << " times" |
1196 << " state was incorrect " << incorrect_state_count << " times"; | 1214 << " state was incorrect " << incorrect_state_count << " times"; |
1197 ADD_FAILURE() << "Timeout reached in " << __FUNCTION__; | 1215 ADD_FAILURE() << "Timeout reached in " << __FUNCTION__; |
1198 return false; | 1216 return false; |
1199 } | 1217 } |
OLD | NEW |