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

Side by Side Diff: net/dns/mdns_client_unittest.cc

Issue 87693002: Refactored to make MDnsSocketFactory return array of sockets. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years 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 | Annotate | Revision Log
« no previous file with comments | « net/dns/mdns_client_impl.cc ('k') | net/dns/mock_mdns_socket_factory.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/message_loop.h" 8 #include "base/message_loop/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 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 365
366 private: 366 private:
367 bool set_; 367 bool set_;
368 std::string name_; 368 std::string name_;
369 std::string ptrdomain_; 369 std::string ptrdomain_;
370 int ttl_; 370 int ttl_;
371 }; 371 };
372 372
373 class MDnsTest : public ::testing::Test { 373 class MDnsTest : public ::testing::Test {
374 public: 374 public:
375 MDnsTest();
376 virtual ~MDnsTest();
377 virtual void SetUp() OVERRIDE; 375 virtual void SetUp() OVERRIDE;
378 virtual void TearDown() OVERRIDE;
379 void DeleteTransaction(); 376 void DeleteTransaction();
380 void DeleteBothListeners(); 377 void DeleteBothListeners();
381 void RunFor(base::TimeDelta time_period); 378 void RunFor(base::TimeDelta time_period);
382 void Stop(); 379 void Stop();
383 380
384 MOCK_METHOD2(MockableRecordCallback, void(MDnsTransaction::Result result, 381 MOCK_METHOD2(MockableRecordCallback, void(MDnsTransaction::Result result,
385 const RecordParsed* record)); 382 const RecordParsed* record));
386 383
387 MOCK_METHOD2(MockableRecordCallback2, void(MDnsTransaction::Result result, 384 MOCK_METHOD2(MockableRecordCallback2, void(MDnsTransaction::Result result,
388 const RecordParsed* record)); 385 const RecordParsed* record));
389 386
390 387
391 protected: 388 protected:
392 void ExpectPacket(const uint8* packet, unsigned size); 389 void ExpectPacket(const uint8* packet, unsigned size);
393 void SimulatePacketReceive(const uint8* packet, unsigned size); 390 void SimulatePacketReceive(const uint8* packet, unsigned size);
394 391
395 scoped_ptr<MDnsClientImpl> test_client_; 392 MDnsClientImpl test_client_;
396 IPEndPoint mdns_ipv4_endpoint_; 393 IPEndPoint mdns_ipv4_endpoint_;
397 StrictMock<MockMDnsSocketFactory>* socket_factory_; 394 StrictMock<MockMDnsSocketFactory> socket_factory_;
398 395
399 // Transactions and listeners that can be deleted by class methods for 396 // Transactions and listeners that can be deleted by class methods for
400 // reentrancy tests. 397 // reentrancy tests.
401 scoped_ptr<MDnsTransaction> transaction_; 398 scoped_ptr<MDnsTransaction> transaction_;
402 scoped_ptr<MDnsListener> listener1_; 399 scoped_ptr<MDnsListener> listener1_;
403 scoped_ptr<MDnsListener> listener2_; 400 scoped_ptr<MDnsListener> listener2_;
404 }; 401 };
405 402
406 class MockListenerDelegate : public MDnsListener::Delegate { 403 class MockListenerDelegate : public MDnsListener::Delegate {
407 public: 404 public:
408 MOCK_METHOD2(OnRecordUpdate, 405 MOCK_METHOD2(OnRecordUpdate,
409 void(MDnsListener::UpdateType update, 406 void(MDnsListener::UpdateType update,
410 const RecordParsed* records)); 407 const RecordParsed* records));
411 MOCK_METHOD2(OnNsecRecord, void(const std::string&, unsigned)); 408 MOCK_METHOD2(OnNsecRecord, void(const std::string&, unsigned));
412 MOCK_METHOD0(OnCachePurged, void()); 409 MOCK_METHOD0(OnCachePurged, void());
413 }; 410 };
414 411
415 MDnsTest::MDnsTest() {
416 socket_factory_ = new StrictMock<MockMDnsSocketFactory>();
417 test_client_.reset(new MDnsClientImpl(
418 scoped_ptr<MDnsConnection::SocketFactory>(socket_factory_)));
419 }
420
421 MDnsTest::~MDnsTest() {
422 }
423
424 void MDnsTest::SetUp() { 412 void MDnsTest::SetUp() {
425 test_client_->StartListening(); 413 test_client_.StartListening(&socket_factory_);
426 }
427
428 void MDnsTest::TearDown() {
429 } 414 }
430 415
431 void MDnsTest::SimulatePacketReceive(const uint8* packet, unsigned size) { 416 void MDnsTest::SimulatePacketReceive(const uint8* packet, unsigned size) {
432 socket_factory_->SimulateReceive(packet, size); 417 socket_factory_.SimulateReceive(packet, size);
433 } 418 }
434 419
435 void MDnsTest::ExpectPacket(const uint8* packet, unsigned size) { 420 void MDnsTest::ExpectPacket(const uint8* packet, unsigned size) {
436 EXPECT_CALL(*socket_factory_, OnSendTo(MakeString(packet, size))) 421 EXPECT_CALL(socket_factory_, OnSendTo(MakeString(packet, size)))
437 .Times(2); 422 .Times(2);
438 } 423 }
439 424
440 void MDnsTest::DeleteTransaction() { 425 void MDnsTest::DeleteTransaction() {
441 transaction_.reset(); 426 transaction_.reset();
442 } 427 }
443 428
444 void MDnsTest::DeleteBothListeners() { 429 void MDnsTest::DeleteBothListeners() {
445 listener1_.reset(); 430 listener1_.reset();
446 listener2_.reset(); 431 listener2_.reset();
(...skipping 13 matching lines...) Expand all
460 base::MessageLoop::current()->Quit(); 445 base::MessageLoop::current()->Quit();
461 } 446 }
462 447
463 TEST_F(MDnsTest, PassiveListeners) { 448 TEST_F(MDnsTest, PassiveListeners) {
464 StrictMock<MockListenerDelegate> delegate_privet; 449 StrictMock<MockListenerDelegate> delegate_privet;
465 StrictMock<MockListenerDelegate> delegate_printer; 450 StrictMock<MockListenerDelegate> delegate_printer;
466 451
467 PtrRecordCopyContainer record_privet; 452 PtrRecordCopyContainer record_privet;
468 PtrRecordCopyContainer record_printer; 453 PtrRecordCopyContainer record_printer;
469 454
470 scoped_ptr<MDnsListener> listener_privet = test_client_->CreateListener( 455 scoped_ptr<MDnsListener> listener_privet =
471 dns_protocol::kTypePTR, "_privet._tcp.local", &delegate_privet); 456 test_client_.CreateListener(dns_protocol::kTypePTR, "_privet._tcp.local",
472 scoped_ptr<MDnsListener> listener_printer = test_client_->CreateListener( 457 &delegate_privet);
473 dns_protocol::kTypePTR, "_printer._tcp.local", &delegate_printer); 458 scoped_ptr<MDnsListener> listener_printer =
459 test_client_.CreateListener(dns_protocol::kTypePTR, "_printer._tcp.local",
460 &delegate_printer);
474 461
475 ASSERT_TRUE(listener_privet->Start()); 462 ASSERT_TRUE(listener_privet->Start());
476 ASSERT_TRUE(listener_printer->Start()); 463 ASSERT_TRUE(listener_printer->Start());
477 464
478 // Send the same packet twice to ensure no records are double-counted. 465 // Send the same packet twice to ensure no records are double-counted.
479 466
480 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) 467 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _))
481 .Times(Exactly(1)) 468 .Times(Exactly(1))
482 .WillOnce(Invoke( 469 .WillOnce(Invoke(
483 &record_privet, 470 &record_privet,
(...skipping 18 matching lines...) Expand all
502 listener_privet.reset(); 489 listener_privet.reset();
503 listener_printer.reset(); 490 listener_printer.reset();
504 } 491 }
505 492
506 TEST_F(MDnsTest, PassiveListenersCacheCleanup) { 493 TEST_F(MDnsTest, PassiveListenersCacheCleanup) {
507 StrictMock<MockListenerDelegate> delegate_privet; 494 StrictMock<MockListenerDelegate> delegate_privet;
508 495
509 PtrRecordCopyContainer record_privet; 496 PtrRecordCopyContainer record_privet;
510 PtrRecordCopyContainer record_privet2; 497 PtrRecordCopyContainer record_privet2;
511 498
512 scoped_ptr<MDnsListener> listener_privet = test_client_->CreateListener( 499 scoped_ptr<MDnsListener> listener_privet =
513 dns_protocol::kTypePTR, "_privet._tcp.local", &delegate_privet); 500 test_client_.CreateListener(dns_protocol::kTypePTR, "_privet._tcp.local",
501 &delegate_privet);
514 502
515 ASSERT_TRUE(listener_privet->Start()); 503 ASSERT_TRUE(listener_privet->Start());
516 504
517 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) 505 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _))
518 .Times(Exactly(1)) 506 .Times(Exactly(1))
519 .WillOnce(Invoke( 507 .WillOnce(Invoke(
520 &record_privet, 508 &record_privet,
521 &PtrRecordCopyContainer::SaveWithDummyArg)); 509 &PtrRecordCopyContainer::SaveWithDummyArg));
522 510
523 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); 511 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1));
(...skipping 12 matching lines...) Expand all
536 524
537 EXPECT_TRUE(record_privet2.IsRecordWith("_privet._tcp.local", 525 EXPECT_TRUE(record_privet2.IsRecordWith("_privet._tcp.local",
538 "hello._privet._tcp.local")); 526 "hello._privet._tcp.local"));
539 } 527 }
540 528
541 TEST_F(MDnsTest, MalformedPacket) { 529 TEST_F(MDnsTest, MalformedPacket) {
542 StrictMock<MockListenerDelegate> delegate_printer; 530 StrictMock<MockListenerDelegate> delegate_printer;
543 531
544 PtrRecordCopyContainer record_printer; 532 PtrRecordCopyContainer record_printer;
545 533
546 scoped_ptr<MDnsListener> listener_printer = test_client_->CreateListener( 534 scoped_ptr<MDnsListener> listener_printer =
547 dns_protocol::kTypePTR, "_printer._tcp.local", &delegate_printer); 535 test_client_.CreateListener(dns_protocol::kTypePTR, "_printer._tcp.local",
536 &delegate_printer);
548 537
549 ASSERT_TRUE(listener_printer->Start()); 538 ASSERT_TRUE(listener_printer->Start());
550 539
551 EXPECT_CALL(delegate_printer, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) 540 EXPECT_CALL(delegate_printer, OnRecordUpdate(MDnsListener::RECORD_ADDED, _))
552 .Times(Exactly(1)) 541 .Times(Exactly(1))
553 .WillOnce(Invoke( 542 .WillOnce(Invoke(
554 &record_printer, 543 &record_printer,
555 &PtrRecordCopyContainer::SaveWithDummyArg)); 544 &PtrRecordCopyContainer::SaveWithDummyArg));
556 545
557 // First, send unsalvagable packet to ensure we can deal with it. 546 // First, send unsalvagable packet to ensure we can deal with it.
558 SimulatePacketReceive(kCorruptedPacketUnsalvagable, 547 SimulatePacketReceive(kCorruptedPacketUnsalvagable,
559 sizeof(kCorruptedPacketUnsalvagable)); 548 sizeof(kCorruptedPacketUnsalvagable));
560 549
561 // Regression test: send a packet where the question cannot be read. 550 // Regression test: send a packet where the question cannot be read.
562 SimulatePacketReceive(kCorruptedPacketBadQuestion, 551 SimulatePacketReceive(kCorruptedPacketBadQuestion,
563 sizeof(kCorruptedPacketBadQuestion)); 552 sizeof(kCorruptedPacketBadQuestion));
564 553
565 // Then send salvagable packet to ensure we can extract useful records. 554 // Then send salvagable packet to ensure we can extract useful records.
566 SimulatePacketReceive(kCorruptedPacketSalvagable, 555 SimulatePacketReceive(kCorruptedPacketSalvagable,
567 sizeof(kCorruptedPacketSalvagable)); 556 sizeof(kCorruptedPacketSalvagable));
568 557
569 EXPECT_TRUE(record_printer.IsRecordWith("_printer._tcp.local", 558 EXPECT_TRUE(record_printer.IsRecordWith("_printer._tcp.local",
570 "hello._printer._tcp.local")); 559 "hello._printer._tcp.local"));
571 } 560 }
572 561
573 TEST_F(MDnsTest, TransactionWithEmptyCache) { 562 TEST_F(MDnsTest, TransactionWithEmptyCache) {
574 ExpectPacket(kQueryPacketPrivet, sizeof(kQueryPacketPrivet)); 563 ExpectPacket(kQueryPacketPrivet, sizeof(kQueryPacketPrivet));
575 564
576 scoped_ptr<MDnsTransaction> transaction_privet = 565 scoped_ptr<MDnsTransaction> transaction_privet =
577 test_client_->CreateTransaction( 566 test_client_.CreateTransaction(
578 dns_protocol::kTypePTR, "_privet._tcp.local", 567 dns_protocol::kTypePTR, "_privet._tcp.local",
579 MDnsTransaction::QUERY_NETWORK | 568 MDnsTransaction::QUERY_NETWORK |
580 MDnsTransaction::QUERY_CACHE | 569 MDnsTransaction::QUERY_CACHE |
581 MDnsTransaction::SINGLE_RESULT, 570 MDnsTransaction::SINGLE_RESULT,
582 base::Bind(&MDnsTest::MockableRecordCallback, 571 base::Bind(&MDnsTest::MockableRecordCallback,
583 base::Unretained(this))); 572 base::Unretained(this)));
584 573
585 ASSERT_TRUE(transaction_privet->Start()); 574 ASSERT_TRUE(transaction_privet->Start());
586 575
587 PtrRecordCopyContainer record_privet; 576 PtrRecordCopyContainer record_privet;
588 577
589 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_RECORD, _)) 578 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_RECORD, _))
590 .Times(Exactly(1)) 579 .Times(Exactly(1))
591 .WillOnce(Invoke(&record_privet, 580 .WillOnce(Invoke(&record_privet,
592 &PtrRecordCopyContainer::SaveWithDummyArg)); 581 &PtrRecordCopyContainer::SaveWithDummyArg));
593 582
594 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); 583 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1));
595 584
596 EXPECT_TRUE(record_privet.IsRecordWith("_privet._tcp.local", 585 EXPECT_TRUE(record_privet.IsRecordWith("_privet._tcp.local",
597 "hello._privet._tcp.local")); 586 "hello._privet._tcp.local"));
598 } 587 }
599 588
600 TEST_F(MDnsTest, TransactionCacheOnlyNoResult) { 589 TEST_F(MDnsTest, TransactionCacheOnlyNoResult) {
601 scoped_ptr<MDnsTransaction> transaction_privet = 590 scoped_ptr<MDnsTransaction> transaction_privet =
602 test_client_->CreateTransaction( 591 test_client_.CreateTransaction(
603 dns_protocol::kTypePTR, "_privet._tcp.local", 592 dns_protocol::kTypePTR, "_privet._tcp.local",
604 MDnsTransaction::QUERY_CACHE | 593 MDnsTransaction::QUERY_CACHE |
605 MDnsTransaction::SINGLE_RESULT, 594 MDnsTransaction::SINGLE_RESULT,
606 base::Bind(&MDnsTest::MockableRecordCallback, 595 base::Bind(&MDnsTest::MockableRecordCallback,
607 base::Unretained(this))); 596 base::Unretained(this)));
608 597
609 EXPECT_CALL(*this, 598 EXPECT_CALL(*this,
610 MockableRecordCallback(MDnsTransaction::RESULT_NO_RESULTS, _)) 599 MockableRecordCallback(MDnsTransaction::RESULT_NO_RESULTS, _))
611 .Times(Exactly(1)); 600 .Times(Exactly(1));
612 601
613 ASSERT_TRUE(transaction_privet->Start()); 602 ASSERT_TRUE(transaction_privet->Start());
614 } 603 }
615 604
616 TEST_F(MDnsTest, TransactionWithCache) { 605 TEST_F(MDnsTest, TransactionWithCache) {
617 // Listener to force the client to listen 606 // Listener to force the client to listen
618 StrictMock<MockListenerDelegate> delegate_irrelevant; 607 StrictMock<MockListenerDelegate> delegate_irrelevant;
619 scoped_ptr<MDnsListener> listener_irrelevant = test_client_->CreateListener( 608 scoped_ptr<MDnsListener> listener_irrelevant =
620 dns_protocol::kTypeA, "codereview.chromium.local", 609 test_client_.CreateListener(dns_protocol::kTypeA,
621 &delegate_irrelevant); 610 "codereview.chromium.local",
611 &delegate_irrelevant);
622 612
623 ASSERT_TRUE(listener_irrelevant->Start()); 613 ASSERT_TRUE(listener_irrelevant->Start());
624 614
625 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); 615 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1));
626 616
627 617
628 PtrRecordCopyContainer record_privet; 618 PtrRecordCopyContainer record_privet;
629 619
630 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_RECORD, _)) 620 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_RECORD, _))
631 .WillOnce(Invoke(&record_privet, 621 .WillOnce(Invoke(&record_privet,
632 &PtrRecordCopyContainer::SaveWithDummyArg)); 622 &PtrRecordCopyContainer::SaveWithDummyArg));
633 623
634 scoped_ptr<MDnsTransaction> transaction_privet = 624 scoped_ptr<MDnsTransaction> transaction_privet =
635 test_client_->CreateTransaction( 625 test_client_.CreateTransaction(
636 dns_protocol::kTypePTR, "_privet._tcp.local", 626 dns_protocol::kTypePTR, "_privet._tcp.local",
637 MDnsTransaction::QUERY_NETWORK | 627 MDnsTransaction::QUERY_NETWORK |
638 MDnsTransaction::QUERY_CACHE | 628 MDnsTransaction::QUERY_CACHE |
639 MDnsTransaction::SINGLE_RESULT, 629 MDnsTransaction::SINGLE_RESULT,
640 base::Bind(&MDnsTest::MockableRecordCallback, 630 base::Bind(&MDnsTest::MockableRecordCallback,
641 base::Unretained(this))); 631 base::Unretained(this)));
642 632
643 ASSERT_TRUE(transaction_privet->Start()); 633 ASSERT_TRUE(transaction_privet->Start());
644 634
645 EXPECT_TRUE(record_privet.IsRecordWith("_privet._tcp.local", 635 EXPECT_TRUE(record_privet.IsRecordWith("_privet._tcp.local",
646 "hello._privet._tcp.local")); 636 "hello._privet._tcp.local"));
647 } 637 }
648 638
649 TEST_F(MDnsTest, AdditionalRecords) { 639 TEST_F(MDnsTest, AdditionalRecords) {
650 StrictMock<MockListenerDelegate> delegate_privet; 640 StrictMock<MockListenerDelegate> delegate_privet;
651 641
652 PtrRecordCopyContainer record_privet; 642 PtrRecordCopyContainer record_privet;
653 643
654 scoped_ptr<MDnsListener> listener_privet = test_client_->CreateListener( 644 scoped_ptr<MDnsListener> listener_privet =
655 dns_protocol::kTypePTR, "_privet._tcp.local", 645 test_client_.CreateListener(dns_protocol::kTypePTR, "_privet._tcp.local",
656 &delegate_privet); 646 &delegate_privet);
657 647
658 ASSERT_TRUE(listener_privet->Start()); 648 ASSERT_TRUE(listener_privet->Start());
659 649
660 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) 650 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _))
661 .Times(Exactly(1)) 651 .Times(Exactly(1))
662 .WillOnce(Invoke( 652 .WillOnce(Invoke(
663 &record_privet, 653 &record_privet,
664 &PtrRecordCopyContainer::SaveWithDummyArg)); 654 &PtrRecordCopyContainer::SaveWithDummyArg));
665 655
666 SimulatePacketReceive(kSamplePacketAdditionalOnly, 656 SimulatePacketReceive(kSamplePacketAdditionalOnly,
667 sizeof(kSamplePacketAdditionalOnly)); 657 sizeof(kSamplePacketAdditionalOnly));
668 658
669 EXPECT_TRUE(record_privet.IsRecordWith("_privet._tcp.local", 659 EXPECT_TRUE(record_privet.IsRecordWith("_privet._tcp.local",
670 "hello._privet._tcp.local")); 660 "hello._privet._tcp.local"));
671 } 661 }
672 662
673 TEST_F(MDnsTest, TransactionTimeout) { 663 TEST_F(MDnsTest, TransactionTimeout) {
674 ExpectPacket(kQueryPacketPrivet, sizeof(kQueryPacketPrivet)); 664 ExpectPacket(kQueryPacketPrivet, sizeof(kQueryPacketPrivet));
675 665
676 scoped_ptr<MDnsTransaction> transaction_privet = 666 scoped_ptr<MDnsTransaction> transaction_privet =
677 test_client_->CreateTransaction( 667 test_client_.CreateTransaction(
678 dns_protocol::kTypePTR, "_privet._tcp.local", 668 dns_protocol::kTypePTR, "_privet._tcp.local",
679 MDnsTransaction::QUERY_NETWORK | 669 MDnsTransaction::QUERY_NETWORK |
680 MDnsTransaction::QUERY_CACHE | 670 MDnsTransaction::QUERY_CACHE |
681 MDnsTransaction::SINGLE_RESULT, 671 MDnsTransaction::SINGLE_RESULT,
682 base::Bind(&MDnsTest::MockableRecordCallback, 672 base::Bind(&MDnsTest::MockableRecordCallback,
683 base::Unretained(this))); 673 base::Unretained(this)));
684 674
685 ASSERT_TRUE(transaction_privet->Start()); 675 ASSERT_TRUE(transaction_privet->Start());
686 676
687 EXPECT_CALL(*this, 677 EXPECT_CALL(*this,
688 MockableRecordCallback(MDnsTransaction::RESULT_NO_RESULTS, NULL)) 678 MockableRecordCallback(MDnsTransaction::RESULT_NO_RESULTS, NULL))
689 .Times(Exactly(1)) 679 .Times(Exactly(1))
690 .WillOnce(InvokeWithoutArgs(this, &MDnsTest::Stop)); 680 .WillOnce(InvokeWithoutArgs(this, &MDnsTest::Stop));
691 681
692 RunFor(base::TimeDelta::FromSeconds(4)); 682 RunFor(base::TimeDelta::FromSeconds(4));
693 } 683 }
694 684
695 TEST_F(MDnsTest, TransactionMultipleRecords) { 685 TEST_F(MDnsTest, TransactionMultipleRecords) {
696 ExpectPacket(kQueryPacketPrivet, sizeof(kQueryPacketPrivet)); 686 ExpectPacket(kQueryPacketPrivet, sizeof(kQueryPacketPrivet));
697 687
698 scoped_ptr<MDnsTransaction> transaction_privet = 688 scoped_ptr<MDnsTransaction> transaction_privet =
699 test_client_->CreateTransaction( 689 test_client_.CreateTransaction(
700 dns_protocol::kTypePTR, "_privet._tcp.local", 690 dns_protocol::kTypePTR, "_privet._tcp.local",
701 MDnsTransaction::QUERY_NETWORK | 691 MDnsTransaction::QUERY_NETWORK |
702 MDnsTransaction::QUERY_CACHE , 692 MDnsTransaction::QUERY_CACHE ,
703 base::Bind(&MDnsTest::MockableRecordCallback, 693 base::Bind(&MDnsTest::MockableRecordCallback,
704 base::Unretained(this))); 694 base::Unretained(this)));
705 695
706 ASSERT_TRUE(transaction_privet->Start()); 696 ASSERT_TRUE(transaction_privet->Start());
707 697
708 PtrRecordCopyContainer record_privet; 698 PtrRecordCopyContainer record_privet;
709 PtrRecordCopyContainer record_privet2; 699 PtrRecordCopyContainer record_privet2;
(...skipping 16 matching lines...) Expand all
726 716
727 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_DONE, NULL)) 717 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_DONE, NULL))
728 .WillOnce(InvokeWithoutArgs(this, &MDnsTest::Stop)); 718 .WillOnce(InvokeWithoutArgs(this, &MDnsTest::Stop));
729 719
730 RunFor(base::TimeDelta::FromSeconds(4)); 720 RunFor(base::TimeDelta::FromSeconds(4));
731 } 721 }
732 722
733 TEST_F(MDnsTest, TransactionReentrantDelete) { 723 TEST_F(MDnsTest, TransactionReentrantDelete) {
734 ExpectPacket(kQueryPacketPrivet, sizeof(kQueryPacketPrivet)); 724 ExpectPacket(kQueryPacketPrivet, sizeof(kQueryPacketPrivet));
735 725
736 transaction_ = test_client_->CreateTransaction( 726 transaction_ = test_client_.CreateTransaction(
737 dns_protocol::kTypePTR, "_privet._tcp.local", 727 dns_protocol::kTypePTR, "_privet._tcp.local",
738 MDnsTransaction::QUERY_NETWORK | 728 MDnsTransaction::QUERY_NETWORK |
739 MDnsTransaction::QUERY_CACHE | 729 MDnsTransaction::QUERY_CACHE |
740 MDnsTransaction::SINGLE_RESULT, 730 MDnsTransaction::SINGLE_RESULT,
741 base::Bind(&MDnsTest::MockableRecordCallback, 731 base::Bind(&MDnsTest::MockableRecordCallback,
742 base::Unretained(this))); 732 base::Unretained(this)));
743 733
744 ASSERT_TRUE(transaction_->Start()); 734 ASSERT_TRUE(transaction_->Start());
745 735
746 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_NO_RESULTS, 736 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_NO_RESULTS,
747 NULL)) 737 NULL))
748 .Times(Exactly(1)) 738 .Times(Exactly(1))
749 .WillOnce(DoAll(InvokeWithoutArgs(this, &MDnsTest::DeleteTransaction), 739 .WillOnce(DoAll(InvokeWithoutArgs(this, &MDnsTest::DeleteTransaction),
750 InvokeWithoutArgs(this, &MDnsTest::Stop))); 740 InvokeWithoutArgs(this, &MDnsTest::Stop)));
751 741
752 RunFor(base::TimeDelta::FromSeconds(4)); 742 RunFor(base::TimeDelta::FromSeconds(4));
753 743
754 EXPECT_EQ(NULL, transaction_.get()); 744 EXPECT_EQ(NULL, transaction_.get());
755 } 745 }
756 746
757 TEST_F(MDnsTest, TransactionReentrantDeleteFromCache) { 747 TEST_F(MDnsTest, TransactionReentrantDeleteFromCache) {
758 StrictMock<MockListenerDelegate> delegate_irrelevant; 748 StrictMock<MockListenerDelegate> delegate_irrelevant;
759 scoped_ptr<MDnsListener> listener_irrelevant = test_client_->CreateListener( 749 scoped_ptr<MDnsListener> listener_irrelevant = test_client_.CreateListener(
760 dns_protocol::kTypeA, "codereview.chromium.local", 750 dns_protocol::kTypeA, "codereview.chromium.local",
761 &delegate_irrelevant); 751 &delegate_irrelevant);
762 ASSERT_TRUE(listener_irrelevant->Start()); 752 ASSERT_TRUE(listener_irrelevant->Start());
763 753
764 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); 754 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1));
765 755
766 transaction_ = test_client_->CreateTransaction( 756 transaction_ = test_client_.CreateTransaction(
767 dns_protocol::kTypePTR, "_privet._tcp.local", 757 dns_protocol::kTypePTR, "_privet._tcp.local",
768 MDnsTransaction::QUERY_NETWORK | 758 MDnsTransaction::QUERY_NETWORK |
769 MDnsTransaction::QUERY_CACHE, 759 MDnsTransaction::QUERY_CACHE,
770 base::Bind(&MDnsTest::MockableRecordCallback, 760 base::Bind(&MDnsTest::MockableRecordCallback,
771 base::Unretained(this))); 761 base::Unretained(this)));
772 762
773 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_RECORD, _)) 763 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_RECORD, _))
774 .Times(Exactly(1)) 764 .Times(Exactly(1))
775 .WillOnce(InvokeWithoutArgs(this, &MDnsTest::DeleteTransaction)); 765 .WillOnce(InvokeWithoutArgs(this, &MDnsTest::DeleteTransaction));
776 766
777 ASSERT_TRUE(transaction_->Start()); 767 ASSERT_TRUE(transaction_->Start());
778 768
779 EXPECT_EQ(NULL, transaction_.get()); 769 EXPECT_EQ(NULL, transaction_.get());
780 } 770 }
781 771
782 TEST_F(MDnsTest, TransactionReentrantCacheLookupStart) { 772 TEST_F(MDnsTest, TransactionReentrantCacheLookupStart) {
783 ExpectPacket(kQueryPacketPrivet, sizeof(kQueryPacketPrivet)); 773 ExpectPacket(kQueryPacketPrivet, sizeof(kQueryPacketPrivet));
784 774
785 scoped_ptr<MDnsTransaction> transaction1 = test_client_->CreateTransaction( 775 scoped_ptr<MDnsTransaction> transaction1 =
786 dns_protocol::kTypePTR, "_privet._tcp.local", 776 test_client_.CreateTransaction(
787 MDnsTransaction::QUERY_NETWORK | 777 dns_protocol::kTypePTR, "_privet._tcp.local",
788 MDnsTransaction::QUERY_CACHE | 778 MDnsTransaction::QUERY_NETWORK |
789 MDnsTransaction::SINGLE_RESULT, 779 MDnsTransaction::QUERY_CACHE |
790 base::Bind(&MDnsTest::MockableRecordCallback, 780 MDnsTransaction::SINGLE_RESULT,
791 base::Unretained(this))); 781 base::Bind(&MDnsTest::MockableRecordCallback,
782 base::Unretained(this)));
792 783
793 scoped_ptr<MDnsTransaction> transaction2 = test_client_->CreateTransaction( 784 scoped_ptr<MDnsTransaction> transaction2 =
794 dns_protocol::kTypePTR, "_printer._tcp.local", 785 test_client_.CreateTransaction(
795 MDnsTransaction::QUERY_CACHE | 786 dns_protocol::kTypePTR, "_printer._tcp.local",
796 MDnsTransaction::SINGLE_RESULT, 787 MDnsTransaction::QUERY_CACHE |
797 base::Bind(&MDnsTest::MockableRecordCallback2, 788 MDnsTransaction::SINGLE_RESULT,
798 base::Unretained(this))); 789 base::Bind(&MDnsTest::MockableRecordCallback2,
790 base::Unretained(this)));
799 791
800 EXPECT_CALL(*this, MockableRecordCallback2(MDnsTransaction::RESULT_RECORD, 792 EXPECT_CALL(*this, MockableRecordCallback2(MDnsTransaction::RESULT_RECORD,
801 _)) 793 _))
802 .Times(Exactly(1)); 794 .Times(Exactly(1));
803 795
804 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_RECORD, 796 EXPECT_CALL(*this, MockableRecordCallback(MDnsTransaction::RESULT_RECORD,
805 _)) 797 _))
806 .Times(Exactly(1)) 798 .Times(Exactly(1))
807 .WillOnce(IgnoreResult(InvokeWithoutArgs(transaction2.get(), 799 .WillOnce(IgnoreResult(InvokeWithoutArgs(transaction2.get(),
808 &MDnsTransaction::Start))); 800 &MDnsTransaction::Start)));
809 801
810 ASSERT_TRUE(transaction1->Start()); 802 ASSERT_TRUE(transaction1->Start());
811 803
812 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); 804 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1));
813 } 805 }
814 806
815 TEST_F(MDnsTest, GoodbyePacketNotification) { 807 TEST_F(MDnsTest, GoodbyePacketNotification) {
816 StrictMock<MockListenerDelegate> delegate_privet; 808 StrictMock<MockListenerDelegate> delegate_privet;
817 809
818 scoped_ptr<MDnsListener> listener_privet = test_client_->CreateListener( 810 scoped_ptr<MDnsListener> listener_privet = test_client_.CreateListener(
819 dns_protocol::kTypePTR, "_privet._tcp.local", &delegate_privet); 811 dns_protocol::kTypePTR, "_privet._tcp.local", &delegate_privet);
820 ASSERT_TRUE(listener_privet->Start()); 812 ASSERT_TRUE(listener_privet->Start());
821 813
822 SimulatePacketReceive(kSamplePacketGoodbye, sizeof(kSamplePacketGoodbye)); 814 SimulatePacketReceive(kSamplePacketGoodbye, sizeof(kSamplePacketGoodbye));
823 815
824 RunFor(base::TimeDelta::FromSeconds(2)); 816 RunFor(base::TimeDelta::FromSeconds(2));
825 } 817 }
826 818
827 TEST_F(MDnsTest, GoodbyePacketRemoval) { 819 TEST_F(MDnsTest, GoodbyePacketRemoval) {
828 StrictMock<MockListenerDelegate> delegate_privet; 820 StrictMock<MockListenerDelegate> delegate_privet;
829 821
830 scoped_ptr<MDnsListener> listener_privet = test_client_->CreateListener( 822 scoped_ptr<MDnsListener> listener_privet =
831 dns_protocol::kTypePTR, "_privet._tcp.local", &delegate_privet); 823 test_client_.CreateListener(dns_protocol::kTypePTR, "_privet._tcp.local",
824 &delegate_privet);
832 ASSERT_TRUE(listener_privet->Start()); 825 ASSERT_TRUE(listener_privet->Start());
833 826
834 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) 827 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _))
835 .Times(Exactly(1)); 828 .Times(Exactly(1));
836 829
837 SimulatePacketReceive(kSamplePacket2, sizeof(kSamplePacket2)); 830 SimulatePacketReceive(kSamplePacket2, sizeof(kSamplePacket2));
838 831
839 SimulatePacketReceive(kSamplePacketGoodbye, sizeof(kSamplePacketGoodbye)); 832 SimulatePacketReceive(kSamplePacketGoodbye, sizeof(kSamplePacketGoodbye));
840 833
841 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_REMOVED, _)) 834 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_REMOVED, _))
842 .Times(Exactly(1)); 835 .Times(Exactly(1));
843 836
844 RunFor(base::TimeDelta::FromSeconds(2)); 837 RunFor(base::TimeDelta::FromSeconds(2));
845 } 838 }
846 839
847 // In order to reliably test reentrant listener deletes, we create two listeners 840 // In order to reliably test reentrant listener deletes, we create two listeners
848 // and have each of them delete both, so we're guaranteed to try and deliver a 841 // and have each of them delete both, so we're guaranteed to try and deliver a
849 // callback to at least one deleted listener. 842 // callback to at least one deleted listener.
850 843
851 TEST_F(MDnsTest, ListenerReentrantDelete) { 844 TEST_F(MDnsTest, ListenerReentrantDelete) {
852 StrictMock<MockListenerDelegate> delegate_privet; 845 StrictMock<MockListenerDelegate> delegate_privet;
853 846
854 listener1_ = test_client_->CreateListener( 847 listener1_ = test_client_.CreateListener(dns_protocol::kTypePTR,
855 dns_protocol::kTypePTR, "_privet._tcp.local", 848 "_privet._tcp.local",
856 &delegate_privet); 849 &delegate_privet);
857 850
858 listener2_ = test_client_->CreateListener( 851 listener2_ = test_client_.CreateListener(dns_protocol::kTypePTR,
859 dns_protocol::kTypePTR, "_privet._tcp.local", 852 "_privet._tcp.local",
860 &delegate_privet); 853 &delegate_privet);
861 854
862 ASSERT_TRUE(listener1_->Start()); 855 ASSERT_TRUE(listener1_->Start());
863 856
864 ASSERT_TRUE(listener2_->Start()); 857 ASSERT_TRUE(listener2_->Start());
865 858
866 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) 859 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _))
867 .Times(Exactly(1)) 860 .Times(Exactly(1))
868 .WillOnce(InvokeWithoutArgs(this, &MDnsTest::DeleteBothListeners)); 861 .WillOnce(InvokeWithoutArgs(this, &MDnsTest::DeleteBothListeners));
869 862
870 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1)); 863 SimulatePacketReceive(kSamplePacket1, sizeof(kSamplePacket1));
871 864
872 EXPECT_EQ(NULL, listener1_.get()); 865 EXPECT_EQ(NULL, listener1_.get());
873 EXPECT_EQ(NULL, listener2_.get()); 866 EXPECT_EQ(NULL, listener2_.get());
874 } 867 }
875 868
876 ACTION_P(SaveIPAddress, ip_container) { 869 ACTION_P(SaveIPAddress, ip_container) {
877 ::testing::StaticAssertTypeEq<const RecordParsed*, arg1_type>(); 870 ::testing::StaticAssertTypeEq<const RecordParsed*, arg1_type>();
878 ::testing::StaticAssertTypeEq<IPAddressNumber*, ip_container_type>(); 871 ::testing::StaticAssertTypeEq<IPAddressNumber*, ip_container_type>();
879 872
880 *ip_container = arg1->template rdata<ARecordRdata>()->address(); 873 *ip_container = arg1->template rdata<ARecordRdata>()->address();
881 } 874 }
882 875
883 TEST_F(MDnsTest, DoubleRecordDisagreeing) { 876 TEST_F(MDnsTest, DoubleRecordDisagreeing) {
884 IPAddressNumber address; 877 IPAddressNumber address;
885 StrictMock<MockListenerDelegate> delegate_privet; 878 StrictMock<MockListenerDelegate> delegate_privet;
886 879
887 scoped_ptr<MDnsListener> listener_privet = test_client_->CreateListener( 880 scoped_ptr<MDnsListener> listener_privet =
888 dns_protocol::kTypeA, "privet.local", &delegate_privet); 881 test_client_.CreateListener(dns_protocol::kTypeA, "privet.local",
882 &delegate_privet);
889 883
890 ASSERT_TRUE(listener_privet->Start()); 884 ASSERT_TRUE(listener_privet->Start());
891 885
892 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) 886 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _))
893 .Times(Exactly(1)) 887 .Times(Exactly(1))
894 .WillOnce(SaveIPAddress(&address)); 888 .WillOnce(SaveIPAddress(&address));
895 889
896 SimulatePacketReceive(kCorruptedPacketDoubleRecord, 890 SimulatePacketReceive(kCorruptedPacketDoubleRecord,
897 sizeof(kCorruptedPacketDoubleRecord)); 891 sizeof(kCorruptedPacketDoubleRecord));
898 892
899 EXPECT_EQ("2.3.4.5", IPAddressToString(address)); 893 EXPECT_EQ("2.3.4.5", IPAddressToString(address));
900 } 894 }
901 895
902 TEST_F(MDnsTest, NsecWithListener) { 896 TEST_F(MDnsTest, NsecWithListener) {
903 StrictMock<MockListenerDelegate> delegate_privet; 897 StrictMock<MockListenerDelegate> delegate_privet;
904 scoped_ptr<MDnsListener> listener_privet = test_client_->CreateListener( 898 scoped_ptr<MDnsListener> listener_privet =
905 dns_protocol::kTypeA, "_privet._tcp.local", &delegate_privet); 899 test_client_.CreateListener(dns_protocol::kTypeA, "_privet._tcp.local",
900 &delegate_privet);
906 901
907 // Test to make sure nsec callback is NOT called for PTR 902 // Test to make sure nsec callback is NOT called for PTR
908 // (which is marked as existing). 903 // (which is marked as existing).
909 StrictMock<MockListenerDelegate> delegate_privet2; 904 StrictMock<MockListenerDelegate> delegate_privet2;
910 scoped_ptr<MDnsListener> listener_privet2 = test_client_->CreateListener( 905 scoped_ptr<MDnsListener> listener_privet2 =
911 dns_protocol::kTypePTR, "_privet._tcp.local", &delegate_privet2); 906 test_client_.CreateListener(dns_protocol::kTypePTR, "_privet._tcp.local",
907 &delegate_privet2);
912 908
913 ASSERT_TRUE(listener_privet->Start()); 909 ASSERT_TRUE(listener_privet->Start());
914 910
915 EXPECT_CALL(delegate_privet, 911 EXPECT_CALL(delegate_privet,
916 OnNsecRecord("_privet._tcp.local", dns_protocol::kTypeA)); 912 OnNsecRecord("_privet._tcp.local", dns_protocol::kTypeA));
917 913
918 SimulatePacketReceive(kSamplePacketNsec, 914 SimulatePacketReceive(kSamplePacketNsec,
919 sizeof(kSamplePacketNsec)); 915 sizeof(kSamplePacketNsec));
920 } 916 }
921 917
922 TEST_F(MDnsTest, NsecWithTransactionFromNetwork) { 918 TEST_F(MDnsTest, NsecWithTransactionFromNetwork) {
923 scoped_ptr<MDnsTransaction> transaction_privet = 919 scoped_ptr<MDnsTransaction> transaction_privet =
924 test_client_->CreateTransaction( 920 test_client_.CreateTransaction(
925 dns_protocol::kTypeA, "_privet._tcp.local", 921 dns_protocol::kTypeA, "_privet._tcp.local",
926 MDnsTransaction::QUERY_NETWORK | 922 MDnsTransaction::QUERY_NETWORK |
927 MDnsTransaction::QUERY_CACHE | 923 MDnsTransaction::QUERY_CACHE |
928 MDnsTransaction::SINGLE_RESULT, 924 MDnsTransaction::SINGLE_RESULT,
929 base::Bind(&MDnsTest::MockableRecordCallback, 925 base::Bind(&MDnsTest::MockableRecordCallback,
930 base::Unretained(this))); 926 base::Unretained(this)));
931 927
932 EXPECT_CALL(*socket_factory_, OnSendTo(_)) 928 EXPECT_CALL(socket_factory_, OnSendTo(_)).Times(2);
933 .Times(2);
934 929
935 ASSERT_TRUE(transaction_privet->Start()); 930 ASSERT_TRUE(transaction_privet->Start());
936 931
937 EXPECT_CALL(*this, 932 EXPECT_CALL(*this,
938 MockableRecordCallback(MDnsTransaction::RESULT_NSEC, NULL)); 933 MockableRecordCallback(MDnsTransaction::RESULT_NSEC, NULL));
939 934
940 SimulatePacketReceive(kSamplePacketNsec, 935 SimulatePacketReceive(kSamplePacketNsec,
941 sizeof(kSamplePacketNsec)); 936 sizeof(kSamplePacketNsec));
942 } 937 }
943 938
944 TEST_F(MDnsTest, NsecWithTransactionFromCache) { 939 TEST_F(MDnsTest, NsecWithTransactionFromCache) {
945 // Force mDNS to listen. 940 // Force mDNS to listen.
946 StrictMock<MockListenerDelegate> delegate_irrelevant; 941 StrictMock<MockListenerDelegate> delegate_irrelevant;
947 scoped_ptr<MDnsListener> listener_irrelevant = 942 scoped_ptr<MDnsListener> listener_irrelevant =
948 test_client_->CreateListener(dns_protocol::kTypePTR, "_privet._tcp.local", 943 test_client_.CreateListener(dns_protocol::kTypePTR, "_privet._tcp.local",
949 &delegate_irrelevant); 944 &delegate_irrelevant);
950 listener_irrelevant->Start(); 945 listener_irrelevant->Start();
951 946
952 SimulatePacketReceive(kSamplePacketNsec, 947 SimulatePacketReceive(kSamplePacketNsec,
953 sizeof(kSamplePacketNsec)); 948 sizeof(kSamplePacketNsec));
954 949
955 EXPECT_CALL(*this, 950 EXPECT_CALL(*this,
956 MockableRecordCallback(MDnsTransaction::RESULT_NSEC, NULL)); 951 MockableRecordCallback(MDnsTransaction::RESULT_NSEC, NULL));
957 952
958 scoped_ptr<MDnsTransaction> transaction_privet_a = 953 scoped_ptr<MDnsTransaction> transaction_privet_a =
959 test_client_->CreateTransaction( 954 test_client_.CreateTransaction(
960 dns_protocol::kTypeA, "_privet._tcp.local", 955 dns_protocol::kTypeA, "_privet._tcp.local",
961 MDnsTransaction::QUERY_NETWORK | 956 MDnsTransaction::QUERY_NETWORK |
962 MDnsTransaction::QUERY_CACHE | 957 MDnsTransaction::QUERY_CACHE |
963 MDnsTransaction::SINGLE_RESULT, 958 MDnsTransaction::SINGLE_RESULT,
964 base::Bind(&MDnsTest::MockableRecordCallback, 959 base::Bind(&MDnsTest::MockableRecordCallback,
965 base::Unretained(this))); 960 base::Unretained(this)));
966 961
967 ASSERT_TRUE(transaction_privet_a->Start()); 962 ASSERT_TRUE(transaction_privet_a->Start());
968 963
969 // Test that a PTR transaction does NOT consider the same NSEC record to be a 964 // Test that a PTR transaction does NOT consider the same NSEC record to be a
970 // valid answer to the query 965 // valid answer to the query
971 966
972 scoped_ptr<MDnsTransaction> transaction_privet_ptr = 967 scoped_ptr<MDnsTransaction> transaction_privet_ptr =
973 test_client_->CreateTransaction( 968 test_client_.CreateTransaction(
974 dns_protocol::kTypePTR, "_privet._tcp.local", 969 dns_protocol::kTypePTR, "_privet._tcp.local",
975 MDnsTransaction::QUERY_NETWORK | 970 MDnsTransaction::QUERY_NETWORK |
976 MDnsTransaction::QUERY_CACHE | 971 MDnsTransaction::QUERY_CACHE |
977 MDnsTransaction::SINGLE_RESULT, 972 MDnsTransaction::SINGLE_RESULT,
978 base::Bind(&MDnsTest::MockableRecordCallback, 973 base::Bind(&MDnsTest::MockableRecordCallback,
979 base::Unretained(this))); 974 base::Unretained(this)));
980 975
981 EXPECT_CALL(*socket_factory_, OnSendTo(_)) 976 EXPECT_CALL(socket_factory_, OnSendTo(_)).Times(2);
982 .Times(2);
983 977
984 ASSERT_TRUE(transaction_privet_ptr->Start()); 978 ASSERT_TRUE(transaction_privet_ptr->Start());
985 } 979 }
986 980
987 TEST_F(MDnsTest, NsecConflictRemoval) { 981 TEST_F(MDnsTest, NsecConflictRemoval) {
988 StrictMock<MockListenerDelegate> delegate_privet; 982 StrictMock<MockListenerDelegate> delegate_privet;
989 scoped_ptr<MDnsListener> listener_privet = test_client_->CreateListener( 983 scoped_ptr<MDnsListener> listener_privet =
990 dns_protocol::kTypeA, "_privet._tcp.local", &delegate_privet); 984 test_client_.CreateListener(dns_protocol::kTypeA, "_privet._tcp.local",
985 &delegate_privet);
991 986
992 ASSERT_TRUE(listener_privet->Start()); 987 ASSERT_TRUE(listener_privet->Start());
993 988
994 const RecordParsed* record1; 989 const RecordParsed* record1;
995 const RecordParsed* record2; 990 const RecordParsed* record2;
996 991
997 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _)) 992 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_ADDED, _))
998 .WillOnce(SaveArg<1>(&record1)); 993 .WillOnce(SaveArg<1>(&record1));
999 994
1000 SimulatePacketReceive(kSamplePacketAPrivet, 995 SimulatePacketReceive(kSamplePacketAPrivet,
1001 sizeof(kSamplePacketAPrivet)); 996 sizeof(kSamplePacketAPrivet));
1002 997
1003 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_REMOVED, _)) 998 EXPECT_CALL(delegate_privet, OnRecordUpdate(MDnsListener::RECORD_REMOVED, _))
1004 .WillOnce(SaveArg<1>(&record2)); 999 .WillOnce(SaveArg<1>(&record2));
1005 1000
1006 EXPECT_CALL(delegate_privet, 1001 EXPECT_CALL(delegate_privet,
1007 OnNsecRecord("_privet._tcp.local", dns_protocol::kTypeA)); 1002 OnNsecRecord("_privet._tcp.local", dns_protocol::kTypeA));
1008 1003
1009 SimulatePacketReceive(kSamplePacketNsec, 1004 SimulatePacketReceive(kSamplePacketNsec,
1010 sizeof(kSamplePacketNsec)); 1005 sizeof(kSamplePacketNsec));
1011 1006
1012 EXPECT_EQ(record1, record2); 1007 EXPECT_EQ(record1, record2);
1013 } 1008 }
1014 1009
1015 1010
1016 // Note: These tests assume that the ipv4 socket will always be created first. 1011 // Note: These tests assume that the ipv4 socket will always be created first.
1017 // This is a simplifying assumption based on the way the code works now. 1012 // This is a simplifying assumption based on the way the code works now.
1018 1013 class SimpleMockSocketFactory : public MDnsSocketFactory {
1019 class SimpleMockSocketFactory
1020 : public MDnsConnection::SocketFactory {
1021 public: 1014 public:
1022 SimpleMockSocketFactory() { 1015 virtual void CreateSockets(
1023 } 1016 ScopedVector<DatagramServerSocket>* sockets) OVERRIDE {
1024 virtual ~SimpleMockSocketFactory() { 1017 sockets->clear();
1018 sockets->swap(sockets_);
1025 } 1019 }
1026 1020
1027 virtual scoped_ptr<DatagramServerSocket> CreateSocket() OVERRIDE { 1021 void PushSocket(DatagramServerSocket* socket) {
1028 MockMDnsDatagramServerSocket* socket = sockets_.back();
1029 sockets_.weak_erase(sockets_.end() - 1);
1030 return scoped_ptr<DatagramServerSocket>(socket);
1031 }
1032
1033 void PushSocket(MockMDnsDatagramServerSocket* socket) {
1034 sockets_.push_back(socket); 1022 sockets_.push_back(socket);
1035 } 1023 }
1036 1024
1037 private: 1025 private:
1038 ScopedVector<MockMDnsDatagramServerSocket> sockets_; 1026 ScopedVector<DatagramServerSocket> sockets_;
1039 }; 1027 };
1040 1028
1041 class MockMDnsConnectionDelegate : public MDnsConnection::Delegate { 1029 class MockMDnsConnectionDelegate : public MDnsConnection::Delegate {
1042 public: 1030 public:
1043 virtual void HandlePacket(DnsResponse* response, int size) { 1031 virtual void HandlePacket(DnsResponse* response, int size) {
1044 HandlePacketInternal(std::string(response->io_buffer()->data(), size)); 1032 HandlePacketInternal(std::string(response->io_buffer()->data(), size));
1045 } 1033 }
1046 1034
1047 MOCK_METHOD1(HandlePacketInternal, void(std::string packet)); 1035 MOCK_METHOD1(HandlePacketInternal, void(std::string packet));
1048 1036
1049 MOCK_METHOD1(OnConnectionError, void(int error)); 1037 MOCK_METHOD1(OnConnectionError, void(int error));
1050 }; 1038 };
1051 1039
1052 class MDnsConnectionTest : public ::testing::Test { 1040 class MDnsConnectionTest : public ::testing::Test {
1053 public: 1041 public:
1054 MDnsConnectionTest() : connection_(&delegate_) { 1042 MDnsConnectionTest() : connection_(&delegate_) {
1055 } 1043 }
1056 1044
1057 protected: 1045 protected:
1058 // Follow successful connection initialization. 1046 // Follow successful connection initialization.
1059 virtual void SetUp() OVERRIDE { 1047 virtual void SetUp() OVERRIDE {
1060 socket_ipv4_ = new MockMDnsDatagramServerSocket; 1048 socket_ipv4_ = new MockMDnsDatagramServerSocket(ADDRESS_FAMILY_IPV4);
1061 socket_ipv6_ = new MockMDnsDatagramServerSocket; 1049 socket_ipv6_ = new MockMDnsDatagramServerSocket(ADDRESS_FAMILY_IPV6);
1062 factory_.PushSocket(socket_ipv6_); 1050 factory_.PushSocket(socket_ipv6_);
1063 factory_.PushSocket(socket_ipv4_); 1051 factory_.PushSocket(socket_ipv4_);
1064 } 1052 }
1065 1053
1066 bool InitConnection() { 1054 bool InitConnection() {
1067 EXPECT_CALL(*socket_ipv4_, AllowAddressReuse());
1068 EXPECT_CALL(*socket_ipv6_, AllowAddressReuse());
1069
1070 EXPECT_CALL(*socket_ipv4_, SetMulticastLoopbackMode(false));
1071 EXPECT_CALL(*socket_ipv6_, SetMulticastLoopbackMode(false));
1072
1073 EXPECT_CALL(*socket_ipv4_, ListenInternal("0.0.0.0:5353"))
1074 .WillOnce(Return(OK));
1075 EXPECT_CALL(*socket_ipv6_, ListenInternal("[::]:5353"))
1076 .WillOnce(Return(OK));
1077
1078 EXPECT_CALL(*socket_ipv4_, JoinGroupInternal("224.0.0.251"))
1079 .WillOnce(Return(OK));
1080 EXPECT_CALL(*socket_ipv6_, JoinGroupInternal("ff02::fb"))
1081 .WillOnce(Return(OK));
1082
1083 return connection_.Init(&factory_); 1055 return connection_.Init(&factory_);
1084 } 1056 }
1085 1057
1086 StrictMock<MockMDnsConnectionDelegate> delegate_; 1058 StrictMock<MockMDnsConnectionDelegate> delegate_;
1087 1059
1088 MockMDnsDatagramServerSocket* socket_ipv4_; 1060 MockMDnsDatagramServerSocket* socket_ipv4_;
1089 MockMDnsDatagramServerSocket* socket_ipv6_; 1061 MockMDnsDatagramServerSocket* socket_ipv6_;
1090 SimpleMockSocketFactory factory_; 1062 SimpleMockSocketFactory factory_;
1091 MDnsConnection connection_; 1063 MDnsConnection connection_;
1092 TestCompletionCallback callback_; 1064 TestCompletionCallback callback_;
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1160 1132
1161 ASSERT_TRUE(InitConnection()); 1133 ASSERT_TRUE(InitConnection());
1162 1134
1163 EXPECT_CALL(delegate_, OnConnectionError(ERR_SOCKET_NOT_CONNECTED)); 1135 EXPECT_CALL(delegate_, OnConnectionError(ERR_SOCKET_NOT_CONNECTED));
1164 callback.Run(ERR_SOCKET_NOT_CONNECTED); 1136 callback.Run(ERR_SOCKET_NOT_CONNECTED);
1165 } 1137 }
1166 1138
1167 } // namespace 1139 } // namespace
1168 1140
1169 } // namespace net 1141 } // namespace net
OLDNEW
« no previous file with comments | « net/dns/mdns_client_impl.cc ('k') | net/dns/mock_mdns_socket_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698