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 b1148c73689a824f5176df17ab90b2f3761f6059..fafc73f62acb17bcf9b71ecaeb5d7490851fd1e7 100644 |
--- a/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc |
+++ b/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc |
@@ -22,6 +22,7 @@ |
#include "mojo/public/cpp/bindings/associated_interface_request.h" |
#include "mojo/public/cpp/bindings/binding.h" |
#include "mojo/public/cpp/bindings/lib/multiplex_router.h" |
+#include "mojo/public/cpp/bindings/strong_binding.h" |
#include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h" |
#include "mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -160,6 +161,10 @@ base::Callback<void(int32_t)> ExpectValueSetFlagAndRunClosure( |
&DoExpectValueSetFlagAndRunClosure, expected_value, flag, closure); |
} |
+void Fail() { |
+ FAIL() << "Unexpected connection error"; |
+} |
+ |
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. |
@@ -740,6 +745,203 @@ 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); |
+ |
+ IntegerSenderImpl impl0(std::move(request)); |
+ AssociatedInterfacePtr<IntegerSender> ptr0; |
+ ptr0.Bind(std::move(ptr_info)); |
+ ptr0.set_connection_error_handler(base::Bind(&Fail)); |
+ |
+ bool ptr0_callback_run = false; |
+ ptr0->Echo(123, ExpectValueSetFlagAndRunClosure( |
+ 123, &ptr0_callback_run, base::Bind(&base::DoNothing))); |
+ ptr0.FlushForTesting(); |
+ EXPECT_TRUE(ptr0_callback_run); |
+} |
+ |
+void SetBool(bool* value) { |
+ *value = true; |
+} |
+ |
+template <typename T> |
+void SetBoolWithUnusedParameter(bool* value, T unused) { |
+ *value = true; |
+} |
+ |
+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); |
+ |
+ AssociatedInterfacePtr<IntegerSender> ptr0; |
+ ptr0.Bind(std::move(ptr_info)); |
+ bool called = false; |
+ ptr0.set_connection_error_handler(base::Bind(&SetBool, &called)); |
+ request = nullptr; |
+ |
+ ptr0.FlushForTesting(); |
+ EXPECT_TRUE(called); |
+ ptr0.FlushForTesting(); |
+} |
+ |
+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); |
+ |
+ IntegerSenderImpl impl0(std::move(request)); |
+ impl0.set_connection_error_handler(base::Bind(&Fail)); |
+ AssociatedInterfacePtr<IntegerSender> ptr0; |
+ ptr0.Bind(std::move(ptr_info)); |
+ |
+ bool ptr0_callback_run = false; |
+ ptr0->Echo(123, ExpectValueSetFlagAndRunClosure( |
+ 123, &ptr0_callback_run, base::Bind(&base::DoNothing))); |
+ // Because the flush is sent from the binding, it only guarantees that the |
+ // request has been received, not the response. The second flush waits for the |
+ // response to be received. |
+ impl0.binding()->FlushForTesting(); |
+ impl0.binding()->FlushForTesting(); |
+ EXPECT_TRUE(ptr0_callback_run); |
+} |
+ |
+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())); |
+ |
+ AssociatedInterfaceRequest<IntegerSender> request; |
+ { |
+ IntegerSenderAssociatedPtrInfo ptr_info; |
+ |
+ router0->CreateAssociatedGroup()->CreateAssociatedInterface( |
+ AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request); |
+ } |
+ |
+ IntegerSenderImpl impl(std::move(request)); |
+ bool called = false; |
+ impl.set_connection_error_handler(base::Bind(&SetBool, &called)); |
+ impl.binding()->FlushForTesting(); |
+ EXPECT_TRUE(called); |
+ impl.binding()->FlushForTesting(); |
+} |
+ |
+TEST_F(AssociatedInterfaceTest, BindingFlushForTesting) { |
+ IntegerSenderConnectionPtr ptr; |
+ IntegerSenderConnectionImpl impl(GetProxy(&ptr)); |
+ bool called = false; |
+ ptr->AsyncGetSender(base::Bind( |
+ &SetBoolWithUnusedParameter<IntegerSenderAssociatedPtrInfo>, &called)); |
+ EXPECT_FALSE(called); |
+ impl.binding()->set_connection_error_handler(base::Bind(&Fail)); |
+ // Because the flush is sent from the binding, it only guarantees that the |
+ // request has been received, not the response. The second flush waits for the |
+ // response to be received. |
+ impl.binding()->FlushForTesting(); |
+ impl.binding()->FlushForTesting(); |
+ EXPECT_TRUE(called); |
+} |
+ |
+TEST_F(AssociatedInterfaceTest, BindingFlushForTestingWithClosedPeer) { |
+ IntegerSenderConnectionPtr ptr; |
+ IntegerSenderConnectionImpl impl(GetProxy(&ptr)); |
+ bool called = false; |
+ impl.binding()->set_connection_error_handler(base::Bind(&SetBool, &called)); |
+ ptr.reset(); |
+ EXPECT_FALSE(called); |
+ impl.binding()->FlushForTesting(); |
+ EXPECT_TRUE(called); |
+ impl.binding()->FlushForTesting(); |
+} |
+ |
+TEST_F(AssociatedInterfaceTest, StrongBindingFlushForTesting) { |
+ IntegerSenderConnectionPtr ptr; |
+ IntegerSenderConnectionImpl impl(IntegerSenderConnectionRequest{}); |
+ mojo::StrongBinding<IntegerSenderConnection> binding(&impl, GetProxy(&ptr)); |
+ binding.set_connection_error_handler(base::Bind(&Fail)); |
+ bool called = false; |
+ IntegerSenderAssociatedPtr sender_ptr; |
+ ptr->GetSender(GetProxy(&sender_ptr, ptr.associated_group())); |
+ sender_ptr->Echo(1, base::Bind(&SetBoolWithUnusedParameter<int>, &called)); |
+ EXPECT_FALSE(called); |
+ // Because the flush is sent from the binding, it only guarantees that the |
+ // request has been received, not the response. The second flush waits for the |
+ // response to be received. |
+ binding.FlushForTesting(); |
+ binding.FlushForTesting(); |
+ EXPECT_TRUE(called); |
+} |
+ |
+TEST_F(AssociatedInterfaceTest, StrongBindingFlushForTestingWithClosedPeer) { |
+ IntegerSenderConnectionPtr ptr; |
+ mojo::StrongBinding<IntegerSenderConnection> binding( |
+ new IntegerSenderConnectionImpl(IntegerSenderConnectionRequest{}), |
+ GetProxy(&ptr)); |
+ bool called = false; |
+ binding.set_connection_error_handler(base::Bind(&SetBool, &called)); |
+ ptr.reset(); |
+ EXPECT_FALSE(called); |
+ binding.FlushForTesting(); |
+ EXPECT_TRUE(called); |
+ binding.FlushForTesting(); |
+} |
+ |
+TEST_F(AssociatedInterfaceTest, PtrFlushForTesting) { |
+ IntegerSenderConnectionPtr ptr; |
+ IntegerSenderConnectionImpl impl(GetProxy(&ptr)); |
+ bool called = false; |
+ ptr.set_connection_error_handler(base::Bind(&Fail)); |
+ ptr->AsyncGetSender(base::Bind( |
+ &SetBoolWithUnusedParameter<IntegerSenderAssociatedPtrInfo>, &called)); |
+ EXPECT_FALSE(called); |
+ ptr.FlushForTesting(); |
+ EXPECT_TRUE(called); |
+} |
+ |
+TEST_F(AssociatedInterfaceTest, PtrFlushForTestingWithClosedPeer) { |
+ IntegerSenderConnectionPtr ptr; |
+ GetProxy(&ptr); |
+ bool called = false; |
+ ptr.set_connection_error_handler(base::Bind(&SetBool, &called)); |
+ EXPECT_FALSE(called); |
+ ptr.FlushForTesting(); |
+ EXPECT_TRUE(called); |
+ ptr.FlushForTesting(); |
+} |
+ |
} // namespace |
} // namespace test |
} // namespace mojo |