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/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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |