Index: ipc/ipc_test_base.cc |
diff --git a/ipc/ipc_test_base.cc b/ipc/ipc_test_base.cc |
index 75033752d2ee65e7f553af03c88cfa69202bf65e..2f739f14e426aa6740c24585887a5dffab776e80 100644 |
--- a/ipc/ipc_test_base.cc |
+++ b/ipc/ipc_test_base.cc |
@@ -4,15 +4,6 @@ |
#include "build/build_config.h" |
-#if defined(OS_WIN) |
-#include <windows.h> |
-#elif defined(OS_POSIX) |
-#include <sys/types.h> |
-#include <unistd.h> |
-#endif |
- |
-#include <utility> |
- |
#include "ipc/ipc_test_base.h" |
#include "base/command_line.h" |
@@ -20,101 +11,112 @@ |
#include "base/threading/thread.h" |
#include "base/time.h" |
#include "ipc/ipc_descriptors.h" |
-#include "ipc/ipc_channel.h" |
-#include "ipc/ipc_channel_proxy.h" |
-#include "ipc/ipc_message_utils.h" |
-#include "ipc/ipc_multiprocess_test.h" |
-#include "ipc/ipc_sender.h" |
#include "ipc/ipc_switches.h" |
-const char kTestClientChannel[] = "T1"; |
-const char kReflectorChannel[] = "T2"; |
-const char kFuzzerChannel[] = "F3"; |
-const char kSyncSocketChannel[] = "S4"; |
+// static |
+std::string IPCTestBase::GetChannelName(const std::string& test_client_name) { |
+ DCHECK(!test_client_name.empty()); |
+ return test_client_name + "__Channel"; |
+} |
+ |
+IPCTestBase::IPCTestBase() |
+ : client_process_(base::kNullProcessHandle) { |
+} |
+ |
+IPCTestBase::~IPCTestBase() { |
+} |
void IPCTestBase::SetUp() { |
MultiProcessTest::SetUp(); |
// Construct a fresh IO Message loop for the duration of each test. |
- message_loop_ = new MessageLoopForIO(); |
+ DCHECK(!message_loop_.get()); |
+ message_loop_.reset(new MessageLoopForIO()); |
} |
void IPCTestBase::TearDown() { |
- delete message_loop_; |
- message_loop_ = NULL; |
- |
+ DCHECK(message_loop_.get()); |
+ message_loop_.reset(); |
MultiProcessTest::TearDown(); |
} |
-#if defined(OS_WIN) |
-base::ProcessHandle IPCTestBase::SpawnChild(IPCTestBase::ChildType child_type, |
- IPC::Channel* channel) { |
- // kDebugChildren support. |
- bool debug_on_start = |
- CommandLine::ForCurrentProcess()->HasSwitch(switches::kDebugChildren); |
+void IPCTestBase::Init(const std::string& test_client_name) { |
+ DCHECK(!test_client_name.empty()); |
+ DCHECK(test_client_name_.empty()); |
+ test_client_name_ = test_client_name; |
+} |
- switch (child_type) { |
- case TEST_CLIENT: |
- return MultiProcessTest::SpawnChild("RunTestClient", debug_on_start); |
- case TEST_REFLECTOR: |
- return MultiProcessTest::SpawnChild("RunReflector", debug_on_start); |
- case FUZZER_SERVER: |
- return MultiProcessTest::SpawnChild("RunFuzzServer", debug_on_start); |
- case SYNC_SOCKET_SERVER: |
- return MultiProcessTest::SpawnChild("RunSyncSocketServer", debug_on_start); |
- default: |
- return NULL; |
- } |
+void IPCTestBase::CreateChannel(IPC::Listener* listener) { |
+ return CreateChannelFromChannelHandle(GetChannelName(test_client_name_), |
+ listener); |
} |
-#elif defined(OS_POSIX) |
-base::ProcessHandle IPCTestBase::SpawnChild(IPCTestBase::ChildType child_type, |
- IPC::Channel* channel) { |
- // kDebugChildren support. |
+ |
+bool IPCTestBase::ConnectChannel() { |
+ CHECK(channel_.get()); |
+ return channel_->Connect(); |
+} |
+ |
+void IPCTestBase::DestroyChannel() { |
+ DCHECK(channel_.get()); |
+ channel_.reset(); |
+} |
+ |
+void IPCTestBase::CreateChannelFromChannelHandle( |
+ const IPC::ChannelHandle& channel_handle, |
+ IPC::Listener* listener) { |
+ CHECK(!channel_.get()); |
+ CHECK(!channel_proxy_.get()); |
+ channel_.reset(new IPC::Channel(channel_handle, |
+ IPC::Channel::MODE_SERVER, |
+ listener)); |
+} |
+ |
+void IPCTestBase::CreateChannelProxy( |
+ IPC::Listener* listener, |
+ base::SingleThreadTaskRunner* ipc_task_runner) { |
+ CHECK(!channel_.get()); |
+ CHECK(!channel_proxy_.get()); |
+ channel_proxy_.reset(new IPC::ChannelProxy(GetChannelName(test_client_name_), |
+ IPC::Channel::MODE_SERVER, |
+ listener, |
+ ipc_task_runner)); |
+} |
+ |
+void IPCTestBase::DestroyChannelProxy() { |
+ CHECK(channel_proxy_.get()); |
+ channel_proxy_.reset(); |
+} |
+ |
+bool IPCTestBase::StartClient() { |
+ DCHECK(client_process_ == base::kNullProcessHandle); |
+ |
+ std::string test_main = test_client_name_ + "TestClientMain"; |
bool debug_on_start = |
CommandLine::ForCurrentProcess()->HasSwitch(switches::kDebugChildren); |
+#if defined(OS_WIN) |
+ client_process_ = MultiProcessTest::SpawnChild(test_main, debug_on_start); |
+#elif defined(OS_POSIX) |
base::FileHandleMappingVector fds_to_map; |
- const int ipcfd = channel->GetClientFileDescriptor(); |
- if (ipcfd > -1) { |
+ const int ipcfd = channel_.get() ? channel_->GetClientFileDescriptor() : |
+ channel_proxy_->GetClientFileDescriptor(); |
+ if (ipcfd > -1) |
fds_to_map.push_back(std::pair<int, int>(ipcfd, kPrimaryIPCChannel + 3)); |
- } |
- |
- base::ProcessHandle ret = base::kNullProcessHandle; |
- switch (child_type) { |
- case TEST_CLIENT: |
- ret = MultiProcessTest::SpawnChild("RunTestClient", |
- fds_to_map, |
- debug_on_start); |
- break; |
- case TEST_DESCRIPTOR_CLIENT: |
- ret = MultiProcessTest::SpawnChild("RunTestDescriptorClient", |
- fds_to_map, |
- debug_on_start); |
- break; |
- case TEST_DESCRIPTOR_CLIENT_SANDBOXED: |
- ret = MultiProcessTest::SpawnChild("RunTestDescriptorClientSandboxed", |
- fds_to_map, |
- debug_on_start); |
- break; |
- case TEST_REFLECTOR: |
- ret = MultiProcessTest::SpawnChild("RunReflector", |
- fds_to_map, |
- debug_on_start); |
- break; |
- case FUZZER_SERVER: |
- ret = MultiProcessTest::SpawnChild("RunFuzzServer", |
- fds_to_map, |
- debug_on_start); |
- break; |
- case SYNC_SOCKET_SERVER: |
- ret = MultiProcessTest::SpawnChild("RunSyncSocketServer", |
- fds_to_map, |
- debug_on_start); |
- break; |
- default: |
- return base::kNullProcessHandle; |
- break; |
- } |
- return ret; |
+ |
+ client_process_ = MultiProcessTest::SpawnChild(test_main, |
+ fds_to_map, |
+ debug_on_start); |
+#endif |
+ |
+ return client_process_ != base::kNullProcessHandle; |
+} |
+ |
+bool IPCTestBase::WaitForClientShutdown() { |
+ DCHECK(client_process_ != base::kNullProcessHandle); |
+ |
+ bool rv = base::WaitForSingleProcess(client_process_, |
+ base::TimeDelta::FromSeconds(5)); |
+ base::CloseProcessHandle(client_process_); |
+ client_process_ = base::kNullProcessHandle; |
+ return rv; |
} |
-#endif // defined(OS_POSIX) |