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

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

Issue 2589663003: mojo:: Rename mojo::GetProxy() to mojo::MakeRequest() (Closed)
Patch Set: Rebase Created 3 years, 12 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 // Note: This file tests both binding.h (mojo::Binding) and strong_binding.h 5 // Note: This file tests both binding.h (mojo::Binding) and strong_binding.h
6 // (mojo::StrongBinding). 6 // (mojo::StrongBinding).
7 7
8 #include "mojo/public/cpp/bindings/binding.h" 8 #include "mojo/public/cpp/bindings/binding.h"
9 9
10 #include <stdint.h> 10 #include <stdint.h>
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 return base::Bind(&DoSetFlagAndRunClosure<Args...>, flag, callback); 76 return base::Bind(&DoSetFlagAndRunClosure<Args...>, flag, callback);
77 } 77 }
78 78
79 // BindingTest ----------------------------------------------------------------- 79 // BindingTest -----------------------------------------------------------------
80 80
81 using BindingTest = BindingTestBase; 81 using BindingTest = BindingTestBase;
82 82
83 TEST_F(BindingTest, Close) { 83 TEST_F(BindingTest, Close) {
84 bool called = false; 84 bool called = false;
85 sample::ServicePtr ptr; 85 sample::ServicePtr ptr;
86 auto request = GetProxy(&ptr); 86 auto request = MakeRequest(&ptr);
87 base::RunLoop run_loop; 87 base::RunLoop run_loop;
88 ptr.set_connection_error_handler( 88 ptr.set_connection_error_handler(
89 SetFlagAndRunClosure(&called, run_loop.QuitClosure())); 89 SetFlagAndRunClosure(&called, run_loop.QuitClosure()));
90 ServiceImpl impl; 90 ServiceImpl impl;
91 Binding<sample::Service> binding(&impl, std::move(request)); 91 Binding<sample::Service> binding(&impl, std::move(request));
92 92
93 binding.Close(); 93 binding.Close();
94 EXPECT_FALSE(called); 94 EXPECT_FALSE(called);
95 run_loop.Run(); 95 run_loop.Run();
96 EXPECT_TRUE(called); 96 EXPECT_TRUE(called);
97 } 97 }
98 98
99 // Tests that destroying a mojo::Binding closes the bound message pipe handle. 99 // Tests that destroying a mojo::Binding closes the bound message pipe handle.
100 TEST_F(BindingTest, DestroyClosesMessagePipe) { 100 TEST_F(BindingTest, DestroyClosesMessagePipe) {
101 bool encountered_error = false; 101 bool encountered_error = false;
102 ServiceImpl impl; 102 ServiceImpl impl;
103 sample::ServicePtr ptr; 103 sample::ServicePtr ptr;
104 auto request = GetProxy(&ptr); 104 auto request = MakeRequest(&ptr);
105 base::RunLoop run_loop; 105 base::RunLoop run_loop;
106 ptr.set_connection_error_handler( 106 ptr.set_connection_error_handler(
107 SetFlagAndRunClosure(&encountered_error, run_loop.QuitClosure())); 107 SetFlagAndRunClosure(&encountered_error, run_loop.QuitClosure()));
108 bool called = false; 108 bool called = false;
109 base::RunLoop run_loop2; 109 base::RunLoop run_loop2;
110 { 110 {
111 Binding<sample::Service> binding(&impl, std::move(request)); 111 Binding<sample::Service> binding(&impl, std::move(request));
112 ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr, 112 ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
113 SetFlagAndRunClosure<int32_t>(&called, 113 SetFlagAndRunClosure<int32_t>(&called,
114 run_loop2.QuitClosure())); 114 run_loop2.QuitClosure()));
(...skipping 15 matching lines...) Expand all
130 EXPECT_FALSE(called); 130 EXPECT_FALSE(called);
131 } 131 }
132 132
133 // Tests that the binding's connection error handler gets called when the other 133 // Tests that the binding's connection error handler gets called when the other
134 // end is closed. 134 // end is closed.
135 TEST_F(BindingTest, ConnectionError) { 135 TEST_F(BindingTest, ConnectionError) {
136 bool called = false; 136 bool called = false;
137 { 137 {
138 ServiceImpl impl; 138 ServiceImpl impl;
139 sample::ServicePtr ptr; 139 sample::ServicePtr ptr;
140 Binding<sample::Service> binding(&impl, GetProxy(&ptr)); 140 Binding<sample::Service> binding(&impl, MakeRequest(&ptr));
141 base::RunLoop run_loop; 141 base::RunLoop run_loop;
142 binding.set_connection_error_handler( 142 binding.set_connection_error_handler(
143 SetFlagAndRunClosure(&called, run_loop.QuitClosure())); 143 SetFlagAndRunClosure(&called, run_loop.QuitClosure()));
144 ptr.reset(); 144 ptr.reset();
145 EXPECT_FALSE(called); 145 EXPECT_FALSE(called);
146 run_loop.Run(); 146 run_loop.Run();
147 EXPECT_TRUE(called); 147 EXPECT_TRUE(called);
148 // We want to make sure that it isn't called again during destruction. 148 // We want to make sure that it isn't called again during destruction.
149 called = false; 149 called = false;
150 } 150 }
151 EXPECT_FALSE(called); 151 EXPECT_FALSE(called);
152 } 152 }
153 153
154 // Tests that calling Close doesn't result in the connection error handler being 154 // Tests that calling Close doesn't result in the connection error handler being
155 // called. 155 // called.
156 TEST_F(BindingTest, CloseDoesntCallConnectionErrorHandler) { 156 TEST_F(BindingTest, CloseDoesntCallConnectionErrorHandler) {
157 ServiceImpl impl; 157 ServiceImpl impl;
158 sample::ServicePtr ptr; 158 sample::ServicePtr ptr;
159 Binding<sample::Service> binding(&impl, GetProxy(&ptr)); 159 Binding<sample::Service> binding(&impl, MakeRequest(&ptr));
160 bool called = false; 160 bool called = false;
161 binding.set_connection_error_handler(SetFlagAndRunClosure(&called)); 161 binding.set_connection_error_handler(SetFlagAndRunClosure(&called));
162 binding.Close(); 162 binding.Close();
163 base::RunLoop().RunUntilIdle(); 163 base::RunLoop().RunUntilIdle();
164 EXPECT_FALSE(called); 164 EXPECT_FALSE(called);
165 165
166 // We can also close the other end, and the error handler still won't be 166 // We can also close the other end, and the error handler still won't be
167 // called. 167 // called.
168 ptr.reset(); 168 ptr.reset();
169 base::RunLoop().RunUntilIdle(); 169 base::RunLoop().RunUntilIdle();
(...skipping 26 matching lines...) Expand all
196 DISALLOW_COPY_AND_ASSIGN(ServiceImplWithBinding); 196 DISALLOW_COPY_AND_ASSIGN(ServiceImplWithBinding);
197 }; 197 };
198 198
199 // Tests that the binding may be deleted in the connection error handler. 199 // Tests that the binding may be deleted in the connection error handler.
200 TEST_F(BindingTest, SelfDeleteOnConnectionError) { 200 TEST_F(BindingTest, SelfDeleteOnConnectionError) {
201 bool was_deleted = false; 201 bool was_deleted = false;
202 sample::ServicePtr ptr; 202 sample::ServicePtr ptr;
203 // This should delete itself on connection error. 203 // This should delete itself on connection error.
204 base::RunLoop run_loop; 204 base::RunLoop run_loop;
205 new ServiceImplWithBinding(&was_deleted, run_loop.QuitClosure(), 205 new ServiceImplWithBinding(&was_deleted, run_loop.QuitClosure(),
206 GetProxy(&ptr)); 206 MakeRequest(&ptr));
207 ptr.reset(); 207 ptr.reset();
208 EXPECT_FALSE(was_deleted); 208 EXPECT_FALSE(was_deleted);
209 run_loop.Run(); 209 run_loop.Run();
210 EXPECT_TRUE(was_deleted); 210 EXPECT_TRUE(was_deleted);
211 } 211 }
212 212
213 // Tests that explicitly calling Unbind followed by rebinding works. 213 // Tests that explicitly calling Unbind followed by rebinding works.
214 TEST_F(BindingTest, Unbind) { 214 TEST_F(BindingTest, Unbind) {
215 ServiceImpl impl; 215 ServiceImpl impl;
216 sample::ServicePtr ptr; 216 sample::ServicePtr ptr;
217 Binding<sample::Service> binding(&impl, GetProxy(&ptr)); 217 Binding<sample::Service> binding(&impl, MakeRequest(&ptr));
218 218
219 bool called = false; 219 bool called = false;
220 base::RunLoop run_loop; 220 base::RunLoop run_loop;
221 ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr, 221 ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
222 SetFlagAndRunClosure<int32_t>(&called, 222 SetFlagAndRunClosure<int32_t>(&called,
223 run_loop.QuitClosure())); 223 run_loop.QuitClosure()));
224 run_loop.Run(); 224 run_loop.Run();
225 EXPECT_TRUE(called); 225 EXPECT_TRUE(called);
226 226
227 called = false; 227 called = false;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 IntegerAccessorImpl impl; 265 IntegerAccessorImpl impl;
266 sample::IntegerAccessorPtr ptr; 266 sample::IntegerAccessorPtr ptr;
267 Binding<sample::IntegerAccessor> binding(&impl, &ptr); 267 Binding<sample::IntegerAccessor> binding(&impl, &ptr);
268 EXPECT_EQ(3u, ptr.version()); 268 EXPECT_EQ(3u, ptr.version());
269 } 269 }
270 270
271 TEST_F(BindingTest, PauseResume) { 271 TEST_F(BindingTest, PauseResume) {
272 bool called = false; 272 bool called = false;
273 base::RunLoop run_loop; 273 base::RunLoop run_loop;
274 sample::ServicePtr ptr; 274 sample::ServicePtr ptr;
275 auto request = GetProxy(&ptr); 275 auto request = MakeRequest(&ptr);
276 ServiceImpl impl; 276 ServiceImpl impl;
277 Binding<sample::Service> binding(&impl, std::move(request)); 277 Binding<sample::Service> binding(&impl, std::move(request));
278 binding.PauseIncomingMethodCallProcessing(); 278 binding.PauseIncomingMethodCallProcessing();
279 ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr, 279 ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
280 SetFlagAndRunClosure<int32_t>(&called, 280 SetFlagAndRunClosure<int32_t>(&called,
281 run_loop.QuitClosure())); 281 run_loop.QuitClosure()));
282 EXPECT_FALSE(called); 282 EXPECT_FALSE(called);
283 base::RunLoop().RunUntilIdle(); 283 base::RunLoop().RunUntilIdle();
284 // Frobinate() should not be called as the binding is paused. 284 // Frobinate() should not be called as the binding is paused.
285 EXPECT_FALSE(called); 285 EXPECT_FALSE(called);
286 286
287 // Resume the binding, which should trigger processing. 287 // Resume the binding, which should trigger processing.
288 binding.ResumeIncomingMethodCallProcessing(); 288 binding.ResumeIncomingMethodCallProcessing();
289 run_loop.Run(); 289 run_loop.Run();
290 EXPECT_TRUE(called); 290 EXPECT_TRUE(called);
291 } 291 }
292 292
293 // Verifies the connection error handler is not run while a binding is paused. 293 // Verifies the connection error handler is not run while a binding is paused.
294 TEST_F(BindingTest, ErrorHandleNotRunWhilePaused) { 294 TEST_F(BindingTest, ErrorHandleNotRunWhilePaused) {
295 bool called = false; 295 bool called = false;
296 base::RunLoop run_loop; 296 base::RunLoop run_loop;
297 sample::ServicePtr ptr; 297 sample::ServicePtr ptr;
298 auto request = GetProxy(&ptr); 298 auto request = MakeRequest(&ptr);
299 ServiceImpl impl; 299 ServiceImpl impl;
300 Binding<sample::Service> binding(&impl, std::move(request)); 300 Binding<sample::Service> binding(&impl, std::move(request));
301 binding.set_connection_error_handler( 301 binding.set_connection_error_handler(
302 SetFlagAndRunClosure(&called, run_loop.QuitClosure())); 302 SetFlagAndRunClosure(&called, run_loop.QuitClosure()));
303 binding.PauseIncomingMethodCallProcessing(); 303 binding.PauseIncomingMethodCallProcessing();
304 304
305 ptr.reset(); 305 ptr.reset();
306 base::RunLoop().RunUntilIdle(); 306 base::RunLoop().RunUntilIdle();
307 // The connection error handle should not be called as the binding is paused. 307 // The connection error handle should not be called as the binding is paused.
308 EXPECT_FALSE(called); 308 EXPECT_FALSE(called);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 353
354 private: 354 private:
355 const base::Closure callback_; 355 const base::Closure callback_;
356 }; 356 };
357 357
358 // Verifies that message filters are notified in the order they were added and 358 // Verifies that message filters are notified in the order they were added and
359 // are always notified before a message is dispatched. 359 // are always notified before a message is dispatched.
360 TEST_F(BindingTest, MessageFilter) { 360 TEST_F(BindingTest, MessageFilter) {
361 test::PingServicePtr ptr; 361 test::PingServicePtr ptr;
362 PingServiceImpl impl; 362 PingServiceImpl impl;
363 mojo::Binding<test::PingService> binding(&impl, GetProxy(&ptr)); 363 mojo::Binding<test::PingService> binding(&impl, MakeRequest(&ptr));
364 364
365 int status = 0; 365 int status = 0;
366 auto handler_helper = [] (int* status, int expected_status, int new_status) { 366 auto handler_helper = [] (int* status, int expected_status, int new_status) {
367 EXPECT_EQ(expected_status, *status); 367 EXPECT_EQ(expected_status, *status);
368 *status = new_status; 368 *status = new_status;
369 }; 369 };
370 auto create_handler = [&] (int expected_status, int new_status) { 370 auto create_handler = [&] (int expected_status, int new_status) {
371 return base::Bind(handler_helper, &status, expected_status, new_status); 371 return base::Bind(handler_helper, &status, expected_status, new_status);
372 }; 372 };
373 373
(...skipping 10 matching lines...) Expand all
384 } 384 }
385 } 385 }
386 386
387 void Fail() { 387 void Fail() {
388 FAIL() << "Unexpected connection error"; 388 FAIL() << "Unexpected connection error";
389 } 389 }
390 390
391 TEST_F(BindingTest, FlushForTesting) { 391 TEST_F(BindingTest, FlushForTesting) {
392 bool called = false; 392 bool called = false;
393 sample::ServicePtr ptr; 393 sample::ServicePtr ptr;
394 auto request = GetProxy(&ptr); 394 auto request = MakeRequest(&ptr);
395 ServiceImpl impl; 395 ServiceImpl impl;
396 Binding<sample::Service> binding(&impl, std::move(request)); 396 Binding<sample::Service> binding(&impl, std::move(request));
397 binding.set_connection_error_handler(base::Bind(&Fail)); 397 binding.set_connection_error_handler(base::Bind(&Fail));
398 398
399 ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr, 399 ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
400 SetFlagAndRunClosure<int32_t>(&called)); 400 SetFlagAndRunClosure<int32_t>(&called));
401 EXPECT_FALSE(called); 401 EXPECT_FALSE(called);
402 // Because the flush is sent from the binding, it only guarantees that the 402 // Because the flush is sent from the binding, it only guarantees that the
403 // request has been received, not the response. The second flush waits for the 403 // request has been received, not the response. The second flush waits for the
404 // response to be received. 404 // response to be received.
405 binding.FlushForTesting(); 405 binding.FlushForTesting();
406 binding.FlushForTesting(); 406 binding.FlushForTesting();
407 EXPECT_TRUE(called); 407 EXPECT_TRUE(called);
408 } 408 }
409 409
410 TEST_F(BindingTest, FlushForTestingWithClosedPeer) { 410 TEST_F(BindingTest, FlushForTestingWithClosedPeer) {
411 bool called = false; 411 bool called = false;
412 sample::ServicePtr ptr; 412 sample::ServicePtr ptr;
413 auto request = GetProxy(&ptr); 413 auto request = MakeRequest(&ptr);
414 ServiceImpl impl; 414 ServiceImpl impl;
415 Binding<sample::Service> binding(&impl, std::move(request)); 415 Binding<sample::Service> binding(&impl, std::move(request));
416 binding.set_connection_error_handler(SetFlagAndRunClosure(&called)); 416 binding.set_connection_error_handler(SetFlagAndRunClosure(&called));
417 ptr.reset(); 417 ptr.reset();
418 418
419 EXPECT_FALSE(called); 419 EXPECT_FALSE(called);
420 binding.FlushForTesting(); 420 binding.FlushForTesting();
421 EXPECT_TRUE(called); 421 EXPECT_TRUE(called);
422 binding.FlushForTesting(); 422 binding.FlushForTesting();
423 } 423 }
424 424
425 TEST_F(BindingTest, ConnectionErrorWithReason) { 425 TEST_F(BindingTest, ConnectionErrorWithReason) {
426 sample::ServicePtr ptr; 426 sample::ServicePtr ptr;
427 auto request = GetProxy(&ptr); 427 auto request = MakeRequest(&ptr);
428 ServiceImpl impl; 428 ServiceImpl impl;
429 Binding<sample::Service> binding(&impl, std::move(request)); 429 Binding<sample::Service> binding(&impl, std::move(request));
430 430
431 base::RunLoop run_loop; 431 base::RunLoop run_loop;
432 binding.set_connection_error_with_reason_handler(base::Bind( 432 binding.set_connection_error_with_reason_handler(base::Bind(
433 [](const base::Closure& quit_closure, uint32_t custom_reason, 433 [](const base::Closure& quit_closure, uint32_t custom_reason,
434 const std::string& description) { 434 const std::string& description) {
435 EXPECT_EQ(1234u, custom_reason); 435 EXPECT_EQ(1234u, custom_reason);
436 EXPECT_EQ("hello", description); 436 EXPECT_EQ("hello", description);
437 quit_closure.Run(); 437 quit_closure.Run();
(...skipping 15 matching lines...) Expand all
453 453
454 template <typename T> 454 template <typename T>
455 using WeakBinding = Binding<T, WeakPtrImplRefTraits<T>>; 455 using WeakBinding = Binding<T, WeakPtrImplRefTraits<T>>;
456 456
457 TEST_F(BindingTest, CustomImplPointerType) { 457 TEST_F(BindingTest, CustomImplPointerType) {
458 PingServiceImpl impl; 458 PingServiceImpl impl;
459 base::WeakPtrFactory<test::PingService> weak_factory(&impl); 459 base::WeakPtrFactory<test::PingService> weak_factory(&impl);
460 460
461 test::PingServicePtr proxy; 461 test::PingServicePtr proxy;
462 WeakBinding<test::PingService> binding(weak_factory.GetWeakPtr(), 462 WeakBinding<test::PingService> binding(weak_factory.GetWeakPtr(),
463 GetProxy(&proxy)); 463 MakeRequest(&proxy));
464 464
465 { 465 {
466 // Ensure the binding is functioning. 466 // Ensure the binding is functioning.
467 base::RunLoop run_loop; 467 base::RunLoop run_loop;
468 proxy->Ping(run_loop.QuitClosure()); 468 proxy->Ping(run_loop.QuitClosure());
469 run_loop.Run(); 469 run_loop.Run();
470 } 470 }
471 471
472 { 472 {
473 // Attempt to dispatch another message after the WeakPtr is invalidated. 473 // Attempt to dispatch another message after the WeakPtr is invalidated.
(...skipping 14 matching lines...) Expand all
488 488
489 using StrongBindingTest = BindingTestBase; 489 using StrongBindingTest = BindingTestBase;
490 490
491 // Tests that destroying a mojo::StrongBinding closes the bound message pipe 491 // Tests that destroying a mojo::StrongBinding closes the bound message pipe
492 // handle but does *not* destroy the implementation object. 492 // handle but does *not* destroy the implementation object.
493 TEST_F(StrongBindingTest, DestroyClosesMessagePipe) { 493 TEST_F(StrongBindingTest, DestroyClosesMessagePipe) {
494 base::RunLoop run_loop; 494 base::RunLoop run_loop;
495 bool encountered_error = false; 495 bool encountered_error = false;
496 bool was_deleted = false; 496 bool was_deleted = false;
497 sample::ServicePtr ptr; 497 sample::ServicePtr ptr;
498 auto request = GetProxy(&ptr); 498 auto request = MakeRequest(&ptr);
499 ptr.set_connection_error_handler( 499 ptr.set_connection_error_handler(
500 SetFlagAndRunClosure(&encountered_error, run_loop.QuitClosure())); 500 SetFlagAndRunClosure(&encountered_error, run_loop.QuitClosure()));
501 bool called = false; 501 bool called = false;
502 base::RunLoop run_loop2; 502 base::RunLoop run_loop2;
503 503
504 auto binding = MakeStrongBinding(base::MakeUnique<ServiceImpl>(&was_deleted), 504 auto binding = MakeStrongBinding(base::MakeUnique<ServiceImpl>(&was_deleted),
505 std::move(request)); 505 std::move(request));
506 ptr->Frobinate( 506 ptr->Frobinate(
507 nullptr, sample::Service::BazOptions::REGULAR, nullptr, 507 nullptr, sample::Service::BazOptions::REGULAR, nullptr,
508 SetFlagAndRunClosure<int32_t>(&called, run_loop2.QuitClosure())); 508 SetFlagAndRunClosure<int32_t>(&called, run_loop2.QuitClosure()));
(...skipping 12 matching lines...) Expand all
521 } 521 }
522 522
523 // Tests the typical case, where the implementation object owns the 523 // Tests the typical case, where the implementation object owns the
524 // StrongBinding (and should be destroyed on connection error). 524 // StrongBinding (and should be destroyed on connection error).
525 TEST_F(StrongBindingTest, ConnectionErrorDestroysImpl) { 525 TEST_F(StrongBindingTest, ConnectionErrorDestroysImpl) {
526 sample::ServicePtr ptr; 526 sample::ServicePtr ptr;
527 bool was_deleted = false; 527 bool was_deleted = false;
528 // Will delete itself. 528 // Will delete itself.
529 base::RunLoop run_loop; 529 base::RunLoop run_loop;
530 new ServiceImplWithBinding(&was_deleted, run_loop.QuitClosure(), 530 new ServiceImplWithBinding(&was_deleted, run_loop.QuitClosure(),
531 GetProxy(&ptr)); 531 MakeRequest(&ptr));
532 532
533 base::RunLoop().RunUntilIdle(); 533 base::RunLoop().RunUntilIdle();
534 EXPECT_FALSE(was_deleted); 534 EXPECT_FALSE(was_deleted);
535 535
536 ptr.reset(); 536 ptr.reset();
537 EXPECT_FALSE(was_deleted); 537 EXPECT_FALSE(was_deleted);
538 run_loop.Run(); 538 run_loop.Run();
539 EXPECT_TRUE(was_deleted); 539 EXPECT_TRUE(was_deleted);
540 } 540 }
541 541
542 TEST_F(StrongBindingTest, FlushForTesting) { 542 TEST_F(StrongBindingTest, FlushForTesting) {
543 bool called = false; 543 bool called = false;
544 bool was_deleted = false; 544 bool was_deleted = false;
545 sample::ServicePtr ptr; 545 sample::ServicePtr ptr;
546 auto request = GetProxy(&ptr); 546 auto request = MakeRequest(&ptr);
547 auto binding = MakeStrongBinding(base::MakeUnique<ServiceImpl>(&was_deleted), 547 auto binding = MakeStrongBinding(base::MakeUnique<ServiceImpl>(&was_deleted),
548 std::move(request)); 548 std::move(request));
549 binding->set_connection_error_handler(base::Bind(&Fail)); 549 binding->set_connection_error_handler(base::Bind(&Fail));
550 550
551 ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr, 551 ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
552 SetFlagAndRunClosure<int32_t>(&called)); 552 SetFlagAndRunClosure<int32_t>(&called));
553 EXPECT_FALSE(called); 553 EXPECT_FALSE(called);
554 // Because the flush is sent from the binding, it only guarantees that the 554 // Because the flush is sent from the binding, it only guarantees that the
555 // request has been received, not the response. The second flush waits for the 555 // request has been received, not the response. The second flush waits for the
556 // response to be received. 556 // response to be received.
557 ASSERT_TRUE(binding); 557 ASSERT_TRUE(binding);
558 binding->FlushForTesting(); 558 binding->FlushForTesting();
559 ASSERT_TRUE(binding); 559 ASSERT_TRUE(binding);
560 binding->FlushForTesting(); 560 binding->FlushForTesting();
561 EXPECT_TRUE(called); 561 EXPECT_TRUE(called);
562 EXPECT_FALSE(was_deleted); 562 EXPECT_FALSE(was_deleted);
563 ptr.reset(); 563 ptr.reset();
564 ASSERT_TRUE(binding); 564 ASSERT_TRUE(binding);
565 binding->set_connection_error_handler(base::Closure()); 565 binding->set_connection_error_handler(base::Closure());
566 binding->FlushForTesting(); 566 binding->FlushForTesting();
567 EXPECT_TRUE(was_deleted); 567 EXPECT_TRUE(was_deleted);
568 } 568 }
569 569
570 TEST_F(StrongBindingTest, FlushForTestingWithClosedPeer) { 570 TEST_F(StrongBindingTest, FlushForTestingWithClosedPeer) {
571 bool called = false; 571 bool called = false;
572 bool was_deleted = false; 572 bool was_deleted = false;
573 sample::ServicePtr ptr; 573 sample::ServicePtr ptr;
574 auto request = GetProxy(&ptr); 574 auto request = MakeRequest(&ptr);
575 auto binding = MakeStrongBinding(base::MakeUnique<ServiceImpl>(&was_deleted), 575 auto binding = MakeStrongBinding(base::MakeUnique<ServiceImpl>(&was_deleted),
576 std::move(request)); 576 std::move(request));
577 binding->set_connection_error_handler(SetFlagAndRunClosure(&called)); 577 binding->set_connection_error_handler(SetFlagAndRunClosure(&called));
578 ptr.reset(); 578 ptr.reset();
579 579
580 EXPECT_FALSE(called); 580 EXPECT_FALSE(called);
581 EXPECT_FALSE(was_deleted); 581 EXPECT_FALSE(was_deleted);
582 ASSERT_TRUE(binding); 582 ASSERT_TRUE(binding);
583 binding->FlushForTesting(); 583 binding->FlushForTesting();
584 EXPECT_TRUE(called); 584 EXPECT_TRUE(called);
585 EXPECT_TRUE(was_deleted); 585 EXPECT_TRUE(was_deleted);
586 ASSERT_FALSE(binding); 586 ASSERT_FALSE(binding);
587 } 587 }
588 588
589 TEST_F(StrongBindingTest, ConnectionErrorWithReason) { 589 TEST_F(StrongBindingTest, ConnectionErrorWithReason) {
590 sample::ServicePtr ptr; 590 sample::ServicePtr ptr;
591 auto request = GetProxy(&ptr); 591 auto request = MakeRequest(&ptr);
592 auto binding = 592 auto binding =
593 MakeStrongBinding(base::MakeUnique<ServiceImpl>(), std::move(request)); 593 MakeStrongBinding(base::MakeUnique<ServiceImpl>(), std::move(request));
594 base::RunLoop run_loop; 594 base::RunLoop run_loop;
595 binding->set_connection_error_with_reason_handler(base::Bind( 595 binding->set_connection_error_with_reason_handler(base::Bind(
596 [](const base::Closure& quit_closure, uint32_t custom_reason, 596 [](const base::Closure& quit_closure, uint32_t custom_reason,
597 const std::string& description) { 597 const std::string& description) {
598 EXPECT_EQ(5678u, custom_reason); 598 EXPECT_EQ(5678u, custom_reason);
599 EXPECT_EQ("hello", description); 599 EXPECT_EQ("hello", description);
600 quit_closure.Run(); 600 quit_closure.Run();
601 }, 601 },
602 run_loop.QuitClosure())); 602 run_loop.QuitClosure()));
603 603
604 ptr.ResetWithReason(5678u, "hello"); 604 ptr.ResetWithReason(5678u, "hello");
605 605
606 run_loop.Run(); 606 run_loop.Run();
607 } 607 }
608 608
609 } // namespace 609 } // namespace
610 } // mojo 610 } // mojo
OLDNEW
« no previous file with comments | « mojo/public/cpp/bindings/tests/binding_set_unittest.cc ('k') | mojo/public/cpp/bindings/tests/bindings_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698