OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 // Unit test for SyncChannel. | 5 // Unit test for SyncChannel. |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 int result; | 153 int result; |
154 OnDouble(in, &result); | 154 OnDouble(in, &result); |
155 SyncChannelTestMsg_Double::WriteReplyParams(reply_msg, result); | 155 SyncChannelTestMsg_Double::WriteReplyParams(reply_msg, result); |
156 Send(reply_msg); | 156 Send(reply_msg); |
157 } | 157 } |
158 | 158 |
159 virtual void OnNestedTestMsg(Message* reply_msg) { | 159 virtual void OnNestedTestMsg(Message* reply_msg) { |
160 NOTREACHED(); | 160 NOTREACHED(); |
161 } | 161 } |
162 | 162 |
163 private: | |
164 base::Thread* ListenerThread() { | 163 base::Thread* ListenerThread() { |
165 return overrided_thread_ ? overrided_thread_ : &listener_thread_; | 164 return overrided_thread_ ? overrided_thread_ : &listener_thread_; |
166 } | 165 } |
| 166 |
| 167 private: |
167 // Called on the listener thread to create the sync channel. | 168 // Called on the listener thread to create the sync channel. |
168 void OnStart() { | 169 void OnStart() { |
169 // Link ipc_thread_, listener_thread_ and channel_ altogether. | 170 // Link ipc_thread_, listener_thread_ and channel_ altogether. |
170 StartThread(&ipc_thread_, MessageLoop::TYPE_IO); | 171 StartThread(&ipc_thread_, MessageLoop::TYPE_IO); |
171 channel_.reset(new SyncChannel( | 172 channel_.reset(new SyncChannel( |
172 channel_name_, mode_, this, NULL, ipc_thread_.message_loop(), true, | 173 channel_name_, mode_, this, NULL, ipc_thread_.message_loop(), true, |
173 &shutdown_event_)); | 174 &shutdown_event_)); |
174 channel_created_->Signal(); | 175 channel_created_->Signal(); |
175 Run(); | 176 Run(); |
176 } | 177 } |
(...skipping 927 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1104 filter_ = new TestSyncMessageFilter(shutdown_event(), this); | 1105 filter_ = new TestSyncMessageFilter(shutdown_event(), this); |
1105 } | 1106 } |
1106 | 1107 |
1107 void Run() { | 1108 void Run() { |
1108 channel()->AddFilter(filter_.get()); | 1109 channel()->AddFilter(filter_.get()); |
1109 } | 1110 } |
1110 | 1111 |
1111 scoped_refptr<TestSyncMessageFilter> filter_; | 1112 scoped_refptr<TestSyncMessageFilter> filter_; |
1112 }; | 1113 }; |
1113 | 1114 |
| 1115 // This class provides functionality to test the case that a Send on the sync |
| 1116 // channel does not crash after the channel has been closed. |
| 1117 class ServerSendAfterClose : public Worker { |
| 1118 public: |
| 1119 ServerSendAfterClose() |
| 1120 : Worker(Channel::MODE_SERVER, "simpler_server"), |
| 1121 send_result_(true) { |
| 1122 } |
| 1123 |
| 1124 bool SendDummy() { |
| 1125 ListenerThread()->message_loop()->PostTask(FROM_HERE, NewRunnableMethod( |
| 1126 this, &ServerSendAfterClose::Send, new SyncChannelTestMsg_NoArgs)); |
| 1127 return true; |
| 1128 } |
| 1129 |
| 1130 bool send_result() const { |
| 1131 return send_result_; |
| 1132 } |
| 1133 |
| 1134 private: |
| 1135 virtual void Run() { |
| 1136 CloseChannel(); |
| 1137 Done(); |
| 1138 } |
| 1139 |
| 1140 bool Send(Message* msg) { |
| 1141 send_result_ = Worker::Send(msg); |
| 1142 Done(); |
| 1143 return send_result_; |
| 1144 } |
| 1145 |
| 1146 bool send_result_; |
| 1147 }; |
| 1148 |
1114 } // namespace | 1149 } // namespace |
1115 | 1150 |
1116 // Tests basic synchronous call | 1151 // Tests basic synchronous call |
1117 TEST_F(IPCSyncChannelTest, SyncMessageFilter) { | 1152 TEST_F(IPCSyncChannelTest, SyncMessageFilter) { |
1118 std::vector<Worker*> workers; | 1153 std::vector<Worker*> workers; |
1119 workers.push_back(new SyncMessageFilterServer()); | 1154 workers.push_back(new SyncMessageFilterServer()); |
1120 workers.push_back(new SimpleClient()); | 1155 workers.push_back(new SimpleClient()); |
1121 RunTest(workers); | 1156 RunTest(workers); |
1122 } | 1157 } |
| 1158 |
| 1159 // Test the case when the channel is closed and a Send is attempted after that. |
| 1160 TEST_F(IPCSyncChannelTest, SendAfterClose) { |
| 1161 ServerSendAfterClose server; |
| 1162 server.Start(); |
| 1163 |
| 1164 server.done_event()->Wait(); |
| 1165 server.done_event()->Reset(); |
| 1166 |
| 1167 server.SendDummy(); |
| 1168 server.done_event()->Wait(); |
| 1169 |
| 1170 EXPECT_FALSE(server.send_result()); |
| 1171 } |
| 1172 |
| 1173 |
OLD | NEW |