OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 #include "ipc/mojo/ipc_channel_mojo.h" | 5 #include "ipc/mojo/ipc_channel_mojo.h" |
6 | 6 |
7 #include "base/base_paths.h" | 7 #include "base/base_paths.h" |
8 #include "base/files/file.h" | 8 #include "base/files/file.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 | 151 |
152 IPC::TestChannelListener::SendOneMessage( | 152 IPC::TestChannelListener::SendOneMessage( |
153 client.channel(), "hello from child"); | 153 client.channel(), "hello from child"); |
154 base::MessageLoop::current()->Run(); | 154 base::MessageLoop::current()->Run(); |
155 EXPECT_TRUE(listener.is_connected_called()); | 155 EXPECT_TRUE(listener.is_connected_called()); |
156 EXPECT_TRUE(listener.HasSentAll()); | 156 EXPECT_TRUE(listener.HasSentAll()); |
157 | 157 |
158 return 0; | 158 return 0; |
159 } | 159 } |
160 | 160 |
161 // Close given handle before use to simulate an error. | |
162 class ErraticChannelMojo : public IPC::ChannelMojo { | |
163 public: | |
164 ErraticChannelMojo(IPC::ChannelMojoHost* host, | |
165 const IPC::ChannelHandle& channel_handle, | |
166 IPC::Channel::Mode mode, | |
167 IPC::Listener* listener, | |
168 scoped_refptr<base::TaskRunner> runner) | |
169 : ChannelMojo(host, channel_handle, mode, listener) {} | |
170 | |
171 virtual void OnConnected(mojo::ScopedMessagePipeHandle pipe) { | |
172 MojoClose(pipe.get().value()); | |
173 OnConnected(pipe.Pass()); | |
174 } | |
175 }; | |
176 | |
177 // Exists to create ErraticChannelMojo. | |
178 class ErraticChannelFactory : public IPC::ChannelFactory { | |
179 public: | |
180 explicit ErraticChannelFactory(IPC::ChannelMojoHost* host, | |
181 const IPC::ChannelHandle& handle, | |
182 base::TaskRunner* runner) | |
183 : host_(host), handle_(handle), runner_(runner) {} | |
184 | |
185 virtual std::string GetName() const OVERRIDE { | |
186 return ""; | |
187 } | |
188 | |
189 virtual scoped_ptr<IPC::Channel> BuildChannel( | |
190 IPC::Listener* listener) OVERRIDE { | |
191 return scoped_ptr<IPC::Channel>(new ErraticChannelMojo( | |
192 host_, handle_, IPC::Channel::MODE_SERVER, listener, runner_)); | |
193 } | |
194 | |
195 private: | |
196 IPC::ChannelMojoHost* host_; | |
197 IPC::ChannelHandle handle_; | |
198 scoped_refptr<base::TaskRunner> runner_; | |
199 }; | |
200 | |
201 class ListenerExpectingErrors : public IPC::Listener { | 161 class ListenerExpectingErrors : public IPC::Listener { |
202 public: | 162 public: |
203 ListenerExpectingErrors() | 163 ListenerExpectingErrors() |
204 : has_error_(false) { | 164 : has_error_(false) { |
205 } | 165 } |
206 | 166 |
| 167 virtual void OnChannelConnected(int32 peer_pid) OVERRIDE { |
| 168 base::MessageLoop::current()->Quit(); |
| 169 } |
| 170 |
207 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { | 171 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { |
208 return true; | 172 return true; |
209 } | 173 } |
210 | 174 |
211 virtual void OnChannelError() OVERRIDE { | 175 virtual void OnChannelError() OVERRIDE { |
212 has_error_ = true; | 176 has_error_ = true; |
213 base::MessageLoop::current()->Quit(); | 177 base::MessageLoop::current()->Quit(); |
214 } | 178 } |
215 | 179 |
216 bool has_error() const { return has_error_; } | 180 bool has_error() const { return has_error_; } |
217 | 181 |
218 private: | 182 private: |
219 bool has_error_; | 183 bool has_error_; |
220 }; | 184 }; |
221 | 185 |
222 | 186 |
223 class IPCChannelMojoErrorTest : public IPCTestBase { | 187 class IPCChannelMojoErrorTest : public IPCTestBase { |
224 protected: | 188 protected: |
225 virtual scoped_ptr<IPC::ChannelFactory> CreateChannelFactory( | 189 virtual scoped_ptr<IPC::ChannelFactory> CreateChannelFactory( |
226 const IPC::ChannelHandle& handle, | 190 const IPC::ChannelHandle& handle, |
227 base::TaskRunner* runner) OVERRIDE { | 191 base::TaskRunner* runner) OVERRIDE { |
228 host_.reset(new IPC::ChannelMojoHost(task_runner())); | 192 host_.reset(new IPC::ChannelMojoHost(task_runner())); |
229 return scoped_ptr<IPC::ChannelFactory>( | 193 return IPC::ChannelMojo::CreateServerFactory(host_.get(), handle); |
230 new ErraticChannelFactory(host_.get(), handle, runner)); | |
231 } | 194 } |
232 | 195 |
233 virtual bool DidStartClient() OVERRIDE { | 196 virtual bool DidStartClient() OVERRIDE { |
234 bool ok = IPCTestBase::DidStartClient(); | 197 bool ok = IPCTestBase::DidStartClient(); |
235 DCHECK(ok); | 198 DCHECK(ok); |
236 host_->OnClientLaunched(client_process()); | 199 host_->OnClientLaunched(client_process()); |
237 return ok; | 200 return ok; |
238 } | 201 } |
239 | 202 |
240 private: | 203 private: |
(...skipping 18 matching lines...) Expand all Loading... |
259 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(IPCChannelMojoErraticTestClient) { | 222 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(IPCChannelMojoErraticTestClient) { |
260 ListenerThatQuits listener; | 223 ListenerThatQuits listener; |
261 ChannelClient client(&listener, "IPCChannelMojoErraticTestClient"); | 224 ChannelClient client(&listener, "IPCChannelMojoErraticTestClient"); |
262 client.Connect(); | 225 client.Connect(); |
263 | 226 |
264 base::MessageLoop::current()->Run(); | 227 base::MessageLoop::current()->Run(); |
265 | 228 |
266 return 0; | 229 return 0; |
267 } | 230 } |
268 | 231 |
269 // https://crbug.com/417439 | 232 TEST_F(IPCChannelMojoErrorTest, SendFailWithPendingMessages) { |
270 TEST_F(IPCChannelMojoErrorTest, DISABLED_SendFailWithPendingMessages) { | |
271 Init("IPCChannelMojoErraticTestClient"); | 233 Init("IPCChannelMojoErraticTestClient"); |
272 | 234 |
273 // Set up IPC channel and start client. | 235 // Set up IPC channel and start client. |
274 ListenerExpectingErrors listener; | 236 ListenerExpectingErrors listener; |
275 CreateChannel(&listener); | 237 CreateChannel(&listener); |
276 ASSERT_TRUE(ConnectChannel()); | 238 ASSERT_TRUE(ConnectChannel()); |
277 | 239 |
| 240 // This matches a value in mojo/system/constants.h |
| 241 const int kMaxMessageNumBytes = 4 * 1024 * 1024; |
| 242 std::string overly_large_data(kMaxMessageNumBytes, '*'); |
278 // This messages are queued as pending. | 243 // This messages are queued as pending. |
279 for (size_t i = 0; i < 2; ++i) { | 244 for (size_t i = 0; i < 10; ++i) { |
280 IPC::TestChannelListener::SendOneMessage( | 245 IPC::TestChannelListener::SendOneMessage( |
281 sender(), "hello from parent"); | 246 sender(), overly_large_data.c_str()); |
282 } | 247 } |
283 | 248 |
284 ASSERT_TRUE(StartClient()); | 249 ASSERT_TRUE(StartClient()); |
285 base::MessageLoop::current()->Run(); | 250 base::MessageLoop::current()->Run(); |
286 | 251 |
287 this->channel()->Close(); | 252 this->channel()->Close(); |
288 | 253 |
289 EXPECT_TRUE(WaitForClientShutdown()); | 254 EXPECT_TRUE(WaitForClientShutdown()); |
290 EXPECT_TRUE(listener.has_error()); | 255 EXPECT_TRUE(listener.has_error()); |
291 | 256 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 client.Connect(); | 339 client.Connect(); |
375 listener.set_sender(client.channel()); | 340 listener.set_sender(client.channel()); |
376 | 341 |
377 base::MessageLoop::current()->Run(); | 342 base::MessageLoop::current()->Run(); |
378 | 343 |
379 return 0; | 344 return 0; |
380 } | 345 } |
381 #endif | 346 #endif |
382 | 347 |
383 } // namespace | 348 } // namespace |
OLD | NEW |