| 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 |