OLD | NEW |
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 Result Accept(Message* message) 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 Result::ForSuccess(); |
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 Result Accept(Message* message) override { |
57 delete *connector_; | 57 delete *connector_; |
58 *connector_ = nullptr; | 58 *connector_ = nullptr; |
59 return MessageAccumulator::Accept(message); | 59 return MessageAccumulator::Accept(message); |
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 Result Accept(Message* message) override { |
72 if (!MessageAccumulator::Accept(message)) | 72 Result result = MessageAccumulator::Accept(message); |
73 return false; | 73 if (!result.Succeeded()) |
| 74 return result; |
74 number_of_calls_++; | 75 number_of_calls_++; |
75 if (number_of_calls_ == 1) { | 76 if (number_of_calls_ == 1) { |
76 return connector_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); | 77 bool result = |
| 78 connector_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); |
| 79 DCHECK(result); |
| 80 return Result::ForSuccess(); |
77 } | 81 } |
78 return true; | 82 return Result::ForSuccess(); |
79 } | 83 } |
80 | 84 |
81 int number_of_calls() { return number_of_calls_; } | 85 int number_of_calls() { return number_of_calls_; } |
82 | 86 |
83 private: | 87 private: |
84 internal::Connector* connector_; | 88 internal::Connector* connector_; |
85 int number_of_calls_; | 89 int number_of_calls_; |
86 }; | 90 }; |
87 | 91 |
88 class ConnectorTest : public testing::Test { | 92 class ConnectorTest : public testing::Test { |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 Message message; | 288 Message message; |
285 AllocMessage(kText, &message); | 289 AllocMessage(kText, &message); |
286 | 290 |
287 // Close the other end of the pipe. | 291 // Close the other end of the pipe. |
288 handle1_.reset(); | 292 handle1_.reset(); |
289 | 293 |
290 // Not observed yet because we haven't spun the message loop yet. | 294 // Not observed yet because we haven't spun the message loop yet. |
291 EXPECT_FALSE(connector0.encountered_error()); | 295 EXPECT_FALSE(connector0.encountered_error()); |
292 | 296 |
293 // Write failures are not reported. | 297 // Write failures are not reported. |
294 bool ok = connector0.Accept(&message); | 298 MessageReceiver::Result result = connector0.Accept(&message); |
295 EXPECT_TRUE(ok); | 299 EXPECT_TRUE(result.Succeeded()); |
296 | 300 |
297 // Still not observed. | 301 // Still not observed. |
298 EXPECT_FALSE(connector0.encountered_error()); | 302 EXPECT_FALSE(connector0.encountered_error()); |
299 | 303 |
300 // Spin the message loop, and then we should start observing the closed pipe. | 304 // Spin the message loop, and then we should start observing the closed pipe. |
301 base::RunLoop run_loop; | 305 base::RunLoop run_loop; |
302 connector0.set_connection_error_handler(run_loop.QuitClosure()); | 306 connector0.set_connection_error_handler(run_loop.QuitClosure()); |
303 run_loop.Run(); | 307 run_loop.Run(); |
304 | 308 |
305 EXPECT_TRUE(connector0.encountered_error()); | 309 EXPECT_TRUE(connector0.encountered_error()); |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
475 error_handler_called1 = true; | 479 error_handler_called1 = true; |
476 run_loop2.Quit(); | 480 run_loop2.Quit(); |
477 }); | 481 }); |
478 | 482 |
479 const char kText[] = "hello world"; | 483 const char kText[] = "hello world"; |
480 | 484 |
481 Message message; | 485 Message message; |
482 AllocMessage(kText, &message); | 486 AllocMessage(kText, &message); |
483 | 487 |
484 connector0.Accept(&message); | 488 connector0.Accept(&message); |
485 connector0.RaiseError(); | 489 connector0.RaiseError(MessageReceiver::Result::ForUnknownError()); |
486 | 490 |
487 base::RunLoop run_loop3; | 491 base::RunLoop run_loop3; |
488 MessageAccumulator accumulator(run_loop3.QuitClosure()); | 492 MessageAccumulator accumulator(run_loop3.QuitClosure()); |
489 connector1.set_incoming_receiver(&accumulator); | 493 connector1.set_incoming_receiver(&accumulator); |
490 | 494 |
491 run_loop3.Run(); | 495 run_loop3.Run(); |
492 | 496 |
493 // Messages sent prior to RaiseError() still arrive at the other end. | 497 // Messages sent prior to RaiseError() still arrive at the other end. |
494 ASSERT_FALSE(accumulator.IsEmpty()); | 498 ASSERT_FALSE(accumulator.IsEmpty()); |
495 | 499 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 connector1.set_incoming_receiver(&accumulator); | 585 connector1.set_incoming_receiver(&accumulator); |
582 | 586 |
583 run_loop.Run(); | 587 run_loop.Run(); |
584 | 588 |
585 ASSERT_EQ(2u, accumulator.size()); | 589 ASSERT_EQ(2u, accumulator.size()); |
586 } | 590 } |
587 | 591 |
588 } // namespace | 592 } // namespace |
589 } // namespace test | 593 } // namespace test |
590 } // namespace mojo | 594 } // namespace mojo |
OLD | NEW |