OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 <queue> | 5 #include <queue> |
6 | 6 |
7 #include "base/memory/ref_counted.h" | 7 #include "base/memory/ref_counted.h" |
8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
9 #include "net/base/rand_callback.h" | 9 #include "net/base/rand_callback.h" |
10 #include "net/base/test_completion_callback.h" | 10 #include "net/base/test_completion_callback.h" |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 bool set_; | 340 bool set_; |
341 std::string name_; | 341 std::string name_; |
342 std::string ptrdomain_; | 342 std::string ptrdomain_; |
343 int ttl_; | 343 int ttl_; |
344 }; | 344 }; |
345 | 345 |
346 class MDnsTest : public ::testing::Test { | 346 class MDnsTest : public ::testing::Test { |
347 public: | 347 public: |
348 MDnsTest(); | 348 MDnsTest(); |
349 virtual ~MDnsTest(); | 349 virtual ~MDnsTest(); |
| 350 virtual void SetUp() OVERRIDE; |
350 virtual void TearDown() OVERRIDE; | 351 virtual void TearDown() OVERRIDE; |
351 void DeleteTransaction(); | 352 void DeleteTransaction(); |
352 void DeleteBothListeners(); | 353 void DeleteBothListeners(); |
353 void RunFor(base::TimeDelta time_period); | 354 void RunFor(base::TimeDelta time_period); |
354 void Stop(); | 355 void Stop(); |
355 | 356 |
356 MOCK_METHOD2(MockableRecordCallback, void(MDnsTransaction::Result result, | 357 MOCK_METHOD2(MockableRecordCallback, void(MDnsTransaction::Result result, |
357 const RecordParsed* record)); | 358 const RecordParsed* record)); |
358 | 359 |
359 MOCK_METHOD2(MockableRecordCallback2, void(MDnsTransaction::Result result, | 360 MOCK_METHOD2(MockableRecordCallback2, void(MDnsTransaction::Result result, |
(...skipping 26 matching lines...) Expand all Loading... |
386 | 387 |
387 MDnsTest::MDnsTest() { | 388 MDnsTest::MDnsTest() { |
388 socket_factory_ = new StrictMock<MockMDnsSocketFactory>(); | 389 socket_factory_ = new StrictMock<MockMDnsSocketFactory>(); |
389 test_client_.reset(new MDnsClientImpl( | 390 test_client_.reset(new MDnsClientImpl( |
390 scoped_ptr<MDnsConnection::SocketFactory>(socket_factory_))); | 391 scoped_ptr<MDnsConnection::SocketFactory>(socket_factory_))); |
391 } | 392 } |
392 | 393 |
393 MDnsTest::~MDnsTest() { | 394 MDnsTest::~MDnsTest() { |
394 } | 395 } |
395 | 396 |
| 397 void MDnsTest::SetUp() { |
| 398 test_client_->StartListening(); |
| 399 } |
| 400 |
396 void MDnsTest::TearDown() { | 401 void MDnsTest::TearDown() { |
397 base::MessageLoop::current()->RunUntilIdle(); | |
398 | |
399 ASSERT_FALSE(test_client_->IsListeningForTests()); | |
400 | |
401 base::MessageLoop::current()->AssertIdle(); | |
402 } | 402 } |
403 | 403 |
404 void MDnsTest::SimulatePacketReceive(const char* packet, unsigned size) { | 404 void MDnsTest::SimulatePacketReceive(const char* packet, unsigned size) { |
405 socket_factory_->SimulateReceive(packet, size); | 405 socket_factory_->SimulateReceive(packet, size); |
406 } | 406 } |
407 | 407 |
408 void MDnsTest::ExpectPacket( | 408 void MDnsTest::ExpectPacket( |
409 const char* packet, | 409 const char* packet, |
410 unsigned size) { | 410 unsigned size) { |
411 EXPECT_CALL(*socket_factory_, OnSendTo(std::string(packet, size))) | 411 EXPECT_CALL(*socket_factory_, OnSendTo(std::string(packet, size))) |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 PtrRecordCopyContainer record_printer; | 443 PtrRecordCopyContainer record_printer; |
444 | 444 |
445 scoped_ptr<MDnsListener> listener_privet = test_client_->CreateListener( | 445 scoped_ptr<MDnsListener> listener_privet = test_client_->CreateListener( |
446 dns_protocol::kTypePTR, "_privet._tcp.local", &delegate_privet); | 446 dns_protocol::kTypePTR, "_privet._tcp.local", &delegate_privet); |
447 scoped_ptr<MDnsListener> listener_printer = test_client_->CreateListener( | 447 scoped_ptr<MDnsListener> listener_printer = test_client_->CreateListener( |
448 dns_protocol::kTypePTR, "_printer._tcp.local", &delegate_printer); | 448 dns_protocol::kTypePTR, "_printer._tcp.local", &delegate_printer); |
449 | 449 |
450 ASSERT_TRUE(listener_privet->Start()); | 450 ASSERT_TRUE(listener_privet->Start()); |
451 ASSERT_TRUE(listener_printer->Start()); | 451 ASSERT_TRUE(listener_printer->Start()); |
452 | 452 |
453 ASSERT_TRUE(test_client_->IsListeningForTests()); | |
454 | |
455 // Send the same packet twice to ensure no records are double-counted. | 453 // Send the same packet twice to ensure no records are double-counted. |
456 | 454 |
457 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) | 455 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) |
458 .Times(Exactly(1)) | 456 .Times(Exactly(1)) |
459 .WillOnce(Invoke( | 457 .WillOnce(Invoke( |
460 &record_privet, | 458 &record_privet, |
461 &PtrRecordCopyContainer::SaveWithDummyArg)); | 459 &PtrRecordCopyContainer::SaveWithDummyArg)); |
462 | 460 |
463 EXPECT_CALL(delegate_printer, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) | 461 EXPECT_CALL(delegate_printer, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) |
464 .Times(Exactly(1)) | 462 .Times(Exactly(1)) |
465 .WillOnce(Invoke( | 463 .WillOnce(Invoke( |
466 &record_printer, | 464 &record_printer, |
467 &PtrRecordCopyContainer::SaveWithDummyArg)); | 465 &PtrRecordCopyContainer::SaveWithDummyArg)); |
468 | 466 |
469 | 467 |
470 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); | 468 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); |
471 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); | 469 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); |
472 | 470 |
473 EXPECT_TRUE(record_privet.IsRecordWith("_privet._tcp.local", | 471 EXPECT_TRUE(record_privet.IsRecordWith("_privet._tcp.local", |
474 "hello._privet._tcp.local")); | 472 "hello._privet._tcp.local")); |
475 | 473 |
476 EXPECT_TRUE(record_printer.IsRecordWith("_printer._tcp.local", | 474 EXPECT_TRUE(record_printer.IsRecordWith("_printer._tcp.local", |
477 "hello._printer._tcp.local")); | 475 "hello._printer._tcp.local")); |
478 | 476 |
479 listener_privet.reset(); | 477 listener_privet.reset(); |
480 listener_printer.reset(); | 478 listener_printer.reset(); |
481 | |
482 ASSERT_TRUE(test_client_->IsListeningForTests()); | |
483 } | 479 } |
484 | 480 |
485 TEST_F(MDnsTest, PassiveListenersCacheCleanup) { | 481 TEST_F(MDnsTest, PassiveListenersCacheCleanup) { |
486 StrictMock<MockListenerDelegate> delegate_privet; | 482 StrictMock<MockListenerDelegate> delegate_privet; |
487 | 483 |
488 PtrRecordCopyContainer record_privet; | 484 PtrRecordCopyContainer record_privet; |
489 PtrRecordCopyContainer record_privet2; | 485 PtrRecordCopyContainer record_privet2; |
490 | 486 |
491 scoped_ptr<MDnsListener> listener_privet = test_client_->CreateListener( | 487 scoped_ptr<MDnsListener> listener_privet = test_client_->CreateListener( |
492 dns_protocol::kTypePTR, "_privet._tcp.local", &delegate_privet); | 488 dns_protocol::kTypePTR, "_privet._tcp.local", &delegate_privet); |
493 | 489 |
494 ASSERT_TRUE(listener_privet->Start()); | 490 ASSERT_TRUE(listener_privet->Start()); |
495 | 491 |
496 ASSERT_TRUE(test_client_->IsListeningForTests()); | |
497 | |
498 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) | 492 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) |
499 .Times(Exactly(1)) | 493 .Times(Exactly(1)) |
500 .WillOnce(Invoke( | 494 .WillOnce(Invoke( |
501 &record_privet, | 495 &record_privet, |
502 &PtrRecordCopyContainer::SaveWithDummyArg)); | 496 &PtrRecordCopyContainer::SaveWithDummyArg)); |
503 | 497 |
504 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); | 498 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); |
505 | 499 |
506 EXPECT_TRUE(record_privet.IsRecordWith("_privet._tcp.local", | 500 EXPECT_TRUE(record_privet.IsRecordWith("_privet._tcp.local", |
507 "hello._privet._tcp.local")); | 501 "hello._privet._tcp.local")); |
(...skipping 14 matching lines...) Expand all Loading... |
522 TEST_F(MDnsTest, MalformedPacket) { | 516 TEST_F(MDnsTest, MalformedPacket) { |
523 StrictMock<MockListenerDelegate> delegate_printer; | 517 StrictMock<MockListenerDelegate> delegate_printer; |
524 | 518 |
525 PtrRecordCopyContainer record_printer; | 519 PtrRecordCopyContainer record_printer; |
526 | 520 |
527 scoped_ptr<MDnsListener> listener_printer = test_client_->CreateListener( | 521 scoped_ptr<MDnsListener> listener_printer = test_client_->CreateListener( |
528 dns_protocol::kTypePTR, "_printer._tcp.local", &delegate_printer); | 522 dns_protocol::kTypePTR, "_printer._tcp.local", &delegate_printer); |
529 | 523 |
530 ASSERT_TRUE(listener_printer->Start()); | 524 ASSERT_TRUE(listener_printer->Start()); |
531 | 525 |
532 ASSERT_TRUE(test_client_->IsListeningForTests()); | |
533 | |
534 EXPECT_CALL(delegate_printer, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) | 526 EXPECT_CALL(delegate_printer, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) |
535 .Times(Exactly(1)) | 527 .Times(Exactly(1)) |
536 .WillOnce(Invoke( | 528 .WillOnce(Invoke( |
537 &record_printer, | 529 &record_printer, |
538 &PtrRecordCopyContainer::SaveWithDummyArg)); | 530 &PtrRecordCopyContainer::SaveWithDummyArg)); |
539 | 531 |
540 // First, send unsalvagable packet to ensure we can deal with it. | 532 // First, send unsalvagable packet to ensure we can deal with it. |
541 SimulatePacketReceive(kCorruptedPacketUnsalvagable, | 533 SimulatePacketReceive(kCorruptedPacketUnsalvagable, |
542 sizeof(kCorruptedPacketUnsalvagable)); | 534 sizeof(kCorruptedPacketUnsalvagable)); |
543 | 535 |
(...skipping 16 matching lines...) Expand all Loading... |
560 test_client_->CreateTransaction( | 552 test_client_->CreateTransaction( |
561 dns_protocol::kTypePTR, "_privet._tcp.local", | 553 dns_protocol::kTypePTR, "_privet._tcp.local", |
562 MDnsTransaction::QUERY_NETWORK | | 554 MDnsTransaction::QUERY_NETWORK | |
563 MDnsTransaction::QUERY_CACHE | | 555 MDnsTransaction::QUERY_CACHE | |
564 MDnsTransaction::SINGLE_RESULT, | 556 MDnsTransaction::SINGLE_RESULT, |
565 base::Bind(&MDnsTest::MockableRecordCallback, | 557 base::Bind(&MDnsTest::MockableRecordCallback, |
566 base::Unretained(this))); | 558 base::Unretained(this))); |
567 | 559 |
568 ASSERT_TRUE(transaction_privet->Start()); | 560 ASSERT_TRUE(transaction_privet->Start()); |
569 | 561 |
570 EXPECT_TRUE(test_client_->IsListeningForTests()); | |
571 | |
572 PtrRecordCopyContainer record_privet; | 562 PtrRecordCopyContainer record_privet; |
573 | 563 |
574 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_RECORD, _)) | 564 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_RECORD, _)) |
575 .Times(Exactly(1)) | 565 .Times(Exactly(1)) |
576 .WillOnce(Invoke(&record_privet, | 566 .WillOnce(Invoke(&record_privet, |
577 &PtrRecordCopyContainer::SaveWithDummyArg)); | 567 &PtrRecordCopyContainer::SaveWithDummyArg)); |
578 | 568 |
579 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); | 569 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); |
580 | 570 |
581 EXPECT_TRUE(record_privet.IsRecordWith("_privet._tcp.local", | 571 EXPECT_TRUE(record_privet.IsRecordWith("_privet._tcp.local", |
582 "hello._privet._tcp.local")); | 572 "hello._privet._tcp.local")); |
583 } | 573 } |
584 | 574 |
585 TEST_F(MDnsTest, TransactionCacheOnlyNoResult) { | 575 TEST_F(MDnsTest, TransactionCacheOnlyNoResult) { |
586 scoped_ptr<MDnsTransaction> transaction_privet = | 576 scoped_ptr<MDnsTransaction> transaction_privet = |
587 test_client_->CreateTransaction( | 577 test_client_->CreateTransaction( |
588 dns_protocol::kTypePTR, "_privet._tcp.local", | 578 dns_protocol::kTypePTR, "_privet._tcp.local", |
589 MDnsTransaction::QUERY_CACHE | | 579 MDnsTransaction::QUERY_CACHE | |
590 MDnsTransaction::SINGLE_RESULT, | 580 MDnsTransaction::SINGLE_RESULT, |
591 base::Bind(&MDnsTest::MockableRecordCallback, | 581 base::Bind(&MDnsTest::MockableRecordCallback, |
592 base::Unretained(this))); | 582 base::Unretained(this))); |
593 | 583 |
594 EXPECT_CALL(*this, | 584 EXPECT_CALL(*this, |
595 MockableRecordCallback(MDnsTransaction::RESULT_NO_RESULTS, _)) | 585 MockableRecordCallback(MDnsTransaction::RESULT_NO_RESULTS, _)) |
596 .Times(Exactly(1)); | 586 .Times(Exactly(1)); |
597 | 587 |
598 ASSERT_TRUE(transaction_privet->Start()); | 588 ASSERT_TRUE(transaction_privet->Start()); |
599 | |
600 EXPECT_FALSE(test_client_->IsListeningForTests()); | |
601 } | 589 } |
602 | 590 |
603 TEST_F(MDnsTest, TransactionWithCache) { | 591 TEST_F(MDnsTest, TransactionWithCache) { |
604 // Listener to force the client to listen | 592 // Listener to force the client to listen |
605 StrictMock<MockListenerDelegate> delegate_irrelevant; | 593 StrictMock<MockListenerDelegate> delegate_irrelevant; |
606 scoped_ptr<MDnsListener> listener_irrelevant = test_client_->CreateListener( | 594 scoped_ptr<MDnsListener> listener_irrelevant = test_client_->CreateListener( |
607 dns_protocol::kTypeA, "codereview.chromium.local", | 595 dns_protocol::kTypeA, "codereview.chromium.local", |
608 &delegate_irrelevant); | 596 &delegate_irrelevant); |
609 | 597 |
610 ASSERT_TRUE(listener_irrelevant->Start()); | 598 ASSERT_TRUE(listener_irrelevant->Start()); |
611 | 599 |
612 EXPECT_TRUE(test_client_->IsListeningForTests()); | |
613 | |
614 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); | 600 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); |
615 | 601 |
616 | 602 |
617 PtrRecordCopyContainer record_privet; | 603 PtrRecordCopyContainer record_privet; |
618 | 604 |
619 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_RECORD, _)) | 605 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_RECORD, _)) |
620 .WillOnce(Invoke(&record_privet, | 606 .WillOnce(Invoke(&record_privet, |
621 &PtrRecordCopyContainer::SaveWithDummyArg)); | 607 &PtrRecordCopyContainer::SaveWithDummyArg)); |
622 | 608 |
623 scoped_ptr<MDnsTransaction> transaction_privet = | 609 scoped_ptr<MDnsTransaction> transaction_privet = |
(...skipping 15 matching lines...) Expand all Loading... |
639 StrictMock<MockListenerDelegate> delegate_privet; | 625 StrictMock<MockListenerDelegate> delegate_privet; |
640 | 626 |
641 PtrRecordCopyContainer record_privet; | 627 PtrRecordCopyContainer record_privet; |
642 | 628 |
643 scoped_ptr<MDnsListener> listener_privet = test_client_->CreateListener( | 629 scoped_ptr<MDnsListener> listener_privet = test_client_->CreateListener( |
644 dns_protocol::kTypePTR, "_privet._tcp.local", | 630 dns_protocol::kTypePTR, "_privet._tcp.local", |
645 &delegate_privet); | 631 &delegate_privet); |
646 | 632 |
647 ASSERT_TRUE(listener_privet->Start()); | 633 ASSERT_TRUE(listener_privet->Start()); |
648 | 634 |
649 ASSERT_TRUE(test_client_->IsListeningForTests()); | |
650 | |
651 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) | 635 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) |
652 .Times(Exactly(1)) | 636 .Times(Exactly(1)) |
653 .WillOnce(Invoke( | 637 .WillOnce(Invoke( |
654 &record_privet, | 638 &record_privet, |
655 &PtrRecordCopyContainer::SaveWithDummyArg)); | 639 &PtrRecordCopyContainer::SaveWithDummyArg)); |
656 | 640 |
657 SimulatePacketReceive(kSamplePacketAdditionalOnly, | 641 SimulatePacketReceive(kSamplePacketAdditionalOnly, |
658 sizeof(kSamplePacketAdditionalOnly)); | 642 sizeof(kSamplePacketAdditionalOnly)); |
659 | 643 |
660 EXPECT_TRUE(record_privet.IsRecordWith("_privet._tcp.local", | 644 EXPECT_TRUE(record_privet.IsRecordWith("_privet._tcp.local", |
661 "hello._privet._tcp.local")); | 645 "hello._privet._tcp.local")); |
662 } | 646 } |
663 | 647 |
664 TEST_F(MDnsTest, TransactionTimeout) { | 648 TEST_F(MDnsTest, TransactionTimeout) { |
665 ExpectPacket(kQueryPacketPrivet, sizeof(kQueryPacketPrivet)); | 649 ExpectPacket(kQueryPacketPrivet, sizeof(kQueryPacketPrivet)); |
666 | 650 |
667 scoped_ptr<MDnsTransaction> transaction_privet = | 651 scoped_ptr<MDnsTransaction> transaction_privet = |
668 test_client_->CreateTransaction( | 652 test_client_->CreateTransaction( |
669 dns_protocol::kTypePTR, "_privet._tcp.local", | 653 dns_protocol::kTypePTR, "_privet._tcp.local", |
670 MDnsTransaction::QUERY_NETWORK | | 654 MDnsTransaction::QUERY_NETWORK | |
671 MDnsTransaction::QUERY_CACHE | | 655 MDnsTransaction::QUERY_CACHE | |
672 MDnsTransaction::SINGLE_RESULT, | 656 MDnsTransaction::SINGLE_RESULT, |
673 base::Bind(&MDnsTest::MockableRecordCallback, | 657 base::Bind(&MDnsTest::MockableRecordCallback, |
674 base::Unretained(this))); | 658 base::Unretained(this))); |
675 | 659 |
676 ASSERT_TRUE(transaction_privet->Start()); | 660 ASSERT_TRUE(transaction_privet->Start()); |
677 | 661 |
678 EXPECT_TRUE(test_client_->IsListeningForTests()); | |
679 | |
680 EXPECT_CALL(*this, | 662 EXPECT_CALL(*this, |
681 MockableRecordCallback(MDnsTransaction::RESULT_NO_RESULTS, NULL)) | 663 MockableRecordCallback(MDnsTransaction::RESULT_NO_RESULTS, NULL)) |
682 .Times(Exactly(1)) | 664 .Times(Exactly(1)) |
683 .WillOnce(InvokeWithoutArgs(this, &MDnsTest::Stop)); | 665 .WillOnce(InvokeWithoutArgs(this, &MDnsTest::Stop)); |
684 | 666 |
685 RunFor(base::TimeDelta::FromSeconds(4)); | 667 RunFor(base::TimeDelta::FromSeconds(4)); |
686 } | 668 } |
687 | 669 |
688 TEST_F(MDnsTest, TransactionMultipleRecords) { | 670 TEST_F(MDnsTest, TransactionMultipleRecords) { |
689 ExpectPacket(kQueryPacketPrivet, sizeof(kQueryPacketPrivet)); | 671 ExpectPacket(kQueryPacketPrivet, sizeof(kQueryPacketPrivet)); |
690 | 672 |
691 scoped_ptr<MDnsTransaction> transaction_privet = | 673 scoped_ptr<MDnsTransaction> transaction_privet = |
692 test_client_->CreateTransaction( | 674 test_client_->CreateTransaction( |
693 dns_protocol::kTypePTR, "_privet._tcp.local", | 675 dns_protocol::kTypePTR, "_privet._tcp.local", |
694 MDnsTransaction::QUERY_NETWORK | | 676 MDnsTransaction::QUERY_NETWORK | |
695 MDnsTransaction::QUERY_CACHE , | 677 MDnsTransaction::QUERY_CACHE , |
696 base::Bind(&MDnsTest::MockableRecordCallback, | 678 base::Bind(&MDnsTest::MockableRecordCallback, |
697 base::Unretained(this))); | 679 base::Unretained(this))); |
698 | 680 |
699 ASSERT_TRUE(transaction_privet->Start()); | 681 ASSERT_TRUE(transaction_privet->Start()); |
700 | 682 |
701 EXPECT_TRUE(test_client_->IsListeningForTests()); | |
702 | |
703 PtrRecordCopyContainer record_privet; | 683 PtrRecordCopyContainer record_privet; |
704 PtrRecordCopyContainer record_privet2; | 684 PtrRecordCopyContainer record_privet2; |
705 | 685 |
706 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_RECORD, _)) | 686 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_RECORD, _)) |
707 .Times(Exactly(2)) | 687 .Times(Exactly(2)) |
708 .WillOnce(Invoke(&record_privet, | 688 .WillOnce(Invoke(&record_privet, |
709 &PtrRecordCopyContainer::SaveWithDummyArg)) | 689 &PtrRecordCopyContainer::SaveWithDummyArg)) |
710 .WillOnce(Invoke(&record_privet2, | 690 .WillOnce(Invoke(&record_privet2, |
711 &PtrRecordCopyContainer::SaveWithDummyArg)); | 691 &PtrRecordCopyContainer::SaveWithDummyArg)); |
712 | 692 |
(...skipping 18 matching lines...) Expand all Loading... |
731 transaction_ = test_client_->CreateTransaction( | 711 transaction_ = test_client_->CreateTransaction( |
732 dns_protocol::kTypePTR, "_privet._tcp.local", | 712 dns_protocol::kTypePTR, "_privet._tcp.local", |
733 MDnsTransaction::QUERY_NETWORK | | 713 MDnsTransaction::QUERY_NETWORK | |
734 MDnsTransaction::QUERY_CACHE | | 714 MDnsTransaction::QUERY_CACHE | |
735 MDnsTransaction::SINGLE_RESULT, | 715 MDnsTransaction::SINGLE_RESULT, |
736 base::Bind(&MDnsTest::MockableRecordCallback, | 716 base::Bind(&MDnsTest::MockableRecordCallback, |
737 base::Unretained(this))); | 717 base::Unretained(this))); |
738 | 718 |
739 ASSERT_TRUE(transaction_->Start()); | 719 ASSERT_TRUE(transaction_->Start()); |
740 | 720 |
741 EXPECT_TRUE(test_client_->IsListeningForTests()); | |
742 | |
743 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_NO_RESULTS, | 721 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_NO_RESULTS, |
744 NULL)) | 722 NULL)) |
745 .Times(Exactly(1)) | 723 .Times(Exactly(1)) |
746 .WillOnce(DoAll(InvokeWithoutArgs(this, &MDnsTest::DeleteTransaction), | 724 .WillOnce(DoAll(InvokeWithoutArgs(this, &MDnsTest::DeleteTransaction), |
747 InvokeWithoutArgs(this, &MDnsTest::Stop))); | 725 InvokeWithoutArgs(this, &MDnsTest::Stop))); |
748 | 726 |
749 RunFor(base::TimeDelta::FromSeconds(4)); | 727 RunFor(base::TimeDelta::FromSeconds(4)); |
750 | 728 |
751 EXPECT_EQ(NULL, transaction_.get()); | 729 EXPECT_EQ(NULL, transaction_.get()); |
752 } | 730 } |
753 | 731 |
754 TEST_F(MDnsTest, TransactionReentrantDeleteFromCache) { | 732 TEST_F(MDnsTest, TransactionReentrantDeleteFromCache) { |
755 StrictMock<MockListenerDelegate> delegate_irrelevant; | 733 StrictMock<MockListenerDelegate> delegate_irrelevant; |
756 scoped_ptr<MDnsListener> listener_irrelevant = test_client_->CreateListener( | 734 scoped_ptr<MDnsListener> listener_irrelevant = test_client_->CreateListener( |
757 dns_protocol::kTypeA, "codereview.chromium.local", | 735 dns_protocol::kTypeA, "codereview.chromium.local", |
758 &delegate_irrelevant); | 736 &delegate_irrelevant); |
759 ASSERT_TRUE(listener_irrelevant->Start()); | 737 ASSERT_TRUE(listener_irrelevant->Start()); |
760 | 738 |
761 ASSERT_TRUE(test_client_->IsListeningForTests()); | |
762 | |
763 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); | 739 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); |
764 | 740 |
765 transaction_ = test_client_->CreateTransaction( | 741 transaction_ = test_client_->CreateTransaction( |
766 dns_protocol::kTypePTR, "_privet._tcp.local", | 742 dns_protocol::kTypePTR, "_privet._tcp.local", |
767 MDnsTransaction::QUERY_NETWORK | | 743 MDnsTransaction::QUERY_NETWORK | |
768 MDnsTransaction::QUERY_CACHE, | 744 MDnsTransaction::QUERY_CACHE, |
769 base::Bind(&MDnsTest::MockableRecordCallback, | 745 base::Bind(&MDnsTest::MockableRecordCallback, |
770 base::Unretained(this))); | 746 base::Unretained(this))); |
771 | 747 |
772 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_RECORD, _)) | 748 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_RECORD, _)) |
(...skipping 28 matching lines...) Expand all Loading... |
801 .Times(Exactly(1)); | 777 .Times(Exactly(1)); |
802 | 778 |
803 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_RECORD, | 779 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_RECORD, |
804 _)) | 780 _)) |
805 .Times(Exactly(1)) | 781 .Times(Exactly(1)) |
806 .WillOnce(IgnoreResult(InvokeWithoutArgs(transaction2.get(), | 782 .WillOnce(IgnoreResult(InvokeWithoutArgs(transaction2.get(), |
807 &MDnsTransaction::Start))); | 783 &MDnsTransaction::Start))); |
808 | 784 |
809 ASSERT_TRUE(transaction1->Start()); | 785 ASSERT_TRUE(transaction1->Start()); |
810 | 786 |
811 EXPECT_TRUE(test_client_->IsListeningForTests()); | |
812 | |
813 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); | 787 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); |
814 } | 788 } |
815 | 789 |
816 // In order to reliably test reentrant listener deletes, we create two listeners | 790 // In order to reliably test reentrant listener deletes, we create two listeners |
817 // and have each of them delete both, so we're guaranteed to try and deliver a | 791 // and have each of them delete both, so we're guaranteed to try and deliver a |
818 // callback to at least one deleted listener. | 792 // callback to at least one deleted listener. |
819 | 793 |
820 TEST_F(MDnsTest, ListenerReentrantDelete) { | 794 TEST_F(MDnsTest, ListenerReentrantDelete) { |
821 StrictMock<MockListenerDelegate> delegate_privet; | 795 StrictMock<MockListenerDelegate> delegate_privet; |
822 | 796 |
823 listener1_ = test_client_->CreateListener( | 797 listener1_ = test_client_->CreateListener( |
824 dns_protocol::kTypePTR, "_privet._tcp.local", | 798 dns_protocol::kTypePTR, "_privet._tcp.local", |
825 &delegate_privet); | 799 &delegate_privet); |
826 | 800 |
827 listener2_ = test_client_->CreateListener( | 801 listener2_ = test_client_->CreateListener( |
828 dns_protocol::kTypePTR, "_privet._tcp.local", | 802 dns_protocol::kTypePTR, "_privet._tcp.local", |
829 &delegate_privet); | 803 &delegate_privet); |
830 | 804 |
831 ASSERT_TRUE(listener1_->Start()); | 805 ASSERT_TRUE(listener1_->Start()); |
832 | 806 |
833 ASSERT_TRUE(listener2_->Start()); | 807 ASSERT_TRUE(listener2_->Start()); |
834 | 808 |
835 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) | 809 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) |
836 .Times(Exactly(1)) | 810 .Times(Exactly(1)) |
837 .WillOnce(InvokeWithoutArgs(this, &MDnsTest::DeleteBothListeners)); | 811 .WillOnce(InvokeWithoutArgs(this, &MDnsTest::DeleteBothListeners)); |
838 | 812 |
839 EXPECT_TRUE(test_client_->IsListeningForTests()); | |
840 | |
841 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); | 813 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); |
842 | 814 |
843 EXPECT_EQ(NULL, listener1_.get()); | 815 EXPECT_EQ(NULL, listener1_.get()); |
844 EXPECT_EQ(NULL, listener2_.get()); | 816 EXPECT_EQ(NULL, listener2_.get()); |
845 } | 817 } |
846 | 818 |
847 ACTION_P(SaveIPAddress, ip_container) { | 819 ACTION_P(SaveIPAddress, ip_container) { |
848 ::testing::StaticAssertTypeEq<const RecordParsed*, arg1_type>(); | 820 ::testing::StaticAssertTypeEq<const RecordParsed*, arg1_type>(); |
849 ::testing::StaticAssertTypeEq<IPAddressNumber*, ip_container_type>(); | 821 ::testing::StaticAssertTypeEq<IPAddressNumber*, ip_container_type>(); |
850 | 822 |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1138 | 1110 |
1139 ASSERT_TRUE(InitConnection()); | 1111 ASSERT_TRUE(InitConnection()); |
1140 | 1112 |
1141 EXPECT_CALL(delegate_, OnConnectionError(ERR_SOCKET_NOT_CONNECTED)); | 1113 EXPECT_CALL(delegate_, OnConnectionError(ERR_SOCKET_NOT_CONNECTED)); |
1142 callback.Run(ERR_SOCKET_NOT_CONNECTED); | 1114 callback.Run(ERR_SOCKET_NOT_CONNECTED); |
1143 } | 1115 } |
1144 | 1116 |
1145 } // namespace | 1117 } // namespace |
1146 | 1118 |
1147 } // namespace net | 1119 } // namespace net |
OLD | NEW |