| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "build/build_config.h" | 5 #include "build/build_config.h" |
| 6 | 6 |
| 7 #include "ipc/ipc_test_base.h" | 7 #include "ipc/ipc_test_base.h" |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/process/kill.h" | 10 #include "base/process/kill.h" |
| 11 #include "base/threading/thread.h" | 11 #include "base/threading/thread.h" |
| 12 #include "base/time/time.h" | 12 #include "base/time/time.h" |
| 13 #include "ipc/ipc_descriptors.h" | 13 #include "ipc/ipc_descriptors.h" |
| 14 | 14 |
| 15 #if defined(OS_POSIX) | 15 #if defined(OS_POSIX) |
| 16 #include "base/posix/global_descriptors.h" | 16 #include "base/posix/global_descriptors.h" |
| 17 #endif | 17 #endif |
| 18 | 18 |
| 19 // static | 19 // static |
| 20 std::string IPCTestBase::GetChannelName(const std::string& test_client_name) { | 20 std::string IPCTestBase::GetChannelName(const std::string& test_client_name) { |
| 21 DCHECK(!test_client_name.empty()); | 21 DCHECK(!test_client_name.empty()); |
| 22 return test_client_name + "__Channel"; | 22 return test_client_name + "__Channel"; |
| 23 } | 23 } |
| 24 | 24 |
| 25 IPCTestBase::IPCTestBase() | 25 IPCTestBase::IPCTestBase() { |
| 26 : client_process_(base::kNullProcessHandle) { | |
| 27 } | 26 } |
| 28 | 27 |
| 29 IPCTestBase::~IPCTestBase() { | 28 IPCTestBase::~IPCTestBase() { |
| 30 } | 29 } |
| 31 | 30 |
| 32 void IPCTestBase::TearDown() { | 31 void IPCTestBase::TearDown() { |
| 33 message_loop_.reset(); | 32 message_loop_.reset(); |
| 34 MultiProcessTest::TearDown(); | 33 MultiProcessTest::TearDown(); |
| 35 } | 34 } |
| 36 | 35 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 void IPCTestBase::DestroyChannelProxy() { | 96 void IPCTestBase::DestroyChannelProxy() { |
| 98 CHECK(channel_proxy_.get()); | 97 CHECK(channel_proxy_.get()); |
| 99 channel_proxy_.reset(); | 98 channel_proxy_.reset(); |
| 100 } | 99 } |
| 101 | 100 |
| 102 std::string IPCTestBase::GetTestMainName() const { | 101 std::string IPCTestBase::GetTestMainName() const { |
| 103 return test_client_name_ + "TestClientMain"; | 102 return test_client_name_ + "TestClientMain"; |
| 104 } | 103 } |
| 105 | 104 |
| 106 bool IPCTestBase::DidStartClient() { | 105 bool IPCTestBase::DidStartClient() { |
| 107 DCHECK_NE(base::kNullProcessHandle, client_process_); | 106 DCHECK(client_process_.IsValid()); |
| 108 return client_process_ != base::kNullProcessHandle; | 107 return client_process_.IsValid(); |
| 109 } | 108 } |
| 110 | 109 |
| 111 #if defined(OS_POSIX) | 110 #if defined(OS_POSIX) |
| 112 | 111 |
| 113 bool IPCTestBase::StartClient() { | 112 bool IPCTestBase::StartClient() { |
| 114 return StartClientWithFD(channel_ | 113 return StartClientWithFD(channel_ |
| 115 ? channel_->GetClientFileDescriptor() | 114 ? channel_->GetClientFileDescriptor() |
| 116 : channel_proxy_->GetClientFileDescriptor()); | 115 : channel_proxy_->GetClientFileDescriptor()); |
| 117 } | 116 } |
| 118 | 117 |
| 119 bool IPCTestBase::StartClientWithFD(int ipcfd) { | 118 bool IPCTestBase::StartClientWithFD(int ipcfd) { |
| 120 DCHECK_EQ(client_process_, base::kNullProcessHandle); | 119 DCHECK(!client_process_.IsValid()); |
| 121 | 120 |
| 122 base::FileHandleMappingVector fds_to_map; | 121 base::FileHandleMappingVector fds_to_map; |
| 123 if (ipcfd > -1) | 122 if (ipcfd > -1) |
| 124 fds_to_map.push_back(std::pair<int, int>(ipcfd, | 123 fds_to_map.push_back(std::pair<int, int>(ipcfd, |
| 125 kPrimaryIPCChannel + base::GlobalDescriptors::kBaseDescriptor)); | 124 kPrimaryIPCChannel + base::GlobalDescriptors::kBaseDescriptor)); |
| 126 base::LaunchOptions options; | 125 base::LaunchOptions options; |
| 127 options.fds_to_remap = &fds_to_map; | 126 options.fds_to_remap = &fds_to_map; |
| 128 client_process_ = SpawnChildWithOptions(GetTestMainName(), options); | 127 client_process_ = SpawnChildWithOptions(GetTestMainName(), options); |
| 129 | 128 |
| 130 return DidStartClient(); | 129 return DidStartClient(); |
| 131 } | 130 } |
| 132 | 131 |
| 133 #elif defined(OS_WIN) | 132 #elif defined(OS_WIN) |
| 134 | 133 |
| 135 bool IPCTestBase::StartClient() { | 134 bool IPCTestBase::StartClient() { |
| 136 DCHECK_EQ(client_process_, base::kNullProcessHandle); | 135 DCHECK(!client_process_.IsValid()); |
| 137 client_process_ = SpawnChild(GetTestMainName()); | 136 client_process_ = SpawnChild(GetTestMainName()); |
| 138 return DidStartClient(); | 137 return DidStartClient(); |
| 139 } | 138 } |
| 140 | 139 |
| 141 #endif | 140 #endif |
| 142 | 141 |
| 143 bool IPCTestBase::WaitForClientShutdown() { | 142 bool IPCTestBase::WaitForClientShutdown() { |
| 144 DCHECK(client_process_ != base::kNullProcessHandle); | 143 DCHECK(client_process_.IsValid()); |
| 145 | 144 |
| 146 bool rv = base::WaitForSingleProcess(client_process_, | 145 bool rv = base::WaitForSingleProcess(client_process_.Handle(), |
| 147 base::TimeDelta::FromSeconds(5)); | 146 base::TimeDelta::FromSeconds(5)); |
| 148 base::CloseProcessHandle(client_process_); | 147 client_process_.Close(); |
| 149 client_process_ = base::kNullProcessHandle; | |
| 150 return rv; | 148 return rv; |
| 151 } | 149 } |
| 152 | 150 |
| 153 IPC::ChannelHandle IPCTestBase::GetTestChannelHandle() { | 151 IPC::ChannelHandle IPCTestBase::GetTestChannelHandle() { |
| 154 return GetChannelName(test_client_name_); | 152 return GetChannelName(test_client_name_); |
| 155 } | 153 } |
| 156 | 154 |
| 157 scoped_refptr<base::TaskRunner> IPCTestBase::task_runner() { | 155 scoped_refptr<base::TaskRunner> IPCTestBase::task_runner() { |
| 158 return message_loop_->message_loop_proxy(); | 156 return message_loop_->message_loop_proxy(); |
| 159 } | 157 } |
| 160 | 158 |
| 161 scoped_ptr<IPC::ChannelFactory> IPCTestBase::CreateChannelFactory( | 159 scoped_ptr<IPC::ChannelFactory> IPCTestBase::CreateChannelFactory( |
| 162 const IPC::ChannelHandle& handle, | 160 const IPC::ChannelHandle& handle, |
| 163 base::TaskRunner* runner) { | 161 base::TaskRunner* runner) { |
| 164 return IPC::ChannelFactory::Create(handle, IPC::Channel::MODE_SERVER); | 162 return IPC::ChannelFactory::Create(handle, IPC::Channel::MODE_SERVER); |
| 165 } | 163 } |
| OLD | NEW |