Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(411)

Side by Side Diff: ipc/mojo/ipc_channel_mojo_unittest.cc

Issue 554363004: ChannelMojo: Handle errors in pending message processing. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
11 #include "base/pickle.h" 11 #include "base/pickle.h"
12 #include "base/threading/thread.h" 12 #include "base/threading/thread.h"
13 #include "ipc/ipc_message.h" 13 #include "ipc/ipc_message.h"
14 #include "ipc/ipc_test_base.h" 14 #include "ipc/ipc_test_base.h"
15 #include "ipc/ipc_test_channel_listener.h" 15 #include "ipc/ipc_test_channel_listener.h"
16 #include "ipc/mojo/ipc_channel_mojo_readers.h"
16 17
17 #if defined(OS_POSIX) 18 #if defined(OS_POSIX)
18 #include "base/file_descriptor_posix.h" 19 #include "base/file_descriptor_posix.h"
19 #endif 20 #endif
20 21
21 namespace { 22 namespace {
22 23
23 class ListenerThatExpectsOK : public IPC::Listener { 24 class ListenerThatExpectsOK : public IPC::Listener {
24 public: 25 public:
25 ListenerThatExpectsOK() 26 ListenerThatExpectsOK()
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 139
139 IPC::TestChannelListener::SendOneMessage( 140 IPC::TestChannelListener::SendOneMessage(
140 client.channel(), "hello from child"); 141 client.channel(), "hello from child");
141 base::MessageLoop::current()->Run(); 142 base::MessageLoop::current()->Run();
142 EXPECT_TRUE(listener.is_connected_called()); 143 EXPECT_TRUE(listener.is_connected_called());
143 EXPECT_TRUE(listener.HasSentAll()); 144 EXPECT_TRUE(listener.HasSentAll());
144 145
145 return 0; 146 return 0;
146 } 147 }
147 148
149
150 // To make WriteMessageToPipe() fail.
151 class ErraticMessageReader : public IPC::internal::MessageReader {
152 public:
153 ErraticMessageReader(mojo::ScopedMessagePipeHandle pipe,
154 IPC::ChannelMojo* owner)
155 : IPC::internal::MessageReader(pipe.Pass(), owner) {
156 }
157
158 virtual MojoResult WriteMessageToPipe(
159 const void* bytes,
160 uint32_t num_bytes,
161 const MojoHandle* handles,
162 uint32_t num_handles,
163 MojoWriteMessageFlags flags) OVERRIDE {
164 return MOJO_RESULT_UNKNOWN;
165 }
166
yzshen1 2014/09/15 17:26:08 unnecessary empty line
Hajime Morrita 2014/09/15 18:16:53 Done.
167 };
168
169 // Exists to create ErraticMessageReader
yzshen1 2014/09/15 17:26:08 nit: trailing '.', please. (and line 188, 259)
Hajime Morrita 2014/09/15 18:16:53 Done.
170 class ErraticChannelMojo : public IPC::ChannelMojo {
171 public:
172 ErraticChannelMojo(
173 const IPC::ChannelHandle &channel_handle,
174 IPC::Channel::Mode mode,
175 IPC::Listener* listener,
176 scoped_refptr<base::TaskRunner> runner)
177 : ChannelMojo(channel_handle, mode, listener, runner) {
178 }
179
180 virtual scoped_ptr<IPC::internal::MessageReader> CreateMessageReader(
181 mojo::ScopedMessagePipeHandle pipe) OVERRIDE {
182 return scoped_ptr<IPC::internal::MessageReader>(
183 new ErraticMessageReader(pipe.Pass(), this));
184 }
185
186 };
187
188 // Exists to create ErraticChannelMojo
189 class ErraticChannelFactory : public IPC::ChannelFactory {
190 public:
191 explicit ErraticChannelFactory(
192 const IPC::ChannelHandle& handle,
193 base::TaskRunner* runner)
194 : handle_(handle), runner_(runner) {
195 }
196
197 virtual std::string GetName() const OVERRIDE {
198 return "";
199 }
200
201 virtual scoped_ptr<IPC::Channel> BuildChannel(
202 IPC::Listener* listener) OVERRIDE {
203 return scoped_ptr<IPC::Channel>(
204 new ErraticChannelMojo(
205 handle_, IPC::Channel::MODE_SERVER, listener, runner_));
206 }
207
208 private:
209 IPC::ChannelHandle handle_;
210 scoped_refptr<base::TaskRunner> runner_;
211 };
212
213 class ListenerExpectingErrors : public IPC::Listener {
214 public:
215 ListenerExpectingErrors()
216 : has_error_(false) {
217 }
218
219 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
220 return true;
221 }
222
223 virtual void OnChannelError() OVERRIDE {
224 has_error_ = true;
225 base::MessageLoop::current()->Quit();
226 }
227
228 bool has_error() const { return has_error_; }
229
230 private:
231 bool has_error_;
232 };
233
234
235 class IPCChannelMojoErrorTest : public IPCTestBase {
236 protected:
237 virtual scoped_ptr<IPC::ChannelFactory> CreateChannelFactory(
238 const IPC::ChannelHandle& handle,
239 base::TaskRunner* runner) OVERRIDE {
240 return scoped_ptr<IPC::ChannelFactory>(
241 new ErraticChannelFactory(handle, runner));
242 }
243 };
244
245 class ListenerThatQuits : public IPC::Listener {
246 public:
247 ListenerThatQuits() {
248 }
249
250 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
251 return true;
252 }
253
254 virtual void OnChannelConnected(int32 peer_pid) OVERRIDE {
255 base::MessageLoop::current()->Quit();
256 }
257 };
258
259 // A long running process that connects to us
260 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(IPCChannelMojoErraticTestClient) {
261 ListenerThatQuits listener;
262 ChannelClient client(&listener, "IPCChannelMojoErraticTestClient");
263 client.Connect();
264
265 base::MessageLoop::current()->Run();
266
267 return 0;
268 }
269
270 TEST_F(IPCChannelMojoErrorTest, SendFailWithPendingMessages) {
271 Init("IPCChannelMojoErraticTestClient");
272
273 // Set up IPC channel and start client.
274 ListenerExpectingErrors listener;
275 CreateChannel(&listener);
276 ASSERT_TRUE(ConnectChannel());
277
278 // This messages are queued as pending.
yzshen1 2014/09/15 17:26:07 This -> These
279 for (size_t i = 0; i < 2; ++i) {
280 IPC::TestChannelListener::SendOneMessage(
281 sender(), "hello from parent");
282 }
283
284 // This triggers ChannelMojo::OnConnected(), which hits
285 // crbug.com/410813
286 ASSERT_TRUE(StartClient());
287 base::MessageLoop::current()->Run();
288
289 this->channel()->Close();
290
291 EXPECT_TRUE(WaitForClientShutdown());
292 EXPECT_TRUE(listener.has_error());
293
294 DestroyChannel();
295 }
296
297
148 #if defined(OS_POSIX) 298 #if defined(OS_POSIX)
149 class ListenerThatExpectsFile : public IPC::Listener { 299 class ListenerThatExpectsFile : public IPC::Listener {
150 public: 300 public:
151 ListenerThatExpectsFile() 301 ListenerThatExpectsFile()
152 : sender_(NULL) {} 302 : sender_(NULL) {}
153 303
154 virtual ~ListenerThatExpectsFile() {} 304 virtual ~ListenerThatExpectsFile() {}
155 305
156 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { 306 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
157 PickleIterator iter(message); 307 PickleIterator iter(message);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 client.Connect(); 376 client.Connect();
227 listener.set_sender(client.channel()); 377 listener.set_sender(client.channel());
228 378
229 base::MessageLoop::current()->Run(); 379 base::MessageLoop::current()->Run();
230 380
231 return 0; 381 return 0;
232 } 382 }
233 #endif 383 #endif
234 384
235 } // namespace 385 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698