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

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

Issue 2318793002: Mojo C++ bindings: support disconnect with a reason. (Closed)
Patch Set: . Created 4 years, 3 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 AssociatedInterfacePtrInfo<T> EmulatePassingAssociatedPtrInfo( 103 AssociatedInterfacePtrInfo<T> EmulatePassingAssociatedPtrInfo(
104 AssociatedInterfacePtrInfo<T> ptr_info, 104 AssociatedInterfacePtrInfo<T> ptr_info,
105 scoped_refptr<MultiplexRouter> target) { 105 scoped_refptr<MultiplexRouter> target) {
106 ScopedInterfaceEndpointHandle handle = ptr_info.PassHandle(); 106 ScopedInterfaceEndpointHandle handle = ptr_info.PassHandle();
107 CHECK(!handle.is_local()); 107 CHECK(!handle.is_local());
108 return AssociatedInterfacePtrInfo<T>( 108 return AssociatedInterfacePtrInfo<T>(
109 target->CreateLocalEndpointHandle(handle.release()), 109 target->CreateLocalEndpointHandle(handle.release()),
110 ptr_info.version()); 110 ptr_info.version());
111 } 111 }
112 112
113 template <typename T> 113 void CreateRouterPair(scoped_refptr<MultiplexRouter>* router0,
114 AssociatedInterfaceRequest<T> EmulatePassingAssociatedRequest( 114 scoped_refptr<MultiplexRouter>* router1) {
115 AssociatedInterfaceRequest<T> request, 115 MessagePipe pipe;
116 scoped_refptr<MultiplexRouter> target) { 116 *router0 = new MultiplexRouter(true, std::move(pipe.handle0),
117 ScopedInterfaceEndpointHandle handle = request.PassHandle(); 117 base::ThreadTaskRunnerHandle::Get());
118 CHECK(!handle.is_local()); 118 *router1 = new MultiplexRouter(false, std::move(pipe.handle1),
119 return MakeAssociatedRequest<T>( 119 base::ThreadTaskRunnerHandle::Get());
120 target->CreateLocalEndpointHandle(handle.release())); 120 }
121
122 void CreateIntegerSenderWithExistingRouters(
123 scoped_refptr<MultiplexRouter> router0,
124 IntegerSenderAssociatedPtrInfo* ptr_info0,
125 scoped_refptr<MultiplexRouter> router1,
126 IntegerSenderAssociatedRequest* request1) {
127 router1->CreateAssociatedGroup()->CreateAssociatedInterface(
128 AssociatedGroup::WILL_PASS_PTR, ptr_info0, request1);
129 *ptr_info0 =
130 EmulatePassingAssociatedPtrInfo(std::move(*ptr_info0), router0);
131 }
132
133 void CreateIntegerSender(IntegerSenderAssociatedPtrInfo* ptr_info,
134 IntegerSenderAssociatedRequest* request) {
135 scoped_refptr<MultiplexRouter> router0;
136 scoped_refptr<MultiplexRouter> router1;
137 CreateRouterPair(&router0, &router1);
138 CreateIntegerSenderWithExistingRouters(router1, ptr_info, router0, request);
121 } 139 }
122 140
123 // Okay to call from any thread. 141 // Okay to call from any thread.
124 void QuitRunLoop(base::RunLoop* run_loop) { 142 void QuitRunLoop(base::RunLoop* run_loop) {
125 if (loop_.task_runner()->BelongsToCurrentThread()) { 143 if (loop_.task_runner()->BelongsToCurrentThread()) {
126 run_loop->Quit(); 144 run_loop->Quit();
127 } else { 145 } else {
128 loop_.task_runner()->PostTask( 146 loop_.task_runner()->PostTask(
129 FROM_HERE, 147 FROM_HERE,
130 base::Bind(&AssociatedInterfaceTest::QuitRunLoop, 148 base::Bind(&AssociatedInterfaceTest::QuitRunLoop,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 } 180 }
163 181
164 void Fail() { 182 void Fail() {
165 FAIL() << "Unexpected connection error"; 183 FAIL() << "Unexpected connection error";
166 } 184 }
167 185
168 TEST_F(AssociatedInterfaceTest, InterfacesAtBothEnds) { 186 TEST_F(AssociatedInterfaceTest, InterfacesAtBothEnds) {
169 // Bind to the same pipe two associated interfaces, whose implementation lives 187 // Bind to the same pipe two associated interfaces, whose implementation lives
170 // at different ends. Test that the two don't interfere with each other. 188 // at different ends. Test that the two don't interfere with each other.
171 189
172 MessagePipe pipe; 190 scoped_refptr<MultiplexRouter> router0;
173 scoped_refptr<MultiplexRouter> router0(new MultiplexRouter( 191 scoped_refptr<MultiplexRouter> router1;
174 true, std::move(pipe.handle0), base::ThreadTaskRunnerHandle::Get())); 192 CreateRouterPair(&router0, &router1);
175 scoped_refptr<MultiplexRouter> router1(new MultiplexRouter(
176 false, std::move(pipe.handle1), base::ThreadTaskRunnerHandle::Get()));
177 193
178 AssociatedInterfaceRequest<IntegerSender> request; 194 AssociatedInterfaceRequest<IntegerSender> request;
179 IntegerSenderAssociatedPtrInfo ptr_info; 195 IntegerSenderAssociatedPtrInfo ptr_info;
180 196 CreateIntegerSenderWithExistingRouters(router1, &ptr_info, router0, &request);
181 router0->CreateAssociatedGroup()->CreateAssociatedInterface(
182 AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request);
183 ptr_info = EmulatePassingAssociatedPtrInfo(std::move(ptr_info), router1);
184 197
185 IntegerSenderImpl impl0(std::move(request)); 198 IntegerSenderImpl impl0(std::move(request));
186 AssociatedInterfacePtr<IntegerSender> ptr0; 199 AssociatedInterfacePtr<IntegerSender> ptr0;
187 ptr0.Bind(std::move(ptr_info)); 200 ptr0.Bind(std::move(ptr_info));
188 201
189 router0->CreateAssociatedGroup()->CreateAssociatedInterface( 202 CreateIntegerSenderWithExistingRouters(router0, &ptr_info, router1, &request);
190 AssociatedGroup::WILL_PASS_REQUEST, &ptr_info, &request);
191 request = EmulatePassingAssociatedRequest(std::move(request), router1);
192 203
193 IntegerSenderImpl impl1(std::move(request)); 204 IntegerSenderImpl impl1(std::move(request));
194 AssociatedInterfacePtr<IntegerSender> ptr1; 205 AssociatedInterfacePtr<IntegerSender> ptr1;
195 ptr1.Bind(std::move(ptr_info)); 206 ptr1.Bind(std::move(ptr_info));
196 207
197 base::RunLoop run_loop, run_loop2; 208 base::RunLoop run_loop, run_loop2;
198 bool ptr0_callback_run = false; 209 bool ptr0_callback_run = false;
199 ptr0->Echo(123, ExpectValueSetFlagAndRunClosure(123, &ptr0_callback_run, 210 ptr0->Echo(123, ExpectValueSetFlagAndRunClosure(123, &ptr0_callback_run,
200 run_loop.QuitClosure())); 211 run_loop.QuitClosure()));
201 212
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 base::Closure notify_finish_; 369 base::Closure notify_finish_;
359 }; 370 };
360 371
361 TEST_F(AssociatedInterfaceTest, MultiThreadAccess) { 372 TEST_F(AssociatedInterfaceTest, MultiThreadAccess) {
362 // Set up four associated interfaces on a message pipe. Use the inteface 373 // Set up four associated interfaces on a message pipe. Use the inteface
363 // pointers on four threads in parallel; run the interface implementations on 374 // pointers on four threads in parallel; run the interface implementations on
364 // two threads. Test that multi-threaded access works. 375 // two threads. Test that multi-threaded access works.
365 376
366 const int32_t kMaxValue = 1000; 377 const int32_t kMaxValue = 1000;
367 MessagePipe pipe; 378 MessagePipe pipe;
368 scoped_refptr<MultiplexRouter> router0(new MultiplexRouter( 379 scoped_refptr<MultiplexRouter> router0;
369 true, std::move(pipe.handle0), base::ThreadTaskRunnerHandle::Get())); 380 scoped_refptr<MultiplexRouter> router1;
370 scoped_refptr<MultiplexRouter> router1(new MultiplexRouter( 381 CreateRouterPair(&router0, &router1);
371 false, std::move(pipe.handle1), base::ThreadTaskRunnerHandle::Get()));
372 382
373 AssociatedInterfaceRequest<IntegerSender> requests[4]; 383 AssociatedInterfaceRequest<IntegerSender> requests[4];
374 IntegerSenderAssociatedPtrInfo ptr_infos[4]; 384 IntegerSenderAssociatedPtrInfo ptr_infos[4];
375
376 for (size_t i = 0; i < 4; ++i) { 385 for (size_t i = 0; i < 4; ++i) {
377 router0->CreateAssociatedGroup()->CreateAssociatedInterface( 386 CreateIntegerSenderWithExistingRouters(router1, &ptr_infos[i], router0,
378 AssociatedGroup::WILL_PASS_PTR, &ptr_infos[i], &requests[i]); 387 &requests[i]);
379 ptr_infos[i] =
380 EmulatePassingAssociatedPtrInfo(std::move(ptr_infos[i]), router1);
381 } 388 }
382 389
383 TestSender senders[4]; 390 TestSender senders[4];
384 for (size_t i = 0; i < 4; ++i) { 391 for (size_t i = 0; i < 4; ++i) {
385 senders[i].sender_thread()->task_runner()->PostTask( 392 senders[i].sender_thread()->task_runner()->PostTask(
386 FROM_HERE, base::Bind(&TestSender::SetUp, base::Unretained(&senders[i]), 393 FROM_HERE, base::Bind(&TestSender::SetUp, base::Unretained(&senders[i]),
387 base::Passed(&ptr_infos[i]), nullptr, 394 base::Passed(&ptr_infos[i]), nullptr,
388 kMaxValue * (i + 1) / 4)); 395 kMaxValue * (i + 1) / 4));
389 } 396 }
390 397
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 } 454 }
448 455
449 TEST_F(AssociatedInterfaceTest, FIFO) { 456 TEST_F(AssociatedInterfaceTest, FIFO) {
450 // Set up four associated interfaces on a message pipe. Use the inteface 457 // Set up four associated interfaces on a message pipe. Use the inteface
451 // pointers on four threads; run the interface implementations on two threads. 458 // pointers on four threads; run the interface implementations on two threads.
452 // Take turns to make calls using the four pointers. Test that FIFO-ness is 459 // Take turns to make calls using the four pointers. Test that FIFO-ness is
453 // preserved. 460 // preserved.
454 461
455 const int32_t kMaxValue = 100; 462 const int32_t kMaxValue = 100;
456 MessagePipe pipe; 463 MessagePipe pipe;
457 scoped_refptr<MultiplexRouter> router0(new MultiplexRouter( 464 scoped_refptr<MultiplexRouter> router0;
458 true, std::move(pipe.handle0), base::ThreadTaskRunnerHandle::Get())); 465 scoped_refptr<MultiplexRouter> router1;
459 scoped_refptr<MultiplexRouter> router1(new MultiplexRouter( 466 CreateRouterPair(&router0, &router1);
460 false, std::move(pipe.handle1), base::ThreadTaskRunnerHandle::Get()));
461 467
462 AssociatedInterfaceRequest<IntegerSender> requests[4]; 468 AssociatedInterfaceRequest<IntegerSender> requests[4];
463 IntegerSenderAssociatedPtrInfo ptr_infos[4]; 469 IntegerSenderAssociatedPtrInfo ptr_infos[4];
464
465 for (size_t i = 0; i < 4; ++i) { 470 for (size_t i = 0; i < 4; ++i) {
466 router0->CreateAssociatedGroup()->CreateAssociatedInterface( 471 CreateIntegerSenderWithExistingRouters(router1, &ptr_infos[i], router0,
467 AssociatedGroup::WILL_PASS_PTR, &ptr_infos[i], &requests[i]); 472 &requests[i]);
468 ptr_infos[i] =
469 EmulatePassingAssociatedPtrInfo(std::move(ptr_infos[i]), router1);
470 } 473 }
471 474
472 TestSender senders[4]; 475 TestSender senders[4];
473 for (size_t i = 0; i < 4; ++i) { 476 for (size_t i = 0; i < 4; ++i) {
474 senders[i].sender_thread()->task_runner()->PostTask( 477 senders[i].sender_thread()->task_runner()->PostTask(
475 FROM_HERE, 478 FROM_HERE,
476 base::Bind(&TestSender::SetUp, base::Unretained(&senders[i]), 479 base::Bind(&TestSender::SetUp, base::Unretained(&senders[i]),
477 base::Passed(&ptr_infos[i]), 480 base::Passed(&ptr_infos[i]),
478 base::Unretained(&senders[(i + 1) % 4]), kMaxValue)); 481 base::Unretained(&senders[(i + 1) % 4]), kMaxValue));
479 } 482 }
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 ping_b->Ping(loop.QuitClosure()); 742 ping_b->Ping(loop.QuitClosure());
740 loop.Run(); 743 loop.Run();
741 } 744 }
742 745
743 EXPECT_EQ(3, a_status); 746 EXPECT_EQ(3, a_status);
744 EXPECT_EQ(3, b_status); 747 EXPECT_EQ(3, b_status);
745 } 748 }
746 } 749 }
747 750
748 TEST_F(AssociatedInterfaceTest, AssociatedPtrFlushForTesting) { 751 TEST_F(AssociatedInterfaceTest, AssociatedPtrFlushForTesting) {
749 MessagePipe pipe;
750 scoped_refptr<MultiplexRouter> router0(new MultiplexRouter(
751 true, std::move(pipe.handle0), base::ThreadTaskRunnerHandle::Get()));
752 scoped_refptr<MultiplexRouter> router1(new MultiplexRouter(
753 false, std::move(pipe.handle1), base::ThreadTaskRunnerHandle::Get()));
754
755 AssociatedInterfaceRequest<IntegerSender> request; 752 AssociatedInterfaceRequest<IntegerSender> request;
756 IntegerSenderAssociatedPtrInfo ptr_info; 753 IntegerSenderAssociatedPtrInfo ptr_info;
757 754 CreateIntegerSender(&ptr_info, &request);
758 router0->CreateAssociatedGroup()->CreateAssociatedInterface(
759 AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request);
760 ptr_info = EmulatePassingAssociatedPtrInfo(std::move(ptr_info), router1);
761 755
762 IntegerSenderImpl impl0(std::move(request)); 756 IntegerSenderImpl impl0(std::move(request));
763 AssociatedInterfacePtr<IntegerSender> ptr0; 757 AssociatedInterfacePtr<IntegerSender> ptr0;
764 ptr0.Bind(std::move(ptr_info)); 758 ptr0.Bind(std::move(ptr_info));
765 ptr0.set_connection_error_handler(base::Bind(&Fail)); 759 ptr0.set_connection_error_handler(base::Bind(&Fail));
766 760
767 bool ptr0_callback_run = false; 761 bool ptr0_callback_run = false;
768 ptr0->Echo(123, ExpectValueSetFlagAndRunClosure( 762 ptr0->Echo(123, ExpectValueSetFlagAndRunClosure(
769 123, &ptr0_callback_run, base::Bind(&base::DoNothing))); 763 123, &ptr0_callback_run, base::Bind(&base::DoNothing)));
770 ptr0.FlushForTesting(); 764 ptr0.FlushForTesting();
771 EXPECT_TRUE(ptr0_callback_run); 765 EXPECT_TRUE(ptr0_callback_run);
772 } 766 }
773 767
774 void SetBool(bool* value) { 768 void SetBool(bool* value) {
775 *value = true; 769 *value = true;
776 } 770 }
777 771
778 template <typename T> 772 template <typename T>
779 void SetBoolWithUnusedParameter(bool* value, T unused) { 773 void SetBoolWithUnusedParameter(bool* value, T unused) {
780 *value = true; 774 *value = true;
781 } 775 }
782 776
783 TEST_F(AssociatedInterfaceTest, AssociatedPtrFlushForTestingWithClosedPeer) { 777 TEST_F(AssociatedInterfaceTest, AssociatedPtrFlushForTestingWithClosedPeer) {
784 MessagePipe pipe;
785 scoped_refptr<MultiplexRouter> router0(new MultiplexRouter(
786 true, std::move(pipe.handle0), base::ThreadTaskRunnerHandle::Get()));
787 scoped_refptr<MultiplexRouter> router1(new MultiplexRouter(
788 false, std::move(pipe.handle1), base::ThreadTaskRunnerHandle::Get()));
789
790 AssociatedInterfaceRequest<IntegerSender> request; 778 AssociatedInterfaceRequest<IntegerSender> request;
791 IntegerSenderAssociatedPtrInfo ptr_info; 779 IntegerSenderAssociatedPtrInfo ptr_info;
792 780 CreateIntegerSender(&ptr_info, &request);
793 router0->CreateAssociatedGroup()->CreateAssociatedInterface(
794 AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request);
795 ptr_info = EmulatePassingAssociatedPtrInfo(std::move(ptr_info), router1);
796 781
797 AssociatedInterfacePtr<IntegerSender> ptr0; 782 AssociatedInterfacePtr<IntegerSender> ptr0;
798 ptr0.Bind(std::move(ptr_info)); 783 ptr0.Bind(std::move(ptr_info));
799 bool called = false; 784 bool called = false;
800 ptr0.set_connection_error_handler(base::Bind(&SetBool, &called)); 785 ptr0.set_connection_error_handler(base::Bind(&SetBool, &called));
801 request = nullptr; 786 request = nullptr;
802 787
803 ptr0.FlushForTesting(); 788 ptr0.FlushForTesting();
804 EXPECT_TRUE(called); 789 EXPECT_TRUE(called);
805 ptr0.FlushForTesting(); 790 ptr0.FlushForTesting();
806 } 791 }
807 792
808 TEST_F(AssociatedInterfaceTest, AssociatedBindingFlushForTesting) { 793 TEST_F(AssociatedInterfaceTest, AssociatedBindingFlushForTesting) {
809 MessagePipe pipe;
810 scoped_refptr<MultiplexRouter> router0(new MultiplexRouter(
811 true, std::move(pipe.handle0), base::ThreadTaskRunnerHandle::Get()));
812 scoped_refptr<MultiplexRouter> router1(new MultiplexRouter(
813 false, std::move(pipe.handle1), base::ThreadTaskRunnerHandle::Get()));
814
815 AssociatedInterfaceRequest<IntegerSender> request; 794 AssociatedInterfaceRequest<IntegerSender> request;
816 IntegerSenderAssociatedPtrInfo ptr_info; 795 IntegerSenderAssociatedPtrInfo ptr_info;
817 796 CreateIntegerSender(&ptr_info, &request);
818 router0->CreateAssociatedGroup()->CreateAssociatedInterface(
819 AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request);
820 ptr_info = EmulatePassingAssociatedPtrInfo(std::move(ptr_info), router1);
821 797
822 IntegerSenderImpl impl0(std::move(request)); 798 IntegerSenderImpl impl0(std::move(request));
823 impl0.set_connection_error_handler(base::Bind(&Fail)); 799 impl0.set_connection_error_handler(base::Bind(&Fail));
824 AssociatedInterfacePtr<IntegerSender> ptr0; 800 AssociatedInterfacePtr<IntegerSender> ptr0;
825 ptr0.Bind(std::move(ptr_info)); 801 ptr0.Bind(std::move(ptr_info));
826 802
827 bool ptr0_callback_run = false; 803 bool ptr0_callback_run = false;
828 ptr0->Echo(123, ExpectValueSetFlagAndRunClosure( 804 ptr0->Echo(123, ExpectValueSetFlagAndRunClosure(
829 123, &ptr0_callback_run, base::Bind(&base::DoNothing))); 805 123, &ptr0_callback_run, base::Bind(&base::DoNothing)));
830 // Because the flush is sent from the binding, it only guarantees that the 806 // Because the flush is sent from the binding, it only guarantees that the
831 // request has been received, not the response. The second flush waits for the 807 // request has been received, not the response. The second flush waits for the
832 // response to be received. 808 // response to be received.
833 impl0.binding()->FlushForTesting(); 809 impl0.binding()->FlushForTesting();
834 impl0.binding()->FlushForTesting(); 810 impl0.binding()->FlushForTesting();
835 EXPECT_TRUE(ptr0_callback_run); 811 EXPECT_TRUE(ptr0_callback_run);
836 } 812 }
837 813
838 TEST_F(AssociatedInterfaceTest, 814 TEST_F(AssociatedInterfaceTest,
839 AssociatedBindingFlushForTestingWithClosedPeer) { 815 AssociatedBindingFlushForTestingWithClosedPeer) {
840 MessagePipe pipe; 816 scoped_refptr<MultiplexRouter> router0;
841 scoped_refptr<MultiplexRouter> router0(new MultiplexRouter( 817 scoped_refptr<MultiplexRouter> router1;
842 true, std::move(pipe.handle0), base::ThreadTaskRunnerHandle::Get())); 818 CreateRouterPair(&router0, &router1);
843 scoped_refptr<MultiplexRouter> router1(new MultiplexRouter(
844 false, std::move(pipe.handle1), base::ThreadTaskRunnerHandle::Get()));
845 819
846 AssociatedInterfaceRequest<IntegerSender> request; 820 AssociatedInterfaceRequest<IntegerSender> request;
847 { 821 {
848 IntegerSenderAssociatedPtrInfo ptr_info; 822 IntegerSenderAssociatedPtrInfo ptr_info;
849 823 CreateIntegerSenderWithExistingRouters(router1, &ptr_info, router0,
850 router0->CreateAssociatedGroup()->CreateAssociatedInterface( 824 &request);
851 AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request);
852 } 825 }
853 826
854 IntegerSenderImpl impl(std::move(request)); 827 IntegerSenderImpl impl(std::move(request));
855 bool called = false; 828 bool called = false;
856 impl.set_connection_error_handler(base::Bind(&SetBool, &called)); 829 impl.set_connection_error_handler(base::Bind(&SetBool, &called));
857 impl.binding()->FlushForTesting(); 830 impl.binding()->FlushForTesting();
858 EXPECT_TRUE(called); 831 EXPECT_TRUE(called);
859 impl.binding()->FlushForTesting(); 832 impl.binding()->FlushForTesting();
860 } 833 }
861 834
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
940 IntegerSenderConnectionPtr ptr; 913 IntegerSenderConnectionPtr ptr;
941 GetProxy(&ptr); 914 GetProxy(&ptr);
942 bool called = false; 915 bool called = false;
943 ptr.set_connection_error_handler(base::Bind(&SetBool, &called)); 916 ptr.set_connection_error_handler(base::Bind(&SetBool, &called));
944 EXPECT_FALSE(called); 917 EXPECT_FALSE(called);
945 ptr.FlushForTesting(); 918 ptr.FlushForTesting();
946 EXPECT_TRUE(called); 919 EXPECT_TRUE(called);
947 ptr.FlushForTesting(); 920 ptr.FlushForTesting();
948 } 921 }
949 922
923 TEST_F(AssociatedInterfaceTest, AssociatedBindingConnectionErrorWithReason) {
924 AssociatedInterfaceRequest<IntegerSender> request;
925 IntegerSenderAssociatedPtrInfo ptr_info;
926 CreateIntegerSender(&ptr_info, &request);
927
928 IntegerSenderImpl impl(std::move(request));
929 AssociatedInterfacePtr<IntegerSender> ptr;
930 ptr.Bind(std::move(ptr_info));
931
932 base::RunLoop run_loop;
933 impl.binding()->set_connection_error_with_reason_handler(base::Bind(
934 [](const base::Closure& quit_closure, uint32_t custom_reason,
935 const std::string& description) {
936 EXPECT_EQ(123u, custom_reason);
937 EXPECT_EQ("farewell", description);
938 quit_closure.Run();
939 },
940 run_loop.QuitClosure()));
941
942 ptr.ResetWithReason(123u, "farewell");
943
944 run_loop.Run();
945 }
946
947 TEST_F(AssociatedInterfaceTest, AssociatedPtrConnectionErrorWithReason) {
948 AssociatedInterfaceRequest<IntegerSender> request;
949 IntegerSenderAssociatedPtrInfo ptr_info;
950 CreateIntegerSender(&ptr_info, &request);
951
952 IntegerSenderImpl impl(std::move(request));
953 AssociatedInterfacePtr<IntegerSender> ptr;
954 ptr.Bind(std::move(ptr_info));
955
956 base::RunLoop run_loop;
957 ptr.set_connection_error_with_reason_handler(base::Bind(
958 [](const base::Closure& quit_closure, uint32_t custom_reason,
959 const std::string& description) {
960 EXPECT_EQ(456u, custom_reason);
961 EXPECT_EQ("farewell", description);
962 quit_closure.Run();
963 },
964 run_loop.QuitClosure()));
965
966 impl.binding()->CloseWithReason(456u, "farewell");
967
968 run_loop.Run();
969 }
970
950 } // namespace 971 } // namespace
951 } // namespace test 972 } // namespace test
952 } // namespace mojo 973 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/public/cpp/bindings/strong_binding.h ('k') | mojo/public/cpp/bindings/tests/binding_set_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698