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

Side by Side Diff: mojo/public/cpp/bindings/tests/connector_unittest.cc

Issue 2064903002: Mojo: Report bindings validation errors via MojoNotifyBadMessage (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "mojo/public/cpp/bindings/lib/connector.h" 5 #include "mojo/public/cpp/bindings/lib/connector.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdlib.h> 8 #include <stdlib.h>
9 #include <string.h> 9 #include <string.h>
10 #include <utility> 10 #include <utility>
11 11
12 #include "base/message_loop/message_loop.h" 12 #include "base/message_loop/message_loop.h"
13 #include "base/run_loop.h" 13 #include "base/run_loop.h"
14 #include "base/threading/thread_task_runner_handle.h" 14 #include "base/threading/thread_task_runner_handle.h"
15 #include "mojo/public/cpp/bindings/lib/message_builder.h" 15 #include "mojo/public/cpp/bindings/lib/message_builder.h"
16 #include "mojo/public/cpp/bindings/tests/message_queue.h" 16 #include "mojo/public/cpp/bindings/tests/message_queue.h"
17 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
18 18
19 namespace mojo { 19 namespace mojo {
20 namespace test { 20 namespace test {
21 namespace { 21 namespace {
22 22
23 class MessageAccumulator : public MessageReceiver { 23 class MessageAccumulator : public MessageReceiver {
24 public: 24 public:
25 MessageAccumulator() {} 25 MessageAccumulator() {}
26 explicit MessageAccumulator(const Closure& closure) : closure_(closure) {} 26 explicit MessageAccumulator(const Closure& closure) : closure_(closure) {}
27 27
28 bool Accept(Message* message) override { 28 bool Accept(Message* message, Error* error) override {
29 queue_.Push(message); 29 queue_.Push(message);
30 if (!closure_.is_null()) { 30 if (!closure_.is_null()) {
31 Closure closure = closure_; 31 Closure closure = closure_;
32 closure_.reset(); 32 closure_.reset();
33 closure.Run(); 33 closure.Run();
34 } 34 }
35 return true; 35 return true;
36 } 36 }
37 37
38 bool IsEmpty() const { return queue_.IsEmpty(); } 38 bool IsEmpty() const { return queue_.IsEmpty(); }
39 39
40 void Pop(Message* message) { queue_.Pop(message); } 40 void Pop(Message* message) { queue_.Pop(message); }
41 41
42 void set_closure(const Closure& closure) { closure_ = closure; } 42 void set_closure(const Closure& closure) { closure_ = closure; }
43 43
44 size_t size() const { return queue_.size(); } 44 size_t size() const { return queue_.size(); }
45 45
46 private: 46 private:
47 MessageQueue queue_; 47 MessageQueue queue_;
48 Closure closure_; 48 Closure closure_;
49 }; 49 };
50 50
51 class ConnectorDeletingMessageAccumulator : public MessageAccumulator { 51 class ConnectorDeletingMessageAccumulator : public MessageAccumulator {
52 public: 52 public:
53 ConnectorDeletingMessageAccumulator(internal::Connector** connector) 53 ConnectorDeletingMessageAccumulator(internal::Connector** connector)
54 : connector_(connector) {} 54 : connector_(connector) {}
55 55
56 bool Accept(Message* message) override { 56 bool Accept(Message* message, Error* error) override {
57 delete *connector_; 57 delete *connector_;
58 *connector_ = nullptr; 58 *connector_ = nullptr;
59 return MessageAccumulator::Accept(message); 59 return MessageAccumulator::Accept(message, error);
60 } 60 }
61 61
62 private: 62 private:
63 internal::Connector** connector_; 63 internal::Connector** connector_;
64 }; 64 };
65 65
66 class ReentrantMessageAccumulator : public MessageAccumulator { 66 class ReentrantMessageAccumulator : public MessageAccumulator {
67 public: 67 public:
68 ReentrantMessageAccumulator(internal::Connector* connector) 68 ReentrantMessageAccumulator(internal::Connector* connector)
69 : connector_(connector), number_of_calls_(0) {} 69 : connector_(connector), number_of_calls_(0) {}
70 70
71 bool Accept(Message* message) override { 71 bool Accept(Message* message, Error* error) override {
72 if (!MessageAccumulator::Accept(message)) 72 if (!MessageAccumulator::Accept(message, error))
73 return false; 73 return false;
74 number_of_calls_++; 74 number_of_calls_++;
75 if (number_of_calls_ == 1) { 75 if (number_of_calls_ == 1) {
76 return connector_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); 76 return connector_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
77 } 77 }
78 return true; 78 return true;
79 } 79 }
80 80
81 int number_of_calls() { return number_of_calls_; } 81 int number_of_calls() { return number_of_calls_; }
82 82
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 base::ThreadTaskRunnerHandle::Get()); 117 base::ThreadTaskRunnerHandle::Get());
118 internal::Connector connector1(std::move(handle1_), 118 internal::Connector connector1(std::move(handle1_),
119 internal::Connector::SINGLE_THREADED_SEND, 119 internal::Connector::SINGLE_THREADED_SEND,
120 base::ThreadTaskRunnerHandle::Get()); 120 base::ThreadTaskRunnerHandle::Get());
121 121
122 const char kText[] = "hello world"; 122 const char kText[] = "hello world";
123 123
124 Message message; 124 Message message;
125 AllocMessage(kText, &message); 125 AllocMessage(kText, &message);
126 126
127 connector0.Accept(&message); 127 Error error;
128 connector0.Accept(&message, &error);
128 129
129 base::RunLoop run_loop; 130 base::RunLoop run_loop;
130 MessageAccumulator accumulator(run_loop.QuitClosure()); 131 MessageAccumulator accumulator(run_loop.QuitClosure());
131 connector1.set_incoming_receiver(&accumulator); 132 connector1.set_incoming_receiver(&accumulator);
132 133
133 run_loop.Run(); 134 run_loop.Run();
134 135
135 ASSERT_FALSE(accumulator.IsEmpty()); 136 ASSERT_FALSE(accumulator.IsEmpty());
136 137
137 Message message_received; 138 Message message_received;
(...skipping 10 matching lines...) Expand all
148 base::ThreadTaskRunnerHandle::Get()); 149 base::ThreadTaskRunnerHandle::Get());
149 internal::Connector connector1(std::move(handle1_), 150 internal::Connector connector1(std::move(handle1_),
150 internal::Connector::SINGLE_THREADED_SEND, 151 internal::Connector::SINGLE_THREADED_SEND,
151 base::ThreadTaskRunnerHandle::Get()); 152 base::ThreadTaskRunnerHandle::Get());
152 153
153 const char kText[] = "hello world"; 154 const char kText[] = "hello world";
154 155
155 Message message; 156 Message message;
156 AllocMessage(kText, &message); 157 AllocMessage(kText, &message);
157 158
158 connector0.Accept(&message); 159 Error error;
160 connector0.Accept(&message, &error);
159 161
160 MessageAccumulator accumulator; 162 MessageAccumulator accumulator;
161 connector1.set_incoming_receiver(&accumulator); 163 connector1.set_incoming_receiver(&accumulator);
162 164
163 connector1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); 165 connector1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
164 166
165 ASSERT_FALSE(accumulator.IsEmpty()); 167 ASSERT_FALSE(accumulator.IsEmpty());
166 168
167 Message message_received; 169 Message message_received;
168 accumulator.Pop(&message_received); 170 accumulator.Pop(&message_received);
(...skipping 13 matching lines...) Expand all
182 184
183 base::RunLoop run_loop; 185 base::RunLoop run_loop;
184 MessageAccumulator accumulator(run_loop.QuitClosure()); 186 MessageAccumulator accumulator(run_loop.QuitClosure());
185 connector1.set_incoming_receiver(&accumulator); 187 connector1.set_incoming_receiver(&accumulator);
186 188
187 const char kText[] = "hello world"; 189 const char kText[] = "hello world";
188 190
189 Message message; 191 Message message;
190 AllocMessage(kText, &message); 192 AllocMessage(kText, &message);
191 193
192 connector0.Accept(&message); 194 Error error;
195 connector0.Accept(&message, &error);
193 196
194 run_loop.Run(); 197 run_loop.Run();
195 198
196 ASSERT_FALSE(accumulator.IsEmpty()); 199 ASSERT_FALSE(accumulator.IsEmpty());
197 200
198 Message message_received; 201 Message message_received;
199 accumulator.Pop(&message_received); 202 accumulator.Pop(&message_received);
200 203
201 EXPECT_EQ( 204 EXPECT_EQ(
202 std::string(kText), 205 std::string(kText),
203 std::string(reinterpret_cast<const char*>(message_received.payload()))); 206 std::string(reinterpret_cast<const char*>(message_received.payload())));
204 } 207 }
205 208
206 TEST_F(ConnectorTest, Basic_TwoMessages) { 209 TEST_F(ConnectorTest, Basic_TwoMessages) {
207 internal::Connector connector0(std::move(handle0_), 210 internal::Connector connector0(std::move(handle0_),
208 internal::Connector::SINGLE_THREADED_SEND, 211 internal::Connector::SINGLE_THREADED_SEND,
209 base::ThreadTaskRunnerHandle::Get()); 212 base::ThreadTaskRunnerHandle::Get());
210 internal::Connector connector1(std::move(handle1_), 213 internal::Connector connector1(std::move(handle1_),
211 internal::Connector::SINGLE_THREADED_SEND, 214 internal::Connector::SINGLE_THREADED_SEND,
212 base::ThreadTaskRunnerHandle::Get()); 215 base::ThreadTaskRunnerHandle::Get());
213 216
214 const char* kText[] = {"hello", "world"}; 217 const char* kText[] = {"hello", "world"};
215 218
216 for (size_t i = 0; i < arraysize(kText); ++i) { 219 for (size_t i = 0; i < arraysize(kText); ++i) {
217 Message message; 220 Message message;
218 AllocMessage(kText[i], &message); 221 AllocMessage(kText[i], &message);
219 222
220 connector0.Accept(&message); 223 Error error;
224 connector0.Accept(&message, &error);
221 } 225 }
222 226
223 MessageAccumulator accumulator; 227 MessageAccumulator accumulator;
224 connector1.set_incoming_receiver(&accumulator); 228 connector1.set_incoming_receiver(&accumulator);
225 229
226 for (size_t i = 0; i < arraysize(kText); ++i) { 230 for (size_t i = 0; i < arraysize(kText); ++i) {
227 if (accumulator.IsEmpty()) { 231 if (accumulator.IsEmpty()) {
228 base::RunLoop run_loop; 232 base::RunLoop run_loop;
229 accumulator.set_closure(run_loop.QuitClosure()); 233 accumulator.set_closure(run_loop.QuitClosure());
230 run_loop.Run(); 234 run_loop.Run();
(...skipping 16 matching lines...) Expand all
247 internal::Connector connector1(std::move(handle1_), 251 internal::Connector connector1(std::move(handle1_),
248 internal::Connector::SINGLE_THREADED_SEND, 252 internal::Connector::SINGLE_THREADED_SEND,
249 base::ThreadTaskRunnerHandle::Get()); 253 base::ThreadTaskRunnerHandle::Get());
250 254
251 const char* kText[] = {"hello", "world"}; 255 const char* kText[] = {"hello", "world"};
252 256
253 for (size_t i = 0; i < arraysize(kText); ++i) { 257 for (size_t i = 0; i < arraysize(kText); ++i) {
254 Message message; 258 Message message;
255 AllocMessage(kText[i], &message); 259 AllocMessage(kText[i], &message);
256 260
257 connector0.Accept(&message); 261 Error error;
262 connector0.Accept(&message, &error);
258 } 263 }
259 264
260 MessageAccumulator accumulator; 265 MessageAccumulator accumulator;
261 connector1.set_incoming_receiver(&accumulator); 266 connector1.set_incoming_receiver(&accumulator);
262 267
263 connector1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); 268 connector1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
264 269
265 ASSERT_FALSE(accumulator.IsEmpty()); 270 ASSERT_FALSE(accumulator.IsEmpty());
266 271
267 Message message_received; 272 Message message_received;
(...skipping 16 matching lines...) Expand all
284 Message message; 289 Message message;
285 AllocMessage(kText, &message); 290 AllocMessage(kText, &message);
286 291
287 // Close the other end of the pipe. 292 // Close the other end of the pipe.
288 handle1_.reset(); 293 handle1_.reset();
289 294
290 // Not observed yet because we haven't spun the message loop yet. 295 // Not observed yet because we haven't spun the message loop yet.
291 EXPECT_FALSE(connector0.encountered_error()); 296 EXPECT_FALSE(connector0.encountered_error());
292 297
293 // Write failures are not reported. 298 // Write failures are not reported.
294 bool ok = connector0.Accept(&message); 299 Error error;
300 bool ok = connector0.Accept(&message, &error);
295 EXPECT_TRUE(ok); 301 EXPECT_TRUE(ok);
296 302
297 // Still not observed. 303 // Still not observed.
298 EXPECT_FALSE(connector0.encountered_error()); 304 EXPECT_FALSE(connector0.encountered_error());
299 305
300 // Spin the message loop, and then we should start observing the closed pipe. 306 // Spin the message loop, and then we should start observing the closed pipe.
301 base::RunLoop run_loop; 307 base::RunLoop run_loop;
302 connector0.set_connection_error_handler(run_loop.QuitClosure()); 308 connector0.set_connection_error_handler(run_loop.QuitClosure());
303 run_loop.Run(); 309 run_loop.Run();
304 310
305 EXPECT_TRUE(connector0.encountered_error()); 311 EXPECT_TRUE(connector0.encountered_error());
306 } 312 }
307 313
308 TEST_F(ConnectorTest, MessageWithHandles) { 314 TEST_F(ConnectorTest, MessageWithHandles) {
309 internal::Connector connector0(std::move(handle0_), 315 internal::Connector connector0(std::move(handle0_),
310 internal::Connector::SINGLE_THREADED_SEND, 316 internal::Connector::SINGLE_THREADED_SEND,
311 base::ThreadTaskRunnerHandle::Get()); 317 base::ThreadTaskRunnerHandle::Get());
312 internal::Connector connector1(std::move(handle1_), 318 internal::Connector connector1(std::move(handle1_),
313 internal::Connector::SINGLE_THREADED_SEND, 319 internal::Connector::SINGLE_THREADED_SEND,
314 base::ThreadTaskRunnerHandle::Get()); 320 base::ThreadTaskRunnerHandle::Get());
315 321
316 const char kText[] = "hello world"; 322 const char kText[] = "hello world";
317 323
318 Message message1; 324 Message message1;
319 AllocMessage(kText, &message1); 325 AllocMessage(kText, &message1);
320 326
321 MessagePipe pipe; 327 MessagePipe pipe;
322 message1.mutable_handles()->push_back(pipe.handle0.release()); 328 message1.mutable_handles()->push_back(pipe.handle0.release());
323 329
324 connector0.Accept(&message1); 330 Error error;
331 connector0.Accept(&message1, &error);
325 332
326 // The message should have been transferred, releasing the handles. 333 // The message should have been transferred, releasing the handles.
327 EXPECT_TRUE(message1.handles()->empty()); 334 EXPECT_TRUE(message1.handles()->empty());
328 335
329 base::RunLoop run_loop; 336 base::RunLoop run_loop;
330 MessageAccumulator accumulator(run_loop.QuitClosure()); 337 MessageAccumulator accumulator(run_loop.QuitClosure());
331 connector1.set_incoming_receiver(&accumulator); 338 connector1.set_incoming_receiver(&accumulator);
332 339
333 run_loop.Run(); 340 run_loop.Run();
334 341
(...skipping 18 matching lines...) Expand all
353 internal::Connector connector_received( 360 internal::Connector connector_received(
354 std::move(smph), internal::Connector::SINGLE_THREADED_SEND, 361 std::move(smph), internal::Connector::SINGLE_THREADED_SEND,
355 base::ThreadTaskRunnerHandle::Get()); 362 base::ThreadTaskRunnerHandle::Get());
356 internal::Connector connector_original( 363 internal::Connector connector_original(
357 std::move(pipe.handle1), internal::Connector::SINGLE_THREADED_SEND, 364 std::move(pipe.handle1), internal::Connector::SINGLE_THREADED_SEND,
358 base::ThreadTaskRunnerHandle::Get()); 365 base::ThreadTaskRunnerHandle::Get());
359 366
360 Message message2; 367 Message message2;
361 AllocMessage(kText, &message2); 368 AllocMessage(kText, &message2);
362 369
363 connector_received.Accept(&message2); 370 connector_received.Accept(&message2, &error);
364 base::RunLoop run_loop2; 371 base::RunLoop run_loop2;
365 MessageAccumulator accumulator2(run_loop2.QuitClosure()); 372 MessageAccumulator accumulator2(run_loop2.QuitClosure());
366 connector_original.set_incoming_receiver(&accumulator2); 373 connector_original.set_incoming_receiver(&accumulator2);
367 run_loop2.Run(); 374 run_loop2.Run();
368 375
369 ASSERT_FALSE(accumulator2.IsEmpty()); 376 ASSERT_FALSE(accumulator2.IsEmpty());
370 377
371 accumulator2.Pop(&message_received); 378 accumulator2.Pop(&message_received);
372 379
373 EXPECT_EQ( 380 EXPECT_EQ(
(...skipping 16 matching lines...) Expand all
390 base::ThreadTaskRunnerHandle::Get()); 397 base::ThreadTaskRunnerHandle::Get());
391 internal::Connector* connector1 = new internal::Connector( 398 internal::Connector* connector1 = new internal::Connector(
392 std::move(handle1_), internal::Connector::SINGLE_THREADED_SEND, 399 std::move(handle1_), internal::Connector::SINGLE_THREADED_SEND,
393 base::ThreadTaskRunnerHandle::Get()); 400 base::ThreadTaskRunnerHandle::Get());
394 401
395 const char kText[] = "hello world"; 402 const char kText[] = "hello world";
396 403
397 Message message; 404 Message message;
398 AllocMessage(kText, &message); 405 AllocMessage(kText, &message);
399 406
400 connector0.Accept(&message); 407 Error error;
408 connector0.Accept(&message, &error);
401 409
402 ConnectorDeletingMessageAccumulator accumulator(&connector1); 410 ConnectorDeletingMessageAccumulator accumulator(&connector1);
403 connector1->set_incoming_receiver(&accumulator); 411 connector1->set_incoming_receiver(&accumulator);
404 412
405 connector1->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); 413 connector1->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
406 414
407 ASSERT_FALSE(connector1); 415 ASSERT_FALSE(connector1);
408 ASSERT_FALSE(accumulator.IsEmpty()); 416 ASSERT_FALSE(accumulator.IsEmpty());
409 417
410 Message message_received; 418 Message message_received;
(...skipping 11 matching lines...) Expand all
422 internal::Connector connector1(std::move(handle1_), 430 internal::Connector connector1(std::move(handle1_),
423 internal::Connector::SINGLE_THREADED_SEND, 431 internal::Connector::SINGLE_THREADED_SEND,
424 base::ThreadTaskRunnerHandle::Get()); 432 base::ThreadTaskRunnerHandle::Get());
425 433
426 const char* kText[] = {"hello", "world"}; 434 const char* kText[] = {"hello", "world"};
427 435
428 for (size_t i = 0; i < arraysize(kText); ++i) { 436 for (size_t i = 0; i < arraysize(kText); ++i) {
429 Message message; 437 Message message;
430 AllocMessage(kText[i], &message); 438 AllocMessage(kText[i], &message);
431 439
432 connector0.Accept(&message); 440 Error error;
441 connector0.Accept(&message, &error);
433 } 442 }
434 443
435 ReentrantMessageAccumulator accumulator(&connector1); 444 ReentrantMessageAccumulator accumulator(&connector1);
436 connector1.set_incoming_receiver(&accumulator); 445 connector1.set_incoming_receiver(&accumulator);
437 446
438 for (size_t i = 0; i < arraysize(kText); ++i) { 447 for (size_t i = 0; i < arraysize(kText); ++i) {
439 if (accumulator.IsEmpty()) { 448 if (accumulator.IsEmpty()) {
440 base::RunLoop run_loop; 449 base::RunLoop run_loop;
441 accumulator.set_closure(run_loop.QuitClosure()); 450 accumulator.set_closure(run_loop.QuitClosure());
442 run_loop.Run(); 451 run_loop.Run();
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 [&error_handler_called1, &run_loop2]() { 483 [&error_handler_called1, &run_loop2]() {
475 error_handler_called1 = true; 484 error_handler_called1 = true;
476 run_loop2.Quit(); 485 run_loop2.Quit();
477 }); 486 });
478 487
479 const char kText[] = "hello world"; 488 const char kText[] = "hello world";
480 489
481 Message message; 490 Message message;
482 AllocMessage(kText, &message); 491 AllocMessage(kText, &message);
483 492
484 connector0.Accept(&message); 493 Error error;
485 connector0.RaiseError(); 494 connector0.Accept(&message, &error);
495 connector0.RaiseError(std::move(error));
486 496
487 base::RunLoop run_loop3; 497 base::RunLoop run_loop3;
488 MessageAccumulator accumulator(run_loop3.QuitClosure()); 498 MessageAccumulator accumulator(run_loop3.QuitClosure());
489 connector1.set_incoming_receiver(&accumulator); 499 connector1.set_incoming_receiver(&accumulator);
490 500
491 run_loop3.Run(); 501 run_loop3.Run();
492 502
493 // Messages sent prior to RaiseError() still arrive at the other end. 503 // Messages sent prior to RaiseError() still arrive at the other end.
494 ASSERT_FALSE(accumulator.IsEmpty()); 504 ASSERT_FALSE(accumulator.IsEmpty());
495 505
(...skipping 25 matching lines...) Expand all
521 internal::Connector::SINGLE_THREADED_SEND, 531 internal::Connector::SINGLE_THREADED_SEND,
522 base::ThreadTaskRunnerHandle::Get()); 532 base::ThreadTaskRunnerHandle::Get());
523 internal::Connector connector1(std::move(handle1_), 533 internal::Connector connector1(std::move(handle1_),
524 internal::Connector::SINGLE_THREADED_SEND, 534 internal::Connector::SINGLE_THREADED_SEND,
525 base::ThreadTaskRunnerHandle::Get()); 535 base::ThreadTaskRunnerHandle::Get());
526 536
527 const char kText[] = "hello world"; 537 const char kText[] = "hello world";
528 538
529 // Queue up two messages. 539 // Queue up two messages.
530 Message message; 540 Message message;
541 Error error;
531 AllocMessage(kText, &message); 542 AllocMessage(kText, &message);
532 connector0.Accept(&message); 543 connector0.Accept(&message, &error);
533 AllocMessage(kText, &message); 544 AllocMessage(kText, &message);
534 connector0.Accept(&message); 545 connector0.Accept(&message, &error);
535 546
536 base::RunLoop run_loop; 547 base::RunLoop run_loop;
537 // Configure the accumulator such that it pauses after the first message is 548 // Configure the accumulator such that it pauses after the first message is
538 // received. 549 // received.
539 MessageAccumulator accumulator([&connector1, &run_loop]() { 550 MessageAccumulator accumulator([&connector1, &run_loop]() {
540 connector1.PauseIncomingMethodCallProcessing(); 551 connector1.PauseIncomingMethodCallProcessing();
541 run_loop.Quit(); 552 run_loop.Quit();
542 }); 553 });
543 connector1.set_incoming_receiver(&accumulator); 554 connector1.set_incoming_receiver(&accumulator);
544 555
545 run_loop.Run(); 556 run_loop.Run();
546 557
547 // As we paused after the first message we should only have gotten one 558 // As we paused after the first message we should only have gotten one
548 // message. 559 // message.
549 ASSERT_EQ(1u, accumulator.size()); 560 ASSERT_EQ(1u, accumulator.size());
550 } 561 }
551 562
552 TEST_F(ConnectorTest, ProcessWhenNested) { 563 TEST_F(ConnectorTest, ProcessWhenNested) {
553 internal::Connector connector0(std::move(handle0_), 564 internal::Connector connector0(std::move(handle0_),
554 internal::Connector::SINGLE_THREADED_SEND, 565 internal::Connector::SINGLE_THREADED_SEND,
555 base::ThreadTaskRunnerHandle::Get()); 566 base::ThreadTaskRunnerHandle::Get());
556 internal::Connector connector1(std::move(handle1_), 567 internal::Connector connector1(std::move(handle1_),
557 internal::Connector::SINGLE_THREADED_SEND, 568 internal::Connector::SINGLE_THREADED_SEND,
558 base::ThreadTaskRunnerHandle::Get()); 569 base::ThreadTaskRunnerHandle::Get());
559 570
560 const char kText[] = "hello world"; 571 const char kText[] = "hello world";
561 572
562 // Queue up two messages. 573 // Queue up two messages.
563 Message message; 574 Message message;
575 Error error;
564 AllocMessage(kText, &message); 576 AllocMessage(kText, &message);
565 connector0.Accept(&message); 577 connector0.Accept(&message, &error);
566 AllocMessage(kText, &message); 578 AllocMessage(kText, &message);
567 connector0.Accept(&message); 579 connector0.Accept(&message, &error);
568 580
569 base::RunLoop run_loop; 581 base::RunLoop run_loop;
570 MessageAccumulator accumulator; 582 MessageAccumulator accumulator;
571 // When the accumulator gets the first message it spins a nested message 583 // When the accumulator gets the first message it spins a nested message
572 // loop. The loop is quit when another message is received. 584 // loop. The loop is quit when another message is received.
573 accumulator.set_closure([&accumulator, &connector1, &run_loop]() { 585 accumulator.set_closure([&accumulator, &connector1, &run_loop]() {
574 base::RunLoop nested_run_loop; 586 base::RunLoop nested_run_loop;
575 base::MessageLoop::ScopedNestableTaskAllower allow( 587 base::MessageLoop::ScopedNestableTaskAllower allow(
576 base::MessageLoop::current()); 588 base::MessageLoop::current());
577 accumulator.set_closure([&nested_run_loop]() { nested_run_loop.Quit(); }); 589 accumulator.set_closure([&nested_run_loop]() { nested_run_loop.Quit(); });
578 nested_run_loop.Run(); 590 nested_run_loop.Run();
579 run_loop.Quit(); 591 run_loop.Quit();
580 }); 592 });
581 connector1.set_incoming_receiver(&accumulator); 593 connector1.set_incoming_receiver(&accumulator);
582 594
583 run_loop.Run(); 595 run_loop.Run();
584 596
585 ASSERT_EQ(2u, accumulator.size()); 597 ASSERT_EQ(2u, accumulator.size());
586 } 598 }
587 599
588 } // namespace 600 } // namespace
589 } // namespace test 601 } // namespace test
590 } // namespace mojo 602 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698