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

Side by Side Diff: chrome/test/ui/ui_test.cc

Issue 4202004: Add named testing interface (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 10 years, 1 month 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 | Annotate | Revision Log
OLDNEW
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 12 matching lines...) Expand all
23 #include "base/process_util.h" 23 #include "base/process_util.h"
24 #include "base/scoped_ptr.h" 24 #include "base/scoped_ptr.h"
25 #include "base/scoped_temp_dir.h" 25 #include "base/scoped_temp_dir.h"
26 #include "base/string_number_conversions.h" 26 #include "base/string_number_conversions.h"
27 #include "base/string_split.h" 27 #include "base/string_split.h"
28 #include "base/test/test_file_util.h" 28 #include "base/test/test_file_util.h"
29 #include "base/time.h" 29 #include "base/time.h"
30 #include "base/utf_string_conversions.h" 30 #include "base/utf_string_conversions.h"
31 #include "chrome/app/chrome_command_ids.h" 31 #include "chrome/app/chrome_command_ids.h"
32 #include "chrome/browser/net/url_fixer_upper.h" 32 #include "chrome/browser/net/url_fixer_upper.h"
33 #include "chrome/common/automation_constants.h"
33 #include "chrome/common/chrome_constants.h" 34 #include "chrome/common/chrome_constants.h"
34 #include "chrome/common/chrome_paths.h" 35 #include "chrome/common/chrome_paths.h"
35 #include "chrome/common/chrome_switches.h" 36 #include "chrome/common/chrome_switches.h"
36 #include "chrome/common/debug_flags.h" 37 #include "chrome/common/debug_flags.h"
37 #include "chrome/common/logging_chrome.h" 38 #include "chrome/common/logging_chrome.h"
38 #include "chrome/common/json_value_serializer.h" 39 #include "chrome/common/json_value_serializer.h"
39 #include "chrome/common/url_constants.h" 40 #include "chrome/common/url_constants.h"
40 #include "chrome/test/automation/automation_messages.h" 41 #include "chrome/test/automation/automation_messages.h"
41 #include "chrome/test/automation/automation_proxy.h" 42 #include "chrome/test/automation/automation_proxy.h"
42 #include "chrome/test/automation/browser_proxy.h" 43 #include "chrome/test/automation/browser_proxy.h"
43 #include "chrome/test/automation/javascript_execution_controller.h" 44 #include "chrome/test/automation/javascript_execution_controller.h"
45 #include "chrome/test/automation/proxy_launcher.h"
44 #include "chrome/test/automation/tab_proxy.h" 46 #include "chrome/test/automation/tab_proxy.h"
45 #include "chrome/test/automation/window_proxy.h" 47 #include "chrome/test/automation/window_proxy.h"
46 #include "chrome/test/chrome_process_util.h" 48 #include "chrome/test/chrome_process_util.h"
47 #include "chrome/test/test_launcher_utils.h" 49 #include "chrome/test/test_launcher_utils.h"
48 #include "chrome/test/test_switches.h" 50 #include "chrome/test/test_switches.h"
49 #include "googleurl/src/gurl.h" 51 #include "googleurl/src/gurl.h"
50 #include "net/base/net_util.h" 52 #include "net/base/net_util.h"
51 53
52 #if defined(OS_WIN) 54 #if defined(OS_WIN)
53 #include "base/win/windows_version.h" 55 #include "base/win/windows_version.h"
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 UITestBase::~UITestBase() { 133 UITestBase::~UITestBase() {
132 } 134 }
133 135
134 void UITestBase::SetUp() { 136 void UITestBase::SetUp() {
135 AssertAppNotRunning(L"Please close any other instances " 137 AssertAppNotRunning(L"Please close any other instances "
136 L"of the app before testing."); 138 L"of the app before testing.");
137 139
138 JavaScriptExecutionController::set_timeout( 140 JavaScriptExecutionController::set_timeout(
139 TestTimeouts::action_max_timeout_ms()); 141 TestTimeouts::action_max_timeout_ms());
140 test_start_time_ = Time::NowFromSystemTime(); 142 test_start_time_ = Time::NowFromSystemTime();
141 LaunchBrowserAndServer(); 143
144 launcher_.reset(CreateProxyLauncher());
145 launcher_->InitializeConnection(this);
142 } 146 }
143 147
144 void UITestBase::TearDown() { 148 void UITestBase::TearDown() {
145 CloseBrowserAndServer(); 149 CloseBrowserAndServer();
146 150
147 // Make sure that we didn't encounter any assertion failures 151 // Make sure that we didn't encounter any assertion failures
148 logging::AssertionList assertions; 152 logging::AssertionList assertions;
149 logging::GetFatalAssertions(&assertions); 153 logging::GetFatalAssertions(&assertions);
150 154
151 // If there were errors, get all the error strings for display. 155 // If there were errors, get all the error strings for display.
(...skipping 14 matching lines...) Expand all
166 L"Encountered an unexpected crash in the program during this test."; 170 L"Encountered an unexpected crash in the program during this test.";
167 if (expected_crashes_ > 0 && actual_crashes == 0) { 171 if (expected_crashes_ > 0 && actual_crashes == 0) {
168 error_msg += L" "; 172 error_msg += L" ";
169 error_msg += kFailedNoCrashService; 173 error_msg += kFailedNoCrashService;
170 } 174 }
171 EXPECT_EQ(expected_crashes_, actual_crashes) << error_msg; 175 EXPECT_EQ(expected_crashes_, actual_crashes) << error_msg;
172 } 176 }
173 177
174 // TODO(phajdan.jr): get rid of set_command_execution_timeout_ms. 178 // TODO(phajdan.jr): get rid of set_command_execution_timeout_ms.
175 void UITestBase::set_command_execution_timeout_ms(int timeout) { 179 void UITestBase::set_command_execution_timeout_ms(int timeout) {
176 server_->set_command_execution_timeout_ms(timeout); 180 automation_proxy_->set_command_execution_timeout_ms(timeout);
177 VLOG(1) << "Automation command execution timeout set to " << timeout << " ms"; 181 VLOG(1) << "Automation command execution timeout set to " << timeout << " ms";
178 } 182 }
179 183
180 AutomationProxy* UITestBase::CreateAutomationProxy(int execution_timeout) { 184 ProxyLauncher* UITestBase::CreateProxyLauncher() {
181 return new AutomationProxy(execution_timeout, false); 185 return new AnonymousProxyLauncher(false);
182 } 186 }
183 187
184 void UITestBase::LaunchBrowserAndServer() { 188 void UITestBase::LaunchBrowserAndServer() {
185 // Set up IPC testing interface server. 189 // Set up IPC testing interface as a server.
186 server_.reset(CreateAutomationProxy( 190 automation_proxy_.reset(launcher_->CreateAutomationProxy(
187 TestTimeouts::command_execution_timeout_ms())); 191 TestTimeouts::command_execution_timeout_ms()));
188 192
189 LaunchBrowser(launch_arguments_, clear_profile_); 193 LaunchBrowser(launch_arguments_, clear_profile_);
190 ASSERT_EQ(AUTOMATION_SUCCESS, server_->WaitForAppLaunch()) 194 WaitForBrowserLaunch();
195 }
196
197 void UITestBase::ConnectToRunningBrowser() {
198 // Set up IPC testing interface as a client.
199 automation_proxy_.reset(launcher_->CreateAutomationProxy(
200 TestTimeouts::command_execution_timeout_ms()));
201 WaitForBrowserLaunch();
202 }
203
204 void UITestBase::WaitForBrowserLaunch() {
205 ASSERT_EQ(AUTOMATION_SUCCESS, automation_proxy_->WaitForAppLaunch())
191 << "Error while awaiting automation ping from browser process"; 206 << "Error while awaiting automation ping from browser process";
192 if (wait_for_initial_loads_) 207 if (wait_for_initial_loads_)
193 ASSERT_TRUE(server_->WaitForInitialLoads()); 208 ASSERT_TRUE(automation_proxy_->WaitForInitialLoads());
194 else 209 else
195 PlatformThread::Sleep(sleep_timeout_ms()); 210 PlatformThread::Sleep(sleep_timeout_ms());
196 211
197 EXPECT_TRUE(automation()->SetFilteredInet(ShouldFilterInet())); 212 EXPECT_TRUE(automation()->SetFilteredInet(ShouldFilterInet()));
198 } 213 }
199 214
200 void UITestBase::CloseBrowserAndServer() { 215 void UITestBase::CloseBrowserAndServer() {
201 QuitBrowser(); 216 QuitBrowser();
202 CleanupAppProcesses(); 217 CleanupAppProcesses();
203 218
204 // Suppress spammy failures that seem to be occurring when running 219 // Suppress spammy failures that seem to be occurring when running
205 // the UI tests in single-process mode. 220 // the UI tests in single-process mode.
206 // TODO(jhughes): figure out why this is necessary at all, and fix it 221 // TODO(jhughes): figure out why this is necessary at all, and fix it
207 if (!in_process_renderer_) 222 if (!in_process_renderer_)
208 AssertAppNotRunning(StringPrintf( 223 AssertAppNotRunning(StringPrintf(
209 L"Unable to quit all browser processes. Original PID %d", process_id_)); 224 L"Unable to quit all browser processes. Original PID %d", process_id_));
210 225
211 server_.reset(); // Shut down IPC testing interface. 226 automation_proxy_.reset(); // Shut down IPC testing interface.
212 } 227 }
213 228
214 void UITestBase::LaunchBrowser(const CommandLine& arguments, 229 void UITestBase::LaunchBrowser(const CommandLine& arguments,
215 bool clear_profile) { 230 bool clear_profile) {
216 if (clear_profile || !temp_profile_dir_->IsValid()) { 231 if (clear_profile || !temp_profile_dir_->IsValid()) {
217 temp_profile_dir_.reset(new ScopedTempDir()); 232 temp_profile_dir_.reset(new ScopedTempDir());
218 ASSERT_TRUE(temp_profile_dir_->CreateUniqueTempDir()); 233 ASSERT_TRUE(temp_profile_dir_->CreateUniqueTempDir());
219 234
220 ASSERT_TRUE( 235 ASSERT_TRUE(
221 test_launcher_utils::OverrideUserDataDir(temp_profile_dir_->path())); 236 test_launcher_utils::OverrideUserDataDir(temp_profile_dir_->path()));
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 EXPECT_TRUE(tab_proxy.get()); 573 EXPECT_TRUE(tab_proxy.get());
559 if (!tab_proxy.get()) 574 if (!tab_proxy.get())
560 return FilePath(); 575 return FilePath();
561 576
562 FilePath download_directory; 577 FilePath download_directory;
563 EXPECT_TRUE(tab_proxy->GetDownloadDirectory(&download_directory)); 578 EXPECT_TRUE(tab_proxy->GetDownloadDirectory(&download_directory));
564 return download_directory; 579 return download_directory;
565 } 580 }
566 581
567 void UITestBase::CloseBrowserAsync(BrowserProxy* browser) const { 582 void UITestBase::CloseBrowserAsync(BrowserProxy* browser) const {
568 ASSERT_TRUE(server_->Send( 583 ASSERT_TRUE(automation_proxy_->Send(
569 new AutomationMsg_CloseBrowserRequestAsync(0, browser->handle()))); 584 new AutomationMsg_CloseBrowserRequestAsync(0, browser->handle())));
570 } 585 }
571 586
572 bool UITestBase::CloseBrowser(BrowserProxy* browser, 587 bool UITestBase::CloseBrowser(BrowserProxy* browser,
573 bool* application_closed) const { 588 bool* application_closed) const {
574 DCHECK(application_closed); 589 DCHECK(application_closed);
575 if (!browser->is_valid() || !browser->handle()) 590 if (!browser->is_valid() || !browser->handle())
576 return false; 591 return false;
577 592
578 bool result = true; 593 bool result = true;
579 594
580 bool succeeded = server_->Send(new AutomationMsg_CloseBrowser( 595 bool succeeded = automation_proxy_->Send(new AutomationMsg_CloseBrowser(
581 0, browser->handle(), &result, application_closed)); 596 0, browser->handle(), &result, application_closed));
582 597
583 if (!succeeded) 598 if (!succeeded)
584 return false; 599 return false;
585 600
586 if (*application_closed) { 601 if (*application_closed) {
587 // Let's wait until the process dies (if it is not gone already). 602 // Let's wait until the process dies (if it is not gone already).
588 bool success = base::WaitForSingleProcess(process_, base::kNoTimeout); 603 bool success = base::WaitForSingleProcess(process_, base::kNoTimeout);
589 EXPECT_TRUE(success); 604 EXPECT_TRUE(success);
590 } 605 }
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 // Tell the browser to use a temporary directory just for this test. 703 // Tell the browser to use a temporary directory just for this test.
689 command_line.AppendSwitchPath(switches::kUserDataDir, user_data_dir()); 704 command_line.AppendSwitchPath(switches::kUserDataDir, user_data_dir());
690 705
691 // We need cookies on file:// for things like the page cycler. 706 // We need cookies on file:// for things like the page cycler.
692 if (enable_file_cookies_) 707 if (enable_file_cookies_)
693 command_line.AppendSwitch(switches::kEnableFileCookies); 708 command_line.AppendSwitch(switches::kEnableFileCookies);
694 709
695 if (dom_automation_enabled_) 710 if (dom_automation_enabled_)
696 command_line.AppendSwitch(switches::kDomAutomationController); 711 command_line.AppendSwitch(switches::kDomAutomationController);
697 712
698 if (include_testing_id_) { 713 if (include_testing_id_)
699 command_line.AppendSwitchASCII(switches::kTestingChannelID, 714 command_line.AppendSwitchASCII(switches::kTestingChannelID,
700 server_->channel_id()); 715 launcher_->PrefixedChannelID());
701 }
702 716
703 if (!show_error_dialogs_ && 717 if (!show_error_dialogs_ &&
704 !CommandLine::ForCurrentProcess()->HasSwitch( 718 !CommandLine::ForCurrentProcess()->HasSwitch(
705 switches::kEnableErrorDialogs)) { 719 switches::kEnableErrorDialogs)) {
706 command_line.AppendSwitch(switches::kNoErrorDialogs); 720 command_line.AppendSwitch(switches::kNoErrorDialogs);
707 } 721 }
708 if (in_process_renderer_) 722 if (in_process_renderer_)
709 command_line.AppendSwitch(switches::kSingleProcess); 723 command_line.AppendSwitch(switches::kSingleProcess);
710 if (no_sandbox_) 724 if (no_sandbox_)
711 command_line.AppendSwitch(switches::kNoSandbox); 725 command_line.AppendSwitch(switches::kNoSandbox);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
768 // (e.g. valgrind) without also running the test harness (e.g. python) 782 // (e.g. valgrind) without also running the test harness (e.g. python)
769 // under the special environment. Provide a way to wrap the browser 783 // under the special environment. Provide a way to wrap the browser
770 // commandline with a special prefix to invoke the special environment. 784 // commandline with a special prefix to invoke the special environment.
771 const char* browser_wrapper = getenv("BROWSER_WRAPPER"); 785 const char* browser_wrapper = getenv("BROWSER_WRAPPER");
772 if (browser_wrapper) { 786 if (browser_wrapper) {
773 command_line.PrependWrapper(browser_wrapper); 787 command_line.PrependWrapper(browser_wrapper);
774 VLOG(1) << "BROWSER_WRAPPER was set, prefixing command_line with " 788 VLOG(1) << "BROWSER_WRAPPER was set, prefixing command_line with "
775 << browser_wrapper; 789 << browser_wrapper;
776 } 790 }
777 791
778 bool started = base::LaunchApp(command_line.argv(), 792 base::file_handle_mapping_vector fds;
779 server_->fds_to_map(), 793 if (automation_proxy_.get())
780 wait, 794 fds = automation_proxy_->fds_to_map();
781 process); 795
796 bool started = base::LaunchApp(command_line.argv(), fds, wait, process);
782 #endif 797 #endif
783 798
784 return started; 799 return started;
785 } 800 }
786 801
787 void UITestBase::UpdateHistoryDates() { 802 void UITestBase::UpdateHistoryDates() {
788 // Migrate the times in the segment_usage table to yesterday so we get 803 // Migrate the times in the segment_usage table to yesterday so we get
789 // actual thumbnails on the NTP. 804 // actual thumbnails on the NTP.
790 sql::Connection db; 805 sql::Connection db;
791 FilePath history = 806 FilePath history =
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
838 } 853 }
839 UITestBase::SetUp(); 854 UITestBase::SetUp();
840 PlatformTest::SetUp(); 855 PlatformTest::SetUp();
841 } 856 }
842 857
843 void UITest::TearDown() { 858 void UITest::TearDown() {
844 UITestBase::TearDown(); 859 UITestBase::TearDown();
845 PlatformTest::TearDown(); 860 PlatformTest::TearDown();
846 } 861 }
847 862
848 AutomationProxy* UITest::CreateAutomationProxy(int execution_timeout) { 863 ProxyLauncher* UITest::CreateProxyLauncher() {
849 // Make the AutomationProxy disconnect the channel on the first error, 864 // Make the AutomationProxy disconnect the channel on the first error,
850 // so that we avoid spending a lot of time in timeouts. The browser is likely 865 // so that we avoid spending a lot of time in timeouts. The browser is likely
851 // hosed if we hit those errors. 866 // hosed if we hit those errors.
852 return new AutomationProxy(execution_timeout, true); 867 return new AnonymousProxyLauncher(true);
853 } 868 }
854 869
855 static CommandLine* CreatePythonCommandLine() { 870 static CommandLine* CreatePythonCommandLine() {
856 return new CommandLine(FilePath(FILE_PATH_LITERAL("python"))); 871 return new CommandLine(FilePath(FILE_PATH_LITERAL("python")));
857 } 872 }
858 873
859 static CommandLine* CreateHttpServerCommandLine() { 874 static CommandLine* CreateHttpServerCommandLine() {
860 FilePath src_path; 875 FilePath src_path;
861 // Get to 'src' dir. 876 // Get to 'src' dir.
862 PathService::Get(base::DIR_SOURCE_ROOT, &src_path); 877 PathService::Get(base::DIR_SOURCE_ROOT, &src_path);
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
1168 incorrect_state_count++; 1183 incorrect_state_count++;
1169 } 1184 }
1170 1185
1171 LOG(INFO) << "Elapsed time: " << (base::Time::Now() - start).InSecondsF() 1186 LOG(INFO) << "Elapsed time: " << (base::Time::Now() - start).InSecondsF()
1172 << " seconds" 1187 << " seconds"
1173 << " call failed " << fail_count << " times" 1188 << " call failed " << fail_count << " times"
1174 << " state was incorrect " << incorrect_state_count << " times"; 1189 << " state was incorrect " << incorrect_state_count << " times";
1175 ADD_FAILURE() << "Timeout reached in " << __FUNCTION__; 1190 ADD_FAILURE() << "Timeout reached in " << __FUNCTION__;
1176 return false; 1191 return false;
1177 } 1192 }
1178
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698