| 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 |