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 <ostream> | 7 #include <ostream> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
610 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( | 610 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( |
611 QuicConnectionPeer::GetTimeoutAlarm(this)); | 611 QuicConnectionPeer::GetTimeoutAlarm(this)); |
612 } | 612 } |
613 | 613 |
614 TestConnectionHelper::TestAlarm* GetMtuDiscoveryAlarm() { | 614 TestConnectionHelper::TestAlarm* GetMtuDiscoveryAlarm() { |
615 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( | 615 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( |
616 QuicConnectionPeer::GetMtuDiscoveryAlarm(this)); | 616 QuicConnectionPeer::GetMtuDiscoveryAlarm(this)); |
617 } | 617 } |
618 | 618 |
619 using QuicConnection::SelectMutualVersion; | 619 using QuicConnection::SelectMutualVersion; |
| 620 using QuicConnection::set_defer_send_in_response_to_packets; |
620 | 621 |
621 private: | 622 private: |
622 TestPacketWriter* writer() { | 623 TestPacketWriter* writer() { |
623 return static_cast<TestPacketWriter*>(QuicConnection::writer()); | 624 return static_cast<TestPacketWriter*>(QuicConnection::writer()); |
624 } | 625 } |
625 | 626 |
626 DISALLOW_COPY_AND_ASSIGN(TestConnection); | 627 DISALLOW_COPY_AND_ASSIGN(TestConnection); |
627 }; | 628 }; |
628 | 629 |
629 // Used for testing packets revived from FEC packets. | 630 // Used for testing packets revived from FEC packets. |
630 class FecQuicConnectionDebugVisitor : public QuicConnectionDebugVisitor { | 631 class FecQuicConnectionDebugVisitor : public QuicConnectionDebugVisitor { |
631 public: | 632 public: |
632 void OnRevivedPacket(const QuicPacketHeader& header, | 633 void OnRevivedPacket(const QuicPacketHeader& header, |
633 StringPiece data) override { | 634 StringPiece data) override { |
634 revived_header_ = header; | 635 revived_header_ = header; |
635 } | 636 } |
636 | 637 |
637 // Public accessor method. | 638 // Public accessor method. |
638 QuicPacketHeader revived_header() const { return revived_header_; } | 639 QuicPacketHeader revived_header() const { return revived_header_; } |
639 | 640 |
640 private: | 641 private: |
641 QuicPacketHeader revived_header_; | 642 QuicPacketHeader revived_header_; |
642 }; | 643 }; |
643 | 644 |
644 // Run tests with combinations of {QuicVersion, fec_send_policy}. | 645 enum class AckResponse { kDefer, kImmediate }; |
| 646 |
| 647 // Run tests with combinations of {QuicVersion, fec_send_policy, |
| 648 // AckResponse}. |
645 struct TestParams { | 649 struct TestParams { |
646 TestParams(QuicVersion version, FecSendPolicy fec_send_policy) | 650 TestParams(QuicVersion version, |
647 : version(version), fec_send_policy(fec_send_policy) {} | 651 FecSendPolicy fec_send_policy, |
| 652 AckResponse ack_response) |
| 653 : version(version), |
| 654 fec_send_policy(fec_send_policy), |
| 655 ack_response(ack_response) {} |
648 | 656 |
649 friend ostream& operator<<(ostream& os, const TestParams& p) { | 657 friend ostream& operator<<(ostream& os, const TestParams& p) { |
650 os << "{ client_version: " << QuicVersionToString(p.version) | 658 os << "{ client_version: " << QuicVersionToString(p.version) |
651 << " fec_send_policy: " << p.fec_send_policy << " }"; | 659 << " fec_send_policy: " << p.fec_send_policy << " ack_response: " |
| 660 << (p.ack_response == AckResponse::kDefer ? "defer" : "immediate") |
| 661 << " }"; |
652 return os; | 662 return os; |
653 } | 663 } |
654 | 664 |
655 QuicVersion version; | 665 QuicVersion version; |
656 FecSendPolicy fec_send_policy; | 666 FecSendPolicy fec_send_policy; |
| 667 AckResponse ack_response; |
657 }; | 668 }; |
658 | 669 |
659 // Constructs various test permutations. | 670 // Constructs various test permutations. |
660 vector<TestParams> GetTestParams() { | 671 vector<TestParams> GetTestParams() { |
661 vector<TestParams> params; | 672 vector<TestParams> params; |
662 QuicVersionVector all_supported_versions = QuicSupportedVersions(); | 673 QuicVersionVector all_supported_versions = QuicSupportedVersions(); |
663 for (size_t i = 0; i < all_supported_versions.size(); ++i) { | 674 for (size_t i = 0; i < all_supported_versions.size(); ++i) { |
664 params.push_back(TestParams(all_supported_versions[i], FEC_ANY_TRIGGER)); | 675 for (FecSendPolicy fec_send_policy : {FEC_ANY_TRIGGER, FEC_ALARM_TRIGGER}) { |
665 params.push_back(TestParams(all_supported_versions[i], FEC_ALARM_TRIGGER)); | 676 for (AckResponse ack_response : |
| 677 {AckResponse::kDefer, AckResponse::kImmediate}) { |
| 678 params.push_back(TestParams(all_supported_versions[i], fec_send_policy, |
| 679 ack_response)); |
| 680 } |
| 681 } |
666 } | 682 } |
667 return params; | 683 return params; |
668 } | 684 } |
669 | 685 |
670 class QuicConnectionTest : public ::testing::TestWithParam<TestParams> { | 686 class QuicConnectionTest : public ::testing::TestWithParam<TestParams> { |
671 protected: | 687 protected: |
672 QuicConnectionTest() | 688 QuicConnectionTest() |
673 : connection_id_(42), | 689 : connection_id_(42), |
674 framer_(SupportedVersions(version()), | 690 framer_(SupportedVersions(version()), |
675 QuicTime::Zero(), | 691 QuicTime::Zero(), |
(...skipping 13 matching lines...) Expand all Loading... |
689 writer_.get(), | 705 writer_.get(), |
690 Perspective::IS_CLIENT, | 706 Perspective::IS_CLIENT, |
691 version()), | 707 version()), |
692 creator_(QuicConnectionPeer::GetPacketCreator(&connection_)), | 708 creator_(QuicConnectionPeer::GetPacketCreator(&connection_)), |
693 generator_(QuicConnectionPeer::GetPacketGenerator(&connection_)), | 709 generator_(QuicConnectionPeer::GetPacketGenerator(&connection_)), |
694 manager_(QuicConnectionPeer::GetSentPacketManager(&connection_)), | 710 manager_(QuicConnectionPeer::GetSentPacketManager(&connection_)), |
695 frame1_(1, false, 0, StringPiece(data1)), | 711 frame1_(1, false, 0, StringPiece(data1)), |
696 frame2_(1, false, 3, StringPiece(data2)), | 712 frame2_(1, false, 3, StringPiece(data2)), |
697 packet_number_length_(PACKET_6BYTE_PACKET_NUMBER), | 713 packet_number_length_(PACKET_6BYTE_PACKET_NUMBER), |
698 connection_id_length_(PACKET_8BYTE_CONNECTION_ID) { | 714 connection_id_length_(PACKET_8BYTE_CONNECTION_ID) { |
| 715 connection_.set_defer_send_in_response_to_packets(GetParam().ack_response == |
| 716 AckResponse::kDefer); |
699 FLAGS_quic_always_log_bugs_for_tests = true; | 717 FLAGS_quic_always_log_bugs_for_tests = true; |
700 connection_.set_visitor(&visitor_); | 718 connection_.set_visitor(&visitor_); |
701 connection_.SetSendAlgorithm(send_algorithm_); | 719 connection_.SetSendAlgorithm(send_algorithm_); |
702 connection_.SetLossAlgorithm(loss_algorithm_); | 720 connection_.SetLossAlgorithm(loss_algorithm_); |
703 framer_.set_received_entropy_calculator(&entropy_calculator_); | 721 framer_.set_received_entropy_calculator(&entropy_calculator_); |
704 generator_->set_fec_send_policy(GetParam().fec_send_policy); | 722 generator_->set_fec_send_policy(GetParam().fec_send_policy); |
705 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)) | 723 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)) |
706 .WillRepeatedly(Return(QuicTime::Delta::Zero())); | 724 .WillRepeatedly(Return(QuicTime::Delta::Zero())); |
707 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 725 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
708 .Times(AnyNumber()); | 726 .Times(AnyNumber()); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
755 return 0; | 773 return 0; |
756 } | 774 } |
757 return writer_->stop_waiting_frames()[0].least_unacked; | 775 return writer_->stop_waiting_frames()[0].least_unacked; |
758 } | 776 } |
759 | 777 |
760 void use_tagging_decrypter() { writer_->use_tagging_decrypter(); } | 778 void use_tagging_decrypter() { writer_->use_tagging_decrypter(); } |
761 | 779 |
762 void ProcessPacket(QuicPathId path_id, QuicPacketNumber number) { | 780 void ProcessPacket(QuicPathId path_id, QuicPacketNumber number) { |
763 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 781 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
764 ProcessDataPacket(path_id, number, 0, !kEntropyFlag); | 782 ProcessDataPacket(path_id, number, 0, !kEntropyFlag); |
| 783 if (connection_.GetSendAlarm()->IsSet()) { |
| 784 connection_.GetSendAlarm()->Fire(); |
| 785 } |
765 } | 786 } |
766 | 787 |
767 QuicPacketEntropyHash ProcessFramePacket(QuicFrame frame) { | 788 QuicPacketEntropyHash ProcessFramePacket(QuicFrame frame) { |
768 return ProcessFramePacketWithAddresses(frame, kSelfAddress, kPeerAddress); | 789 return ProcessFramePacketWithAddresses(frame, kSelfAddress, kPeerAddress); |
769 } | 790 } |
770 | 791 |
771 QuicPacketEntropyHash ProcessFramePacketWithAddresses( | 792 QuicPacketEntropyHash ProcessFramePacketWithAddresses( |
772 QuicFrame frame, | 793 QuicFrame frame, |
773 IPEndPoint self_address, | 794 IPEndPoint self_address, |
774 IPEndPoint peer_address) { | 795 IPEndPoint peer_address) { |
775 QuicFrames frames; | 796 QuicFrames frames; |
776 frames.push_back(QuicFrame(frame)); | 797 frames.push_back(QuicFrame(frame)); |
777 QuicPacketCreatorPeer::SetSendVersionInPacket( | 798 QuicPacketCreatorPeer::SetSendVersionInPacket( |
778 &peer_creator_, connection_.perspective() == Perspective::IS_SERVER); | 799 &peer_creator_, connection_.perspective() == Perspective::IS_SERVER); |
779 | 800 |
780 char buffer[kMaxPacketSize]; | 801 char buffer[kMaxPacketSize]; |
781 SerializedPacket serialized_packet = | 802 SerializedPacket serialized_packet = |
782 QuicPacketCreatorPeer::SerializeAllFrames(&peer_creator_, frames, | 803 QuicPacketCreatorPeer::SerializeAllFrames(&peer_creator_, frames, |
783 buffer, kMaxPacketSize); | 804 buffer, kMaxPacketSize); |
784 connection_.ProcessUdpPacket( | 805 connection_.ProcessUdpPacket( |
785 self_address, peer_address, | 806 self_address, peer_address, |
786 QuicEncryptedPacket(serialized_packet.encrypted_buffer, | 807 QuicEncryptedPacket(serialized_packet.encrypted_buffer, |
787 serialized_packet.encrypted_length)); | 808 serialized_packet.encrypted_length)); |
| 809 if (connection_.GetSendAlarm()->IsSet()) { |
| 810 connection_.GetSendAlarm()->Fire(); |
| 811 } |
788 return serialized_packet.entropy_hash; | 812 return serialized_packet.entropy_hash; |
789 } | 813 } |
790 | 814 |
791 QuicPacketEntropyHash ProcessFramePacketAtLevel(QuicPathId path_id, | 815 QuicPacketEntropyHash ProcessFramePacketAtLevel(QuicPathId path_id, |
792 QuicPacketNumber number, | 816 QuicPacketNumber number, |
793 QuicFrame frame, | 817 QuicFrame frame, |
794 EncryptionLevel level) { | 818 EncryptionLevel level) { |
795 QuicPacketHeader header; | 819 QuicPacketHeader header; |
796 header.public_header.connection_id = connection_id_; | 820 header.public_header.connection_id = connection_id_; |
797 header.public_header.packet_number_length = packet_number_length_; | 821 header.public_header.packet_number_length = packet_number_length_; |
(...skipping 29 matching lines...) Expand all Loading... |
827 bool has_stop_waiting, | 851 bool has_stop_waiting, |
828 EncryptionLevel level) { | 852 EncryptionLevel level) { |
829 scoped_ptr<QuicPacket> packet(ConstructDataPacket( | 853 scoped_ptr<QuicPacket> packet(ConstructDataPacket( |
830 path_id, number, fec_group, entropy_flag, has_stop_waiting)); | 854 path_id, number, fec_group, entropy_flag, has_stop_waiting)); |
831 char buffer[kMaxPacketSize]; | 855 char buffer[kMaxPacketSize]; |
832 size_t encrypted_length = framer_.EncryptPayload( | 856 size_t encrypted_length = framer_.EncryptPayload( |
833 level, path_id, number, *packet, buffer, kMaxPacketSize); | 857 level, path_id, number, *packet, buffer, kMaxPacketSize); |
834 connection_.ProcessUdpPacket( | 858 connection_.ProcessUdpPacket( |
835 kSelfAddress, kPeerAddress, | 859 kSelfAddress, kPeerAddress, |
836 QuicEncryptedPacket(buffer, encrypted_length, false)); | 860 QuicEncryptedPacket(buffer, encrypted_length, false)); |
| 861 if (connection_.GetSendAlarm()->IsSet()) { |
| 862 connection_.GetSendAlarm()->Fire(); |
| 863 } |
837 return encrypted_length; | 864 return encrypted_length; |
838 } | 865 } |
839 | 866 |
840 void ProcessClosePacket(QuicPathId path_id, | 867 void ProcessClosePacket(QuicPathId path_id, |
841 QuicPacketNumber number, | 868 QuicPacketNumber number, |
842 QuicFecGroupNumber fec_group) { | 869 QuicFecGroupNumber fec_group) { |
843 scoped_ptr<QuicPacket> packet(ConstructClosePacket(number, fec_group)); | 870 scoped_ptr<QuicPacket> packet(ConstructClosePacket(number, fec_group)); |
844 char buffer[kMaxPacketSize]; | 871 char buffer[kMaxPacketSize]; |
845 size_t encrypted_length = framer_.EncryptPayload( | 872 size_t encrypted_length = framer_.EncryptPayload( |
846 ENCRYPTION_NONE, path_id, number, *packet, buffer, kMaxPacketSize); | 873 ENCRYPTION_NONE, path_id, number, *packet, buffer, kMaxPacketSize); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
939 | 966 |
940 scoped_ptr<QuicPacket> fec_packet( | 967 scoped_ptr<QuicPacket> fec_packet( |
941 framer_.BuildFecPacket(header, data_packet->FecProtectedData())); | 968 framer_.BuildFecPacket(header, data_packet->FecProtectedData())); |
942 char buffer[kMaxPacketSize]; | 969 char buffer[kMaxPacketSize]; |
943 size_t encrypted_length = framer_.EncryptPayload( | 970 size_t encrypted_length = framer_.EncryptPayload( |
944 level, path_id, number, *fec_packet, buffer, kMaxPacketSize); | 971 level, path_id, number, *fec_packet, buffer, kMaxPacketSize); |
945 | 972 |
946 connection_.ProcessUdpPacket( | 973 connection_.ProcessUdpPacket( |
947 kSelfAddress, kPeerAddress, | 974 kSelfAddress, kPeerAddress, |
948 QuicEncryptedPacket(buffer, encrypted_length, false)); | 975 QuicEncryptedPacket(buffer, encrypted_length, false)); |
| 976 if (connection_.GetSendAlarm()->IsSet()) { |
| 977 connection_.GetSendAlarm()->Fire(); |
| 978 } |
949 return encrypted_length; | 979 return encrypted_length; |
950 } | 980 } |
951 | 981 |
952 QuicByteCount SendStreamDataToPeer(QuicStreamId id, | 982 QuicByteCount SendStreamDataToPeer(QuicStreamId id, |
953 StringPiece data, | 983 StringPiece data, |
954 QuicStreamOffset offset, | 984 QuicStreamOffset offset, |
955 bool fin, | 985 bool fin, |
956 QuicPacketNumber* last_packet) { | 986 QuicPacketNumber* last_packet) { |
957 QuicByteCount packet_size; | 987 QuicByteCount packet_size; |
958 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 988 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
(...skipping 4668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5627 // result in multiple attempts to close the connection - it will be marked as | 5657 // result in multiple attempts to close the connection - it will be marked as |
5628 // disconnected after the first call. | 5658 // disconnected after the first call. |
5629 EXPECT_CALL(visitor_, OnConnectionClosed(_, _)).Times(1); | 5659 EXPECT_CALL(visitor_, OnConnectionClosed(_, _)).Times(1); |
5630 connection_.SendConnectionCloseWithDetails(QUIC_NO_ERROR, "no reason"); | 5660 connection_.SendConnectionCloseWithDetails(QUIC_NO_ERROR, "no reason"); |
5631 connection_.SendConnectionCloseWithDetails(QUIC_NO_ERROR, "no reason"); | 5661 connection_.SendConnectionCloseWithDetails(QUIC_NO_ERROR, "no reason"); |
5632 } | 5662 } |
5633 | 5663 |
5634 } // namespace | 5664 } // namespace |
5635 } // namespace test | 5665 } // namespace test |
5636 } // namespace net | 5666 } // namespace net |
OLD | NEW |