Index: mojo/public/cpp/bindings/tests/associated_interface_unittest.cc |
diff --git a/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc b/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc |
index 32f0570bb3730b6e6b56ab327f2f64392352315f..b760e9e3aaa3387616cfbe3004e0e620012f1801 100644 |
--- a/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc |
+++ b/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc |
@@ -110,14 +110,32 @@ class AssociatedInterfaceTest : public testing::Test { |
ptr_info.version()); |
} |
- template <typename T> |
- AssociatedInterfaceRequest<T> EmulatePassingAssociatedRequest( |
- AssociatedInterfaceRequest<T> request, |
- scoped_refptr<MultiplexRouter> target) { |
- ScopedInterfaceEndpointHandle handle = request.PassHandle(); |
- CHECK(!handle.is_local()); |
- return MakeAssociatedRequest<T>( |
- target->CreateLocalEndpointHandle(handle.release())); |
+ void CreateRouterPair(scoped_refptr<MultiplexRouter>* router0, |
+ scoped_refptr<MultiplexRouter>* router1) { |
+ MessagePipe pipe; |
+ *router0 = new MultiplexRouter(true, std::move(pipe.handle0), |
+ base::ThreadTaskRunnerHandle::Get()); |
+ *router1 = new MultiplexRouter(false, std::move(pipe.handle1), |
+ base::ThreadTaskRunnerHandle::Get()); |
+ } |
+ |
+ void CreateIntegerSenderWithExistingRouters( |
+ scoped_refptr<MultiplexRouter> router0, |
+ IntegerSenderAssociatedPtrInfo* ptr_info0, |
+ scoped_refptr<MultiplexRouter> router1, |
+ IntegerSenderAssociatedRequest* request1) { |
+ router1->CreateAssociatedGroup()->CreateAssociatedInterface( |
+ AssociatedGroup::WILL_PASS_PTR, ptr_info0, request1); |
+ *ptr_info0 = |
+ EmulatePassingAssociatedPtrInfo(std::move(*ptr_info0), router0); |
+ } |
+ |
+ void CreateIntegerSender(IntegerSenderAssociatedPtrInfo* ptr_info, |
+ IntegerSenderAssociatedRequest* request) { |
+ scoped_refptr<MultiplexRouter> router0; |
+ scoped_refptr<MultiplexRouter> router1; |
+ CreateRouterPair(&router0, &router1); |
+ CreateIntegerSenderWithExistingRouters(router1, ptr_info, router0, request); |
} |
// Okay to call from any thread. |
@@ -169,26 +187,19 @@ TEST_F(AssociatedInterfaceTest, InterfacesAtBothEnds) { |
// Bind to the same pipe two associated interfaces, whose implementation lives |
// at different ends. Test that the two don't interfere with each other. |
- MessagePipe pipe; |
- scoped_refptr<MultiplexRouter> router0(new MultiplexRouter( |
- true, std::move(pipe.handle0), base::ThreadTaskRunnerHandle::Get())); |
- scoped_refptr<MultiplexRouter> router1(new MultiplexRouter( |
- false, std::move(pipe.handle1), base::ThreadTaskRunnerHandle::Get())); |
+ scoped_refptr<MultiplexRouter> router0; |
+ scoped_refptr<MultiplexRouter> router1; |
+ CreateRouterPair(&router0, &router1); |
AssociatedInterfaceRequest<IntegerSender> request; |
IntegerSenderAssociatedPtrInfo ptr_info; |
- |
- router0->CreateAssociatedGroup()->CreateAssociatedInterface( |
- AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request); |
- ptr_info = EmulatePassingAssociatedPtrInfo(std::move(ptr_info), router1); |
+ CreateIntegerSenderWithExistingRouters(router1, &ptr_info, router0, &request); |
IntegerSenderImpl impl0(std::move(request)); |
AssociatedInterfacePtr<IntegerSender> ptr0; |
ptr0.Bind(std::move(ptr_info)); |
- router0->CreateAssociatedGroup()->CreateAssociatedInterface( |
- AssociatedGroup::WILL_PASS_REQUEST, &ptr_info, &request); |
- request = EmulatePassingAssociatedRequest(std::move(request), router1); |
+ CreateIntegerSenderWithExistingRouters(router0, &ptr_info, router1, &request); |
IntegerSenderImpl impl1(std::move(request)); |
AssociatedInterfacePtr<IntegerSender> ptr1; |
@@ -365,19 +376,15 @@ TEST_F(AssociatedInterfaceTest, MultiThreadAccess) { |
const int32_t kMaxValue = 1000; |
MessagePipe pipe; |
- scoped_refptr<MultiplexRouter> router0(new MultiplexRouter( |
- true, std::move(pipe.handle0), base::ThreadTaskRunnerHandle::Get())); |
- scoped_refptr<MultiplexRouter> router1(new MultiplexRouter( |
- false, std::move(pipe.handle1), base::ThreadTaskRunnerHandle::Get())); |
+ scoped_refptr<MultiplexRouter> router0; |
+ scoped_refptr<MultiplexRouter> router1; |
+ CreateRouterPair(&router0, &router1); |
AssociatedInterfaceRequest<IntegerSender> requests[4]; |
IntegerSenderAssociatedPtrInfo ptr_infos[4]; |
- |
for (size_t i = 0; i < 4; ++i) { |
- router0->CreateAssociatedGroup()->CreateAssociatedInterface( |
- AssociatedGroup::WILL_PASS_PTR, &ptr_infos[i], &requests[i]); |
- ptr_infos[i] = |
- EmulatePassingAssociatedPtrInfo(std::move(ptr_infos[i]), router1); |
+ CreateIntegerSenderWithExistingRouters(router1, &ptr_infos[i], router0, |
+ &requests[i]); |
} |
TestSender senders[4]; |
@@ -454,19 +461,15 @@ TEST_F(AssociatedInterfaceTest, FIFO) { |
const int32_t kMaxValue = 100; |
MessagePipe pipe; |
- scoped_refptr<MultiplexRouter> router0(new MultiplexRouter( |
- true, std::move(pipe.handle0), base::ThreadTaskRunnerHandle::Get())); |
- scoped_refptr<MultiplexRouter> router1(new MultiplexRouter( |
- false, std::move(pipe.handle1), base::ThreadTaskRunnerHandle::Get())); |
+ scoped_refptr<MultiplexRouter> router0; |
+ scoped_refptr<MultiplexRouter> router1; |
+ CreateRouterPair(&router0, &router1); |
AssociatedInterfaceRequest<IntegerSender> requests[4]; |
IntegerSenderAssociatedPtrInfo ptr_infos[4]; |
- |
for (size_t i = 0; i < 4; ++i) { |
- router0->CreateAssociatedGroup()->CreateAssociatedInterface( |
- AssociatedGroup::WILL_PASS_PTR, &ptr_infos[i], &requests[i]); |
- ptr_infos[i] = |
- EmulatePassingAssociatedPtrInfo(std::move(ptr_infos[i]), router1); |
+ CreateIntegerSenderWithExistingRouters(router1, &ptr_infos[i], router0, |
+ &requests[i]); |
} |
TestSender senders[4]; |
@@ -746,18 +749,9 @@ TEST_F(AssociatedInterfaceTest, BindingWithFilters) { |
} |
TEST_F(AssociatedInterfaceTest, AssociatedPtrFlushForTesting) { |
- MessagePipe pipe; |
- scoped_refptr<MultiplexRouter> router0(new MultiplexRouter( |
- true, std::move(pipe.handle0), base::ThreadTaskRunnerHandle::Get())); |
- scoped_refptr<MultiplexRouter> router1(new MultiplexRouter( |
- false, std::move(pipe.handle1), base::ThreadTaskRunnerHandle::Get())); |
- |
AssociatedInterfaceRequest<IntegerSender> request; |
IntegerSenderAssociatedPtrInfo ptr_info; |
- |
- router0->CreateAssociatedGroup()->CreateAssociatedInterface( |
- AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request); |
- ptr_info = EmulatePassingAssociatedPtrInfo(std::move(ptr_info), router1); |
+ CreateIntegerSender(&ptr_info, &request); |
IntegerSenderImpl impl0(std::move(request)); |
AssociatedInterfacePtr<IntegerSender> ptr0; |
@@ -781,18 +775,9 @@ void SetBoolWithUnusedParameter(bool* value, T unused) { |
} |
TEST_F(AssociatedInterfaceTest, AssociatedPtrFlushForTestingWithClosedPeer) { |
- MessagePipe pipe; |
- scoped_refptr<MultiplexRouter> router0(new MultiplexRouter( |
- true, std::move(pipe.handle0), base::ThreadTaskRunnerHandle::Get())); |
- scoped_refptr<MultiplexRouter> router1(new MultiplexRouter( |
- false, std::move(pipe.handle1), base::ThreadTaskRunnerHandle::Get())); |
- |
AssociatedInterfaceRequest<IntegerSender> request; |
IntegerSenderAssociatedPtrInfo ptr_info; |
- |
- router0->CreateAssociatedGroup()->CreateAssociatedInterface( |
- AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request); |
- ptr_info = EmulatePassingAssociatedPtrInfo(std::move(ptr_info), router1); |
+ CreateIntegerSender(&ptr_info, &request); |
AssociatedInterfacePtr<IntegerSender> ptr0; |
ptr0.Bind(std::move(ptr_info)); |
@@ -806,18 +791,9 @@ TEST_F(AssociatedInterfaceTest, AssociatedPtrFlushForTestingWithClosedPeer) { |
} |
TEST_F(AssociatedInterfaceTest, AssociatedBindingFlushForTesting) { |
- MessagePipe pipe; |
- scoped_refptr<MultiplexRouter> router0(new MultiplexRouter( |
- true, std::move(pipe.handle0), base::ThreadTaskRunnerHandle::Get())); |
- scoped_refptr<MultiplexRouter> router1(new MultiplexRouter( |
- false, std::move(pipe.handle1), base::ThreadTaskRunnerHandle::Get())); |
- |
AssociatedInterfaceRequest<IntegerSender> request; |
IntegerSenderAssociatedPtrInfo ptr_info; |
- |
- router0->CreateAssociatedGroup()->CreateAssociatedInterface( |
- AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request); |
- ptr_info = EmulatePassingAssociatedPtrInfo(std::move(ptr_info), router1); |
+ CreateIntegerSender(&ptr_info, &request); |
IntegerSenderImpl impl0(std::move(request)); |
impl0.set_connection_error_handler(base::Bind(&Fail)); |
@@ -837,18 +813,15 @@ TEST_F(AssociatedInterfaceTest, AssociatedBindingFlushForTesting) { |
TEST_F(AssociatedInterfaceTest, |
AssociatedBindingFlushForTestingWithClosedPeer) { |
- MessagePipe pipe; |
- scoped_refptr<MultiplexRouter> router0(new MultiplexRouter( |
- true, std::move(pipe.handle0), base::ThreadTaskRunnerHandle::Get())); |
- scoped_refptr<MultiplexRouter> router1(new MultiplexRouter( |
- false, std::move(pipe.handle1), base::ThreadTaskRunnerHandle::Get())); |
+ scoped_refptr<MultiplexRouter> router0; |
+ scoped_refptr<MultiplexRouter> router1; |
+ CreateRouterPair(&router0, &router1); |
AssociatedInterfaceRequest<IntegerSender> request; |
{ |
IntegerSenderAssociatedPtrInfo ptr_info; |
- |
- router0->CreateAssociatedGroup()->CreateAssociatedInterface( |
- AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request); |
+ CreateIntegerSenderWithExistingRouters(router1, &ptr_info, router0, |
+ &request); |
} |
IntegerSenderImpl impl(std::move(request)); |
@@ -947,6 +920,54 @@ TEST_F(AssociatedInterfaceTest, PtrFlushForTestingWithClosedPeer) { |
ptr.FlushForTesting(); |
} |
+TEST_F(AssociatedInterfaceTest, AssociatedBindingConnectionErrorWithReason) { |
+ AssociatedInterfaceRequest<IntegerSender> request; |
+ IntegerSenderAssociatedPtrInfo ptr_info; |
+ CreateIntegerSender(&ptr_info, &request); |
+ |
+ IntegerSenderImpl impl(std::move(request)); |
+ AssociatedInterfacePtr<IntegerSender> ptr; |
+ ptr.Bind(std::move(ptr_info)); |
+ |
+ base::RunLoop run_loop; |
+ impl.binding()->set_connection_error_with_reason_handler(base::Bind( |
+ [](const base::Closure& quit_closure, uint32_t custom_reason, |
+ const std::string& description) { |
+ EXPECT_EQ(123u, custom_reason); |
+ EXPECT_EQ("farewell", description); |
+ quit_closure.Run(); |
+ }, |
+ run_loop.QuitClosure())); |
+ |
+ ptr.ResetWithReason(123u, "farewell"); |
+ |
+ run_loop.Run(); |
+} |
+ |
+TEST_F(AssociatedInterfaceTest, AssociatedPtrConnectionErrorWithReason) { |
+ AssociatedInterfaceRequest<IntegerSender> request; |
+ IntegerSenderAssociatedPtrInfo ptr_info; |
+ CreateIntegerSender(&ptr_info, &request); |
+ |
+ IntegerSenderImpl impl(std::move(request)); |
+ AssociatedInterfacePtr<IntegerSender> ptr; |
+ ptr.Bind(std::move(ptr_info)); |
+ |
+ base::RunLoop run_loop; |
+ ptr.set_connection_error_with_reason_handler(base::Bind( |
+ [](const base::Closure& quit_closure, uint32_t custom_reason, |
+ const std::string& description) { |
+ EXPECT_EQ(456u, custom_reason); |
+ EXPECT_EQ("farewell", description); |
+ quit_closure.Run(); |
+ }, |
+ run_loop.QuitClosure())); |
+ |
+ impl.binding()->CloseWithReason(456u, "farewell"); |
+ |
+ run_loop.Run(); |
+} |
+ |
} // namespace |
} // namespace test |
} // namespace mojo |