OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 <memory> | 5 #include <memory> |
6 #include <utility> | 6 #include <utility> |
7 | 7 |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
10 #include "mojo/public/cpp/bindings/associated_binding_set.h" | 10 #include "mojo/public/cpp/bindings/associated_binding_set.h" |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 PingServiceAssociatedPtr ptr; | 345 PingServiceAssociatedPtr ptr; |
346 master_ptr->GetPing(MakeRequest(&ptr)); | 346 master_ptr->GetPing(MakeRequest(&ptr)); |
347 | 347 |
348 ptr.ResetWithReason(2048u, "bye"); | 348 ptr.ResetWithReason(2048u, "bye"); |
349 | 349 |
350 run_loop.Run(); | 350 run_loop.Run(); |
351 } | 351 } |
352 | 352 |
353 class PingInstanceCounter : public PingService { | 353 class PingInstanceCounter : public PingService { |
354 public: | 354 public: |
355 PingInstanceCounter() { ++instance_count; } | 355 explicit PingInstanceCounter( |
356 ~PingInstanceCounter() override { --instance_count; } | 356 const base::Closure& destruction_callback = base::Closure()) |
| 357 : destruction_callback_(destruction_callback) { |
| 358 ++instance_count; |
| 359 } |
| 360 |
| 361 ~PingInstanceCounter() override { |
| 362 --instance_count; |
| 363 if (destruction_callback_) |
| 364 destruction_callback_.Run(); |
| 365 } |
357 | 366 |
358 void Ping(const PingCallback& callback) override {} | 367 void Ping(const PingCallback& callback) override {} |
359 | 368 |
| 369 const base::Closure destruction_callback_; |
| 370 |
360 static int instance_count; | 371 static int instance_count; |
361 }; | 372 }; |
362 int PingInstanceCounter::instance_count = 0; | 373 int PingInstanceCounter::instance_count = 0; |
363 | 374 |
364 TEST_F(BindingSetTest, StrongBinding_Destructor) { | 375 TEST_F(BindingSetTest, StrongBinding_Destructor) { |
365 PingServicePtr ping_a, ping_b; | 376 PingServicePtr ping_a, ping_b; |
366 auto bindings = base::MakeUnique<StrongBindingSet<PingService>>(); | 377 auto bindings = base::MakeUnique<StrongBindingSet<PingService>>(); |
367 | 378 |
368 bindings->AddBinding(base::MakeUnique<PingInstanceCounter>(), | 379 bindings->AddBinding(base::MakeUnique<PingInstanceCounter>(), |
369 mojo::MakeRequest(&ping_a)); | 380 mojo::MakeRequest(&ping_a)); |
370 EXPECT_EQ(1, PingInstanceCounter::instance_count); | 381 EXPECT_EQ(1, PingInstanceCounter::instance_count); |
371 | 382 |
372 bindings->AddBinding(base::MakeUnique<PingInstanceCounter>(), | 383 bindings->AddBinding(base::MakeUnique<PingInstanceCounter>(), |
373 mojo::MakeRequest(&ping_b)); | 384 mojo::MakeRequest(&ping_b)); |
374 EXPECT_EQ(2, PingInstanceCounter::instance_count); | 385 EXPECT_EQ(2, PingInstanceCounter::instance_count); |
375 | 386 |
376 bindings.reset(); | 387 bindings.reset(); |
377 EXPECT_EQ(0, PingInstanceCounter::instance_count); | 388 EXPECT_EQ(0, PingInstanceCounter::instance_count); |
378 } | 389 } |
379 | 390 |
380 TEST_F(BindingSetTest, StrongBinding_ConnectionError) { | 391 TEST_F(BindingSetTest, StrongBinding_ConnectionError) { |
| 392 base::RunLoop loop_a, loop_b; |
381 PingServicePtr ping_a, ping_b; | 393 PingServicePtr ping_a, ping_b; |
382 StrongBindingSet<PingService> bindings; | 394 StrongBindingSet<PingService> bindings; |
383 bindings.AddBinding(base::MakeUnique<PingInstanceCounter>(), | 395 bindings.AddBinding( |
384 mojo::MakeRequest(&ping_a)); | 396 base::MakeUnique<PingInstanceCounter>(loop_a.QuitClosure()), |
385 bindings.AddBinding(base::MakeUnique<PingInstanceCounter>(), | 397 mojo::MakeRequest(&ping_a)); |
386 mojo::MakeRequest(&ping_b)); | 398 bindings.AddBinding( |
| 399 base::MakeUnique<PingInstanceCounter>(loop_b.QuitClosure()), |
| 400 mojo::MakeRequest(&ping_b)); |
387 EXPECT_EQ(2, PingInstanceCounter::instance_count); | 401 EXPECT_EQ(2, PingInstanceCounter::instance_count); |
388 | 402 |
389 ping_a.reset(); | 403 ping_a.reset(); |
390 base::RunLoop().RunUntilIdle(); | 404 loop_a.Run(); |
391 EXPECT_EQ(1, PingInstanceCounter::instance_count); | 405 EXPECT_EQ(1, PingInstanceCounter::instance_count); |
392 | 406 |
393 ping_b.reset(); | 407 ping_b.reset(); |
394 base::RunLoop().RunUntilIdle(); | 408 loop_b.Run(); |
395 EXPECT_EQ(0, PingInstanceCounter::instance_count); | 409 EXPECT_EQ(0, PingInstanceCounter::instance_count); |
396 } | 410 } |
397 | 411 |
398 TEST_F(BindingSetTest, StrongBinding_RemoveBinding) { | 412 TEST_F(BindingSetTest, StrongBinding_RemoveBinding) { |
399 PingServicePtr ping_a, ping_b; | 413 PingServicePtr ping_a, ping_b; |
400 StrongBindingSet<PingService> bindings; | 414 StrongBindingSet<PingService> bindings; |
401 BindingId binding_id_a = bindings.AddBinding( | 415 BindingId binding_id_a = bindings.AddBinding( |
402 base::MakeUnique<PingInstanceCounter>(), mojo::MakeRequest(&ping_a)); | 416 base::MakeUnique<PingInstanceCounter>(), mojo::MakeRequest(&ping_a)); |
403 BindingId binding_id_b = bindings.AddBinding( | 417 BindingId binding_id_b = bindings.AddBinding( |
404 base::MakeUnique<PingInstanceCounter>(), mojo::MakeRequest(&ping_b)); | 418 base::MakeUnique<PingInstanceCounter>(), mojo::MakeRequest(&ping_b)); |
405 EXPECT_EQ(2, PingInstanceCounter::instance_count); | 419 EXPECT_EQ(2, PingInstanceCounter::instance_count); |
406 | 420 |
407 EXPECT_TRUE(bindings.RemoveBinding(binding_id_a)); | 421 EXPECT_TRUE(bindings.RemoveBinding(binding_id_a)); |
408 EXPECT_EQ(1, PingInstanceCounter::instance_count); | 422 EXPECT_EQ(1, PingInstanceCounter::instance_count); |
409 | 423 |
410 EXPECT_TRUE(bindings.RemoveBinding(binding_id_b)); | 424 EXPECT_TRUE(bindings.RemoveBinding(binding_id_b)); |
411 EXPECT_EQ(0, PingInstanceCounter::instance_count); | 425 EXPECT_EQ(0, PingInstanceCounter::instance_count); |
412 } | 426 } |
413 | 427 |
414 } // namespace | 428 } // namespace |
415 } // namespace test | 429 } // namespace test |
416 } // namespace mojo | 430 } // namespace mojo |
OLD | NEW |