| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "ipc/ipc_sync_channel.h" | 7 #include "ipc/ipc_sync_channel.h" |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 } | 159 } |
| 160 | 160 |
| 161 const base::Thread& ipc_thread() const { return ipc_thread_; } | 161 const base::Thread& ipc_thread() const { return ipc_thread_; } |
| 162 | 162 |
| 163 private: | 163 private: |
| 164 // Called on the listener thread to create the sync channel. | 164 // Called on the listener thread to create the sync channel. |
| 165 void OnStart() { | 165 void OnStart() { |
| 166 // Link ipc_thread_, listener_thread_ and channel_ altogether. | 166 // Link ipc_thread_, listener_thread_ and channel_ altogether. |
| 167 StartThread(&ipc_thread_, MessageLoop::TYPE_IO); | 167 StartThread(&ipc_thread_, MessageLoop::TYPE_IO); |
| 168 channel_.reset(new SyncChannel( | 168 channel_.reset(new SyncChannel( |
| 169 channel_name_, mode_, this, ipc_thread_.message_loop(), true, | 169 channel_name_, mode_, this, ipc_thread_.message_loop_proxy(), true, |
| 170 &shutdown_event_)); | 170 &shutdown_event_)); |
| 171 channel_created_->Signal(); | 171 channel_created_->Signal(); |
| 172 Run(); | 172 Run(); |
| 173 } | 173 } |
| 174 | 174 |
| 175 void OnListenerThreadShutdown1(WaitableEvent* listener_event, | 175 void OnListenerThreadShutdown1(WaitableEvent* listener_event, |
| 176 WaitableEvent* ipc_event) { | 176 WaitableEvent* ipc_event) { |
| 177 // SyncChannel needs to be destructed on the thread that it was created on. | 177 // SyncChannel needs to be destructed on the thread that it was created on. |
| 178 channel_.reset(); | 178 channel_.reset(); |
| 179 | 179 |
| (...skipping 1063 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1243 NewRunnableMethod(server_, &RestrictedDispatchServer::OnDoPing, 1)); | 1243 NewRunnableMethod(server_, &RestrictedDispatchServer::OnDoPing, 1)); |
| 1244 sent_ping_event_->Wait(); | 1244 sent_ping_event_->Wait(); |
| 1245 Send(new SyncChannelTestMsg_NoArgs); | 1245 Send(new SyncChannelTestMsg_NoArgs); |
| 1246 if (ping_ == 1) | 1246 if (ping_ == 1) |
| 1247 ++*success_; | 1247 ++*success_; |
| 1248 else | 1248 else |
| 1249 LOG(ERROR) << "Send failed to dispatch incoming message on same channel"; | 1249 LOG(ERROR) << "Send failed to dispatch incoming message on same channel"; |
| 1250 | 1250 |
| 1251 scoped_ptr<SyncChannel> non_restricted_channel(new SyncChannel( | 1251 scoped_ptr<SyncChannel> non_restricted_channel(new SyncChannel( |
| 1252 "non_restricted_channel", Channel::MODE_CLIENT, this, | 1252 "non_restricted_channel", Channel::MODE_CLIENT, this, |
| 1253 ipc_thread().message_loop(), true, shutdown_event())); | 1253 ipc_thread().message_loop_proxy(), true, shutdown_event())); |
| 1254 | 1254 |
| 1255 server_->ListenerThread()->message_loop()->PostTask(FROM_HERE, | 1255 server_->ListenerThread()->message_loop()->PostTask(FROM_HERE, |
| 1256 NewRunnableMethod(server_, &RestrictedDispatchServer::OnDoPing, 2)); | 1256 NewRunnableMethod(server_, &RestrictedDispatchServer::OnDoPing, 2)); |
| 1257 sent_ping_event_->Wait(); | 1257 sent_ping_event_->Wait(); |
| 1258 // Check that the incoming message is *not* dispatched when sending on the | 1258 // Check that the incoming message is *not* dispatched when sending on the |
| 1259 // non restricted channel. | 1259 // non restricted channel. |
| 1260 // TODO(piman): there is a possibility of a false positive race condition | 1260 // TODO(piman): there is a possibility of a false positive race condition |
| 1261 // here, if the message that was posted on the server-side end of the pipe | 1261 // here, if the message that was posted on the server-side end of the pipe |
| 1262 // is not visible yet on the client side, but I don't know how to solve this | 1262 // is not visible yet on the client side, but I don't know how to solve this |
| 1263 // without hooking into the internals of SyncChannel. I haven't seen it in | 1263 // without hooking into the internals of SyncChannel. I haven't seen it in |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1308 new RestrictedDispatchServer(&sent_ping_event); | 1308 new RestrictedDispatchServer(&sent_ping_event); |
| 1309 int success = 0; | 1309 int success = 0; |
| 1310 std::vector<Worker*> workers; | 1310 std::vector<Worker*> workers; |
| 1311 workers.push_back(new NonRestrictedDispatchServer); | 1311 workers.push_back(new NonRestrictedDispatchServer); |
| 1312 workers.push_back(server); | 1312 workers.push_back(server); |
| 1313 workers.push_back( | 1313 workers.push_back( |
| 1314 new RestrictedDispatchClient(&sent_ping_event, server, &success)); | 1314 new RestrictedDispatchClient(&sent_ping_event, server, &success)); |
| 1315 RunTest(workers); | 1315 RunTest(workers); |
| 1316 EXPECT_EQ(3, success); | 1316 EXPECT_EQ(3, success); |
| 1317 } | 1317 } |
| OLD | NEW |