diff options
Diffstat (limited to 'chrome/test')
-rw-r--r-- | chrome/test/automation/automation_proxy.cc | 14 | ||||
-rw-r--r-- | chrome/test/automation/automation_proxy.h | 18 | ||||
-rw-r--r-- | chrome/test/automation/automation_proxy_uitest.cc | 20 | ||||
-rw-r--r-- | chrome/test/automation/automation_proxy_uitest.h | 14 | ||||
-rw-r--r-- | chrome/test/automation/proxy_launcher.cc | 75 | ||||
-rw-r--r-- | chrome/test/automation/proxy_launcher.h | 78 | ||||
-rw-r--r-- | chrome/test/ui/named_interface_uitest.cc | 42 | ||||
-rw-r--r-- | chrome/test/ui/ui_test.cc | 60 | ||||
-rw-r--r-- | chrome/test/ui/ui_test.h | 27 |
9 files changed, 48 insertions, 300 deletions
diff --git a/chrome/test/automation/automation_proxy.cc b/chrome/test/automation/automation_proxy.cc index a33f095..fbdde25 100644 --- a/chrome/test/automation/automation_proxy.cc +++ b/chrome/test/automation/automation_proxy.cc @@ -107,8 +107,10 @@ AutomationProxy::AutomationProxy(int command_execution_timeout_ms, // least it is legal... ;-) DCHECK_GE(command_execution_timeout_ms, 0); listener_thread_id_ = PlatformThread::CurrentId(); + InitializeChannelID(); InitializeHandleTracker(); InitializeThread(); + InitializeChannel(); } AutomationProxy::~AutomationProxy() { @@ -120,7 +122,7 @@ AutomationProxy::~AutomationProxy() { tracker_.reset(); } -std::string AutomationProxy::GenerateChannelID() { +void AutomationProxy::InitializeChannelID() { // The channel counter keeps us out of trouble if we create and destroy // several AutomationProxies sequentially over the course of a test run. // (Creating the channel sometimes failed before when running a lot of @@ -131,7 +133,7 @@ std::string AutomationProxy::GenerateChannelID() { std::ostringstream buf; buf << "ChromeTestingInterface:" << base::GetCurrentProcId() << "." << ++channel_counter; - return buf.str(); + channel_id_ = buf.str(); } void AutomationProxy::InitializeThread() { @@ -144,8 +146,7 @@ void AutomationProxy::InitializeThread() { thread_.swap(thread); } -void AutomationProxy::InitializeChannel(const std::string& channel_id, - bool use_named_interface) { +void AutomationProxy::InitializeChannel() { DCHECK(shutdown_event_.get() != NULL); // TODO(iyengar) @@ -153,9 +154,8 @@ void AutomationProxy::InitializeChannel(const std::string& channel_id, // provider, where we use the shutdown event provided by the chrome browser // process. channel_.reset(new IPC::SyncChannel( - channel_id, - use_named_interface ? IPC::Channel::MODE_NAMED_CLIENT - : IPC::Channel::MODE_SERVER, + channel_id_, + IPC::Channel::MODE_SERVER, this, // we are the listener new AutomationMessageFilter(this), thread_->message_loop(), diff --git a/chrome/test/automation/automation_proxy.h b/chrome/test/automation/automation_proxy.h index 7902ef0..853a6d3 100644 --- a/chrome/test/automation/automation_proxy.h +++ b/chrome/test/automation/automation_proxy.h @@ -61,17 +61,6 @@ class AutomationProxy : public IPC::Channel::Listener, AutomationProxy(int command_execution_timeout_ms, bool disconnect_on_failure); virtual ~AutomationProxy(); - // Creates a previously unused channel id. - static std::string GenerateChannelID(); - - // Initializes a channel for a connection to an AutomationProvider. - // If use_named_interface is false, it will act as a client - // and connect to the named IPC socket with channel_id as its path. - // If use_named_interface is true, it will act as a server and - // use an anonymous socketpair instead. - void InitializeChannel(const std::string& channel_id, - bool use_named_interface); - // IPC callback virtual void OnMessageReceived(const IPC::Message& msg); virtual void OnChannelError(); @@ -219,6 +208,10 @@ class AutomationProxy : public IPC::Channel::Listener, const std::string& password) WARN_UNUSED_RESULT; #endif + // Returns the ID of the automation IPC channel, so that it can be + // passed to the app as a launch parameter. + const std::string& channel_id() const { return channel_id_; } + #if defined(OS_POSIX) base::file_handle_mapping_vector fds_to_map() const; #endif @@ -270,9 +263,12 @@ class AutomationProxy : public IPC::Channel::Listener, protected: template <class T> scoped_refptr<T> ProxyObjectFromHandle(int handle); + void InitializeChannelID(); void InitializeThread(); + void InitializeChannel(); void InitializeHandleTracker(); + std::string channel_id_; scoped_ptr<base::Thread> thread_; scoped_ptr<IPC::SyncChannel> channel_; scoped_ptr<AutomationHandleTracker> tracker_; diff --git a/chrome/test/automation/automation_proxy_uitest.cc b/chrome/test/automation/automation_proxy_uitest.cc index f94e442..db6a18e4 100644 --- a/chrome/test/automation/automation_proxy_uitest.cc +++ b/chrome/test/automation/automation_proxy_uitest.cc @@ -841,27 +841,11 @@ template <typename T> T** ReceivePointer(scoped_refptr<T>& p) { // NOLINT return reinterpret_cast<T**>(&p); } -// Replace the default automation proxy with our mock client. -ProxyLauncher* ExternalTabUITest::CreateProxyLauncher() { - channel_id_ = AutomationProxy::GenerateChannelID(); - return this; -} - -AutomationProxy* ExternalTabUITest::CreateAutomationProxy( - int execution_timeout) { - mock_ = new ExternalTabUITestMockClient(execution_timeout); - mock_->InitializeChannel(channel_id_, false); +AutomationProxy* ExternalTabUITest::CreateAutomationProxy(int exec_timeout) { + mock_ = new ExternalTabUITestMockClient(exec_timeout); return mock_; } -void ExternalTabUITest::InitializeConnection(UITestBase* ui_test_base) const { - ui_test_base->LaunchBrowserAndServer(); -} - -std::string ExternalTabUITest::PrefixedChannelID() const { - return channel_id_; -} - // Create with specifying a url // Flaky, http://crbug.com/32293 TEST_F(ExternalTabUITest, FLAKY_CreateExternalTab1) { diff --git a/chrome/test/automation/automation_proxy_uitest.h b/chrome/test/automation/automation_proxy_uitest.h index 073cd5b..55da8cc 100644 --- a/chrome/test/automation/automation_proxy_uitest.h +++ b/chrome/test/automation/automation_proxy_uitest.h @@ -12,7 +12,6 @@ #include "base/platform_thread.h" #include "base/time.h" #include "chrome/test/automation/automation_proxy.h" -#include "chrome/test/automation/proxy_launcher.h" #include "chrome/test/ui/ui_test.h" #include "gfx/native_widget_types.h" #include "googleurl/src/gurl.h" @@ -110,26 +109,19 @@ class ExternalTabUITestMockClient : public AutomationProxy { }; // Base your external tab UI tests on this. -class ExternalTabUITest : public UITest, public ProxyLauncher { +class ExternalTabUITest : public UITest { public: ExternalTabUITest() : UITest(MessageLoop::TYPE_UI) {} - - // Override UITest's CreateProxyLauncher to provide the unit test + // Override UITest's CreateAutomationProxy to provide the unit test // with our special implementation of AutomationProxy. - // This function is called from within UITest::SetUp(). - virtual ProxyLauncher* CreateProxyLauncher(); - - // ProxyLauncher functions + // This function is called from within UITest::LaunchBrowserAndServer. virtual AutomationProxy* CreateAutomationProxy(int execution_timeout); - virtual void InitializeConnection(UITestBase* ui_test_base) const; - virtual std::string PrefixedChannelID() const; protected: // Filtered Inet will override automation callbacks for network resources. virtual bool ShouldFilterInet() { return false; } ExternalTabUITestMockClient* mock_; - std::string channel_id_; // Channel id of automation proxy. }; #endif // CHROME_TEST_AUTOMATION_AUTOMATION_PROXY_UITEST_H_ diff --git a/chrome/test/automation/proxy_launcher.cc b/chrome/test/automation/proxy_launcher.cc deleted file mode 100644 index 2325958..0000000 --- a/chrome/test/automation/proxy_launcher.cc +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/test/automation/proxy_launcher.h" - -#include "chrome/common/automation_constants.h" -#include "chrome/common/logging_chrome.h" -#include "chrome/test/automation/automation_proxy.h" -#include "chrome/test/ui/ui_test.h" - -// Default path of named testing interface. -static const char kInterfacePath[] = "/var/tmp/ChromeTestingInterface"; - -// NamedProxyLauncher functions - -NamedProxyLauncher::NamedProxyLauncher(bool launch_browser, - bool disconnect_on_failure) - : launch_browser_(launch_browser), - disconnect_on_failure_(disconnect_on_failure) { - channel_id_ = kInterfacePath; -} - -AutomationProxy* NamedProxyLauncher::CreateAutomationProxy( - int execution_timeout) { - AutomationProxy* proxy = new AutomationProxy(execution_timeout, - disconnect_on_failure_); - proxy->InitializeChannel(channel_id_, true); - return proxy; -} - -void NamedProxyLauncher::InitializeConnection(UITestBase* ui_test_base) const { - if (launch_browser_) { - // Set up IPC testing interface as a client. - ui_test_base->LaunchBrowser(); - - // Wait for browser to be ready for connections. - struct stat file_info; - while (stat(kInterfacePath, &file_info)) - PlatformThread::Sleep(automation::kSleepTime); - } - - ui_test_base->ConnectToRunningBrowser(); -} - -std::string NamedProxyLauncher::PrefixedChannelID() const { - std::string channel_id; - channel_id.append(automation::kNamedInterfacePrefix).append(channel_id_); - return channel_id; -} - -// AnonymousProxyLauncher functions - -AnonymousProxyLauncher::AnonymousProxyLauncher(bool disconnect_on_failure) - : disconnect_on_failure_(disconnect_on_failure) { - channel_id_ = AutomationProxy::GenerateChannelID(); -} - -AutomationProxy* AnonymousProxyLauncher::CreateAutomationProxy( - int execution_timeout) { - AutomationProxy* proxy = new AutomationProxy(execution_timeout, - disconnect_on_failure_); - proxy->InitializeChannel(channel_id_, false); - return proxy; -} - -void AnonymousProxyLauncher::InitializeConnection( - UITestBase* ui_test_base) const { - ui_test_base->LaunchBrowserAndServer(); -} - -std::string AnonymousProxyLauncher::PrefixedChannelID() const { - return channel_id_; -} - diff --git a/chrome/test/automation/proxy_launcher.h b/chrome/test/automation/proxy_launcher.h deleted file mode 100644 index 0f4d04d..0000000 --- a/chrome/test/automation/proxy_launcher.h +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_TEST_AUTOMATION_PROXY_LAUNCHER_H_ -#define CHROME_TEST_AUTOMATION_PROXY_LAUNCHER_H_ - -#include <string> - -#include "base/basictypes.h" - -class AutomationProxy; -class UITestBase; - -// Subclass from this class to use a different implementation of AutomationProxy -// or to use different channel IDs inside a class that derives from UITest. -class ProxyLauncher { - public: - ProxyLauncher() {} - virtual ~ProxyLauncher() {} - - // Creates an automation proxy. - virtual AutomationProxy* CreateAutomationProxy( - int execution_timeout) = 0; - - // Launches the browser if needed and establishes a connection - // connection with it using the specified UITestBase. - virtual void InitializeConnection(UITestBase* ui_test_base) const = 0; - - // Returns the automation proxy's channel with any prefixes prepended, - // for passing as a command line parameter over to the browser. - virtual std::string PrefixedChannelID() const = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(ProxyLauncher); -}; - -// Uses an automation proxy that communicates over a named socket. -// This is used if you want to connect an AutomationProxy -// to a browser process that is already running. -// The channel id of the proxy is a constant specified by kInterfacePath. -class NamedProxyLauncher : public ProxyLauncher { - public: - // If launch_browser is true, launches Chrome with named interface enabled. - // Otherwise, there should be an existing instance the proxy can connect to. - NamedProxyLauncher(bool launch_browser, bool disconnect_on_failure); - - virtual AutomationProxy* CreateAutomationProxy(int execution_timeout); - virtual void InitializeConnection(UITestBase* ui_test_base) const; - virtual std::string PrefixedChannelID() const; - - protected: - std::string channel_id_; // Channel id of automation proxy. - bool launch_browser_; // True if we should launch the browser too. - bool disconnect_on_failure_; // True if we disconnect on IPC channel failure. - - private: - DISALLOW_COPY_AND_ASSIGN(NamedProxyLauncher); -}; - -// Uses an automation proxy that communicates over an anonymous socket. -class AnonymousProxyLauncher : public ProxyLauncher { - public: - explicit AnonymousProxyLauncher(bool disconnect_on_failure); - virtual AutomationProxy* CreateAutomationProxy(int execution_timeout); - virtual void InitializeConnection(UITestBase* ui_test_base) const; - virtual std::string PrefixedChannelID() const; - - protected: - std::string channel_id_; // Channel id of automation proxy. - bool disconnect_on_failure_; // True if we disconnect on IPC channel failure. - - private: - DISALLOW_COPY_AND_ASSIGN(AnonymousProxyLauncher); -}; - -#endif // CHROME_TEST_AUTOMATION_PROXY_LAUNCHER_H_ - diff --git a/chrome/test/ui/named_interface_uitest.cc b/chrome/test/ui/named_interface_uitest.cc deleted file mode 100644 index ee44820..0000000 --- a/chrome/test/ui/named_interface_uitest.cc +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/test/ui/ui_test.h" - -#include "chrome/common/url_constants.h" -#include "chrome/test/automation/proxy_launcher.h" - -// The named testing interface enables the use of a named socket for controlling -// the browser. This eliminates the dependency that the browser must be forked -// from the controlling process. -namespace { - -class NamedInterfaceTest : public UITest { - public: - NamedInterfaceTest() { - show_window_ = true; - } - - virtual ProxyLauncher *CreateProxyLauncher() { - return new NamedProxyLauncher(true, true); - } -}; - -// Basic sanity test for named testing interface which -// launches a browser instance that uses a named socket, then -// sends it some commands to open some tabs over that socket. -TEST_F(NamedInterfaceTest, BasicNamedInterface) { - scoped_refptr<BrowserProxy> browser_proxy( - automation()->GetBrowserWindow(0)); - ASSERT_TRUE(browser_proxy.get()); - - for (int i = 0; i < 10; ++i) - ASSERT_TRUE(browser_proxy->AppendTab(GURL(chrome::kAboutBlankURL))); -} - -// TODO(dtu): crosbug.com/8514: Write a test that makes sure you can disconnect, -// then reconnect with a new connection and continue automation. - -} // namespace - diff --git a/chrome/test/ui/ui_test.cc b/chrome/test/ui/ui_test.cc index e6aff60..9fbb857 100644 --- a/chrome/test/ui/ui_test.cc +++ b/chrome/test/ui/ui_test.cc @@ -43,7 +43,6 @@ #include "chrome/test/automation/automation_proxy.h" #include "chrome/test/automation/browser_proxy.h" #include "chrome/test/automation/javascript_execution_controller.h" -#include "chrome/test/automation/proxy_launcher.h" #include "chrome/test/automation/tab_proxy.h" #include "chrome/test/automation/window_proxy.h" #include "chrome/test/chrome_process_util.h" @@ -141,9 +140,7 @@ void UITestBase::SetUp() { JavaScriptExecutionController::set_timeout( TestTimeouts::action_max_timeout_ms()); test_start_time_ = Time::NowFromSystemTime(); - - launcher_.reset(CreateProxyLauncher()); - launcher_->InitializeConnection(this); + LaunchBrowserAndServer(); } void UITestBase::TearDown() { @@ -178,39 +175,24 @@ void UITestBase::TearDown() { // TODO(phajdan.jr): get rid of set_command_execution_timeout_ms. void UITestBase::set_command_execution_timeout_ms(int timeout) { - automation_proxy_->set_command_execution_timeout_ms(timeout); + server_->set_command_execution_timeout_ms(timeout); VLOG(1) << "Automation command execution timeout set to " << timeout << " ms"; } -ProxyLauncher* UITestBase::CreateProxyLauncher() { - return new AnonymousProxyLauncher(false); -} - -void UITestBase::LaunchBrowser() { - LaunchBrowser(launch_arguments_, clear_profile_); +AutomationProxy* UITestBase::CreateAutomationProxy(int execution_timeout) { + return new AutomationProxy(execution_timeout, false); } void UITestBase::LaunchBrowserAndServer() { - // Set up IPC testing interface as a server. - automation_proxy_.reset(launcher_->CreateAutomationProxy( - TestTimeouts::command_execution_timeout_ms())); + // Set up IPC testing interface server. + server_.reset(CreateAutomationProxy( + TestTimeouts::command_execution_timeout_ms())); LaunchBrowser(launch_arguments_, clear_profile_); - WaitForBrowserLaunch(); -} - -void UITestBase::ConnectToRunningBrowser() { - // Set up IPC testing interface as a client. - automation_proxy_.reset(launcher_->CreateAutomationProxy( - TestTimeouts::command_execution_timeout_ms())); - WaitForBrowserLaunch(); -} - -void UITestBase::WaitForBrowserLaunch() { - ASSERT_EQ(AUTOMATION_SUCCESS, automation_proxy_->WaitForAppLaunch()) + ASSERT_EQ(AUTOMATION_SUCCESS, server_->WaitForAppLaunch()) << "Error while awaiting automation ping from browser process"; if (wait_for_initial_loads_) - ASSERT_TRUE(automation_proxy_->WaitForInitialLoads()); + ASSERT_TRUE(server_->WaitForInitialLoads()); else PlatformThread::Sleep(sleep_timeout_ms()); @@ -228,7 +210,7 @@ void UITestBase::CloseBrowserAndServer() { AssertAppNotRunning(StringPrintf( L"Unable to quit all browser processes. Original PID %d", process_id_)); - automation_proxy_.reset(); // Shut down IPC testing interface. + server_.reset(); // Shut down IPC testing interface. } void UITestBase::LaunchBrowser(const CommandLine& arguments, @@ -585,7 +567,7 @@ FilePath UITestBase::GetDownloadDirectory() { } void UITestBase::CloseBrowserAsync(BrowserProxy* browser) const { - ASSERT_TRUE(automation_proxy_->Send( + ASSERT_TRUE(server_->Send( new AutomationMsg_CloseBrowserRequestAsync(0, browser->handle()))); } @@ -597,7 +579,7 @@ bool UITestBase::CloseBrowser(BrowserProxy* browser, bool result = true; - bool succeeded = automation_proxy_->Send(new AutomationMsg_CloseBrowser( + bool succeeded = server_->Send(new AutomationMsg_CloseBrowser( 0, browser->handle(), &result, application_closed)); if (!succeeded) @@ -712,9 +694,10 @@ void UITestBase::PrepareTestCommandline(CommandLine* command_line) { if (dom_automation_enabled_) command_line->AppendSwitch(switches::kDomAutomationController); - if (include_testing_id_) + if (include_testing_id_) { command_line->AppendSwitchASCII(switches::kTestingChannelID, - launcher_->PrefixedChannelID()); + server_->channel_id()); + } if (!show_error_dialogs_ && !CommandLine::ForCurrentProcess()->HasSwitch( @@ -803,11 +786,10 @@ bool UITestBase::LaunchBrowserHelper(const CommandLine& arguments, << browser_wrapper; } - base::file_handle_mapping_vector fds; - if (automation_proxy_.get()) - fds = automation_proxy_->fds_to_map(); - - bool started = base::LaunchApp(command_line.argv(), fds, wait, process); + bool started = base::LaunchApp(command_line.argv(), + server_->fds_to_map(), + wait, + process); #endif return started; @@ -885,11 +867,11 @@ void UITest::TearDown() { PlatformTest::TearDown(); } -ProxyLauncher* UITest::CreateProxyLauncher() { +AutomationProxy* UITest::CreateAutomationProxy(int execution_timeout) { // Make the AutomationProxy disconnect the channel on the first error, // so that we avoid spending a lot of time in timeouts. The browser is likely // hosed if we hit those errors. - return new AnonymousProxyLauncher(true); + return new AutomationProxy(execution_timeout, true); } static CommandLine* CreatePythonCommandLine() { diff --git a/chrome/test/ui/ui_test.h b/chrome/test/ui/ui_test.h index 3305cc5..ced9f34 100644 --- a/chrome/test/ui/ui_test.h +++ b/chrome/test/ui/ui_test.h @@ -38,7 +38,6 @@ class BrowserProxy; class DictionaryValue; class FilePath; class GURL; -class ProxyLauncher; class ScopedTempDir; class TabProxy; @@ -69,21 +68,14 @@ class UITestBase { public: // ********* Utility functions ********* - // Launches the browser only. - void LaunchBrowser(); - - // Launches the browser and IPC testing connection in server mode. + // Launches the browser and IPC testing server. void LaunchBrowserAndServer(); - // Launches the IPC testing connection in client mode, - // which then attempts to connect to a browser. - void ConnectToRunningBrowser(); - // Only for pyauto. void set_command_execution_timeout_ms(int timeout); - // Overridable so that derived classes can provide their own ProxyLauncher. - virtual ProxyLauncher* CreateProxyLauncher(); + // Overridable so that derived classes can provide their own AutomationProxy. + virtual AutomationProxy* CreateAutomationProxy(int execution_timeout); // Closes the browser and IPC testing server. void CloseBrowserAndServer(); @@ -110,7 +102,7 @@ class UITestBase { // Terminates the browser, simulates end of session. void TerminateBrowser(); - // Tells the browser to navigate to the given URL in the active tab + // Tells the browser to navigato to the givne URL in the active tab // of the first app window. // Does not wait for the navigation to complete to return. void NavigateToURLAsync(const GURL& url); @@ -369,8 +361,8 @@ class UITestBase { protected: AutomationProxy* automation() { - EXPECT_TRUE(automation_proxy_.get()); - return automation_proxy_.get(); + EXPECT_TRUE(server_.get()); + return server_.get(); } virtual bool ShouldFilterInet() { @@ -420,7 +412,6 @@ class UITestBase { // id on the command line? Default is // true. bool enable_file_cookies_; // Enable file cookies, default is true. - scoped_ptr<ProxyLauncher> launcher_; // Launches browser and AutomationProxy. ProfileType profile_type_; // Are we using a profile with a // complex theme? FilePath websocket_pid_file_; // PID file for websocket server. @@ -428,8 +419,6 @@ class UITestBase { // the browser. Used in ShutdownTest. private: - void WaitForBrowserLaunch(); - bool LaunchBrowserHelper(const CommandLine& arguments, bool wait, base::ProcessHandle* process); @@ -461,7 +450,7 @@ class UITestBase { static std::string js_flags_; // Flags passed to the JS engine. static std::string log_level_; // Logging level. - scoped_ptr<AutomationProxy> automation_proxy_; + scoped_ptr<AutomationProxy> server_; std::string ui_test_name_; @@ -479,7 +468,7 @@ class UITest : public UITestBase, public PlatformTest { virtual void SetUp(); virtual void TearDown(); - virtual ProxyLauncher* CreateProxyLauncher(); + virtual AutomationProxy* CreateAutomationProxy(int execution_timeout); // Synchronously launches local http server normally used to run LayoutTests. void StartHttpServer(const FilePath& root_directory); |