OLD | NEW |
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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 public: | 60 public: |
61 explicit IntegerSenderConnectionImpl( | 61 explicit IntegerSenderConnectionImpl( |
62 InterfaceRequest<IntegerSenderConnection> request) | 62 InterfaceRequest<IntegerSenderConnection> request) |
63 : binding_(this, std::move(request)) {} | 63 : binding_(this, std::move(request)) {} |
64 | 64 |
65 ~IntegerSenderConnectionImpl() override {} | 65 ~IntegerSenderConnectionImpl() override {} |
66 | 66 |
67 void GetSender(AssociatedInterfaceRequest<IntegerSender> sender) override { | 67 void GetSender(AssociatedInterfaceRequest<IntegerSender> sender) override { |
68 IntegerSenderImpl* sender_impl = new IntegerSenderImpl(std::move(sender)); | 68 IntegerSenderImpl* sender_impl = new IntegerSenderImpl(std::move(sender)); |
69 sender_impl->set_connection_error_handler( | 69 sender_impl->set_connection_error_handler( |
70 [sender_impl]() { delete sender_impl; }); | 70 base::Bind(&DeleteSender, sender_impl)); |
71 } | 71 } |
72 | 72 |
73 void AsyncGetSender(const AsyncGetSenderCallback& callback) override { | 73 void AsyncGetSender(const AsyncGetSenderCallback& callback) override { |
74 AssociatedInterfaceRequest<IntegerSender> request; | 74 AssociatedInterfaceRequest<IntegerSender> request; |
75 IntegerSenderAssociatedPtrInfo ptr_info; | 75 IntegerSenderAssociatedPtrInfo ptr_info; |
76 binding_.associated_group()->CreateAssociatedInterface( | 76 binding_.associated_group()->CreateAssociatedInterface( |
77 AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request); | 77 AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request); |
78 GetSender(std::move(request)); | 78 GetSender(std::move(request)); |
79 callback.Run(std::move(ptr_info)); | 79 callback.Run(std::move(ptr_info)); |
80 } | 80 } |
81 | 81 |
82 Binding<IntegerSenderConnection>* binding() { return &binding_; } | 82 Binding<IntegerSenderConnection>* binding() { return &binding_; } |
83 | 83 |
84 private: | 84 private: |
| 85 static void DeleteSender(IntegerSenderImpl* sender) { delete sender; } |
| 86 |
85 Binding<IntegerSenderConnection> binding_; | 87 Binding<IntegerSenderConnection> binding_; |
86 }; | 88 }; |
87 | 89 |
88 class AssociatedInterfaceTest : public testing::Test { | 90 class AssociatedInterfaceTest : public testing::Test { |
89 public: | 91 public: |
90 AssociatedInterfaceTest() {} | 92 AssociatedInterfaceTest() {} |
91 ~AssociatedInterfaceTest() override { loop_.RunUntilIdle(); } | 93 ~AssociatedInterfaceTest() override { loop_.RunUntilIdle(); } |
92 | 94 |
93 void PumpMessages() { loop_.RunUntilIdle(); } | 95 void PumpMessages() { loop_.RunUntilIdle(); } |
94 | 96 |
(...skipping 27 matching lines...) Expand all Loading... |
122 FROM_HERE, | 124 FROM_HERE, |
123 base::Bind(&AssociatedInterfaceTest::QuitRunLoop, | 125 base::Bind(&AssociatedInterfaceTest::QuitRunLoop, |
124 base::Unretained(this), base::Unretained(run_loop))); | 126 base::Unretained(this), base::Unretained(run_loop))); |
125 } | 127 } |
126 } | 128 } |
127 | 129 |
128 private: | 130 private: |
129 base::MessageLoop loop_; | 131 base::MessageLoop loop_; |
130 }; | 132 }; |
131 | 133 |
| 134 void DoSetFlagAndRunClosure(bool* flag, const base::Closure& closure) { |
| 135 *flag = true; |
| 136 closure.Run(); |
| 137 } |
| 138 |
| 139 void DoExpectValueSetFlagAndRunClosure(int32_t expected_value, |
| 140 bool* flag, |
| 141 const base::Closure& closure, |
| 142 int32_t value) { |
| 143 EXPECT_EQ(expected_value, value); |
| 144 DoSetFlagAndRunClosure(flag, closure); |
| 145 } |
| 146 |
| 147 base::Closure SetFlagAndRunClosure(bool* flag, const base::Closure& closure) { |
| 148 return base::Bind(&DoSetFlagAndRunClosure, flag, closure); |
| 149 } |
| 150 |
| 151 base::Callback<void(int32_t)> ExpectValueSetFlagAndRunClosure( |
| 152 int32_t expected_value, |
| 153 bool* flag, |
| 154 const base::Closure& closure) { |
| 155 return base::Bind( |
| 156 &DoExpectValueSetFlagAndRunClosure, expected_value, flag, closure); |
| 157 } |
| 158 |
132 TEST_F(AssociatedInterfaceTest, InterfacesAtBothEnds) { | 159 TEST_F(AssociatedInterfaceTest, InterfacesAtBothEnds) { |
133 // Bind to the same pipe two associated interfaces, whose implementation lives | 160 // Bind to the same pipe two associated interfaces, whose implementation lives |
134 // at different ends. Test that the two don't interfere with each other. | 161 // at different ends. Test that the two don't interfere with each other. |
135 | 162 |
136 MessagePipe pipe; | 163 MessagePipe pipe; |
137 scoped_refptr<MultiplexRouter> router0(new MultiplexRouter( | 164 scoped_refptr<MultiplexRouter> router0(new MultiplexRouter( |
138 true, std::move(pipe.handle0), base::ThreadTaskRunnerHandle::Get())); | 165 true, std::move(pipe.handle0), base::ThreadTaskRunnerHandle::Get())); |
139 scoped_refptr<MultiplexRouter> router1(new MultiplexRouter( | 166 scoped_refptr<MultiplexRouter> router1(new MultiplexRouter( |
140 false, std::move(pipe.handle1), base::ThreadTaskRunnerHandle::Get())); | 167 false, std::move(pipe.handle1), base::ThreadTaskRunnerHandle::Get())); |
141 | 168 |
(...skipping 11 matching lines...) Expand all Loading... |
153 router0->CreateAssociatedGroup()->CreateAssociatedInterface( | 180 router0->CreateAssociatedGroup()->CreateAssociatedInterface( |
154 AssociatedGroup::WILL_PASS_REQUEST, &ptr_info, &request); | 181 AssociatedGroup::WILL_PASS_REQUEST, &ptr_info, &request); |
155 request = EmulatePassingAssociatedRequest(std::move(request), router1); | 182 request = EmulatePassingAssociatedRequest(std::move(request), router1); |
156 | 183 |
157 IntegerSenderImpl impl1(std::move(request)); | 184 IntegerSenderImpl impl1(std::move(request)); |
158 AssociatedInterfacePtr<IntegerSender> ptr1; | 185 AssociatedInterfacePtr<IntegerSender> ptr1; |
159 ptr1.Bind(std::move(ptr_info)); | 186 ptr1.Bind(std::move(ptr_info)); |
160 | 187 |
161 base::RunLoop run_loop, run_loop2; | 188 base::RunLoop run_loop, run_loop2; |
162 bool ptr0_callback_run = false; | 189 bool ptr0_callback_run = false; |
163 ptr0->Echo(123, [&ptr0_callback_run, &run_loop](int32_t value) { | 190 ptr0->Echo(123, ExpectValueSetFlagAndRunClosure(123, &ptr0_callback_run, |
164 EXPECT_EQ(123, value); | 191 run_loop.QuitClosure())); |
165 ptr0_callback_run = true; | |
166 run_loop.Quit(); | |
167 }); | |
168 | 192 |
169 bool ptr1_callback_run = false; | 193 bool ptr1_callback_run = false; |
170 ptr1->Echo(456, [&ptr1_callback_run, &run_loop2](int32_t value) { | 194 ptr1->Echo(456, ExpectValueSetFlagAndRunClosure(456, &ptr1_callback_run, |
171 EXPECT_EQ(456, value); | 195 run_loop2.QuitClosure())); |
172 ptr1_callback_run = true; | |
173 run_loop2.Quit(); | |
174 }); | |
175 | 196 |
176 run_loop.Run(); | 197 run_loop.Run(); |
177 run_loop2.Run(); | 198 run_loop2.Run(); |
178 EXPECT_TRUE(ptr0_callback_run); | 199 EXPECT_TRUE(ptr0_callback_run); |
179 EXPECT_TRUE(ptr1_callback_run); | 200 EXPECT_TRUE(ptr1_callback_run); |
180 | 201 |
181 bool ptr0_error_callback_run = false; | 202 bool ptr0_error_callback_run = false; |
182 base::RunLoop run_loop3; | 203 base::RunLoop run_loop3; |
183 ptr0.set_connection_error_handler([&ptr0_error_callback_run, &run_loop3]() { | 204 ptr0.set_connection_error_handler( |
184 ptr0_error_callback_run = true; | 205 SetFlagAndRunClosure(&ptr0_error_callback_run, run_loop3.QuitClosure())); |
185 run_loop3.Quit(); | |
186 }); | |
187 | 206 |
188 impl0.binding()->Close(); | 207 impl0.binding()->Close(); |
189 run_loop3.Run(); | 208 run_loop3.Run(); |
190 EXPECT_TRUE(ptr0_error_callback_run); | 209 EXPECT_TRUE(ptr0_error_callback_run); |
191 | 210 |
192 bool impl1_error_callback_run = false; | 211 bool impl1_error_callback_run = false; |
193 base::RunLoop run_loop4; | 212 base::RunLoop run_loop4; |
194 impl1.binding()->set_connection_error_handler( | 213 impl1.binding()->set_connection_error_handler( |
195 [&impl1_error_callback_run, &run_loop4]() { | 214 SetFlagAndRunClosure(&impl1_error_callback_run, run_loop4.QuitClosure())); |
196 impl1_error_callback_run = true; | |
197 run_loop4.Quit(); | |
198 }); | |
199 | 215 |
200 ptr1.reset(); | 216 ptr1.reset(); |
201 run_loop4.Run(); | 217 run_loop4.Run(); |
202 EXPECT_TRUE(impl1_error_callback_run); | 218 EXPECT_TRUE(impl1_error_callback_run); |
203 } | 219 } |
204 | 220 |
205 class TestSender { | 221 class TestSender { |
206 public: | 222 public: |
207 TestSender() | 223 TestSender() |
208 : sender_thread_("TestSender"), | 224 : sender_thread_("TestSender"), |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 | 513 |
498 EXPECT_EQ(static_cast<size_t>(kMaxValue / 2), receivers[0].values().size()); | 514 EXPECT_EQ(static_cast<size_t>(kMaxValue / 2), receivers[0].values().size()); |
499 EXPECT_EQ(static_cast<size_t>(kMaxValue / 2), receivers[1].values().size()); | 515 EXPECT_EQ(static_cast<size_t>(kMaxValue / 2), receivers[1].values().size()); |
500 | 516 |
501 for (size_t i = 0; i < 2; ++i) { | 517 for (size_t i = 0; i < 2; ++i) { |
502 for (size_t j = 1; j < receivers[i].values().size(); ++j) | 518 for (size_t j = 1; j < receivers[i].values().size(); ++j) |
503 EXPECT_LT(receivers[i].values()[j - 1], receivers[i].values()[j]); | 519 EXPECT_LT(receivers[i].values()[j - 1], receivers[i].values()[j]); |
504 } | 520 } |
505 } | 521 } |
506 | 522 |
| 523 void CaptureInt32(int32_t* storage, |
| 524 const base::Closure& closure, |
| 525 int32_t value) { |
| 526 *storage = value; |
| 527 closure.Run(); |
| 528 } |
| 529 |
| 530 void CaptureSenderPtrInfo(IntegerSenderAssociatedPtr* storage, |
| 531 const base::Closure& closure, |
| 532 IntegerSenderAssociatedPtrInfo info) { |
| 533 storage->Bind(std::move(info)); |
| 534 closure.Run(); |
| 535 } |
| 536 |
507 TEST_F(AssociatedInterfaceTest, PassAssociatedInterfaces) { | 537 TEST_F(AssociatedInterfaceTest, PassAssociatedInterfaces) { |
508 IntegerSenderConnectionPtr connection_ptr; | 538 IntegerSenderConnectionPtr connection_ptr; |
509 IntegerSenderConnectionImpl connection(GetProxy(&connection_ptr)); | 539 IntegerSenderConnectionImpl connection(GetProxy(&connection_ptr)); |
510 | 540 |
511 IntegerSenderAssociatedPtr sender0; | 541 IntegerSenderAssociatedPtr sender0; |
512 connection_ptr->GetSender( | 542 connection_ptr->GetSender( |
513 GetProxy(&sender0, connection_ptr.associated_group())); | 543 GetProxy(&sender0, connection_ptr.associated_group())); |
514 | 544 |
515 int32_t echoed_value = 0; | 545 int32_t echoed_value = 0; |
516 base::RunLoop run_loop; | 546 base::RunLoop run_loop; |
517 sender0->Echo(123, [&echoed_value, &run_loop](int32_t value) { | 547 sender0->Echo(123, base::Bind(&CaptureInt32, &echoed_value, |
518 echoed_value = value; | 548 run_loop.QuitClosure())); |
519 run_loop.Quit(); | |
520 }); | |
521 run_loop.Run(); | 549 run_loop.Run(); |
522 EXPECT_EQ(123, echoed_value); | 550 EXPECT_EQ(123, echoed_value); |
523 | 551 |
524 IntegerSenderAssociatedPtr sender1; | 552 IntegerSenderAssociatedPtr sender1; |
525 base::RunLoop run_loop2; | 553 base::RunLoop run_loop2; |
526 connection_ptr->AsyncGetSender( | 554 connection_ptr->AsyncGetSender( |
527 [&sender1, &run_loop2](IntegerSenderAssociatedPtrInfo ptr_info) { | 555 base::Bind(&CaptureSenderPtrInfo, &sender1, run_loop2.QuitClosure())); |
528 sender1.Bind(std::move(ptr_info)); | |
529 run_loop2.Quit(); | |
530 }); | |
531 run_loop2.Run(); | 556 run_loop2.Run(); |
532 EXPECT_TRUE(sender1); | 557 EXPECT_TRUE(sender1); |
533 | 558 |
534 base::RunLoop run_loop3; | 559 base::RunLoop run_loop3; |
535 sender1->Echo(456, [&echoed_value, &run_loop3](int32_t value) { | 560 sender1->Echo(456, base::Bind(&CaptureInt32, &echoed_value, |
536 echoed_value = value; | 561 run_loop3.QuitClosure())); |
537 run_loop3.Quit(); | |
538 }); | |
539 run_loop3.Run(); | 562 run_loop3.Run(); |
540 EXPECT_EQ(456, echoed_value); | 563 EXPECT_EQ(456, echoed_value); |
541 } | 564 } |
542 | 565 |
543 TEST_F(AssociatedInterfaceTest, BindingWaitAndPauseWhenNoAssociatedInterfaces) { | 566 TEST_F(AssociatedInterfaceTest, BindingWaitAndPauseWhenNoAssociatedInterfaces) { |
544 IntegerSenderConnectionPtr connection_ptr; | 567 IntegerSenderConnectionPtr connection_ptr; |
545 IntegerSenderConnectionImpl connection(GetProxy(&connection_ptr)); | 568 IntegerSenderConnectionImpl connection(GetProxy(&connection_ptr)); |
546 | 569 |
547 IntegerSenderAssociatedPtr sender0; | 570 IntegerSenderAssociatedPtr sender0; |
548 connection_ptr->GetSender( | 571 connection_ptr->GetSender( |
(...skipping 11 matching lines...) Expand all Loading... |
560 | 583 |
561 // The previous wait has dispatched the GetSender request message, therefore | 584 // The previous wait has dispatched the GetSender request message, therefore |
562 // an associated interface has been set up on the pipe. It is not allowed to | 585 // an associated interface has been set up on the pipe. It is not allowed to |
563 // wait or pause. | 586 // wait or pause. |
564 EXPECT_TRUE(connection.binding()->HasAssociatedInterfaces()); | 587 EXPECT_TRUE(connection.binding()->HasAssociatedInterfaces()); |
565 } | 588 } |
566 | 589 |
567 } // namespace | 590 } // namespace |
568 } // namespace test | 591 } // namespace test |
569 } // namespace mojo | 592 } // namespace mojo |
OLD | NEW |