Index: ipc/ipc_sync_channel_unittest.cc |
diff --git a/ipc/ipc_sync_channel_unittest.cc b/ipc/ipc_sync_channel_unittest.cc |
index 24c512c66f2aea53ad577fc94b4fa155741a9032..55c571149c947128d8a9946afcc99680ad002d02 100644 |
--- a/ipc/ipc_sync_channel_unittest.cc |
+++ b/ipc/ipc_sync_channel_unittest.cc |
@@ -8,6 +8,7 @@ |
#include <memory> |
#include <string> |
+#include <utility> |
#include <vector> |
#include "base/bind.h" |
@@ -28,6 +29,7 @@ |
#include "ipc/ipc_sender.h" |
#include "ipc/ipc_sync_message_filter.h" |
#include "ipc/ipc_sync_message_unittest.h" |
+#include "mojo/public/cpp/system/message_pipe.h" |
#include "testing/gtest/include/gtest/gtest.h" |
using base::WaitableEvent; |
@@ -41,14 +43,14 @@ class Worker : public Listener, public Sender { |
// Will create a channel without a name. |
Worker(Channel::Mode mode, |
const std::string& thread_name, |
- const std::string& channel_name) |
+ mojo::ScopedMessagePipeHandle channel_handle) |
: done_( |
new WaitableEvent(base::WaitableEvent::ResetPolicy::AUTOMATIC, |
base::WaitableEvent::InitialState::NOT_SIGNALED)), |
channel_created_( |
new WaitableEvent(base::WaitableEvent::ResetPolicy::AUTOMATIC, |
base::WaitableEvent::InitialState::NOT_SIGNALED)), |
- channel_name_(channel_name), |
+ channel_handle_(std::move(channel_handle)), |
mode_(mode), |
ipc_thread_((thread_name + "_ipc").c_str()), |
listener_thread_((thread_name + "_listener").c_str()), |
@@ -58,17 +60,17 @@ class Worker : public Listener, public Sender { |
is_shutdown_(false) {} |
// Will create a named channel and use this name for the threads' name. |
- Worker(const std::string& channel_name, Channel::Mode mode) |
+ Worker(mojo::ScopedMessagePipeHandle channel_handle, Channel::Mode mode) |
: done_( |
new WaitableEvent(base::WaitableEvent::ResetPolicy::AUTOMATIC, |
base::WaitableEvent::InitialState::NOT_SIGNALED)), |
channel_created_( |
new WaitableEvent(base::WaitableEvent::ResetPolicy::AUTOMATIC, |
base::WaitableEvent::InitialState::NOT_SIGNALED)), |
- channel_name_(channel_name), |
+ channel_handle_(std::move(channel_handle)), |
mode_(mode), |
- ipc_thread_((channel_name + "_ipc").c_str()), |
- listener_thread_((channel_name + "_listener").c_str()), |
+ ipc_thread_("ipc thread"), |
+ listener_thread_("listener thread"), |
overrided_thread_(NULL), |
shutdown_event_(base::WaitableEvent::ResetPolicy::MANUAL, |
base::WaitableEvent::InitialState::NOT_SIGNALED), |
@@ -133,7 +135,10 @@ class Worker : public Listener, public Sender { |
DCHECK_EQ(answer, (succeed ? 10 : 0)); |
return result; |
} |
- const std::string& channel_name() { return channel_name_; } |
+ mojo::MessagePipeHandle TakeChannelHandle() { |
+ DCHECK(channel_handle_.is_valid()); |
+ return channel_handle_.release(); |
+ } |
Channel::Mode mode() { return mode_; } |
WaitableEvent* done_event() { return done_.get(); } |
WaitableEvent* shutdown_event() { return &shutdown_event_; } |
@@ -171,9 +176,9 @@ class Worker : public Listener, public Sender { |
} |
virtual SyncChannel* CreateChannel() { |
- std::unique_ptr<SyncChannel> channel = SyncChannel::Create( |
- channel_name_, mode_, this, ipc_thread_.task_runner().get(), true, |
- &shutdown_event_); |
+ std::unique_ptr<SyncChannel> channel = |
+ SyncChannel::Create(TakeChannelHandle(), mode_, this, |
+ ipc_thread_.task_runner(), true, &shutdown_event_); |
return channel.release(); |
} |
@@ -239,7 +244,7 @@ class Worker : public Listener, public Sender { |
std::unique_ptr<WaitableEvent> done_; |
std::unique_ptr<WaitableEvent> channel_created_; |
- std::string channel_name_; |
+ mojo::ScopedMessagePipeHandle channel_handle_; |
Channel::Mode mode_; |
std::unique_ptr<SyncChannel> channel_; |
base::Thread ipc_thread_; |
@@ -291,8 +296,11 @@ class IPCSyncChannelTest : public testing::Test { |
class SimpleServer : public Worker { |
public: |
- SimpleServer(bool pump_during_send, const std::string& channel_name) |
- : Worker(Channel::MODE_SERVER, "simpler_server", channel_name), |
+ SimpleServer(bool pump_during_send, |
+ mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(Channel::MODE_SERVER, |
+ "simpler_server", |
+ std::move(channel_handle)), |
pump_during_send_(pump_during_send) {} |
void Run() override { |
SendAnswerToLife(pump_during_send_, true); |
@@ -304,8 +312,10 @@ class SimpleServer : public Worker { |
class SimpleClient : public Worker { |
public: |
- explicit SimpleClient(const std::string& channel_name) |
- : Worker(Channel::MODE_CLIENT, "simple_client", channel_name) {} |
+ explicit SimpleClient(mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(Channel::MODE_CLIENT, |
+ "simple_client", |
+ std::move(channel_handle)) {} |
void OnAnswer(int* answer) override { |
*answer = 42; |
@@ -315,8 +325,10 @@ class SimpleClient : public Worker { |
void Simple(bool pump_during_send) { |
std::vector<Worker*> workers; |
- workers.push_back(new SimpleServer(pump_during_send, "Simple")); |
- workers.push_back(new SimpleClient("Simple")); |
+ mojo::MessagePipe pipe; |
+ workers.push_back( |
+ new SimpleServer(pump_during_send, std::move(pipe.handle0))); |
+ workers.push_back(new SimpleClient(std::move(pipe.handle1))); |
RunTest(workers); |
} |
@@ -338,8 +350,11 @@ TEST_F(IPCSyncChannelTest, MAYBE_Simple) { |
// ChannelProxy::Init separately) process. |
class TwoStepServer : public Worker { |
public: |
- TwoStepServer(bool create_pipe_now, const std::string& channel_name) |
- : Worker(Channel::MODE_SERVER, "simpler_server", channel_name), |
+ TwoStepServer(bool create_pipe_now, |
+ mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(Channel::MODE_SERVER, |
+ "simpler_server", |
+ std::move(channel_handle)), |
create_pipe_now_(create_pipe_now) {} |
void Run() override { |
@@ -349,8 +364,8 @@ class TwoStepServer : public Worker { |
SyncChannel* CreateChannel() override { |
SyncChannel* channel = |
- SyncChannel::Create(channel_name(), mode(), this, |
- ipc_thread().task_runner().get(), create_pipe_now_, |
+ SyncChannel::Create(TakeChannelHandle(), mode(), this, |
+ ipc_thread().task_runner(), create_pipe_now_, |
shutdown_event()) |
.release(); |
return channel; |
@@ -361,8 +376,11 @@ class TwoStepServer : public Worker { |
class TwoStepClient : public Worker { |
public: |
- TwoStepClient(bool create_pipe_now, const std::string& channel_name) |
- : Worker(Channel::MODE_CLIENT, "simple_client", channel_name), |
+ TwoStepClient(bool create_pipe_now, |
+ mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(Channel::MODE_CLIENT, |
+ "simple_client", |
+ std::move(channel_handle)), |
create_pipe_now_(create_pipe_now) {} |
void OnAnswer(int* answer) override { |
@@ -372,8 +390,8 @@ class TwoStepClient : public Worker { |
SyncChannel* CreateChannel() override { |
SyncChannel* channel = |
- SyncChannel::Create(channel_name(), mode(), this, |
- ipc_thread().task_runner().get(), create_pipe_now_, |
+ SyncChannel::Create(TakeChannelHandle(), mode(), this, |
+ ipc_thread().task_runner(), create_pipe_now_, |
shutdown_event()) |
.release(); |
return channel; |
@@ -384,8 +402,11 @@ class TwoStepClient : public Worker { |
void TwoStep(bool create_server_pipe_now, bool create_client_pipe_now) { |
std::vector<Worker*> workers; |
- workers.push_back(new TwoStepServer(create_server_pipe_now, "TwoStep")); |
- workers.push_back(new TwoStepClient(create_client_pipe_now, "TwoStep")); |
+ mojo::MessagePipe pipe; |
+ workers.push_back( |
+ new TwoStepServer(create_server_pipe_now, std::move(pipe.handle0))); |
+ workers.push_back( |
+ new TwoStepClient(create_client_pipe_now, std::move(pipe.handle1))); |
RunTest(workers); |
} |
@@ -402,8 +423,10 @@ TEST_F(IPCSyncChannelTest, TwoStepInitialization) { |
class DelayClient : public Worker { |
public: |
- explicit DelayClient(const std::string& channel_name) |
- : Worker(Channel::MODE_CLIENT, "delay_client", channel_name) {} |
+ explicit DelayClient(mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(Channel::MODE_CLIENT, |
+ "delay_client", |
+ std::move(channel_handle)) {} |
void OnAnswerDelay(Message* reply_msg) override { |
SyncChannelTestMsg_AnswerToLife::WriteReplyParams(reply_msg, 42); |
@@ -414,8 +437,10 @@ class DelayClient : public Worker { |
void DelayReply(bool pump_during_send) { |
std::vector<Worker*> workers; |
- workers.push_back(new SimpleServer(pump_during_send, "DelayReply")); |
- workers.push_back(new DelayClient("DelayReply")); |
+ mojo::MessagePipe pipe; |
+ workers.push_back( |
+ new SimpleServer(pump_during_send, std::move(pipe.handle0))); |
+ workers.push_back(new DelayClient(std::move(pipe.handle1))); |
RunTest(workers); |
} |
@@ -431,8 +456,10 @@ class NoHangServer : public Worker { |
public: |
NoHangServer(WaitableEvent* got_first_reply, |
bool pump_during_send, |
- const std::string& channel_name) |
- : Worker(Channel::MODE_SERVER, "no_hang_server", channel_name), |
+ mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(Channel::MODE_SERVER, |
+ "no_hang_server", |
+ std::move(channel_handle)), |
got_first_reply_(got_first_reply), |
pump_during_send_(pump_during_send) {} |
void Run() override { |
@@ -449,8 +476,11 @@ class NoHangServer : public Worker { |
class NoHangClient : public Worker { |
public: |
- NoHangClient(WaitableEvent* got_first_reply, const std::string& channel_name) |
- : Worker(Channel::MODE_CLIENT, "no_hang_client", channel_name), |
+ NoHangClient(WaitableEvent* got_first_reply, |
+ mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(Channel::MODE_CLIENT, |
+ "no_hang_client", |
+ std::move(channel_handle)), |
got_first_reply_(got_first_reply) {} |
void OnAnswerDelay(Message* reply_msg) override { |
@@ -471,9 +501,11 @@ void NoHang(bool pump_during_send) { |
base::WaitableEvent::ResetPolicy::AUTOMATIC, |
base::WaitableEvent::InitialState::NOT_SIGNALED); |
std::vector<Worker*> workers; |
+ mojo::MessagePipe pipe; |
+ workers.push_back(new NoHangServer(&got_first_reply, pump_during_send, |
+ std::move(pipe.handle0))); |
workers.push_back( |
- new NoHangServer(&got_first_reply, pump_during_send, "NoHang")); |
- workers.push_back(new NoHangClient(&got_first_reply, "NoHang")); |
+ new NoHangClient(&got_first_reply, std::move(pipe.handle1))); |
RunTest(workers); |
} |
@@ -489,8 +521,10 @@ class UnblockServer : public Worker { |
public: |
UnblockServer(bool pump_during_send, |
bool delete_during_send, |
- const std::string& channel_name) |
- : Worker(Channel::MODE_SERVER, "unblock_server", channel_name), |
+ mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(Channel::MODE_SERVER, |
+ "unblock_server", |
+ std::move(channel_handle)), |
pump_during_send_(pump_during_send), |
delete_during_send_(delete_during_send) {} |
void Run() override { |
@@ -521,8 +555,11 @@ class UnblockServer : public Worker { |
class UnblockClient : public Worker { |
public: |
- UnblockClient(bool pump_during_send, const std::string& channel_name) |
- : Worker(Channel::MODE_CLIENT, "unblock_client", channel_name), |
+ UnblockClient(bool pump_during_send, |
+ mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(Channel::MODE_CLIENT, |
+ "unblock_client", |
+ std::move(channel_handle)), |
pump_during_send_(pump_during_send) {} |
void OnAnswer(int* answer) override { |
@@ -536,9 +573,10 @@ class UnblockClient : public Worker { |
void Unblock(bool server_pump, bool client_pump, bool delete_during_send) { |
std::vector<Worker*> workers; |
- workers.push_back( |
- new UnblockServer(server_pump, delete_during_send, "Unblock")); |
- workers.push_back(new UnblockClient(client_pump, "Unblock")); |
+ mojo::MessagePipe pipe; |
+ workers.push_back(new UnblockServer(server_pump, delete_during_send, |
+ std::move(pipe.handle0))); |
+ workers.push_back(new UnblockClient(client_pump, std::move(pipe.handle1))); |
RunTest(workers); |
} |
@@ -572,8 +610,10 @@ class RecursiveServer : public Worker { |
RecursiveServer(bool expected_send_result, |
bool pump_first, |
bool pump_second, |
- const std::string& channel_name) |
- : Worker(Channel::MODE_SERVER, "recursive_server", channel_name), |
+ mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(Channel::MODE_SERVER, |
+ "recursive_server", |
+ std::move(channel_handle)), |
expected_send_result_(expected_send_result), |
pump_first_(pump_first), |
pump_second_(pump_second) {} |
@@ -594,8 +634,10 @@ class RecursiveClient : public Worker { |
public: |
RecursiveClient(bool pump_during_send, |
bool close_channel, |
- const std::string& channel_name) |
- : Worker(Channel::MODE_CLIENT, "recursive_client", channel_name), |
+ mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(Channel::MODE_CLIENT, |
+ "recursive_client", |
+ std::move(channel_handle)), |
pump_during_send_(pump_during_send), |
close_channel_(close_channel) {} |
@@ -626,9 +668,11 @@ class RecursiveClient : public Worker { |
void Recursive( |
bool server_pump_first, bool server_pump_second, bool client_pump) { |
std::vector<Worker*> workers; |
- workers.push_back(new RecursiveServer(true, server_pump_first, |
- server_pump_second, "Recursive")); |
- workers.push_back(new RecursiveClient(client_pump, false, "Recursive")); |
+ mojo::MessagePipe pipe; |
+ workers.push_back(new RecursiveServer( |
+ true, server_pump_first, server_pump_second, std::move(pipe.handle0))); |
+ workers.push_back( |
+ new RecursiveClient(client_pump, false, std::move(pipe.handle1))); |
RunTest(workers); |
} |
@@ -649,9 +693,11 @@ TEST_F(IPCSyncChannelTest, Recursive) { |
void RecursiveNoHang( |
bool server_pump_first, bool server_pump_second, bool client_pump) { |
std::vector<Worker*> workers; |
- workers.push_back(new RecursiveServer(false, server_pump_first, |
- server_pump_second, "RecursiveNoHang")); |
- workers.push_back(new RecursiveClient(client_pump, true, "RecursiveNoHang")); |
+ mojo::MessagePipe pipe; |
+ workers.push_back(new RecursiveServer( |
+ false, server_pump_first, server_pump_second, std::move(pipe.handle0))); |
+ workers.push_back( |
+ new RecursiveClient(client_pump, true, std::move(pipe.handle1))); |
RunTest(workers); |
} |
@@ -672,9 +718,10 @@ TEST_F(IPCSyncChannelTest, RecursiveNoHang) { |
class MultipleServer1 : public Worker { |
public: |
- explicit MultipleServer1(bool pump_during_send) |
- : Worker("test_channel1", Channel::MODE_SERVER), |
- pump_during_send_(pump_during_send) { } |
+ MultipleServer1(bool pump_during_send, |
+ mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(std::move(channel_handle), Channel::MODE_SERVER), |
+ pump_during_send_(pump_during_send) {} |
void Run() override { |
SendDouble(pump_during_send_, true); |
@@ -687,10 +734,11 @@ class MultipleServer1 : public Worker { |
class MultipleClient1 : public Worker { |
public: |
MultipleClient1(WaitableEvent* client1_msg_received, |
- WaitableEvent* client1_can_reply) : |
- Worker("test_channel1", Channel::MODE_CLIENT), |
- client1_msg_received_(client1_msg_received), |
- client1_can_reply_(client1_can_reply) { } |
+ WaitableEvent* client1_can_reply, |
+ mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(std::move(channel_handle), Channel::MODE_CLIENT), |
+ client1_msg_received_(client1_msg_received), |
+ client1_can_reply_(client1_can_reply) {} |
void OnDouble(int in, int* out) override { |
client1_msg_received_->Signal(); |
@@ -705,7 +753,8 @@ class MultipleClient1 : public Worker { |
class MultipleServer2 : public Worker { |
public: |
- MultipleServer2() : Worker("test_channel2", Channel::MODE_SERVER) { } |
+ explicit MultipleServer2(mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(std::move(channel_handle), Channel::MODE_SERVER) {} |
void OnAnswer(int* result) override { |
*result = 42; |
@@ -715,13 +764,14 @@ class MultipleServer2 : public Worker { |
class MultipleClient2 : public Worker { |
public: |
- MultipleClient2( |
- WaitableEvent* client1_msg_received, WaitableEvent* client1_can_reply, |
- bool pump_during_send) |
- : Worker("test_channel2", Channel::MODE_CLIENT), |
- client1_msg_received_(client1_msg_received), |
- client1_can_reply_(client1_can_reply), |
- pump_during_send_(pump_during_send) { } |
+ MultipleClient2(WaitableEvent* client1_msg_received, |
+ WaitableEvent* client1_can_reply, |
+ bool pump_during_send, |
+ mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(std::move(channel_handle), Channel::MODE_CLIENT), |
+ client1_msg_received_(client1_msg_received), |
+ client1_can_reply_(client1_can_reply), |
+ pump_during_send_(pump_during_send) {} |
void Run() override { |
client1_msg_received_->Wait(); |
@@ -754,20 +804,21 @@ void Multiple(bool server_pump, bool client_pump) { |
Worker* worker; |
- worker = new MultipleServer2(); |
+ mojo::MessagePipe pipe1, pipe2; |
+ worker = new MultipleServer2(std::move(pipe2.handle0)); |
worker->OverrideThread(&worker_thread); |
workers.push_back(worker); |
- worker = new MultipleClient2( |
- &client1_msg_received, &client1_can_reply, client_pump); |
+ worker = new MultipleClient2(&client1_msg_received, &client1_can_reply, |
+ client_pump, std::move(pipe2.handle1)); |
workers.push_back(worker); |
- worker = new MultipleServer1(server_pump); |
+ worker = new MultipleServer1(server_pump, std::move(pipe1.handle0)); |
worker->OverrideThread(&worker_thread); |
workers.push_back(worker); |
- worker = new MultipleClient1( |
- &client1_msg_received, &client1_can_reply); |
+ worker = new MultipleClient1(&client1_msg_received, &client1_can_reply, |
+ std::move(pipe1.handle1)); |
workers.push_back(worker); |
RunTest(workers); |
@@ -790,9 +841,9 @@ TEST_F(IPCSyncChannelTest, Multiple) { |
class QueuedReplyServer : public Worker { |
public: |
QueuedReplyServer(base::Thread* listener_thread, |
- const std::string& channel_name, |
+ mojo::ScopedMessagePipeHandle channel_handle, |
const std::string& reply_text) |
- : Worker(channel_name, Channel::MODE_SERVER), |
+ : Worker(std::move(channel_handle), Channel::MODE_SERVER), |
reply_text_(reply_text) { |
Worker::OverrideThread(listener_thread); |
} |
@@ -817,10 +868,10 @@ class QueuedReplyServer : public Worker { |
class QueuedReplyClient : public Worker { |
public: |
QueuedReplyClient(base::Thread* listener_thread, |
- const std::string& channel_name, |
+ mojo::ScopedMessagePipeHandle channel_handle, |
const std::string& expected_text, |
bool pump_during_send) |
- : Worker(channel_name, Channel::MODE_CLIENT), |
+ : Worker(std::move(channel_handle), Channel::MODE_CLIENT), |
pump_during_send_(pump_during_send), |
expected_text_(expected_text) { |
Worker::OverrideThread(listener_thread); |
@@ -856,26 +907,23 @@ void QueuedReply(bool client_pump) { |
Worker* worker; |
+ mojo::MessagePipe pipe1, pipe2; |
worker = new QueuedReplyServer(&server_worker_thread, |
- "QueuedReply_Server1", |
- "Got first message"); |
+ std::move(pipe1.handle0), "Got first message"); |
workers.push_back(worker); |
- worker = new QueuedReplyServer(&server_worker_thread, |
- "QueuedReply_Server2", |
- "Got second message"); |
+ worker = new QueuedReplyServer( |
+ &server_worker_thread, std::move(pipe2.handle0), "Got second message"); |
workers.push_back(worker); |
- worker = new QueuedReplyClient(&client_worker_thread, |
- "QueuedReply_Server1", |
- "Got first message", |
- client_pump); |
+ worker = |
+ new QueuedReplyClient(&client_worker_thread, std::move(pipe1.handle1), |
+ "Got first message", client_pump); |
workers.push_back(worker); |
- worker = new QueuedReplyClient(&client_worker_thread, |
- "QueuedReply_Server2", |
- "Got second message", |
- client_pump); |
+ worker = |
+ new QueuedReplyClient(&client_worker_thread, std::move(pipe2.handle1), |
+ "Got second message", client_pump); |
workers.push_back(worker); |
RunTest(workers); |
@@ -896,8 +944,10 @@ TEST_F(IPCSyncChannelTest, QueuedReply) { |
class ChattyClient : public Worker { |
public: |
- explicit ChattyClient(const std::string& channel_name) |
- : Worker(Channel::MODE_CLIENT, "chatty_client", channel_name) {} |
+ explicit ChattyClient(mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(Channel::MODE_CLIENT, |
+ "chatty_client", |
+ std::move(channel_handle)) {} |
void OnAnswer(int* answer) override { |
// The PostMessage limit is 10k. Send 20% more than that. |
@@ -914,8 +964,10 @@ class ChattyClient : public Worker { |
void ChattyServer(bool pump_during_send) { |
std::vector<Worker*> workers; |
- workers.push_back(new UnblockServer(pump_during_send, false, "ChattyServer")); |
- workers.push_back(new ChattyClient("ChattyServer")); |
+ mojo::MessagePipe pipe; |
+ workers.push_back( |
+ new UnblockServer(pump_during_send, false, std::move(pipe.handle0))); |
+ workers.push_back(new ChattyClient(std::move(pipe.handle1))); |
RunTest(workers); |
} |
@@ -930,6 +982,15 @@ void ChattyServer(bool pump_during_send) { |
// queue. |
TEST_F(IPCSyncChannelTest, MAYBE_ChattyServer) { |
ChattyServer(false); |
+} |
+ |
+#if defined(OS_ANDROID) |
+// Times out. |
+#define MAYBE_ChattyServerPumpDuringSend DISABLED_ChattyServerPumpDuringSend |
+#else |
+#define MAYBE_ChattyServerPumpDuringSend ChattyServerPumpDuringSend |
+#endif |
+TEST_F(IPCSyncChannelTest, MAYBE_ChattyServerPumpDuringSend) { |
ChattyServer(true); |
} |
@@ -949,8 +1010,10 @@ void TimeoutCallback() { |
class DoneEventRaceServer : public Worker { |
public: |
- explicit DoneEventRaceServer(const std::string& channel_name) |
- : Worker(Channel::MODE_SERVER, "done_event_race_server", channel_name) {} |
+ explicit DoneEventRaceServer(mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(Channel::MODE_SERVER, |
+ "done_event_race_server", |
+ std::move(channel_handle)) {} |
void Run() override { |
base::ThreadTaskRunnerHandle::Get()->PostTask( |
@@ -978,8 +1041,9 @@ class DoneEventRaceServer : public Worker { |
// reply comes back OnObjectSignaled will be called for the first message. |
TEST_F(IPCSyncChannelTest, MAYBE_DoneEventRace) { |
std::vector<Worker*> workers; |
- workers.push_back(new DoneEventRaceServer("DoneEventRace")); |
- workers.push_back(new SimpleClient("DoneEventRace")); |
+ mojo::MessagePipe pipe; |
+ workers.push_back(new DoneEventRaceServer(std::move(pipe.handle0))); |
+ workers.push_back(new SimpleClient(std::move(pipe.handle1))); |
RunTest(workers); |
} |
@@ -1020,10 +1084,10 @@ class TestSyncMessageFilter : public SyncMessageFilter { |
class SyncMessageFilterServer : public Worker { |
public: |
- explicit SyncMessageFilterServer(const std::string& channel_name) |
+ explicit SyncMessageFilterServer(mojo::ScopedMessagePipeHandle channel_handle) |
: Worker(Channel::MODE_SERVER, |
"sync_message_filter_server", |
- channel_name), |
+ std::move(channel_handle)), |
thread_("helper_thread") { |
base::Thread::Options options; |
options.message_loop_type = base::MessageLoop::TYPE_DEFAULT; |
@@ -1044,8 +1108,10 @@ class SyncMessageFilterServer : public Worker { |
// channel does not crash after the channel has been closed. |
class ServerSendAfterClose : public Worker { |
public: |
- explicit ServerSendAfterClose(const std::string& channel_name) |
- : Worker(Channel::MODE_SERVER, "simpler_server", channel_name), |
+ explicit ServerSendAfterClose(mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(Channel::MODE_SERVER, |
+ "simpler_server", |
+ std::move(channel_handle)), |
send_result_(true) {} |
bool SendDummy() { |
@@ -1077,14 +1143,16 @@ class ServerSendAfterClose : public Worker { |
// Tests basic synchronous call |
TEST_F(IPCSyncChannelTest, SyncMessageFilter) { |
std::vector<Worker*> workers; |
- workers.push_back(new SyncMessageFilterServer("SyncMessageFilter")); |
- workers.push_back(new SimpleClient("SyncMessageFilter")); |
+ mojo::MessagePipe pipe; |
+ workers.push_back(new SyncMessageFilterServer(std::move(pipe.handle0))); |
+ workers.push_back(new SimpleClient(std::move(pipe.handle1))); |
RunTest(workers); |
} |
// Test the case when the channel is closed and a Send is attempted after that. |
TEST_F(IPCSyncChannelTest, SendAfterClose) { |
- ServerSendAfterClose server("SendAfterClose"); |
+ mojo::MessagePipe pipe; |
+ ServerSendAfterClose server(std::move(pipe.handle0)); |
server.Start(); |
server.done_event()->Wait(); |
@@ -1103,10 +1171,11 @@ TEST_F(IPCSyncChannelTest, SendAfterClose) { |
class RestrictedDispatchServer : public Worker { |
public: |
RestrictedDispatchServer(WaitableEvent* sent_ping_event, |
- WaitableEvent* wait_event) |
- : Worker("restricted_channel", Channel::MODE_SERVER), |
+ WaitableEvent* wait_event, |
+ mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(std::move(channel_handle), Channel::MODE_SERVER), |
sent_ping_event_(sent_ping_event), |
- wait_event_(wait_event) { } |
+ wait_event_(wait_event) {} |
void OnDoPing(int ping) { |
// Send an asynchronous message that unblocks the caller. |
@@ -1147,8 +1216,9 @@ class RestrictedDispatchServer : public Worker { |
class NonRestrictedDispatchServer : public Worker { |
public: |
- NonRestrictedDispatchServer(WaitableEvent* signal_event) |
- : Worker("non_restricted_channel", Channel::MODE_SERVER), |
+ NonRestrictedDispatchServer(WaitableEvent* signal_event, |
+ mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(std::move(channel_handle), Channel::MODE_SERVER), |
signal_event_(signal_event) {} |
base::Thread* ListenerThread() { return Worker::ListenerThread(); } |
@@ -1174,16 +1244,21 @@ class NonRestrictedDispatchServer : public Worker { |
class RestrictedDispatchClient : public Worker { |
public: |
- RestrictedDispatchClient(WaitableEvent* sent_ping_event, |
- RestrictedDispatchServer* server, |
- NonRestrictedDispatchServer* server2, |
- int* success) |
- : Worker("restricted_channel", Channel::MODE_CLIENT), |
+ RestrictedDispatchClient( |
+ WaitableEvent* sent_ping_event, |
+ RestrictedDispatchServer* server, |
+ NonRestrictedDispatchServer* server2, |
+ int* success, |
+ mojo::ScopedMessagePipeHandle restricted_channel_handle, |
+ mojo::ScopedMessagePipeHandle non_restricted_channel_handle) |
+ : Worker(std::move(restricted_channel_handle), Channel::MODE_CLIENT), |
ping_(0), |
server_(server), |
server2_(server2), |
success_(success), |
- sent_ping_event_(sent_ping_event) {} |
+ sent_ping_event_(sent_ping_event), |
+ non_restricted_channel_handle_( |
+ std::move(non_restricted_channel_handle)) {} |
void Run() override { |
// Incoming messages from our channel should only be dispatched when we |
@@ -1200,8 +1275,8 @@ class RestrictedDispatchClient : public Worker { |
LOG(ERROR) << "Send failed to dispatch incoming message on same channel"; |
non_restricted_channel_ = SyncChannel::Create( |
- "non_restricted_channel", IPC::Channel::MODE_CLIENT, this, |
- ipc_thread().task_runner().get(), true, shutdown_event()); |
+ non_restricted_channel_handle_.release(), IPC::Channel::MODE_CLIENT, |
+ this, ipc_thread().task_runner(), true, shutdown_event()); |
server_->ListenerThread()->task_runner()->PostTask( |
FROM_HERE, base::Bind(&RestrictedDispatchServer::OnDoPing, server_, 2)); |
@@ -1271,6 +1346,7 @@ class RestrictedDispatchClient : public Worker { |
int* success_; |
WaitableEvent* sent_ping_event_; |
std::unique_ptr<SyncChannel> non_restricted_channel_; |
+ mojo::ScopedMessagePipeHandle non_restricted_channel_handle_; |
}; |
TEST_F(IPCSyncChannelTest, RestrictedDispatch) { |
@@ -1279,17 +1355,20 @@ TEST_F(IPCSyncChannelTest, RestrictedDispatch) { |
base::WaitableEvent::InitialState::NOT_SIGNALED); |
WaitableEvent wait_event(base::WaitableEvent::ResetPolicy::AUTOMATIC, |
base::WaitableEvent::InitialState::NOT_SIGNALED); |
- RestrictedDispatchServer* server = |
- new RestrictedDispatchServer(&sent_ping_event, &wait_event); |
- NonRestrictedDispatchServer* server2 = |
- new NonRestrictedDispatchServer(&wait_event); |
+ mojo::MessagePipe restricted_pipe, non_restricted_pipe; |
+ RestrictedDispatchServer* server = new RestrictedDispatchServer( |
+ &sent_ping_event, &wait_event, std::move(restricted_pipe.handle0)); |
+ NonRestrictedDispatchServer* server2 = new NonRestrictedDispatchServer( |
+ &wait_event, std::move(non_restricted_pipe.handle0)); |
int success = 0; |
std::vector<Worker*> workers; |
workers.push_back(server); |
workers.push_back(server2); |
- workers.push_back(new RestrictedDispatchClient( |
- &sent_ping_event, server, server2, &success)); |
+ workers.push_back( |
+ new RestrictedDispatchClient(&sent_ping_event, server, server2, &success, |
+ std::move(restricted_pipe.handle1), |
+ std::move(non_restricted_pipe.handle1))); |
RunTest(workers); |
EXPECT_EQ(4, success); |
} |
@@ -1328,12 +1407,13 @@ class RestrictedDispatchDeadlockServer : public Worker { |
RestrictedDispatchDeadlockServer(int server_num, |
WaitableEvent* server_ready_event, |
WaitableEvent** events, |
- RestrictedDispatchDeadlockServer* peer) |
- : Worker(server_num == 1 ? "channel1" : "channel2", Channel::MODE_SERVER), |
+ RestrictedDispatchDeadlockServer* peer, |
+ mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(std::move(channel_handle), Channel::MODE_SERVER), |
server_num_(server_num), |
server_ready_event_(server_ready_event), |
events_(events), |
- peer_(peer) { } |
+ peer_(peer) {} |
void OnDoServerTask() { |
events_[3]->Signal(); |
@@ -1380,10 +1460,12 @@ class RestrictedDispatchDeadlockServer : public Worker { |
class RestrictedDispatchDeadlockClient2 : public Worker { |
public: |
- RestrictedDispatchDeadlockClient2(RestrictedDispatchDeadlockServer* server, |
- WaitableEvent* server_ready_event, |
- WaitableEvent** events) |
- : Worker("channel2", Channel::MODE_CLIENT), |
+ RestrictedDispatchDeadlockClient2( |
+ RestrictedDispatchDeadlockServer* server, |
+ WaitableEvent* server_ready_event, |
+ WaitableEvent** events, |
+ mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(std::move(channel_handle), Channel::MODE_CLIENT), |
server_ready_event_(server_ready_event), |
events_(events), |
received_msg_(false), |
@@ -1438,11 +1520,13 @@ class RestrictedDispatchDeadlockClient2 : public Worker { |
class RestrictedDispatchDeadlockClient1 : public Worker { |
public: |
- RestrictedDispatchDeadlockClient1(RestrictedDispatchDeadlockServer* server, |
- RestrictedDispatchDeadlockClient2* peer, |
- WaitableEvent* server_ready_event, |
- WaitableEvent** events) |
- : Worker("channel1", Channel::MODE_CLIENT), |
+ RestrictedDispatchDeadlockClient1( |
+ RestrictedDispatchDeadlockServer* server, |
+ RestrictedDispatchDeadlockClient2* peer, |
+ WaitableEvent* server_ready_event, |
+ WaitableEvent** events, |
+ mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(std::move(channel_handle), Channel::MODE_CLIENT), |
server_(server), |
peer_(peer), |
server_ready_event_(server_ready_event), |
@@ -1528,22 +1612,23 @@ TEST_F(IPCSyncChannelTest, RestrictedDispatchDeadlock) { |
RestrictedDispatchDeadlockClient1* client1; |
RestrictedDispatchDeadlockClient2* client2; |
- server2 = new RestrictedDispatchDeadlockServer(2, &server2_ready, events, |
- NULL); |
+ mojo::MessagePipe pipe1, pipe2; |
+ server2 = new RestrictedDispatchDeadlockServer( |
+ 2, &server2_ready, events, NULL, std::move(pipe2.handle0)); |
server2->OverrideThread(&worker_thread); |
workers.push_back(server2); |
- client2 = new RestrictedDispatchDeadlockClient2(server2, &server2_ready, |
- events); |
+ client2 = new RestrictedDispatchDeadlockClient2( |
+ server2, &server2_ready, events, std::move(pipe2.handle1)); |
workers.push_back(client2); |
- server1 = new RestrictedDispatchDeadlockServer(1, &server1_ready, events, |
- server2); |
+ server1 = new RestrictedDispatchDeadlockServer( |
+ 1, &server1_ready, events, server2, std::move(pipe1.handle0)); |
server1->OverrideThread(&worker_thread); |
workers.push_back(server1); |
- client1 = new RestrictedDispatchDeadlockClient1(server1, client2, |
- &server1_ready, events); |
+ client1 = new RestrictedDispatchDeadlockClient1( |
+ server1, client2, &server1_ready, events, std::move(pipe1.handle1)); |
workers.push_back(client1); |
RunTest(workers); |
@@ -1559,20 +1644,18 @@ TEST_F(IPCSyncChannelTest, RestrictedDispatchDeadlock) { |
class RestrictedDispatchPipeWorker : public Worker { |
public: |
- RestrictedDispatchPipeWorker( |
- const std::string &channel1, |
- WaitableEvent* event1, |
- const std::string &channel2, |
- WaitableEvent* event2, |
- int group, |
- int* success) |
- : Worker(channel1, Channel::MODE_SERVER), |
+ RestrictedDispatchPipeWorker(mojo::ScopedMessagePipeHandle channel_handle1, |
+ WaitableEvent* event1, |
+ mojo::ScopedMessagePipeHandle channel_handle2, |
+ WaitableEvent* event2, |
+ int group, |
+ int* success) |
+ : Worker(std::move(channel_handle1), Channel::MODE_SERVER), |
event1_(event1), |
event2_(event2), |
- other_channel_name_(channel2), |
+ other_channel_handle_(std::move(channel_handle2)), |
group_(group), |
- success_(success) { |
- } |
+ success_(success) {} |
void OnPingTTL(int ping, int* ret) { |
*ret = 0; |
@@ -1596,8 +1679,8 @@ class RestrictedDispatchPipeWorker : public Worker { |
event1_->Signal(); |
event2_->Wait(); |
other_channel_ = SyncChannel::Create( |
- other_channel_name_, IPC::Channel::MODE_CLIENT, this, |
- ipc_thread().task_runner().get(), true, shutdown_event()); |
+ other_channel_handle_.release(), IPC::Channel::MODE_CLIENT, this, |
+ ipc_thread().task_runner(), true, shutdown_event()); |
other_channel_->SetRestrictDispatchChannelGroup(group_); |
if (!is_first()) { |
event1_->Signal(); |
@@ -1630,7 +1713,7 @@ class RestrictedDispatchPipeWorker : public Worker { |
std::unique_ptr<SyncChannel> other_channel_; |
WaitableEvent* event1_; |
WaitableEvent* event2_; |
- std::string other_channel_name_; |
+ mojo::ScopedMessagePipeHandle other_channel_handle_; |
int group_; |
int* success_; |
}; |
@@ -1652,14 +1735,19 @@ TEST_F(IPCSyncChannelTest, MAYBE_RestrictedDispatch4WayDeadlock) { |
base::WaitableEvent::InitialState::NOT_SIGNALED); |
WaitableEvent event3(base::WaitableEvent::ResetPolicy::MANUAL, |
base::WaitableEvent::InitialState::NOT_SIGNALED); |
+ mojo::MessagePipe pipe0, pipe1, pipe2, pipe3; |
workers.push_back(new RestrictedDispatchPipeWorker( |
- "channel0", &event0, "channel1", &event1, 1, &success)); |
+ std::move(pipe0.handle0), &event0, std::move(pipe1.handle1), &event1, 1, |
+ &success)); |
workers.push_back(new RestrictedDispatchPipeWorker( |
- "channel1", &event1, "channel2", &event2, 2, NULL)); |
+ std::move(pipe1.handle0), &event1, std::move(pipe2.handle1), &event2, 2, |
+ NULL)); |
workers.push_back(new RestrictedDispatchPipeWorker( |
- "channel2", &event2, "channel3", &event3, 3, NULL)); |
+ std::move(pipe2.handle0), &event2, std::move(pipe3.handle1), &event3, 3, |
+ NULL)); |
workers.push_back(new RestrictedDispatchPipeWorker( |
- "channel3", &event3, "channel0", &event0, 4, NULL)); |
+ std::move(pipe3.handle0), &event3, std::move(pipe0.handle1), &event0, 4, |
+ NULL)); |
RunTest(workers); |
EXPECT_EQ(3, success); |
} |
@@ -1676,14 +1764,17 @@ TEST_F(IPCSyncChannelTest, MAYBE_RestrictedDispatch4WayDeadlock) { |
class ReentrantReplyServer1 : public Worker { |
public: |
- ReentrantReplyServer1(WaitableEvent* server_ready) |
- : Worker("reentrant_reply1", Channel::MODE_SERVER), |
- server_ready_(server_ready) { } |
+ ReentrantReplyServer1(WaitableEvent* server_ready, |
+ mojo::ScopedMessagePipeHandle channel_handle1, |
+ mojo::ScopedMessagePipeHandle channel_handle2) |
+ : Worker(std::move(channel_handle1), Channel::MODE_SERVER), |
+ server_ready_(server_ready), |
+ other_channel_handle_(std::move(channel_handle2)) {} |
void Run() override { |
server2_channel_ = SyncChannel::Create( |
- "reentrant_reply2", IPC::Channel::MODE_CLIENT, this, |
- ipc_thread().task_runner().get(), true, shutdown_event()); |
+ other_channel_handle_.release(), IPC::Channel::MODE_CLIENT, this, |
+ ipc_thread().task_runner(), true, shutdown_event()); |
server_ready_->Signal(); |
Message* msg = new SyncChannelTestMsg_Reentrant1(); |
server2_channel_->Send(msg); |
@@ -1713,13 +1804,13 @@ class ReentrantReplyServer1 : public Worker { |
WaitableEvent* server_ready_; |
std::unique_ptr<SyncChannel> server2_channel_; |
+ mojo::ScopedMessagePipeHandle other_channel_handle_; |
}; |
class ReentrantReplyServer2 : public Worker { |
public: |
- ReentrantReplyServer2() |
- : Worker("reentrant_reply2", Channel::MODE_SERVER), |
- reply_(NULL) { } |
+ ReentrantReplyServer2(mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(std::move(channel_handle), Channel::MODE_SERVER), reply_(NULL) {} |
private: |
bool OnMessageReceived(const Message& message) override { |
@@ -1750,9 +1841,10 @@ class ReentrantReplyServer2 : public Worker { |
class ReentrantReplyClient : public Worker { |
public: |
- ReentrantReplyClient(WaitableEvent* server_ready) |
- : Worker("reentrant_reply1", Channel::MODE_CLIENT), |
- server_ready_(server_ready) { } |
+ ReentrantReplyClient(WaitableEvent* server_ready, |
+ mojo::ScopedMessagePipeHandle channel_handle) |
+ : Worker(std::move(channel_handle), Channel::MODE_CLIENT), |
+ server_ready_(server_ready) {} |
void Run() override { |
server_ready_->Wait(); |
@@ -1768,103 +1860,14 @@ TEST_F(IPCSyncChannelTest, ReentrantReply) { |
std::vector<Worker*> workers; |
WaitableEvent server_ready(base::WaitableEvent::ResetPolicy::AUTOMATIC, |
base::WaitableEvent::InitialState::NOT_SIGNALED); |
- workers.push_back(new ReentrantReplyServer2()); |
- workers.push_back(new ReentrantReplyServer1(&server_ready)); |
- workers.push_back(new ReentrantReplyClient(&server_ready)); |
- RunTest(workers); |
-} |
- |
-//------------------------------------------------------------------------------ |
- |
-// Generate a validated channel ID using Channel::GenerateVerifiedChannelID(). |
- |
-class VerifiedServer : public Worker { |
- public: |
- VerifiedServer(base::Thread* listener_thread, |
- const std::string& channel_name, |
- const std::string& reply_text) |
- : Worker(channel_name, Channel::MODE_SERVER), |
- reply_text_(reply_text) { |
- Worker::OverrideThread(listener_thread); |
- } |
- |
- void OnNestedTestMsg(Message* reply_msg) override { |
- VLOG(1) << __FUNCTION__ << " Sending reply: " << reply_text_; |
- SyncChannelNestedTestMsg_String::WriteReplyParams(reply_msg, reply_text_); |
- Send(reply_msg); |
- ASSERT_EQ(channel()->GetPeerPID(), base::GetCurrentProcId()); |
- Done(); |
- } |
- |
- private: |
- std::string reply_text_; |
-}; |
- |
-class VerifiedClient : public Worker { |
- public: |
- VerifiedClient(base::Thread* listener_thread, |
- const std::string& channel_name, |
- const std::string& expected_text) |
- : Worker(channel_name, Channel::MODE_CLIENT), |
- expected_text_(expected_text) { |
- Worker::OverrideThread(listener_thread); |
- } |
- |
- void OnChannelConnected(int32_t peer_pid) override { |
- ListenerThread()->task_runner()->PostTask( |
- FROM_HERE, base::Bind(&VerifiedClient::RunTestOnConnected, this)); |
- } |
- |
- void RunTestOnConnected() { |
- std::string response; |
- SyncMessage* msg = new SyncChannelNestedTestMsg_String(&response); |
- bool result = Send(msg); |
- DCHECK(result); |
- DCHECK_EQ(response, expected_text_); |
- // expected_text_ is only used in the above DCHECK. This line suppresses the |
- // "unused private field" warning in release builds. |
- (void)expected_text_; |
- |
- VLOG(1) << __FUNCTION__ << " Received reply: " << response; |
- ASSERT_EQ(channel()->GetPeerPID(), base::GetCurrentProcId()); |
- Done(); |
- } |
- |
- private: |
- std::string expected_text_; |
-}; |
- |
-void Verified() { |
- std::vector<Worker*> workers; |
- |
- // A shared worker thread for servers |
- base::Thread server_worker_thread("Verified_ServerListener"); |
- ASSERT_TRUE(server_worker_thread.Start()); |
- |
- base::Thread client_worker_thread("Verified_ClientListener"); |
- ASSERT_TRUE(client_worker_thread.Start()); |
- |
- std::string channel_id = Channel::GenerateVerifiedChannelID("Verified"); |
- Worker* worker; |
- |
- worker = new VerifiedServer(&server_worker_thread, |
- channel_id, |
- "Got first message"); |
- workers.push_back(worker); |
- |
- worker = new VerifiedClient(&client_worker_thread, |
- channel_id, |
- "Got first message"); |
- workers.push_back(worker); |
- |
+ mojo::MessagePipe pipe1, pipe2; |
+ workers.push_back(new ReentrantReplyServer2(std::move(pipe2.handle0))); |
+ workers.push_back(new ReentrantReplyServer1( |
+ &server_ready, std::move(pipe1.handle0), std::move(pipe2.handle1))); |
+ workers.push_back( |
+ new ReentrantReplyClient(&server_ready, std::move(pipe1.handle1))); |
RunTest(workers); |
} |
-// Windows needs to send an out-of-band secret to verify the client end of the |
-// channel. Test that we still connect correctly in that case. |
-TEST_F(IPCSyncChannelTest, Verified) { |
- Verified(); |
-} |
- |
} // namespace |
} // namespace IPC |