OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "net/quic/quic_connection.h" | 5 #include "net/quic/quic_connection.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
(...skipping 20 matching lines...) Expand all Loading... |
31 using base::StringPiece; | 31 using base::StringPiece; |
32 using std::map; | 32 using std::map; |
33 using std::vector; | 33 using std::vector; |
34 using testing::AnyNumber; | 34 using testing::AnyNumber; |
35 using testing::AtLeast; | 35 using testing::AtLeast; |
36 using testing::ContainerEq; | 36 using testing::ContainerEq; |
37 using testing::Contains; | 37 using testing::Contains; |
38 using testing::DoAll; | 38 using testing::DoAll; |
39 using testing::InSequence; | 39 using testing::InSequence; |
40 using testing::InvokeWithoutArgs; | 40 using testing::InvokeWithoutArgs; |
| 41 using testing::NiceMock; |
41 using testing::Ref; | 42 using testing::Ref; |
42 using testing::Return; | 43 using testing::Return; |
43 using testing::SaveArg; | 44 using testing::SaveArg; |
44 using testing::StrictMock; | 45 using testing::StrictMock; |
45 using testing::_; | 46 using testing::_; |
46 | 47 |
47 namespace net { | 48 namespace net { |
48 namespace test { | 49 namespace test { |
49 namespace { | 50 namespace { |
50 | 51 |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
404 uint32 packets_write_attempts_; | 405 uint32 packets_write_attempts_; |
405 | 406 |
406 DISALLOW_COPY_AND_ASSIGN(TestPacketWriter); | 407 DISALLOW_COPY_AND_ASSIGN(TestPacketWriter); |
407 }; | 408 }; |
408 | 409 |
409 class TestConnection : public QuicConnection { | 410 class TestConnection : public QuicConnection { |
410 public: | 411 public: |
411 TestConnection(QuicConnectionId connection_id, | 412 TestConnection(QuicConnectionId connection_id, |
412 IPEndPoint address, | 413 IPEndPoint address, |
413 TestConnectionHelper* helper, | 414 TestConnectionHelper* helper, |
414 TestPacketWriter* writer, | 415 const PacketWriterFactory& factory, |
415 bool is_server, | 416 bool is_server, |
416 QuicVersion version) | 417 QuicVersion version) |
417 : QuicConnection(connection_id, | 418 : QuicConnection(connection_id, |
418 address, | 419 address, |
419 helper, | 420 helper, |
420 writer, | 421 factory, |
421 false /* owns_writer */, | 422 /* owns_writer= */ false, |
422 is_server, | 423 is_server, |
423 SupportedVersions(version)), | 424 SupportedVersions(version)) { |
424 writer_(writer) { | |
425 // Disable tail loss probes for most tests. | 425 // Disable tail loss probes for most tests. |
426 QuicSentPacketManagerPeer::SetMaxTailLossProbes( | 426 QuicSentPacketManagerPeer::SetMaxTailLossProbes( |
427 QuicConnectionPeer::GetSentPacketManager(this), 0); | 427 QuicConnectionPeer::GetSentPacketManager(this), 0); |
428 writer_->set_is_server(is_server); | 428 writer()->set_is_server(is_server); |
429 } | 429 } |
430 | 430 |
431 void SendAck() { | 431 void SendAck() { |
432 QuicConnectionPeer::SendAck(this); | 432 QuicConnectionPeer::SendAck(this); |
433 } | 433 } |
434 | 434 |
435 void SetReceiveAlgorithm(TestReceiveAlgorithm* receive_algorithm) { | 435 void SetReceiveAlgorithm(TestReceiveAlgorithm* receive_algorithm) { |
436 QuicConnectionPeer::SetReceiveAlgorithm(this, receive_algorithm); | 436 QuicConnectionPeer::SetReceiveAlgorithm(this, receive_algorithm); |
437 } | 437 } |
438 | 438 |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 bool is_server() { | 530 bool is_server() { |
531 return QuicConnectionPeer::IsServer(this); | 531 return QuicConnectionPeer::IsServer(this); |
532 } | 532 } |
533 | 533 |
534 void set_version(QuicVersion version) { | 534 void set_version(QuicVersion version) { |
535 QuicConnectionPeer::GetFramer(this)->set_version(version); | 535 QuicConnectionPeer::GetFramer(this)->set_version(version); |
536 } | 536 } |
537 | 537 |
538 void SetSupportedVersions(const QuicVersionVector& versions) { | 538 void SetSupportedVersions(const QuicVersionVector& versions) { |
539 QuicConnectionPeer::GetFramer(this)->SetSupportedVersions(versions); | 539 QuicConnectionPeer::GetFramer(this)->SetSupportedVersions(versions); |
540 writer_->SetSupportedVersions(versions); | 540 writer()->SetSupportedVersions(versions); |
541 } | 541 } |
542 | 542 |
543 void set_is_server(bool is_server) { | 543 void set_is_server(bool is_server) { |
544 writer_->set_is_server(is_server); | 544 writer()->set_is_server(is_server); |
545 QuicConnectionPeer::SetIsServer(this, is_server); | 545 QuicConnectionPeer::SetIsServer(this, is_server); |
546 } | 546 } |
547 | 547 |
548 TestConnectionHelper::TestAlarm* GetAckAlarm() { | 548 TestConnectionHelper::TestAlarm* GetAckAlarm() { |
549 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( | 549 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( |
550 QuicConnectionPeer::GetAckAlarm(this)); | 550 QuicConnectionPeer::GetAckAlarm(this)); |
551 } | 551 } |
552 | 552 |
553 TestConnectionHelper::TestAlarm* GetPingAlarm() { | 553 TestConnectionHelper::TestAlarm* GetPingAlarm() { |
554 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( | 554 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( |
(...skipping 16 matching lines...) Expand all Loading... |
571 } | 571 } |
572 | 572 |
573 TestConnectionHelper::TestAlarm* GetTimeoutAlarm() { | 573 TestConnectionHelper::TestAlarm* GetTimeoutAlarm() { |
574 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( | 574 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( |
575 QuicConnectionPeer::GetTimeoutAlarm(this)); | 575 QuicConnectionPeer::GetTimeoutAlarm(this)); |
576 } | 576 } |
577 | 577 |
578 using QuicConnection::SelectMutualVersion; | 578 using QuicConnection::SelectMutualVersion; |
579 | 579 |
580 private: | 580 private: |
581 TestPacketWriter* writer_; | 581 TestPacketWriter* writer() { |
| 582 return static_cast<TestPacketWriter*>(QuicConnection::writer()); |
| 583 } |
582 | 584 |
583 DISALLOW_COPY_AND_ASSIGN(TestConnection); | 585 DISALLOW_COPY_AND_ASSIGN(TestConnection); |
584 }; | 586 }; |
585 | 587 |
586 // Used for testing packets revived from FEC packets. | 588 // Used for testing packets revived from FEC packets. |
587 class FecQuicConnectionDebugVisitor | 589 class FecQuicConnectionDebugVisitor |
588 : public QuicConnectionDebugVisitor { | 590 : public QuicConnectionDebugVisitor { |
589 public: | 591 public: |
590 virtual void OnRevivedPacket(const QuicPacketHeader& header, | 592 virtual void OnRevivedPacket(const QuicPacketHeader& header, |
591 StringPiece data) OVERRIDE { | 593 StringPiece data) OVERRIDE { |
592 revived_header_ = header; | 594 revived_header_ = header; |
593 } | 595 } |
594 | 596 |
595 // Public accessor method. | 597 // Public accessor method. |
596 QuicPacketHeader revived_header() const { | 598 QuicPacketHeader revived_header() const { |
597 return revived_header_; | 599 return revived_header_; |
598 } | 600 } |
599 | 601 |
600 private: | 602 private: |
601 QuicPacketHeader revived_header_; | 603 QuicPacketHeader revived_header_; |
602 }; | 604 }; |
603 | 605 |
| 606 class MockPacketWriterFactory : public QuicConnection::PacketWriterFactory { |
| 607 public: |
| 608 MockPacketWriterFactory(QuicPacketWriter* writer) { |
| 609 ON_CALL(*this, Create(_)).WillByDefault(Return(writer)); |
| 610 } |
| 611 virtual ~MockPacketWriterFactory() {} |
| 612 |
| 613 MOCK_CONST_METHOD1(Create, QuicPacketWriter*(QuicConnection* connection)); |
| 614 }; |
| 615 |
604 class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> { | 616 class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> { |
605 protected: | 617 protected: |
606 QuicConnectionTest() | 618 QuicConnectionTest() |
607 : connection_id_(42), | 619 : connection_id_(42), |
608 framer_(SupportedVersions(version()), QuicTime::Zero(), false), | 620 framer_(SupportedVersions(version()), QuicTime::Zero(), false), |
609 peer_creator_(connection_id_, &framer_, &random_generator_), | 621 peer_creator_(connection_id_, &framer_, &random_generator_), |
610 send_algorithm_(new StrictMock<MockSendAlgorithm>), | 622 send_algorithm_(new StrictMock<MockSendAlgorithm>), |
611 loss_algorithm_(new MockLossAlgorithm()), | 623 loss_algorithm_(new MockLossAlgorithm()), |
612 helper_(new TestConnectionHelper(&clock_, &random_generator_)), | 624 helper_(new TestConnectionHelper(&clock_, &random_generator_)), |
613 writer_(new TestPacketWriter(version())), | 625 writer_(new TestPacketWriter(version())), |
| 626 factory_(writer_.get()), |
614 connection_(connection_id_, IPEndPoint(), helper_.get(), | 627 connection_(connection_id_, IPEndPoint(), helper_.get(), |
615 writer_.get(), false, version()), | 628 factory_, false, version()), |
616 frame1_(1, false, 0, MakeIOVector(data1)), | 629 frame1_(1, false, 0, MakeIOVector(data1)), |
617 frame2_(1, false, 3, MakeIOVector(data2)), | 630 frame2_(1, false, 3, MakeIOVector(data2)), |
618 sequence_number_length_(PACKET_6BYTE_SEQUENCE_NUMBER), | 631 sequence_number_length_(PACKET_6BYTE_SEQUENCE_NUMBER), |
619 connection_id_length_(PACKET_8BYTE_CONNECTION_ID) { | 632 connection_id_length_(PACKET_8BYTE_CONNECTION_ID) { |
620 connection_.set_visitor(&visitor_); | 633 connection_.set_visitor(&visitor_); |
621 connection_.SetSendAlgorithm(send_algorithm_); | 634 connection_.SetSendAlgorithm(send_algorithm_); |
622 connection_.SetLossAlgorithm(loss_algorithm_); | 635 connection_.SetLossAlgorithm(loss_algorithm_); |
623 framer_.set_received_entropy_calculator(&entropy_calculator_); | 636 framer_.set_received_entropy_calculator(&entropy_calculator_); |
624 // Simplify tests by not sending feedback unless specifically configured. | 637 // Simplify tests by not sending feedback unless specifically configured. |
625 SetFeedback(NULL); | 638 SetFeedback(NULL); |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
960 QuicPacketCreator peer_creator_; | 973 QuicPacketCreator peer_creator_; |
961 MockEntropyCalculator entropy_calculator_; | 974 MockEntropyCalculator entropy_calculator_; |
962 | 975 |
963 MockSendAlgorithm* send_algorithm_; | 976 MockSendAlgorithm* send_algorithm_; |
964 MockLossAlgorithm* loss_algorithm_; | 977 MockLossAlgorithm* loss_algorithm_; |
965 TestReceiveAlgorithm* receive_algorithm_; | 978 TestReceiveAlgorithm* receive_algorithm_; |
966 MockClock clock_; | 979 MockClock clock_; |
967 MockRandom random_generator_; | 980 MockRandom random_generator_; |
968 scoped_ptr<TestConnectionHelper> helper_; | 981 scoped_ptr<TestConnectionHelper> helper_; |
969 scoped_ptr<TestPacketWriter> writer_; | 982 scoped_ptr<TestPacketWriter> writer_; |
| 983 NiceMock<MockPacketWriterFactory> factory_; |
970 TestConnection connection_; | 984 TestConnection connection_; |
971 StrictMock<MockConnectionVisitor> visitor_; | 985 StrictMock<MockConnectionVisitor> visitor_; |
972 | 986 |
973 QuicPacketHeader header_; | 987 QuicPacketHeader header_; |
974 QuicStreamFrame frame1_; | 988 QuicStreamFrame frame1_; |
975 QuicStreamFrame frame2_; | 989 QuicStreamFrame frame2_; |
976 scoped_ptr<QuicAckFrame> outgoing_ack_; | 990 scoped_ptr<QuicAckFrame> outgoing_ack_; |
977 scoped_ptr<QuicStopWaitingFrame> stop_waiting_; | 991 scoped_ptr<QuicStopWaitingFrame> stop_waiting_; |
978 QuicSequenceNumberLength sequence_number_length_; | 992 QuicSequenceNumberLength sequence_number_length_; |
979 QuicConnectionIdLength connection_id_length_; | 993 QuicConnectionIdLength connection_id_length_; |
(...skipping 2971 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3951 new MockQuicConnectionDebugVisitor(); | 3965 new MockQuicConnectionDebugVisitor(); |
3952 connection_.set_debug_visitor(debug_visitor); | 3966 connection_.set_debug_visitor(debug_visitor); |
3953 EXPECT_CALL(*debug_visitor, OnPacketHeader(Ref(header))).Times(1); | 3967 EXPECT_CALL(*debug_visitor, OnPacketHeader(Ref(header))).Times(1); |
3954 connection_.OnPacketHeader(header); | 3968 connection_.OnPacketHeader(header); |
3955 } | 3969 } |
3956 | 3970 |
3957 TEST_P(QuicConnectionTest, Pacing) { | 3971 TEST_P(QuicConnectionTest, Pacing) { |
3958 ValueRestore<bool> old_flag(&FLAGS_enable_quic_pacing, true); | 3972 ValueRestore<bool> old_flag(&FLAGS_enable_quic_pacing, true); |
3959 | 3973 |
3960 TestConnection server(connection_id_, IPEndPoint(), helper_.get(), | 3974 TestConnection server(connection_id_, IPEndPoint(), helper_.get(), |
3961 writer_.get(), true, version()); | 3975 factory_, /* is_server= */ true, version()); |
3962 TestConnection client(connection_id_, IPEndPoint(), helper_.get(), | 3976 TestConnection client(connection_id_, IPEndPoint(), helper_.get(), |
3963 writer_.get(), false, version()); | 3977 factory_, /* is_server= */ false, version()); |
3964 EXPECT_FALSE(client.sent_packet_manager().using_pacing()); | 3978 EXPECT_FALSE(client.sent_packet_manager().using_pacing()); |
3965 EXPECT_FALSE(server.sent_packet_manager().using_pacing()); | 3979 EXPECT_FALSE(server.sent_packet_manager().using_pacing()); |
3966 } | 3980 } |
3967 | 3981 |
3968 TEST_P(QuicConnectionTest, ControlFramesInstigateAcks) { | 3982 TEST_P(QuicConnectionTest, ControlFramesInstigateAcks) { |
3969 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3983 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
3970 | 3984 |
3971 // Send a WINDOW_UPDATE frame. | 3985 // Send a WINDOW_UPDATE frame. |
3972 QuicWindowUpdateFrame window_update; | 3986 QuicWindowUpdateFrame window_update; |
3973 window_update.stream_id = 3; | 3987 window_update.stream_id = 3; |
(...skipping 10 matching lines...) Expand all Loading... |
3984 QuicBlockedFrame blocked; | 3998 QuicBlockedFrame blocked; |
3985 blocked.stream_id = 3; | 3999 blocked.stream_id = 3; |
3986 EXPECT_CALL(visitor_, OnBlockedFrames(_)); | 4000 EXPECT_CALL(visitor_, OnBlockedFrames(_)); |
3987 ProcessFramePacket(QuicFrame(&blocked)); | 4001 ProcessFramePacket(QuicFrame(&blocked)); |
3988 EXPECT_TRUE(ack_alarm->IsSet()); | 4002 EXPECT_TRUE(ack_alarm->IsSet()); |
3989 } | 4003 } |
3990 | 4004 |
3991 } // namespace | 4005 } // namespace |
3992 } // namespace test | 4006 } // namespace test |
3993 } // namespace net | 4007 } // namespace net |
OLD | NEW |