Index: ipc/ipc_sync_channel_unittest.cc |
=================================================================== |
--- ipc/ipc_sync_channel_unittest.cc (revision 43588) |
+++ ipc/ipc_sync_channel_unittest.cc (working copy) |
@@ -18,6 +18,7 @@ |
#include "base/waitable_event.h" |
#include "ipc/ipc_message.h" |
#include "ipc/ipc_sync_channel.h" |
+#include "ipc/ipc_sync_message_filter.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -120,12 +121,14 @@ |
} |
Channel::Mode mode() { return mode_; } |
WaitableEvent* done_event() { return done_.get(); } |
+ WaitableEvent* shutdown_event() { return &shutdown_event_; } |
void ResetChannel() { channel_.reset(); } |
- |
- protected: |
// Derived classes need to call this when they've completed their part of |
// the test. |
void Done() { done_->Signal(); } |
+ |
+ protected: |
+ IPC::SyncChannel* channel() { return channel_.get(); } |
// Functions for dervied classes to implement if they wish. |
virtual void Run() { } |
virtual void OnAnswer(int* answer) { NOTREACHED(); } |
@@ -1054,3 +1057,61 @@ |
workers.push_back(new SimpleClient()); |
RunTest(workers); |
} |
+ |
+//----------------------------------------------------------------------------- |
+ |
+namespace { |
+ |
+class TestSyncMessageFilter : public IPC::SyncMessageFilter { |
+ public: |
+ TestSyncMessageFilter(base::WaitableEvent* shutdown_event, Worker* worker) |
+ : SyncMessageFilter(shutdown_event), |
+ worker_(worker), |
+ thread_("helper_thread") { |
+ base::Thread::Options options; |
+ options.message_loop_type = MessageLoop::TYPE_DEFAULT; |
+ thread_.StartWithOptions(options); |
+ } |
+ |
+ virtual void OnFilterAdded(Channel* channel) { |
+ SyncMessageFilter::OnFilterAdded(channel); |
+ thread_.message_loop()->PostTask(FROM_HERE, NewRunnableMethod( |
+ this, &TestSyncMessageFilter::SendMessageOnHelperThread)); |
+ } |
+ |
+ void SendMessageOnHelperThread() { |
+ int answer = 0; |
+ bool result = Send(new SyncChannelTestMsg_AnswerToLife(&answer)); |
+ DCHECK(result); |
+ DCHECK_EQ(answer, 42); |
+ |
+ worker_->Done(); |
+ } |
+ |
+ Worker* worker_; |
+ base::Thread thread_; |
+}; |
+ |
+class SyncMessageFilterServer : public Worker { |
+ public: |
+ SyncMessageFilterServer() |
+ : Worker(Channel::MODE_SERVER, "sync_message_filter_server") { |
+ filter_ = new TestSyncMessageFilter(shutdown_event(), this); |
+ } |
+ |
+ void Run() { |
+ channel()->AddFilter(filter_.get()); |
+ } |
+ |
+ scoped_refptr<TestSyncMessageFilter> filter_; |
+}; |
+ |
+} // namespace |
+ |
+// Tests basic synchronous call |
+TEST_F(IPCSyncChannelTest, SyncMessageFilter) { |
+ std::vector<Worker*> workers; |
+ workers.push_back(new SyncMessageFilterServer()); |
+ workers.push_back(new SimpleClient()); |
+ RunTest(workers); |
+} |