summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorphajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-12-11 11:37:41 +0000
committerphajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-12-11 11:37:41 +0000
commit713a5f2c310760e24319e91f7f6cfe47f6043d12 (patch)
tree0cfd820e8ca8c2400595e808693baeb115f01dff
parente6c276f8e0094c07cf0805f43f5f345334a9cc4e (diff)
downloadchromium_src-713a5f2c310760e24319e91f7f6cfe47f6043d12.zip
chromium_src-713a5f2c310760e24319e91f7f6cfe47f6043d12.tar.gz
chromium_src-713a5f2c310760e24319e91f7f6cfe47f6043d12.tar.bz2
Revert "Add named testing interface."
http://src.chromium.org/viewvc/chrome?view=rev&revision=67300 The change has been approved conditionally, i.e. if the outstanding review comments are handled in a follow-up as the top priority. Two weeks have passed, and I have not seen the follow-up. It is risky to keep this change in the tree, as it is already non-trivial to revert. Conflicts: chrome/browser/automation/automation_provider.cc chrome/test/ui/named_interface_uitest.cc ipc/ipc_channel_posix.cc TBR=nirnimesh BUG=chromium-os:8512 TEST=none Review URL: http://codereview.chromium.org/5707006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@68944 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/automation/automation_provider.cc61
-rw-r--r--chrome/browser/automation/automation_provider.h24
-rw-r--r--chrome/browser/automation/automation_provider_observers.cc2
-rw-r--r--chrome/browser/ui/browser_init.cc23
-rw-r--r--chrome/browser/ui/browser_init.h2
-rw-r--r--chrome/chrome_tests.gypi9
-rw-r--r--chrome/common/automation_constants.cc9
-rw-r--r--chrome/common/automation_constants.h10
-rw-r--r--chrome/test/automation/automation_proxy.cc14
-rw-r--r--chrome/test/automation/automation_proxy.h18
-rw-r--r--chrome/test/automation/automation_proxy_uitest.cc35
-rw-r--r--chrome/test/automation/automation_proxy_uitest.h7
-rw-r--r--chrome/test/automation/proxy_launcher.cc75
-rw-r--r--chrome/test/automation/proxy_launcher.h78
-rw-r--r--chrome/test/ui/named_interface_uitest.cc49
-rw-r--r--chrome/test/ui/ui_test.cc60
-rw-r--r--chrome/test/ui/ui_test.h27
-rw-r--r--chrome_frame/chrome_frame.gyp6
-rw-r--r--chrome_frame/chrome_frame_automation.cc11
-rw-r--r--chrome_frame/chrome_frame_automation.h1
-rw-r--r--chrome_frame/test/automation_client_mock.cc4
-rw-r--r--chrome_frame/test/net/test_automation_provider.cc2
-rw-r--r--ipc/ipc_channel.h4
-rw-r--r--ipc/ipc_channel_posix.cc10
24 files changed, 89 insertions, 452 deletions
diff --git a/chrome/browser/automation/automation_provider.cc b/chrome/browser/automation/automation_provider.cc
index 50f5306..ff81396 100644
--- a/chrome/browser/automation/automation_provider.cc
+++ b/chrome/browser/automation/automation_provider.cc
@@ -113,9 +113,7 @@ using base::Time;
AutomationProvider::AutomationProvider(Profile* profile)
: profile_(profile),
- reply_message_(NULL),
- is_connected_(false),
- initial_loads_complete_(false) {
+ reply_message_(NULL) {
TRACE_EVENT_BEGIN("AutomationProvider::AutomationProvider", 0, "");
browser_tracker_.reset(new AutomationBrowserTracker(this));
@@ -151,38 +149,23 @@ AutomationProvider::~AutomationProvider() {
g_browser_process->ReleaseModule();
}
-bool AutomationProvider::InitializeChannel(const std::string& channel_id) {
- TRACE_EVENT_BEGIN("AutomationProvider::InitializeChannel", 0, "");
-
- std::string effective_channel_id = channel_id;
-
- // If the channel_id starts with kNamedInterfacePrefix, create a named IPC
- // server and listen on it, else connect as client to an existing IPC server
- bool use_named_interface =
- channel_id.find(automation::kNamedInterfacePrefix) == 0;
- if (use_named_interface) {
- effective_channel_id = channel_id.substr(
- strlen(automation::kNamedInterfacePrefix));
- if (effective_channel_id.length() <= 0)
- return false;
- }
+void AutomationProvider::ConnectToChannel(const std::string& channel_id) {
+ TRACE_EVENT_BEGIN("AutomationProvider::ConnectToChannel", 0, "");
if (!automation_resource_message_filter_.get()) {
automation_resource_message_filter_ = new AutomationResourceMessageFilter;
}
- channel_.reset(new IPC::SyncChannel(
- effective_channel_id,
- use_named_interface ? IPC::Channel::MODE_NAMED_SERVER
- : IPC::Channel::MODE_CLIENT,
- this,
- g_browser_process->io_thread()->message_loop(),
- true, g_browser_process->shutdown_event()));
+ channel_.reset(
+ new IPC::SyncChannel(channel_id, IPC::Channel::MODE_CLIENT, this,
+ g_browser_process->io_thread()->message_loop(),
+ true, g_browser_process->shutdown_event()));
channel_->AddFilter(automation_resource_message_filter_);
- TRACE_EVENT_END("AutomationProvider::InitializeChannel", 0, "");
+ // Send a hello message with our current automation protocol version.
+ channel_->Send(new AutomationMsg_Hello(0, GetProtocolVersion().c_str()));
- return true;
+ TRACE_EVENT_END("AutomationProvider::ConnectToChannel", 0, "");
}
std::string AutomationProvider::GetProtocolVersion() {
@@ -191,16 +174,11 @@ std::string AutomationProvider::GetProtocolVersion() {
}
void AutomationProvider::SetExpectedTabCount(size_t expected_tabs) {
- if (expected_tabs == 0)
- OnInitialLoadsComplete();
- else
- initial_load_observer_.reset(new InitialLoadObserver(expected_tabs, this));
-}
-
-void AutomationProvider::OnInitialLoadsComplete() {
- initial_loads_complete_ = true;
- if (is_connected_)
+ if (expected_tabs == 0) {
Send(new AutomationMsg_InitialLoadsComplete(0));
+ } else {
+ initial_load_observer_.reset(new InitialLoadObserver(expected_tabs, this));
+ }
}
NotificationObserver* AutomationProvider::AddNavigationStatusListener(
@@ -349,17 +327,6 @@ const Extension* AutomationProvider::GetDisabledExtension(
return NULL;
}
-void AutomationProvider::OnChannelConnected(int pid) {
- is_connected_ = true;
- LOG(INFO) << "Testing channel connected, sending hello message";
-
- // Send a hello message with our current automation protocol version.
- chrome::VersionInfo version_info;
- channel_->Send(new AutomationMsg_Hello(0, version_info.Version()));
- if (initial_loads_complete_)
- Send(new AutomationMsg_InitialLoadsComplete(0));
-}
-
void AutomationProvider::OnMessageReceived(const IPC::Message& message) {
IPC_BEGIN_MESSAGE_MAP(AutomationProvider, message)
#if !defined(OS_MACOSX)
diff --git a/chrome/browser/automation/automation_provider.h b/chrome/browser/automation/automation_provider.h
index 797d8b08..8abc0b2 100644
--- a/chrome/browser/automation/automation_provider.h
+++ b/chrome/browser/automation/automation_provider.h
@@ -17,7 +17,6 @@
#include <vector>
#include "base/basictypes.h"
-#include "base/compiler_specific.h"
#include "base/observer_list.h"
#include "base/scoped_ptr.h"
#include "base/string16.h"
@@ -83,23 +82,15 @@ class AutomationProvider : public base::RefCounted<AutomationProvider>,
Profile* profile() const { return profile_; }
- // Initializes a channel for a connection to an AutomationProxy.
- // If channel_id starts with kNamedInterfacePrefix, it will act
- // as a server, create a named IPC socket with channel_id as its
- // path, and will listen on the socket for incoming connections.
- // If channel_id does not, it will act as a client and establish
- // a connection on its primary IPC channel. See ipc/ipc_channel_posix.cc
- // for more information about kPrimaryIPCChannel.
- bool InitializeChannel(const std::string& channel_id) WARN_UNUSED_RESULT;
+ // Establishes a connection to an automation client, if present.
+ // An AutomationProxy should be established (probably in a different process)
+ // before calling this.
+ void ConnectToChannel(const std::string& channel_id);
// Sets the number of tabs that we expect; when this number of tabs has
// loaded, an AutomationMsg_InitialLoadsComplete message is sent.
void SetExpectedTabCount(size_t expected_tabs);
- // Called when the inital set of tabs has finished loading.
- // Call SetExpectedTabCount(0) to set this to true immediately.
- void OnInitialLoadsComplete();
-
// Add a listener for navigation status notification. Currently only
// navigation completion is observed; when the |number_of_navigations|
// complete, the completed_response object is sent; if the server requires
@@ -147,7 +138,6 @@ class AutomationProvider : public base::RefCounted<AutomationProvider>,
// IPC implementations
virtual bool Send(IPC::Message* msg);
- virtual void OnChannelConnected(int pid);
virtual void OnMessageReceived(const IPC::Message& msg);
virtual void OnChannelError();
@@ -411,12 +401,6 @@ class AutomationProvider : public base::RefCounted<AutomationProvider>,
scoped_ptr<AutomationExtensionTracker> extension_tracker_;
PortContainerMap port_containers_;
- // True iff connected to an AutomationProxy.
- bool is_connected_;
-
- // True iff browser finished loading initial set of tabs.
- bool initial_loads_complete_;
-
DISALLOW_COPY_AND_ASSIGN(AutomationProvider);
};
diff --git a/chrome/browser/automation/automation_provider_observers.cc b/chrome/browser/automation/automation_provider_observers.cc
index d49f31b..c18cb1e 100644
--- a/chrome/browser/automation/automation_provider_observers.cc
+++ b/chrome/browser/automation/automation_provider_observers.cc
@@ -142,7 +142,7 @@ DictionaryValue* InitialLoadObserver::GetTimingInformation() const {
void InitialLoadObserver::ConditionMet() {
registrar_.RemoveAll();
- automation_->OnInitialLoadsComplete();
+ automation_->Send(new AutomationMsg_InitialLoadsComplete(0));
}
NewTabUILoadObserver::NewTabUILoadObserver(AutomationProvider* automation)
diff --git a/chrome/browser/ui/browser_init.cc b/chrome/browser/ui/browser_init.cc
index 936b6dd..8249ecb0d 100644
--- a/chrome/browser/ui/browser_init.cc
+++ b/chrome/browser/ui/browser_init.cc
@@ -1002,11 +1002,10 @@ bool BrowserInit::ProcessCmdLineImpl(const CommandLine& command_line,
expected_tab_count =
std::max(1, static_cast<int>(command_line.args().size()));
}
- if (!CreateAutomationProvider<TestingAutomationProvider>(
+ CreateAutomationProvider<TestingAutomationProvider>(
testing_channel_id,
profile,
- static_cast<size_t>(expected_tab_count)))
- return false;
+ static_cast<size_t>(expected_tab_count));
}
}
@@ -1023,13 +1022,11 @@ bool BrowserInit::ProcessCmdLineImpl(const CommandLine& command_line,
silent_launch = true;
if (command_line.HasSwitch(switches::kChromeFrame)) {
- if (!CreateAutomationProvider<ChromeFrameAutomationProvider>(
- automation_channel_id, profile, expected_tabs))
- return false;
+ CreateAutomationProvider<ChromeFrameAutomationProvider>(
+ automation_channel_id, profile, expected_tabs);
} else {
- if (!CreateAutomationProvider<AutomationProvider>(
- automation_channel_id, profile, expected_tabs))
- return false;
+ CreateAutomationProvider<AutomationProvider>(automation_channel_id,
+ profile, expected_tabs);
}
}
@@ -1088,20 +1085,16 @@ bool BrowserInit::ProcessCmdLineImpl(const CommandLine& command_line,
}
template <class AutomationProviderClass>
-bool BrowserInit::CreateAutomationProvider(const std::string& channel_id,
+void BrowserInit::CreateAutomationProvider(const std::string& channel_id,
Profile* profile,
size_t expected_tabs) {
scoped_refptr<AutomationProviderClass> automation =
new AutomationProviderClass(profile);
-
- if (!automation->InitializeChannel(channel_id))
- return false;
+ automation->ConnectToChannel(channel_id);
automation->SetExpectedTabCount(expected_tabs);
AutomationProviderList* list =
g_browser_process->InitAutomationProviderList();
DCHECK(list);
list->AddProvider(automation);
-
- return true;
}
diff --git a/chrome/browser/ui/browser_init.h b/chrome/browser/ui/browser_init.h
index 746320c..07e99e9 100644
--- a/chrome/browser/ui/browser_init.h
+++ b/chrome/browser/ui/browser_init.h
@@ -53,7 +53,7 @@ class BrowserInit {
}
template <class AutomationProviderClass>
- static bool CreateAutomationProvider(const std::string& channel_id,
+ static void CreateAutomationProvider(const std::string& channel_id,
Profile* profile,
size_t expected_tabs);
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index 67b51dbc..0257151 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -174,8 +174,6 @@
'sources': [
'test/automated_ui_tests/automated_ui_test_base.cc',
'test/automated_ui_tests/automated_ui_test_base.h',
- 'test/automation/proxy_launcher.cc',
- 'test/automation/proxy_launcher.h',
'test/testing_browser_process.h',
'test/ui/javascript_test_util.cc',
'test/ui/npapi_test_helper.cc',
@@ -524,7 +522,6 @@
'test/ui/dromaeo_benchmark_uitest.cc',
'test/ui/history_uitest.cc',
'test/ui/layout_plugin_uitest.cc',
- 'test/ui/named_interface_uitest.cc',
'test/ui/npapi_uitest.cc',
'test/ui/omnibox_uitest.cc',
'test/ui/pepper_uitest.cc',
@@ -610,10 +607,6 @@
},
},
},
- 'sources!': [
- # TODO(dtu): port to windows http://crosbug.com/8515
- 'test/ui/named_interface_uitest.cc',
- ],
}, { # else: OS != "win"
'sources!': [
# TODO(port): http://crbug.com/45770
@@ -3276,8 +3269,6 @@
'-Wno-uninitialized',
],
'sources': [
- 'test/automation/proxy_launcher.cc',
- 'test/automation/proxy_launcher.h',
'test/pyautolib/pyautolib.cc',
'test/pyautolib/pyautolib.h',
'test/ui/ui_test.cc',
diff --git a/chrome/common/automation_constants.cc b/chrome/common/automation_constants.cc
index 9480254..c253871 100644
--- a/chrome/common/automation_constants.cc
+++ b/chrome/common/automation_constants.cc
@@ -5,7 +5,6 @@
#include "chrome/common/automation_constants.h"
namespace automation {
-
// JSON value labels for proxy settings that are passed in via
// AutomationMsg_SetProxyConfig.
const char kJSONProxyAutoconfig[] = "proxy.autoconfig";
@@ -13,10 +12,4 @@ const char kJSONProxyNoProxy[] = "proxy.no_proxy";
const char kJSONProxyPacUrl[] = "proxy.pac_url";
const char kJSONProxyBypassList[] = "proxy.bypass_list";
const char kJSONProxyServer[] = "proxy.server";
-
-// Named testing interface is used when you want to connect an
-// AutomationProxy to an already-running browser instance.
-const char kNamedInterfacePrefix[] = "NamedTestingInterface:";
-
-} // namespace automation
-
+}
diff --git a/chrome/common/automation_constants.h b/chrome/common/automation_constants.h
index 6579776..13b120e 100644
--- a/chrome/common/automation_constants.h
+++ b/chrome/common/automation_constants.h
@@ -7,7 +7,6 @@
#pragma once
namespace automation {
-
// JSON value labels for proxy settings that are passed in via
// AutomationMsg_SetProxyConfig. These are here since they are used by both
// AutomationProvider and AutomationProxy.
@@ -17,16 +16,9 @@ extern const char kJSONProxyPacUrl[];
extern const char kJSONProxyBypassList[];
extern const char kJSONProxyServer[];
-// When passing the kTestingChannelID switch to the browser, prepend
-// this prefix to the channel id to enable the named testing interface.
-// Named testing interface is used when you want to connect an
-// AutomationProxy to an already-running browser instance.
-extern const char kNamedInterfacePrefix[];
-
// Amount of time to wait before querying the browser.
static const int kSleepTime = 250;
-
-} // namespace automation
+}
// Used by AutomationProxy, declared here so that other headers don't need
// to include automation_proxy.h.
diff --git a/chrome/test/automation/automation_proxy.cc b/chrome/test/automation/automation_proxy.cc
index cd5d9af..4da271b 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
thread_->message_loop(),
true,
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 eb197e6..f25ce10 100644
--- a/chrome/test/automation/automation_proxy_uitest.cc
+++ b/chrome/test/automation/automation_proxy_uitest.cc
@@ -29,7 +29,6 @@
#include "chrome/test/automation/autocomplete_edit_proxy.h"
#include "chrome/test/automation/automation_proxy_uitest.h"
#include "chrome/test/automation/browser_proxy.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/ui_test_utils.h"
@@ -48,34 +47,6 @@ using testing::CreateFunctor;
using testing::StrEq;
using testing::_;
-
-// Replace the default automation proxy with our mock client.
-class ExternalTabUITestMockLauncher : public ProxyLauncher {
- public:
- explicit ExternalTabUITestMockLauncher(ExternalTabUITestMockClient **mock)
- : mock_(mock) {
- channel_id_ = AutomationProxy::GenerateChannelID();
- }
-
- AutomationProxy* CreateAutomationProxy(int execution_timeout) {
- *mock_ = new ExternalTabUITestMockClient(execution_timeout);
- (*mock_)->InitializeChannel(channel_id_, false);
- return *mock_;
- }
-
- void InitializeConnection(UITestBase* ui_test_base) const {
- ui_test_base->LaunchBrowserAndServer();
- }
-
- std::string PrefixedChannelID() const {
- return channel_id_;
- }
-
- private:
- ExternalTabUITestMockClient **mock_;
- std::string channel_id_; // Channel id of automation proxy.
-};
-
class AutomationProxyTest : public UITest {
protected:
AutomationProxyTest() {
@@ -870,9 +841,9 @@ 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() {
- return new ExternalTabUITestMockLauncher(&mock_);
+AutomationProxy* ExternalTabUITest::CreateAutomationProxy(int exec_timeout) {
+ mock_ = new ExternalTabUITestMockClient(exec_timeout);
+ return mock_;
}
// Create with specifying a url
diff --git a/chrome/test/automation/automation_proxy_uitest.h b/chrome/test/automation/automation_proxy_uitest.h
index 4e6d095..55da8cc 100644
--- a/chrome/test/automation/automation_proxy_uitest.h
+++ b/chrome/test/automation/automation_proxy_uitest.h
@@ -112,17 +112,16 @@ class ExternalTabUITestMockClient : public AutomationProxy {
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();
+ // This function is called from within UITest::LaunchBrowserAndServer.
+ virtual AutomationProxy* CreateAutomationProxy(int execution_timeout);
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 84341fc..0000000
--- a/chrome/test/ui/named_interface_uitest.cc
+++ /dev/null
@@ -1,49 +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);
- }
-};
-
-// This test is flaky on Linux bots. http://crbug.com/66414
-#if defined(OS_LINUX)
-#define MAYBE_BasicNamedInterface FLAKY_BasicNamedInterface
-#else
-#define MAYBE_BasicNamedInterface BasicNamedInterface
-#endif
-
-// 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, MAYBE_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);
diff --git a/chrome_frame/chrome_frame.gyp b/chrome_frame/chrome_frame.gyp
index 579c0f3..b04d965 100644
--- a/chrome_frame/chrome_frame.gyp
+++ b/chrome_frame/chrome_frame.gyp
@@ -553,10 +553,7 @@
'test/win_event_receiver.h',
'chrome_tab.h',
'../base/test/test_file_util_win.cc',
- '../chrome/test/automation/proxy_launcher.cc',
- '../chrome/test/automation/proxy_launcher.h',
'../chrome/test/ui/ui_test.cc',
- '../chrome/test/ui/ui_test.h',
'../chrome/test/ui/ui_test_suite.cc',
'../chrome/test/ui/ui_test_suite.h',
'../chrome/test/chrome_process_util.cc',
@@ -902,8 +899,7 @@
],
'process_outputs_as_sources': 0,
'message':
- 'Assembling <(RULE_INPUT_PATH) to ' \
- '<(INTERMEDIATE_DIR)\<(RULE_INPUT_ROOT).obj.',
+ 'Assembling <(RULE_INPUT_PATH) to <(INTERMEDIATE_DIR)\<(RULE_INPUT_ROOT).obj.',
},
],
'msvs_settings': {
diff --git a/chrome_frame/chrome_frame_automation.cc b/chrome_frame/chrome_frame_automation.cc
index b670548..c8a0938 100644
--- a/chrome_frame/chrome_frame_automation.cc
+++ b/chrome_frame/chrome_frame_automation.cc
@@ -144,13 +144,10 @@ class ChromeFrameAutomationProxyImpl::CFMsgDispatcher
};
ChromeFrameAutomationProxyImpl::ChromeFrameAutomationProxyImpl(
- AutomationProxyCacheEntry* entry,
- std::string channel_id, int launch_timeout)
+ AutomationProxyCacheEntry* entry, int launch_timeout)
: AutomationProxy(launch_timeout, false), proxy_entry_(entry) {
TRACE_EVENT_BEGIN("chromeframe.automationproxy", this, "");
- InitializeChannel(channel_id, false);
-
sync_ = new CFMsgDispatcher();
message_filter_ = new TabProxyNotificationMessageFilter(tracker_.get());
@@ -274,10 +271,8 @@ void AutomationProxyCacheEntry::CreateProxy(ChromeFrameLaunchParams* params,
// destruction notification.
// At same time we must destroy/stop the thread from another thread.
- std::string channel_id = AutomationProxy::GenerateChannelID();
ChromeFrameAutomationProxyImpl* proxy =
- new ChromeFrameAutomationProxyImpl(this, channel_id,
- params->launch_timeout());
+ new ChromeFrameAutomationProxyImpl(this, params->launch_timeout());
// Ensure that the automation proxy actually respects our choice on whether
// or not to check the version.
@@ -287,7 +282,7 @@ void AutomationProxyCacheEntry::CreateProxy(ChromeFrameLaunchParams* params,
scoped_ptr<CommandLine> command_line(
chrome_launcher::CreateLaunchCommandLine());
command_line->AppendSwitchASCII(switches::kAutomationClientChannelID,
- channel_id);
+ proxy->channel_id());
// Run Chrome in Chrome Frame mode. In practice, this modifies the paths
// and registry keys that Chrome looks in via the BrowserDistribution
diff --git a/chrome_frame/chrome_frame_automation.h b/chrome_frame/chrome_frame_automation.h
index 5cf1304..cb1b282 100644
--- a/chrome_frame/chrome_frame_automation.h
+++ b/chrome_frame/chrome_frame_automation.h
@@ -92,7 +92,6 @@ class ChromeFrameAutomationProxyImpl
protected:
friend class AutomationProxyCacheEntry;
ChromeFrameAutomationProxyImpl(AutomationProxyCacheEntry* entry,
- std::string channel_id,
int launch_timeout);
class CFMsgDispatcher;
diff --git a/chrome_frame/test/automation_client_mock.cc b/chrome_frame/test/automation_client_mock.cc
index 48c5856..c02d7e0d 100644
--- a/chrome_frame/test/automation_client_mock.cc
+++ b/chrome_frame/test/automation_client_mock.cc
@@ -315,8 +315,7 @@ class TestChromeFrameAutomationProxyImpl
public:
TestChromeFrameAutomationProxyImpl()
// 1 is an unneeded timeout.
- : ChromeFrameAutomationProxyImpl(
- NULL, AutomationProxy::GenerateChannelID(), 1) {
+ : ChromeFrameAutomationProxyImpl(NULL, 1) {
}
MOCK_METHOD3(
SendAsAsync,
@@ -470,3 +469,4 @@ TEST_F(CFACMockTest, NavigateTwiceAfterInitToSameUrl) {
EXPECT_CALL(mock_proxy_, ReleaseTabProxy(testing::Eq(tab_handle_))).Times(1);
client_->Uninitialize();
}
+
diff --git a/chrome_frame/test/net/test_automation_provider.cc b/chrome_frame/test/net/test_automation_provider.cc
index 4b4d2a1..5625126 100644
--- a/chrome_frame/test/net/test_automation_provider.cc
+++ b/chrome_frame/test/net/test_automation_provider.cc
@@ -119,7 +119,7 @@ TestAutomationProvider* TestAutomationProvider::NewAutomationProvider(
Profile* p, const std::string& channel,
TestAutomationProviderDelegate* delegate) {
TestAutomationProvider* automation = new TestAutomationProvider(p, delegate);
- automation->InitializeChannel(channel);
+ automation->ConnectToChannel(channel);
automation->SetExpectedTabCount(1);
return automation;
}
diff --git a/ipc/ipc_channel.h b/ipc/ipc_channel.h
index d07e3e5..132b494 100644
--- a/ipc/ipc_channel.h
+++ b/ipc/ipc_channel.h
@@ -39,9 +39,7 @@ class Channel : public Message::Sender {
enum Mode {
MODE_NONE,
MODE_SERVER,
- MODE_CLIENT,
- MODE_NAMED_SERVER,
- MODE_NAMED_CLIENT
+ MODE_CLIENT
};
enum {
diff --git a/ipc/ipc_channel_posix.cc b/ipc/ipc_channel_posix.cc
index 7c03f44..9d0b81a 100644
--- a/ipc/ipc_channel_posix.cc
+++ b/ipc/ipc_channel_posix.cc
@@ -298,9 +298,8 @@ Channel::ChannelImpl::ChannelImpl(const IPC::ChannelHandle& channel_handle,
: mode_(mode),
is_blocked_on_write_(false),
message_send_bytes_written_(0),
- uses_fifo_(
- CommandLine::ForCurrentProcess()->HasSwitch(switches::kIPCUseFIFO) ||
- mode == MODE_NAMED_SERVER || mode == MODE_NAMED_CLIENT),
+ uses_fifo_(CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kIPCUseFIFO)),
server_listen_pipe_(-1),
pipe_(-1),
client_pipe_(-1),
@@ -311,11 +310,6 @@ Channel::ChannelImpl::ChannelImpl(const IPC::ChannelHandle& channel_handle,
listener_(listener),
waiting_connect_(true),
factory_(this) {
- if (mode_ == MODE_NAMED_SERVER)
- mode_ = MODE_SERVER;
- if (mode_ == MODE_NAMED_CLIENT)
- mode_ = MODE_CLIENT;
-
if (!CreatePipe(channel_handle, mode_)) {
// The pipe may have been closed already.
LOG(WARNING) << "Unable to create pipe named \"" << channel_handle.name