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 573 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
584 using QuicConnection::set_defer_send_in_response_to_packets; | 584 using QuicConnection::set_defer_send_in_response_to_packets; |
585 | 585 |
586 private: | 586 private: |
587 TestPacketWriter* writer() { | 587 TestPacketWriter* writer() { |
588 return static_cast<TestPacketWriter*>(QuicConnection::writer()); | 588 return static_cast<TestPacketWriter*>(QuicConnection::writer()); |
589 } | 589 } |
590 | 590 |
591 DISALLOW_COPY_AND_ASSIGN(TestConnection); | 591 DISALLOW_COPY_AND_ASSIGN(TestConnection); |
592 }; | 592 }; |
593 | 593 |
594 // Used for testing packets revived from FEC packets. | |
595 class FecQuicConnectionDebugVisitor : public QuicConnectionDebugVisitor { | |
596 public: | |
597 void OnRevivedPacket(const QuicPacketHeader& header, | |
598 StringPiece data) override { | |
599 revived_header_ = header; | |
600 } | |
601 | |
602 // Public accessor method. | |
603 QuicPacketHeader revived_header() const { return revived_header_; } | |
604 | |
605 private: | |
606 QuicPacketHeader revived_header_; | |
607 }; | |
608 | |
609 enum class AckResponse { kDefer, kImmediate }; | 594 enum class AckResponse { kDefer, kImmediate }; |
610 | 595 |
611 // Run tests with combinations of {QuicVersion, AckResponse}. | 596 // Run tests with combinations of {QuicVersion, AckResponse}. |
612 struct TestParams { | 597 struct TestParams { |
613 TestParams(QuicVersion version, | 598 TestParams(QuicVersion version, |
614 AckResponse ack_response) | 599 AckResponse ack_response) |
615 : version(version), | 600 : version(version), |
616 ack_response(ack_response) {} | 601 ack_response(ack_response) {} |
617 | 602 |
618 friend ostream& operator<<(ostream& os, const TestParams& p) { | 603 friend ostream& operator<<(ostream& os, const TestParams& p) { |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
728 if (writer_->stop_waiting_frames().empty()) { | 713 if (writer_->stop_waiting_frames().empty()) { |
729 return 0; | 714 return 0; |
730 } | 715 } |
731 return writer_->stop_waiting_frames()[0].least_unacked; | 716 return writer_->stop_waiting_frames()[0].least_unacked; |
732 } | 717 } |
733 | 718 |
734 void use_tagging_decrypter() { writer_->use_tagging_decrypter(); } | 719 void use_tagging_decrypter() { writer_->use_tagging_decrypter(); } |
735 | 720 |
736 void ProcessPacket(QuicPathId path_id, QuicPacketNumber number) { | 721 void ProcessPacket(QuicPathId path_id, QuicPacketNumber number) { |
737 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 722 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
738 ProcessDataPacket(path_id, number, 0, !kEntropyFlag); | 723 ProcessDataPacket(path_id, number, !kEntropyFlag); |
739 if (connection_.GetSendAlarm()->IsSet()) { | 724 if (connection_.GetSendAlarm()->IsSet()) { |
740 connection_.GetSendAlarm()->Fire(); | 725 connection_.GetSendAlarm()->Fire(); |
741 } | 726 } |
742 } | 727 } |
743 | 728 |
744 QuicPacketEntropyHash ProcessFramePacket(QuicFrame frame) { | 729 QuicPacketEntropyHash ProcessFramePacket(QuicFrame frame) { |
745 return ProcessFramePacketWithAddresses(frame, kSelfAddress, kPeerAddress); | 730 return ProcessFramePacketWithAddresses(frame, kSelfAddress, kPeerAddress); |
746 } | 731 } |
747 | 732 |
748 QuicPacketEntropyHash ProcessFramePacketWithAddresses( | 733 QuicPacketEntropyHash ProcessFramePacketWithAddresses( |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
787 size_t encrypted_length = framer_.EncryptPayload( | 772 size_t encrypted_length = framer_.EncryptPayload( |
788 level, path_id, number, *packet, buffer, kMaxPacketSize); | 773 level, path_id, number, *packet, buffer, kMaxPacketSize); |
789 connection_.ProcessUdpPacket( | 774 connection_.ProcessUdpPacket( |
790 kSelfAddress, kPeerAddress, | 775 kSelfAddress, kPeerAddress, |
791 QuicEncryptedPacket(buffer, encrypted_length, false)); | 776 QuicEncryptedPacket(buffer, encrypted_length, false)); |
792 return base::checked_cast<QuicPacketEntropyHash>(encrypted_length); | 777 return base::checked_cast<QuicPacketEntropyHash>(encrypted_length); |
793 } | 778 } |
794 | 779 |
795 size_t ProcessDataPacket(QuicPathId path_id, | 780 size_t ProcessDataPacket(QuicPathId path_id, |
796 QuicPacketNumber number, | 781 QuicPacketNumber number, |
797 QuicFecGroupNumber fec_group, | |
798 bool entropy_flag) { | 782 bool entropy_flag) { |
799 return ProcessDataPacketAtLevel(path_id, number, fec_group, entropy_flag, | 783 return ProcessDataPacketAtLevel(path_id, number, entropy_flag, false, |
800 false, ENCRYPTION_NONE); | 784 ENCRYPTION_NONE); |
801 } | 785 } |
802 | 786 |
803 size_t ProcessDataPacketAtLevel(QuicPathId path_id, | 787 size_t ProcessDataPacketAtLevel(QuicPathId path_id, |
804 QuicPacketNumber number, | 788 QuicPacketNumber number, |
805 QuicFecGroupNumber fec_group, | |
806 bool entropy_flag, | 789 bool entropy_flag, |
807 bool has_stop_waiting, | 790 bool has_stop_waiting, |
808 EncryptionLevel level) { | 791 EncryptionLevel level) { |
809 scoped_ptr<QuicPacket> packet(ConstructDataPacket( | 792 scoped_ptr<QuicPacket> packet( |
810 path_id, number, fec_group, entropy_flag, has_stop_waiting)); | 793 ConstructDataPacket(path_id, number, entropy_flag, has_stop_waiting)); |
811 char buffer[kMaxPacketSize]; | 794 char buffer[kMaxPacketSize]; |
812 size_t encrypted_length = framer_.EncryptPayload( | 795 size_t encrypted_length = framer_.EncryptPayload( |
813 level, path_id, number, *packet, buffer, kMaxPacketSize); | 796 level, path_id, number, *packet, buffer, kMaxPacketSize); |
814 connection_.ProcessUdpPacket( | 797 connection_.ProcessUdpPacket( |
815 kSelfAddress, kPeerAddress, | 798 kSelfAddress, kPeerAddress, |
816 QuicEncryptedPacket(buffer, encrypted_length, false)); | 799 QuicEncryptedPacket(buffer, encrypted_length, false)); |
817 if (connection_.GetSendAlarm()->IsSet()) { | 800 if (connection_.GetSendAlarm()->IsSet()) { |
818 connection_.GetSendAlarm()->Fire(); | 801 connection_.GetSendAlarm()->Fire(); |
819 } | 802 } |
820 return encrypted_length; | 803 return encrypted_length; |
821 } | 804 } |
822 | 805 |
823 void ProcessClosePacket(QuicPathId path_id, | 806 void ProcessClosePacket(QuicPathId path_id, QuicPacketNumber number) { |
824 QuicPacketNumber number, | 807 scoped_ptr<QuicPacket> packet(ConstructClosePacket(number)); |
825 QuicFecGroupNumber fec_group) { | |
826 scoped_ptr<QuicPacket> packet(ConstructClosePacket(number, fec_group)); | |
827 char buffer[kMaxPacketSize]; | 808 char buffer[kMaxPacketSize]; |
828 size_t encrypted_length = framer_.EncryptPayload( | 809 size_t encrypted_length = framer_.EncryptPayload( |
829 ENCRYPTION_NONE, path_id, number, *packet, buffer, kMaxPacketSize); | 810 ENCRYPTION_NONE, path_id, number, *packet, buffer, kMaxPacketSize); |
830 connection_.ProcessUdpPacket( | 811 connection_.ProcessUdpPacket( |
831 kSelfAddress, kPeerAddress, | 812 kSelfAddress, kPeerAddress, |
832 QuicEncryptedPacket(buffer, encrypted_length, false)); | 813 QuicEncryptedPacket(buffer, encrypted_length, false)); |
833 } | 814 } |
834 | 815 |
835 size_t ProcessFecProtectedPacket(QuicPathId path_id, | |
836 QuicPacketNumber number, | |
837 bool expect_revival, | |
838 bool entropy_flag, | |
839 bool has_stop_waiting) { | |
840 return ProcessFecProtectedPacketAtLevel(path_id, number, 1, expect_revival, | |
841 entropy_flag, has_stop_waiting, | |
842 ENCRYPTION_NONE); | |
843 } | |
844 | |
845 size_t ProcessFecProtectedPacketAtLevel(QuicPathId path_id, | |
846 QuicPacketNumber number, | |
847 QuicFecGroupNumber fec_group, | |
848 bool expect_revival, | |
849 bool entropy_flag, | |
850 bool has_stop_waiting, | |
851 EncryptionLevel level) { | |
852 if (expect_revival) { | |
853 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | |
854 } | |
855 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1).RetiresOnSaturation(); | |
856 return ProcessDataPacketAtLevel(path_id, number, fec_group, entropy_flag, | |
857 has_stop_waiting, level); | |
858 } | |
859 | |
860 // Processes an FEC packet that covers the packets that would have been | |
861 // received. | |
862 size_t ProcessFecPacket(QuicPathId path_id, | |
863 QuicPacketNumber number, | |
864 QuicPacketNumber min_protected_packet, | |
865 bool expect_revival, | |
866 bool entropy_flag, | |
867 QuicPacket* packet) { | |
868 return ProcessFecPacketAtLevel(path_id, number, min_protected_packet, | |
869 expect_revival, entropy_flag, packet, | |
870 ENCRYPTION_NONE); | |
871 } | |
872 | |
873 // Processes an FEC packet that covers the packets that would have been | |
874 // received. | |
875 size_t ProcessFecPacketAtLevel(QuicPathId path_id, | |
876 QuicPacketNumber number, | |
877 QuicPacketNumber min_protected_packet, | |
878 bool expect_revival, | |
879 bool entropy_flag, | |
880 QuicPacket* packet, | |
881 EncryptionLevel level) { | |
882 if (expect_revival) { | |
883 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | |
884 } | |
885 | |
886 // Construct the decrypted data packet so we can compute the correct | |
887 // redundancy. If |packet| has been provided then use that, otherwise | |
888 // construct a default data packet. | |
889 scoped_ptr<QuicPacket> data_packet; | |
890 if (packet) { | |
891 data_packet.reset(packet); | |
892 } else { | |
893 data_packet.reset(ConstructDataPacket(path_id, number, 1, !kEntropyFlag, | |
894 !kHasStopWaiting)); | |
895 } | |
896 | |
897 QuicPacketHeader header; | |
898 header.public_header.connection_id = connection_id_; | |
899 header.public_header.packet_number_length = packet_number_length_; | |
900 header.public_header.connection_id_length = connection_id_length_; | |
901 header.public_header.multipath_flag = path_id != kDefaultPathId; | |
902 header.path_id = path_id; | |
903 header.packet_number = number; | |
904 header.entropy_flag = entropy_flag; | |
905 header.fec_flag = true; | |
906 header.is_in_fec_group = IN_FEC_GROUP; | |
907 header.fec_group = min_protected_packet; | |
908 | |
909 // Since all data packets in this test have the same payload, the | |
910 // redundancy is either equal to that payload or the xor of that payload | |
911 // with itself, depending on the number of packets. | |
912 if (((number - min_protected_packet) % 2) == 0) { | |
913 for (size_t i = GetStartOfFecProtectedData( | |
914 header.public_header.connection_id_length, | |
915 header.public_header.version_flag, | |
916 header.public_header.multipath_flag, | |
917 header.public_header.packet_number_length); | |
918 i < data_packet->length(); ++i) { | |
919 data_packet->mutable_data()[i] ^= data_packet->data()[i]; | |
920 } | |
921 } | |
922 | |
923 scoped_ptr<QuicPacket> fec_packet( | |
924 framer_.BuildFecPacket(header, data_packet->FecProtectedData())); | |
925 char buffer[kMaxPacketSize]; | |
926 size_t encrypted_length = framer_.EncryptPayload( | |
927 level, path_id, number, *fec_packet, buffer, kMaxPacketSize); | |
928 | |
929 connection_.ProcessUdpPacket( | |
930 kSelfAddress, kPeerAddress, | |
931 QuicEncryptedPacket(buffer, encrypted_length, false)); | |
932 if (connection_.GetSendAlarm()->IsSet()) { | |
933 connection_.GetSendAlarm()->Fire(); | |
934 } | |
935 return encrypted_length; | |
936 } | |
937 | |
938 QuicByteCount SendStreamDataToPeer(QuicStreamId id, | 816 QuicByteCount SendStreamDataToPeer(QuicStreamId id, |
939 StringPiece data, | 817 StringPiece data, |
940 QuicStreamOffset offset, | 818 QuicStreamOffset offset, |
941 bool fin, | 819 bool fin, |
942 QuicPacketNumber* last_packet) { | 820 QuicPacketNumber* last_packet) { |
943 QuicByteCount packet_size; | 821 QuicByteCount packet_size; |
944 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 822 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
945 .WillOnce(DoAll(SaveArg<3>(&packet_size), Return(true))); | 823 .WillOnce(DoAll(SaveArg<3>(&packet_size), Return(true))); |
946 connection_.SendStreamDataWithString(id, data, offset, fin, nullptr); | 824 connection_.SendStreamDataWithString(id, data, offset, fin, nullptr); |
947 if (last_packet != nullptr) { | 825 if (last_packet != nullptr) { |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
994 } | 872 } |
995 | 873 |
996 QuicPacket* ConstructPacket(QuicPacketHeader header, QuicFrames frames) { | 874 QuicPacket* ConstructPacket(QuicPacketHeader header, QuicFrames frames) { |
997 QuicPacket* packet = BuildUnsizedDataPacket(&framer_, header, frames); | 875 QuicPacket* packet = BuildUnsizedDataPacket(&framer_, header, frames); |
998 EXPECT_NE(nullptr, packet); | 876 EXPECT_NE(nullptr, packet); |
999 return packet; | 877 return packet; |
1000 } | 878 } |
1001 | 879 |
1002 QuicPacket* ConstructDataPacket(QuicPathId path_id, | 880 QuicPacket* ConstructDataPacket(QuicPathId path_id, |
1003 QuicPacketNumber number, | 881 QuicPacketNumber number, |
1004 QuicFecGroupNumber fec_group, | |
1005 bool entropy_flag, | 882 bool entropy_flag, |
1006 bool has_stop_waiting) { | 883 bool has_stop_waiting) { |
1007 QuicPacketHeader header; | 884 QuicPacketHeader header; |
1008 header.public_header.connection_id = connection_id_; | 885 header.public_header.connection_id = connection_id_; |
1009 header.public_header.packet_number_length = packet_number_length_; | 886 header.public_header.packet_number_length = packet_number_length_; |
1010 header.public_header.connection_id_length = connection_id_length_; | 887 header.public_header.connection_id_length = connection_id_length_; |
1011 header.public_header.multipath_flag = path_id != kDefaultPathId; | 888 header.public_header.multipath_flag = path_id != kDefaultPathId; |
1012 header.entropy_flag = entropy_flag; | 889 header.entropy_flag = entropy_flag; |
1013 header.path_id = path_id; | 890 header.path_id = path_id; |
1014 header.packet_number = number; | 891 header.packet_number = number; |
1015 header.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; | 892 header.is_in_fec_group = NOT_IN_FEC_GROUP; |
1016 header.fec_group = fec_group; | 893 header.fec_group = 0; |
1017 | 894 |
1018 QuicFrames frames; | 895 QuicFrames frames; |
1019 frames.push_back(QuicFrame(&frame1_)); | 896 frames.push_back(QuicFrame(&frame1_)); |
1020 if (has_stop_waiting) { | 897 if (has_stop_waiting) { |
1021 frames.push_back(QuicFrame(&stop_waiting_)); | 898 frames.push_back(QuicFrame(&stop_waiting_)); |
1022 } | 899 } |
1023 return ConstructPacket(header, frames); | 900 return ConstructPacket(header, frames); |
1024 } | 901 } |
1025 | 902 |
1026 QuicPacket* ConstructClosePacket(QuicPacketNumber number, | 903 QuicPacket* ConstructClosePacket(QuicPacketNumber number) { |
1027 QuicFecGroupNumber fec_group) { | |
1028 QuicPacketHeader header; | 904 QuicPacketHeader header; |
1029 header.public_header.connection_id = connection_id_; | 905 header.public_header.connection_id = connection_id_; |
1030 header.packet_number = number; | 906 header.packet_number = number; |
1031 header.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; | 907 header.is_in_fec_group = NOT_IN_FEC_GROUP; |
1032 header.fec_group = fec_group; | 908 header.fec_group = 0; |
1033 | 909 |
1034 QuicConnectionCloseFrame qccf; | 910 QuicConnectionCloseFrame qccf; |
1035 qccf.error_code = QUIC_PEER_GOING_AWAY; | 911 qccf.error_code = QUIC_PEER_GOING_AWAY; |
1036 | 912 |
1037 QuicFrames frames; | 913 QuicFrames frames; |
1038 frames.push_back(QuicFrame(&qccf)); | 914 frames.push_back(QuicFrame(&qccf)); |
1039 return ConstructPacket(header, frames); | 915 return ConstructPacket(header, frames); |
1040 } | 916 } |
1041 | 917 |
1042 QuicTime::Delta DefaultRetransmissionTime() { | 918 QuicTime::Delta DefaultRetransmissionTime() { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1078 frame->entropy_hash ^= | 954 frame->entropy_hash ^= |
1079 QuicConnectionPeer::PacketEntropy(&connection_, arrived); | 955 QuicConnectionPeer::PacketEntropy(&connection_, arrived); |
1080 } | 956 } |
1081 | 957 |
1082 void TriggerConnectionClose() { | 958 void TriggerConnectionClose() { |
1083 // Send an erroneous packet to close the connection. | 959 // Send an erroneous packet to close the connection. |
1084 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, | 960 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, |
1085 ConnectionCloseSource::FROM_SELF)); | 961 ConnectionCloseSource::FROM_SELF)); |
1086 // Call ProcessDataPacket rather than ProcessPacket, as we should not get a | 962 // Call ProcessDataPacket rather than ProcessPacket, as we should not get a |
1087 // packet call to the visitor. | 963 // packet call to the visitor. |
1088 ProcessDataPacket(kDefaultPathId, 6000, 0, !kEntropyFlag); | 964 ProcessDataPacket(kDefaultPathId, 6000, !kEntropyFlag); |
1089 EXPECT_FALSE(QuicConnectionPeer::GetConnectionClosePacket(&connection_) == | 965 EXPECT_FALSE(QuicConnectionPeer::GetConnectionClosePacket(&connection_) == |
1090 nullptr); | 966 nullptr); |
1091 } | 967 } |
1092 | 968 |
1093 void BlockOnNextWrite() { | 969 void BlockOnNextWrite() { |
1094 writer_->BlockOnNextWrite(); | 970 writer_->BlockOnNextWrite(); |
1095 EXPECT_CALL(visitor_, OnWriteBlocked()).Times(AtLeast(1)); | 971 EXPECT_CALL(visitor_, OnWriteBlocked()).Times(AtLeast(1)); |
1096 } | 972 } |
1097 | 973 |
1098 void SetWritePauseTimeDelta(QuicTime::Delta delta) { | 974 void SetWritePauseTimeDelta(QuicTime::Delta delta) { |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1325 TEST_P(QuicConnectionTest, DuplicatePacket) { | 1201 TEST_P(QuicConnectionTest, DuplicatePacket) { |
1326 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1202 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
1327 | 1203 |
1328 ProcessPacket(kDefaultPathId, 3); | 1204 ProcessPacket(kDefaultPathId, 3); |
1329 EXPECT_EQ(3u, outgoing_ack()->largest_observed); | 1205 EXPECT_EQ(3u, outgoing_ack()->largest_observed); |
1330 EXPECT_TRUE(IsMissing(2)); | 1206 EXPECT_TRUE(IsMissing(2)); |
1331 EXPECT_TRUE(IsMissing(1)); | 1207 EXPECT_TRUE(IsMissing(1)); |
1332 | 1208 |
1333 // Send packet 3 again, but do not set the expectation that | 1209 // Send packet 3 again, but do not set the expectation that |
1334 // the visitor OnStreamFrame() will be called. | 1210 // the visitor OnStreamFrame() will be called. |
1335 ProcessDataPacket(kDefaultPathId, 3, 0, !kEntropyFlag); | 1211 ProcessDataPacket(kDefaultPathId, 3, !kEntropyFlag); |
1336 EXPECT_EQ(3u, outgoing_ack()->largest_observed); | 1212 EXPECT_EQ(3u, outgoing_ack()->largest_observed); |
1337 EXPECT_TRUE(IsMissing(2)); | 1213 EXPECT_TRUE(IsMissing(2)); |
1338 EXPECT_TRUE(IsMissing(1)); | 1214 EXPECT_TRUE(IsMissing(1)); |
1339 } | 1215 } |
1340 | 1216 |
1341 TEST_P(QuicConnectionTest, PacketsOutOfOrderWithAdditionsAndLeastAwaiting) { | 1217 TEST_P(QuicConnectionTest, PacketsOutOfOrderWithAdditionsAndLeastAwaiting) { |
1342 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1218 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
1343 | 1219 |
1344 ProcessPacket(kDefaultPathId, 3); | 1220 ProcessPacket(kDefaultPathId, 3); |
1345 EXPECT_EQ(3u, outgoing_ack()->largest_observed); | 1221 EXPECT_EQ(3u, outgoing_ack()->largest_observed); |
(...skipping 20 matching lines...) Expand all Loading... |
1366 // Force an ack to be sent. | 1242 // Force an ack to be sent. |
1367 SendAckPacketToPeer(); | 1243 SendAckPacketToPeer(); |
1368 EXPECT_TRUE(IsMissing(4)); | 1244 EXPECT_TRUE(IsMissing(4)); |
1369 } | 1245 } |
1370 | 1246 |
1371 TEST_P(QuicConnectionTest, RejectPacketTooFarOut) { | 1247 TEST_P(QuicConnectionTest, RejectPacketTooFarOut) { |
1372 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, | 1248 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, |
1373 ConnectionCloseSource::FROM_SELF)); | 1249 ConnectionCloseSource::FROM_SELF)); |
1374 // Call ProcessDataPacket rather than ProcessPacket, as we should not get a | 1250 // Call ProcessDataPacket rather than ProcessPacket, as we should not get a |
1375 // packet call to the visitor. | 1251 // packet call to the visitor. |
1376 ProcessDataPacket(kDefaultPathId, 6000, 0, !kEntropyFlag); | 1252 ProcessDataPacket(kDefaultPathId, 6000, !kEntropyFlag); |
1377 EXPECT_FALSE(QuicConnectionPeer::GetConnectionClosePacket(&connection_) == | 1253 EXPECT_FALSE(QuicConnectionPeer::GetConnectionClosePacket(&connection_) == |
1378 nullptr); | 1254 nullptr); |
1379 } | 1255 } |
1380 | 1256 |
1381 TEST_P(QuicConnectionTest, RejectUnencryptedStreamData) { | 1257 TEST_P(QuicConnectionTest, RejectUnencryptedStreamData) { |
1382 // Process an unencrypted packet from the non-crypto stream. | 1258 // Process an unencrypted packet from the non-crypto stream. |
1383 frame1_.stream_id = 3; | 1259 frame1_.stream_id = 3; |
1384 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1260 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
1385 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_UNENCRYPTED_STREAM_DATA, | 1261 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_UNENCRYPTED_STREAM_DATA, |
1386 ConnectionCloseSource::FROM_SELF)); | 1262 ConnectionCloseSource::FROM_SELF)); |
1387 EXPECT_DFATAL(ProcessDataPacket(kDefaultPathId, 1, 0, !kEntropyFlag), ""); | 1263 EXPECT_DFATAL(ProcessDataPacket(kDefaultPathId, 1, !kEntropyFlag), ""); |
1388 EXPECT_FALSE(QuicConnectionPeer::GetConnectionClosePacket(&connection_) == | 1264 EXPECT_FALSE(QuicConnectionPeer::GetConnectionClosePacket(&connection_) == |
1389 nullptr); | 1265 nullptr); |
1390 const vector<QuicConnectionCloseFrame>& connection_close_frames = | 1266 const vector<QuicConnectionCloseFrame>& connection_close_frames = |
1391 writer_->connection_close_frames(); | 1267 writer_->connection_close_frames(); |
1392 EXPECT_EQ(1u, connection_close_frames.size()); | 1268 EXPECT_EQ(1u, connection_close_frames.size()); |
1393 EXPECT_EQ(QUIC_UNENCRYPTED_STREAM_DATA, | 1269 EXPECT_EQ(QUIC_UNENCRYPTED_STREAM_DATA, |
1394 connection_close_frames[0].error_code); | 1270 connection_close_frames[0].error_code); |
1395 } | 1271 } |
1396 | 1272 |
1397 TEST_P(QuicConnectionTest, TruncatedAck) { | 1273 TEST_P(QuicConnectionTest, TruncatedAck) { |
(...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1910 // Parse the last packet and ensure it's the stream frame from stream 3. | 1786 // Parse the last packet and ensure it's the stream frame from stream 3. |
1911 EXPECT_EQ(1u, writer_->frame_count()); | 1787 EXPECT_EQ(1u, writer_->frame_count()); |
1912 ASSERT_EQ(1u, writer_->stream_frames().size()); | 1788 ASSERT_EQ(1u, writer_->stream_frames().size()); |
1913 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0]->stream_id); | 1789 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0]->stream_id); |
1914 } | 1790 } |
1915 | 1791 |
1916 TEST_P(QuicConnectionTest, FramePackingAckResponse) { | 1792 TEST_P(QuicConnectionTest, FramePackingAckResponse) { |
1917 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1793 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
1918 // Process a data packet to queue up a pending ack. | 1794 // Process a data packet to queue up a pending ack. |
1919 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 1795 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
1920 ProcessDataPacket(kDefaultPathId, 1, 1, kEntropyFlag); | 1796 ProcessDataPacket(kDefaultPathId, 1, kEntropyFlag); |
1921 | 1797 |
1922 EXPECT_CALL(visitor_, OnCanWrite()) | 1798 EXPECT_CALL(visitor_, OnCanWrite()) |
1923 .WillOnce(DoAll(IgnoreResult(InvokeWithoutArgs( | 1799 .WillOnce(DoAll(IgnoreResult(InvokeWithoutArgs( |
1924 &connection_, &TestConnection::SendStreamData3)), | 1800 &connection_, &TestConnection::SendStreamData3)), |
1925 IgnoreResult(InvokeWithoutArgs( | 1801 IgnoreResult(InvokeWithoutArgs( |
1926 &connection_, &TestConnection::SendStreamData5)))); | 1802 &connection_, &TestConnection::SendStreamData5)))); |
1927 | 1803 |
1928 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 1804 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
1929 | 1805 |
1930 // Process an ack to cause the visitor's OnCanWrite to be invoked. | 1806 // Process an ack to cause the visitor's OnCanWrite to be invoked. |
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2533 | 2409 |
2534 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); | 2410 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); |
2535 frame = InitAckFrame(7); | 2411 frame = InitAckFrame(7); |
2536 NackPacket(5, &frame); | 2412 NackPacket(5, &frame); |
2537 NackPacket(6, &frame); | 2413 NackPacket(6, &frame); |
2538 ProcessAckPacket(&frame); | 2414 ProcessAckPacket(&frame); |
2539 | 2415 |
2540 EXPECT_EQ(6u, stop_waiting()->least_unacked); | 2416 EXPECT_EQ(6u, stop_waiting()->least_unacked); |
2541 } | 2417 } |
2542 | 2418 |
2543 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterFecPacket) { | |
2544 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
2545 | |
2546 // Don't send missing packet 1. | |
2547 ProcessFecPacket(kDefaultPathId, 2, 1, true, !kEntropyFlag, nullptr); | |
2548 // Entropy flag should be false, so entropy should be 0. | |
2549 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); | |
2550 } | |
2551 | |
2552 TEST_P(QuicConnectionTest, ReviveMissingPacketWithVaryingSeqNumLengths) { | |
2553 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
2554 | |
2555 // Set up a debug visitor to the connection. | |
2556 scoped_ptr<FecQuicConnectionDebugVisitor> fec_visitor( | |
2557 new FecQuicConnectionDebugVisitor()); | |
2558 connection_.set_debug_visitor(fec_visitor.get()); | |
2559 | |
2560 QuicPacketNumber fec_packet = 0; | |
2561 // clang-format off | |
2562 QuicPacketNumberLength lengths[] = { | |
2563 PACKET_6BYTE_PACKET_NUMBER, PACKET_4BYTE_PACKET_NUMBER, | |
2564 PACKET_2BYTE_PACKET_NUMBER, PACKET_1BYTE_PACKET_NUMBER}; | |
2565 // clang-format on | |
2566 // For each packet number length size, revive a packet and check sequence | |
2567 // number length in the revived packet. | |
2568 for (size_t i = 0; i < arraysize(lengths); ++i) { | |
2569 // Set packet_number_length_ (for data and FEC packets). | |
2570 packet_number_length_ = lengths[i]; | |
2571 fec_packet += 2; | |
2572 // Don't send missing packet, but send fec packet right after it. | |
2573 ProcessFecPacket(kDefaultPathId, fec_packet, fec_packet - 1, true, | |
2574 !kEntropyFlag, nullptr); | |
2575 // packet number length in the revived header should be the same as | |
2576 // in the original data/fec packet headers. | |
2577 EXPECT_EQ(packet_number_length_, | |
2578 fec_visitor->revived_header().public_header.packet_number_length); | |
2579 } | |
2580 } | |
2581 | |
2582 TEST_P(QuicConnectionTest, ReviveMissingPacketWithVaryingConnectionIdLengths) { | |
2583 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
2584 | |
2585 // Set up a debug visitor to the connection. | |
2586 scoped_ptr<FecQuicConnectionDebugVisitor> fec_visitor( | |
2587 new FecQuicConnectionDebugVisitor()); | |
2588 connection_.set_debug_visitor(fec_visitor.get()); | |
2589 | |
2590 QuicPacketNumber fec_packet = 0; | |
2591 QuicConnectionIdLength lengths[] = { | |
2592 PACKET_8BYTE_CONNECTION_ID, PACKET_4BYTE_CONNECTION_ID, | |
2593 PACKET_1BYTE_CONNECTION_ID, PACKET_0BYTE_CONNECTION_ID}; | |
2594 // For each connection id length size, revive a packet and check connection | |
2595 // id length in the revived packet. | |
2596 for (size_t i = 0; i < arraysize(lengths); ++i) { | |
2597 // Set connection id length (for data and FEC packets). | |
2598 connection_id_length_ = lengths[i]; | |
2599 fec_packet += 2; | |
2600 // Don't send missing packet, but send fec packet right after it. | |
2601 ProcessFecPacket(kDefaultPathId, fec_packet, fec_packet - 1, true, | |
2602 !kEntropyFlag, nullptr); | |
2603 // Connection id length in the revived header should be the same as | |
2604 // in the original data/fec packet headers. | |
2605 EXPECT_EQ(connection_id_length_, | |
2606 fec_visitor->revived_header().public_header.connection_id_length); | |
2607 } | |
2608 } | |
2609 | |
2610 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacketThenFecPacket) { | |
2611 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
2612 | |
2613 ProcessFecProtectedPacket(kDefaultPathId, 1, false, kEntropyFlag, | |
2614 !kHasStopWaiting); | |
2615 // Don't send missing packet 2. | |
2616 ProcessFecPacket(kDefaultPathId, 3, 1, true, !kEntropyFlag, nullptr); | |
2617 // Entropy flag should be true, so entropy should not be 0. | |
2618 EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); | |
2619 } | |
2620 | |
2621 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacketsThenFecPacket) { | |
2622 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
2623 | |
2624 ProcessFecProtectedPacket(kDefaultPathId, 1, false, !kEntropyFlag, | |
2625 !kHasStopWaiting); | |
2626 // Don't send missing packet 2. | |
2627 ProcessFecProtectedPacket(kDefaultPathId, 3, false, !kEntropyFlag, | |
2628 !kHasStopWaiting); | |
2629 ProcessFecPacket(kDefaultPathId, 4, 1, true, kEntropyFlag, nullptr); | |
2630 // Ensure QUIC no longer revives entropy for lost packets. | |
2631 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); | |
2632 EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 4)); | |
2633 } | |
2634 | |
2635 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacket) { | |
2636 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
2637 | |
2638 // Don't send missing packet 1. | |
2639 ProcessFecPacket(kDefaultPathId, 3, 1, false, !kEntropyFlag, nullptr); | |
2640 // Out of order. | |
2641 ProcessFecProtectedPacket(kDefaultPathId, 2, true, !kEntropyFlag, | |
2642 !kHasStopWaiting); | |
2643 // Entropy flag should be false, so entropy should be 0. | |
2644 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); | |
2645 } | |
2646 | |
2647 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPackets) { | |
2648 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
2649 | |
2650 ProcessFecProtectedPacket(kDefaultPathId, 1, false, !kEntropyFlag, | |
2651 !kHasStopWaiting); | |
2652 // Don't send missing packet 2. | |
2653 ProcessFecPacket(kDefaultPathId, 6, 1, false, kEntropyFlag, nullptr); | |
2654 ProcessFecProtectedPacket(kDefaultPathId, 3, false, kEntropyFlag, | |
2655 !kHasStopWaiting); | |
2656 ProcessFecProtectedPacket(kDefaultPathId, 4, false, kEntropyFlag, | |
2657 !kHasStopWaiting); | |
2658 ProcessFecProtectedPacket(kDefaultPathId, 5, true, !kEntropyFlag, | |
2659 !kHasStopWaiting); | |
2660 // Ensure entropy is not revived for the missing packet. | |
2661 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); | |
2662 EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 3)); | |
2663 } | |
2664 | |
2665 TEST_P(QuicConnectionTest, TLP) { | 2419 TEST_P(QuicConnectionTest, TLP) { |
2666 QuicSentPacketManagerPeer::SetMaxTailLossProbes(manager_, 1); | 2420 QuicSentPacketManagerPeer::SetMaxTailLossProbes(manager_, 1); |
2667 | 2421 |
2668 SendStreamDataToPeer(3, "foo", 0, !kFin, nullptr); | 2422 SendStreamDataToPeer(3, "foo", 0, !kFin, nullptr); |
2669 EXPECT_EQ(1u, stop_waiting()->least_unacked); | 2423 EXPECT_EQ(1u, stop_waiting()->least_unacked); |
2670 QuicTime retransmission_time = | 2424 QuicTime retransmission_time = |
2671 connection_.GetRetransmissionAlarm()->deadline(); | 2425 connection_.GetRetransmissionAlarm()->deadline(); |
2672 EXPECT_NE(QuicTime::Zero(), retransmission_time); | 2426 EXPECT_NE(QuicTime::Zero(), retransmission_time); |
2673 | 2427 |
2674 EXPECT_EQ(1u, writer_->header().packet_number); | 2428 EXPECT_EQ(1u, writer_->header().packet_number); |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2863 QuicConfig config; | 2617 QuicConfig config; |
2864 connection_.SetFromConfig(config); | 2618 connection_.SetFromConfig(config); |
2865 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2619 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2866 use_tagging_decrypter(); | 2620 use_tagging_decrypter(); |
2867 | 2621 |
2868 const uint8_t tag = 0x07; | 2622 const uint8_t tag = 0x07; |
2869 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); | 2623 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); |
2870 | 2624 |
2871 // Process an encrypted packet which can not yet be decrypted which should | 2625 // Process an encrypted packet which can not yet be decrypted which should |
2872 // result in the packet being buffered. | 2626 // result in the packet being buffered. |
2873 ProcessDataPacketAtLevel(kDefaultPathId, 1, 0, kEntropyFlag, !kHasStopWaiting, | 2627 ProcessDataPacketAtLevel(kDefaultPathId, 1, kEntropyFlag, !kHasStopWaiting, |
2874 ENCRYPTION_INITIAL); | 2628 ENCRYPTION_INITIAL); |
2875 | 2629 |
2876 // Transition to the new encryption state and process another encrypted packet | 2630 // Transition to the new encryption state and process another encrypted packet |
2877 // which should result in the original packet being processed. | 2631 // which should result in the original packet being processed. |
2878 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); | 2632 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); |
2879 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL); | 2633 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL); |
2880 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); | 2634 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); |
2881 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(2); | 2635 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(2); |
2882 ProcessDataPacketAtLevel(kDefaultPathId, 2, 0, kEntropyFlag, !kHasStopWaiting, | 2636 ProcessDataPacketAtLevel(kDefaultPathId, 2, kEntropyFlag, !kHasStopWaiting, |
2883 ENCRYPTION_INITIAL); | 2637 ENCRYPTION_INITIAL); |
2884 | 2638 |
2885 // Finally, process a third packet and note that we do not reprocess the | 2639 // Finally, process a third packet and note that we do not reprocess the |
2886 // buffered packet. | 2640 // buffered packet. |
2887 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 2641 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
2888 ProcessDataPacketAtLevel(kDefaultPathId, 3, 0, kEntropyFlag, !kHasStopWaiting, | 2642 ProcessDataPacketAtLevel(kDefaultPathId, 3, kEntropyFlag, !kHasStopWaiting, |
2889 ENCRYPTION_INITIAL); | 2643 ENCRYPTION_INITIAL); |
2890 } | 2644 } |
2891 | 2645 |
2892 TEST_P(QuicConnectionTest, ProcessBufferedFECGroup) { | |
2893 // SetFromConfig is always called after construction from InitializeSession. | |
2894 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | |
2895 QuicConfig config; | |
2896 config.set_max_undecryptable_packets(100); | |
2897 connection_.SetFromConfig(config); | |
2898 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
2899 use_tagging_decrypter(); | |
2900 | |
2901 const uint8_t tag = 0x07; | |
2902 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); | |
2903 | |
2904 // Don't send packet 1 and buffer initially encrypted packets. | |
2905 ProcessFecProtectedPacketAtLevel(kDefaultPathId, 2, 1, false, !kEntropyFlag, | |
2906 !kHasStopWaiting, ENCRYPTION_INITIAL); | |
2907 ProcessFecPacketAtLevel(kDefaultPathId, 3, 1, false, kEntropyFlag, nullptr, | |
2908 ENCRYPTION_INITIAL); | |
2909 // Since the packets were buffered, no FEC group should be open. | |
2910 ASSERT_EQ(0u, connection_.NumFecGroups()); | |
2911 | |
2912 // Now send non-fec protected ack packet and close the group. | |
2913 QuicStopWaitingFrame frame = InitStopWaitingFrame(4); | |
2914 ProcessStopWaitingPacketAtLevel(kDefaultPathId, 4, &frame, | |
2915 ENCRYPTION_INITIAL); | |
2916 | |
2917 // Transition to the new encryption state and process another encrypted packet | |
2918 // which should result in the original packets being processed. The missing | |
2919 // packet should be revived before the STOP_WAITING packet is processed. | |
2920 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); | |
2921 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL); | |
2922 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); | |
2923 | |
2924 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(2).RetiresOnSaturation(); | |
2925 ProcessDataPacketAtLevel(kDefaultPathId, 5, 0, kEntropyFlag, !kHasStopWaiting, | |
2926 ENCRYPTION_INITIAL); | |
2927 const QuicConnectionStats& stats = connection_.GetStats(); | |
2928 EXPECT_EQ(1u, stats.packets_revived); | |
2929 } | |
2930 | |
2931 TEST_P(QuicConnectionTest, Buffer100NonDecryptablePackets) { | 2646 TEST_P(QuicConnectionTest, Buffer100NonDecryptablePackets) { |
2932 // SetFromConfig is always called after construction from InitializeSession. | 2647 // SetFromConfig is always called after construction from InitializeSession. |
2933 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 2648 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
2934 QuicConfig config; | 2649 QuicConfig config; |
2935 config.set_max_undecryptable_packets(100); | 2650 config.set_max_undecryptable_packets(100); |
2936 connection_.SetFromConfig(config); | 2651 connection_.SetFromConfig(config); |
2937 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2652 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2938 use_tagging_decrypter(); | 2653 use_tagging_decrypter(); |
2939 | 2654 |
2940 const uint8_t tag = 0x07; | 2655 const uint8_t tag = 0x07; |
2941 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); | 2656 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); |
2942 | 2657 |
2943 // Process an encrypted packet which can not yet be decrypted which should | 2658 // Process an encrypted packet which can not yet be decrypted which should |
2944 // result in the packet being buffered. | 2659 // result in the packet being buffered. |
2945 for (QuicPacketNumber i = 1; i <= 100; ++i) { | 2660 for (QuicPacketNumber i = 1; i <= 100; ++i) { |
2946 ProcessDataPacketAtLevel(kDefaultPathId, i, 0, kEntropyFlag, | 2661 ProcessDataPacketAtLevel(kDefaultPathId, i, kEntropyFlag, !kHasStopWaiting, |
2947 !kHasStopWaiting, ENCRYPTION_INITIAL); | 2662 ENCRYPTION_INITIAL); |
2948 } | 2663 } |
2949 | 2664 |
2950 // Transition to the new encryption state and process another encrypted packet | 2665 // Transition to the new encryption state and process another encrypted packet |
2951 // which should result in the original packets being processed. | 2666 // which should result in the original packets being processed. |
2952 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); | 2667 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); |
2953 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL); | 2668 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL); |
2954 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); | 2669 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); |
2955 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(101); | 2670 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(101); |
2956 ProcessDataPacketAtLevel(kDefaultPathId, 101, 0, kEntropyFlag, | 2671 ProcessDataPacketAtLevel(kDefaultPathId, 101, kEntropyFlag, !kHasStopWaiting, |
2957 !kHasStopWaiting, ENCRYPTION_INITIAL); | 2672 ENCRYPTION_INITIAL); |
2958 | 2673 |
2959 // Finally, process a third packet and note that we do not reprocess the | 2674 // Finally, process a third packet and note that we do not reprocess the |
2960 // buffered packet. | 2675 // buffered packet. |
2961 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 2676 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
2962 ProcessDataPacketAtLevel(kDefaultPathId, 102, 0, kEntropyFlag, | 2677 ProcessDataPacketAtLevel(kDefaultPathId, 102, kEntropyFlag, !kHasStopWaiting, |
2963 !kHasStopWaiting, ENCRYPTION_INITIAL); | 2678 ENCRYPTION_INITIAL); |
2964 } | 2679 } |
2965 | 2680 |
2966 TEST_P(QuicConnectionTest, TestRetransmitOrder) { | 2681 TEST_P(QuicConnectionTest, TestRetransmitOrder) { |
2967 QuicByteCount first_packet_size; | 2682 QuicByteCount first_packet_size; |
2968 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 2683 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
2969 .WillOnce(DoAll(SaveArg<3>(&first_packet_size), Return(true))); | 2684 .WillOnce(DoAll(SaveArg<3>(&first_packet_size), Return(true))); |
2970 | 2685 |
2971 connection_.SendStreamDataWithString(3, "first_packet", 0, !kFin, nullptr); | 2686 connection_.SendStreamDataWithString(3, "first_packet", 0, !kFin, nullptr); |
2972 QuicByteCount second_packet_size; | 2687 QuicByteCount second_packet_size; |
2973 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 2688 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3049 BlockOnNextWrite(); | 2764 BlockOnNextWrite(); |
3050 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); | 2765 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); |
3051 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 2766 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
3052 | 2767 |
3053 // Unblock the writes and actually send. | 2768 // Unblock the writes and actually send. |
3054 writer_->SetWritable(); | 2769 writer_->SetWritable(); |
3055 connection_.OnCanWrite(); | 2770 connection_.OnCanWrite(); |
3056 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 2771 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
3057 } | 2772 } |
3058 | 2773 |
3059 TEST_P(QuicConnectionTest, CloseFecGroup) { | |
3060 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
3061 // Don't send missing packet 1. | |
3062 // Don't send missing packet 2. | |
3063 ProcessFecProtectedPacket(kDefaultPathId, 3, false, !kEntropyFlag, | |
3064 !kHasStopWaiting); | |
3065 // Don't send missing FEC packet 3. | |
3066 ASSERT_EQ(1u, connection_.NumFecGroups()); | |
3067 | |
3068 // Now send non-fec protected ack packet and close the group. | |
3069 QuicPacketCreatorPeer::SetPacketNumber(&peer_creator_, 4); | |
3070 QuicStopWaitingFrame frame = InitStopWaitingFrame(5); | |
3071 ProcessStopWaitingPacket(&frame); | |
3072 ASSERT_EQ(0u, connection_.NumFecGroups()); | |
3073 } | |
3074 | |
3075 TEST_P(QuicConnectionTest, | |
3076 CloseFecGroupUnderStopWaitingAndWaitingForPacketsBelowStopWaiting) { | |
3077 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
3078 // Don't send missing packet 1. | |
3079 ProcessFecProtectedPacket(kDefaultPathId, 2, false, !kEntropyFlag, | |
3080 !kHasStopWaiting); | |
3081 EXPECT_EQ(1u, connection_.NumFecGroups()); | |
3082 stop_waiting_ = InitStopWaitingFrame(2); | |
3083 ProcessFecProtectedPacket(kDefaultPathId, 3, false, !kEntropyFlag, | |
3084 kHasStopWaiting); | |
3085 // This Fec group would be closed. | |
3086 EXPECT_EQ(0u, connection_.NumFecGroups()); | |
3087 } | |
3088 | |
3089 TEST_P(QuicConnectionTest, | |
3090 DoNotCloseFecGroupUnderStopWaitingButNotWaitingForPacketsBelow) { | |
3091 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
3092 ProcessFecProtectedPacket(kDefaultPathId, 1, false, !kEntropyFlag, | |
3093 !kHasStopWaiting); | |
3094 ProcessFecProtectedPacket(kDefaultPathId, 2, false, !kEntropyFlag, | |
3095 !kHasStopWaiting); | |
3096 // Don't send missing packet 3. | |
3097 EXPECT_EQ(1u, connection_.NumFecGroups()); | |
3098 stop_waiting_ = InitStopWaitingFrame(2); | |
3099 ProcessFecProtectedPacket(kDefaultPathId, 3, false, !kEntropyFlag, | |
3100 kHasStopWaiting); | |
3101 // This group will not be closed because this group is not waiting for packets | |
3102 // below stop waiting. | |
3103 EXPECT_EQ(1u, connection_.NumFecGroups()); | |
3104 } | |
3105 | |
3106 TEST_P(QuicConnectionTest, InitialTimeout) { | 2774 TEST_P(QuicConnectionTest, InitialTimeout) { |
3107 EXPECT_TRUE(connection_.connected()); | 2775 EXPECT_TRUE(connection_.connected()); |
3108 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AnyNumber()); | 2776 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AnyNumber()); |
3109 EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet()); | 2777 EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet()); |
3110 | 2778 |
3111 // SetFromConfig sets the initial timeouts before negotiation. | 2779 // SetFromConfig sets the initial timeouts before negotiation. |
3112 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 2780 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
3113 QuicConfig config; | 2781 QuicConfig config; |
3114 connection_.SetFromConfig(config); | 2782 connection_.SetFromConfig(config); |
3115 // Subtract a second from the idle timeout on the client side. | 2783 // Subtract a second from the idle timeout on the client side. |
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3661 nullptr); | 3329 nullptr); |
3662 connection_.GetTimeoutAlarm()->Fire(); | 3330 connection_.GetTimeoutAlarm()->Fire(); |
3663 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 3331 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
3664 } | 3332 } |
3665 EXPECT_FALSE(connection_.connected()); | 3333 EXPECT_FALSE(connection_.connected()); |
3666 EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet()); | 3334 EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet()); |
3667 } | 3335 } |
3668 | 3336 |
3669 TEST_P(QuicConnectionTest, SendScheduler) { | 3337 TEST_P(QuicConnectionTest, SendScheduler) { |
3670 // Test that if we send a packet without delay, it is not queued. | 3338 // Test that if we send a packet without delay, it is not queued. |
3671 QuicPacket* packet = ConstructDataPacket(kDefaultPathId, 1, 0, !kEntropyFlag, | 3339 QuicPacket* packet = |
3672 !kHasStopWaiting); | 3340 ConstructDataPacket(kDefaultPathId, 1, !kEntropyFlag, !kHasStopWaiting); |
3673 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 3341 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
3674 connection_.SendPacket(ENCRYPTION_NONE, kDefaultPathId, 1, packet, | 3342 connection_.SendPacket(ENCRYPTION_NONE, kDefaultPathId, 1, packet, |
3675 kTestEntropyHash, HAS_RETRANSMITTABLE_DATA, false, | 3343 kTestEntropyHash, HAS_RETRANSMITTABLE_DATA, false, |
3676 false); | 3344 false); |
3677 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 3345 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
3678 } | 3346 } |
3679 | 3347 |
3680 TEST_P(QuicConnectionTest, FailToSendFirstPacket) { | 3348 TEST_P(QuicConnectionTest, FailToSendFirstPacket) { |
3681 // Test that the connection does not crash when it fails to send the first | 3349 // Test that the connection does not crash when it fails to send the first |
3682 // packet at which point self_address_ might be uninitialized. | 3350 // packet at which point self_address_ might be uninitialized. |
3683 EXPECT_CALL(visitor_, OnConnectionClosed(_, _)).Times(1); | 3351 EXPECT_CALL(visitor_, OnConnectionClosed(_, _)).Times(1); |
3684 QuicPacket* packet = ConstructDataPacket(kDefaultPathId, 1, 0, !kEntropyFlag, | 3352 QuicPacket* packet = |
3685 !kHasStopWaiting); | 3353 ConstructDataPacket(kDefaultPathId, 1, !kEntropyFlag, !kHasStopWaiting); |
3686 writer_->SetShouldWriteFail(); | 3354 writer_->SetShouldWriteFail(); |
3687 connection_.SendPacket(ENCRYPTION_NONE, kDefaultPathId, 1, packet, | 3355 connection_.SendPacket(ENCRYPTION_NONE, kDefaultPathId, 1, packet, |
3688 kTestEntropyHash, HAS_RETRANSMITTABLE_DATA, false, | 3356 kTestEntropyHash, HAS_RETRANSMITTABLE_DATA, false, |
3689 false); | 3357 false); |
3690 } | 3358 } |
3691 | 3359 |
3692 TEST_P(QuicConnectionTest, SendSchedulerEAGAIN) { | 3360 TEST_P(QuicConnectionTest, SendSchedulerEAGAIN) { |
3693 QuicPacket* packet = ConstructDataPacket(kDefaultPathId, 1, 0, !kEntropyFlag, | 3361 QuicPacket* packet = |
3694 !kHasStopWaiting); | 3362 ConstructDataPacket(kDefaultPathId, 1, !kEntropyFlag, !kHasStopWaiting); |
3695 BlockOnNextWrite(); | 3363 BlockOnNextWrite(); |
3696 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0); | 3364 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0); |
3697 connection_.SendPacket(ENCRYPTION_NONE, kDefaultPathId, 1, packet, | 3365 connection_.SendPacket(ENCRYPTION_NONE, kDefaultPathId, 1, packet, |
3698 kTestEntropyHash, HAS_RETRANSMITTABLE_DATA, false, | 3366 kTestEntropyHash, HAS_RETRANSMITTABLE_DATA, false, |
3699 false); | 3367 false); |
3700 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 3368 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
3701 } | 3369 } |
3702 | 3370 |
3703 TEST_P(QuicConnectionTest, TestQueueLimitsOnSendStreamData) { | 3371 TEST_P(QuicConnectionTest, TestQueueLimitsOnSendStreamData) { |
3704 // All packets carry version info till version is negotiated. | 3372 // All packets carry version info till version is negotiated. |
3705 size_t payload_length; | 3373 size_t payload_length; |
3706 size_t length = GetPacketLengthForOneStream( | 3374 size_t length = GetPacketLengthForOneStream( |
3707 connection_.version(), kIncludeVersion, !kIncludePathId, | 3375 connection_.version(), kIncludeVersion, !kIncludePathId, |
3708 PACKET_8BYTE_CONNECTION_ID, PACKET_1BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP, | 3376 PACKET_8BYTE_CONNECTION_ID, PACKET_1BYTE_PACKET_NUMBER, &payload_length); |
3709 &payload_length); | |
3710 connection_.SetMaxPacketLength(length); | 3377 connection_.SetMaxPacketLength(length); |
3711 | 3378 |
3712 // Queue the first packet. | 3379 // Queue the first packet. |
3713 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)) | 3380 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)) |
3714 .WillOnce(testing::Return(QuicTime::Delta::FromMicroseconds(10))); | 3381 .WillOnce(testing::Return(QuicTime::Delta::FromMicroseconds(10))); |
3715 const string payload(payload_length, 'a'); | 3382 const string payload(payload_length, 'a'); |
3716 EXPECT_EQ(0u, | 3383 EXPECT_EQ(0u, |
3717 connection_.SendStreamDataWithString(3, payload, 0, !kFin, nullptr) | 3384 connection_.SendStreamDataWithString(3, payload, 0, !kFin, nullptr) |
3718 .bytes_consumed); | 3385 .bytes_consumed); |
3719 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 3386 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
3720 } | 3387 } |
3721 | 3388 |
3722 TEST_P(QuicConnectionTest, LoopThroughSendingPackets) { | 3389 TEST_P(QuicConnectionTest, LoopThroughSendingPackets) { |
3723 // All packets carry version info till version is negotiated. | 3390 // All packets carry version info till version is negotiated. |
3724 size_t payload_length; | 3391 size_t payload_length; |
3725 // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining | 3392 // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining |
3726 // packet length. The size of the offset field in a stream frame is 0 for | 3393 // packet length. The size of the offset field in a stream frame is 0 for |
3727 // offset 0, and 2 for non-zero offsets up through 16K. Increase | 3394 // offset 0, and 2 for non-zero offsets up through 16K. Increase |
3728 // max_packet_length by 2 so that subsequent packets containing subsequent | 3395 // max_packet_length by 2 so that subsequent packets containing subsequent |
3729 // stream frames with non-zero offets will fit within the packet length. | 3396 // stream frames with non-zero offets will fit within the packet length. |
3730 size_t length = | 3397 size_t length = 2 + GetPacketLengthForOneStream( |
3731 2 + GetPacketLengthForOneStream( | 3398 connection_.version(), kIncludeVersion, |
3732 connection_.version(), kIncludeVersion, !kIncludePathId, | 3399 !kIncludePathId, PACKET_8BYTE_CONNECTION_ID, |
3733 PACKET_8BYTE_CONNECTION_ID, PACKET_1BYTE_PACKET_NUMBER, | 3400 PACKET_1BYTE_PACKET_NUMBER, &payload_length); |
3734 NOT_IN_FEC_GROUP, &payload_length); | |
3735 connection_.SetMaxPacketLength(length); | 3401 connection_.SetMaxPacketLength(length); |
3736 | 3402 |
3737 // Queue the first packet. | 3403 // Queue the first packet. |
3738 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(7); | 3404 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(7); |
3739 // The first stream frame will have 2 fewer overhead bytes than the other six. | 3405 // The first stream frame will have 2 fewer overhead bytes than the other six. |
3740 const string payload(payload_length * 7 + 2, 'a'); | 3406 const string payload(payload_length * 7 + 2, 'a'); |
3741 EXPECT_EQ(payload.size(), | 3407 EXPECT_EQ(payload.size(), |
3742 connection_.SendStreamDataWithString(1, payload, 0, !kFin, nullptr) | 3408 connection_.SendStreamDataWithString(1, payload, 0, !kFin, nullptr) |
3743 .bytes_consumed); | 3409 .bytes_consumed); |
3744 } | 3410 } |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3797 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 3463 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
3798 const uint8_t tag = 0x07; | 3464 const uint8_t tag = 0x07; |
3799 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); | 3465 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); |
3800 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); | 3466 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); |
3801 // Process a packet from the non-crypto stream. | 3467 // Process a packet from the non-crypto stream. |
3802 frame1_.stream_id = 3; | 3468 frame1_.stream_id = 3; |
3803 | 3469 |
3804 // The same as ProcessPacket(1) except that ENCRYPTION_INITIAL is used | 3470 // The same as ProcessPacket(1) except that ENCRYPTION_INITIAL is used |
3805 // instead of ENCRYPTION_NONE. | 3471 // instead of ENCRYPTION_NONE. |
3806 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 3472 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
3807 ProcessDataPacketAtLevel(kDefaultPathId, 1, 0, !kEntropyFlag, | 3473 ProcessDataPacketAtLevel(kDefaultPathId, 1, !kEntropyFlag, !kHasStopWaiting, |
3808 !kHasStopWaiting, ENCRYPTION_INITIAL); | 3474 ENCRYPTION_INITIAL); |
3809 | 3475 |
3810 // Check if delayed ack timer is running for the expected interval. | 3476 // Check if delayed ack timer is running for the expected interval. |
3811 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); | 3477 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); |
3812 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline()); | 3478 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline()); |
3813 // Simulate delayed ack alarm firing. | 3479 // Simulate delayed ack alarm firing. |
3814 connection_.GetAckAlarm()->Fire(); | 3480 connection_.GetAckAlarm()->Fire(); |
3815 // Check that ack is sent and that delayed ack alarm is reset. | 3481 // Check that ack is sent and that delayed ack alarm is reset. |
3816 EXPECT_EQ(2u, writer_->frame_count()); | 3482 EXPECT_EQ(2u, writer_->frame_count()); |
3817 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); | 3483 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); |
3818 EXPECT_FALSE(writer_->ack_frames().empty()); | 3484 EXPECT_FALSE(writer_->ack_frames().empty()); |
(...skipping 16 matching lines...) Expand all Loading... |
3835 const uint8_t tag = 0x07; | 3501 const uint8_t tag = 0x07; |
3836 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); | 3502 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); |
3837 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); | 3503 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); |
3838 // Process a packet from the non-crypto stream. | 3504 // Process a packet from the non-crypto stream. |
3839 frame1_.stream_id = 3; | 3505 frame1_.stream_id = 3; |
3840 | 3506 |
3841 // Process all the initial packets in order so there aren't missing packets. | 3507 // Process all the initial packets in order so there aren't missing packets. |
3842 QuicPacketNumber kFirstDecimatedPacket = 101; | 3508 QuicPacketNumber kFirstDecimatedPacket = 101; |
3843 for (unsigned int i = 0; i < kFirstDecimatedPacket - 1; ++i) { | 3509 for (unsigned int i = 0; i < kFirstDecimatedPacket - 1; ++i) { |
3844 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 3510 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
3845 ProcessDataPacketAtLevel(kDefaultPathId, 1 + i, 0, !kEntropyFlag, | 3511 ProcessDataPacketAtLevel(kDefaultPathId, 1 + i, !kEntropyFlag, |
3846 !kHasStopWaiting, ENCRYPTION_INITIAL); | 3512 !kHasStopWaiting, ENCRYPTION_INITIAL); |
3847 } | 3513 } |
3848 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 3514 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
3849 // The same as ProcessPacket(1) except that ENCRYPTION_INITIAL is used | 3515 // The same as ProcessPacket(1) except that ENCRYPTION_INITIAL is used |
3850 // instead of ENCRYPTION_NONE. | 3516 // instead of ENCRYPTION_NONE. |
3851 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 3517 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
3852 ProcessDataPacketAtLevel(kDefaultPathId, kFirstDecimatedPacket, 0, | 3518 ProcessDataPacketAtLevel(kDefaultPathId, kFirstDecimatedPacket, !kEntropyFlag, |
3853 !kEntropyFlag, !kHasStopWaiting, ENCRYPTION_INITIAL); | 3519 !kHasStopWaiting, ENCRYPTION_INITIAL); |
3854 | 3520 |
3855 // Check if delayed ack timer is running for the expected interval. | 3521 // Check if delayed ack timer is running for the expected interval. |
3856 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); | 3522 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); |
3857 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline()); | 3523 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline()); |
3858 | 3524 |
3859 // The 10th received packet causes an ack to be sent. | 3525 // The 10th received packet causes an ack to be sent. |
3860 for (int i = 0; i < 9; ++i) { | 3526 for (int i = 0; i < 9; ++i) { |
3861 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); | 3527 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); |
3862 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 3528 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
3863 ProcessDataPacketAtLevel(kDefaultPathId, kFirstDecimatedPacket + 1 + i, 0, | 3529 ProcessDataPacketAtLevel(kDefaultPathId, kFirstDecimatedPacket + 1 + i, |
3864 !kEntropyFlag, !kHasStopWaiting, | 3530 !kEntropyFlag, !kHasStopWaiting, |
3865 ENCRYPTION_INITIAL); | 3531 ENCRYPTION_INITIAL); |
3866 } | 3532 } |
3867 // Check that ack is sent and that delayed ack alarm is reset. | 3533 // Check that ack is sent and that delayed ack alarm is reset. |
3868 EXPECT_EQ(2u, writer_->frame_count()); | 3534 EXPECT_EQ(2u, writer_->frame_count()); |
3869 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); | 3535 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); |
3870 EXPECT_FALSE(writer_->ack_frames().empty()); | 3536 EXPECT_FALSE(writer_->ack_frames().empty()); |
3871 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 3537 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
3872 } | 3538 } |
3873 | 3539 |
(...skipping 15 matching lines...) Expand all Loading... |
3889 const uint8_t tag = 0x07; | 3555 const uint8_t tag = 0x07; |
3890 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); | 3556 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); |
3891 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); | 3557 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); |
3892 // Process a packet from the non-crypto stream. | 3558 // Process a packet from the non-crypto stream. |
3893 frame1_.stream_id = 3; | 3559 frame1_.stream_id = 3; |
3894 | 3560 |
3895 // Process all the initial packets in order so there aren't missing packets. | 3561 // Process all the initial packets in order so there aren't missing packets. |
3896 QuicPacketNumber kFirstDecimatedPacket = 101; | 3562 QuicPacketNumber kFirstDecimatedPacket = 101; |
3897 for (unsigned int i = 0; i < kFirstDecimatedPacket - 1; ++i) { | 3563 for (unsigned int i = 0; i < kFirstDecimatedPacket - 1; ++i) { |
3898 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 3564 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
3899 ProcessDataPacketAtLevel(kDefaultPathId, 1 + i, 0, !kEntropyFlag, | 3565 ProcessDataPacketAtLevel(kDefaultPathId, 1 + i, !kEntropyFlag, |
3900 !kHasStopWaiting, ENCRYPTION_INITIAL); | 3566 !kHasStopWaiting, ENCRYPTION_INITIAL); |
3901 } | 3567 } |
3902 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 3568 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
3903 // The same as ProcessPacket(1) except that ENCRYPTION_INITIAL is used | 3569 // The same as ProcessPacket(1) except that ENCRYPTION_INITIAL is used |
3904 // instead of ENCRYPTION_NONE. | 3570 // instead of ENCRYPTION_NONE. |
3905 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 3571 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
3906 ProcessDataPacketAtLevel(kDefaultPathId, kFirstDecimatedPacket, 0, | 3572 ProcessDataPacketAtLevel(kDefaultPathId, kFirstDecimatedPacket, !kEntropyFlag, |
3907 !kEntropyFlag, !kHasStopWaiting, ENCRYPTION_INITIAL); | 3573 !kHasStopWaiting, ENCRYPTION_INITIAL); |
3908 | 3574 |
3909 // Check if delayed ack timer is running for the expected interval. | 3575 // Check if delayed ack timer is running for the expected interval. |
3910 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); | 3576 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); |
3911 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline()); | 3577 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline()); |
3912 | 3578 |
3913 // Process packet 10 first and ensure the alarm is one eighth min_rtt. | 3579 // Process packet 10 first and ensure the alarm is one eighth min_rtt. |
3914 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 3580 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
3915 ProcessDataPacketAtLevel(kDefaultPathId, kFirstDecimatedPacket + 9, 0, | 3581 ProcessDataPacketAtLevel(kDefaultPathId, kFirstDecimatedPacket + 9, |
3916 !kEntropyFlag, !kHasStopWaiting, ENCRYPTION_INITIAL); | 3582 !kEntropyFlag, !kHasStopWaiting, ENCRYPTION_INITIAL); |
3917 ack_time = clock_.ApproximateNow().Add(QuicTime::Delta::FromMilliseconds(5)); | 3583 ack_time = clock_.ApproximateNow().Add(QuicTime::Delta::FromMilliseconds(5)); |
3918 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); | 3584 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); |
3919 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline()); | 3585 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline()); |
3920 | 3586 |
3921 // The 10th received packet causes an ack to be sent. | 3587 // The 10th received packet causes an ack to be sent. |
3922 for (int i = 0; i < 8; ++i) { | 3588 for (int i = 0; i < 8; ++i) { |
3923 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); | 3589 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); |
3924 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 3590 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
3925 ProcessDataPacketAtLevel(kDefaultPathId, kFirstDecimatedPacket + 1 + i, 0, | 3591 ProcessDataPacketAtLevel(kDefaultPathId, kFirstDecimatedPacket + 1 + i, |
3926 !kEntropyFlag, !kHasStopWaiting, | 3592 !kEntropyFlag, !kHasStopWaiting, |
3927 ENCRYPTION_INITIAL); | 3593 ENCRYPTION_INITIAL); |
3928 } | 3594 } |
3929 // Check that ack is sent and that delayed ack alarm is reset. | 3595 // Check that ack is sent and that delayed ack alarm is reset. |
3930 EXPECT_EQ(2u, writer_->frame_count()); | 3596 EXPECT_EQ(2u, writer_->frame_count()); |
3931 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); | 3597 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); |
3932 EXPECT_FALSE(writer_->ack_frames().empty()); | 3598 EXPECT_FALSE(writer_->ack_frames().empty()); |
3933 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 3599 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
3934 } | 3600 } |
3935 | 3601 |
(...skipping 15 matching lines...) Expand all Loading... |
3951 const uint8_t tag = 0x07; | 3617 const uint8_t tag = 0x07; |
3952 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); | 3618 connection_.SetDecrypter(ENCRYPTION_INITIAL, new StrictTaggingDecrypter(tag)); |
3953 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); | 3619 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); |
3954 // Process a packet from the non-crypto stream. | 3620 // Process a packet from the non-crypto stream. |
3955 frame1_.stream_id = 3; | 3621 frame1_.stream_id = 3; |
3956 | 3622 |
3957 // Process all the initial packets in order so there aren't missing packets. | 3623 // Process all the initial packets in order so there aren't missing packets. |
3958 QuicPacketNumber kFirstDecimatedPacket = 101; | 3624 QuicPacketNumber kFirstDecimatedPacket = 101; |
3959 for (unsigned int i = 0; i < kFirstDecimatedPacket - 1; ++i) { | 3625 for (unsigned int i = 0; i < kFirstDecimatedPacket - 1; ++i) { |
3960 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 3626 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
3961 ProcessDataPacketAtLevel(kDefaultPathId, 1 + i, 0, !kEntropyFlag, | 3627 ProcessDataPacketAtLevel(kDefaultPathId, 1 + i, !kEntropyFlag, |
3962 !kHasStopWaiting, ENCRYPTION_INITIAL); | 3628 !kHasStopWaiting, ENCRYPTION_INITIAL); |
3963 } | 3629 } |
3964 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 3630 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
3965 // The same as ProcessPacket(1) except that ENCRYPTION_INITIAL is used | 3631 // The same as ProcessPacket(1) except that ENCRYPTION_INITIAL is used |
3966 // instead of ENCRYPTION_NONE. | 3632 // instead of ENCRYPTION_NONE. |
3967 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 3633 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
3968 ProcessDataPacketAtLevel(kDefaultPathId, kFirstDecimatedPacket, 0, | 3634 ProcessDataPacketAtLevel(kDefaultPathId, kFirstDecimatedPacket, !kEntropyFlag, |
3969 !kEntropyFlag, !kHasStopWaiting, ENCRYPTION_INITIAL); | 3635 !kHasStopWaiting, ENCRYPTION_INITIAL); |
3970 | 3636 |
3971 // Check if delayed ack timer is running for the expected interval. | 3637 // Check if delayed ack timer is running for the expected interval. |
3972 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); | 3638 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); |
3973 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline()); | 3639 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline()); |
3974 | 3640 |
3975 // Process packet 10 first and ensure the alarm is one eighth min_rtt. | 3641 // Process packet 10 first and ensure the alarm is one eighth min_rtt. |
3976 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 3642 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
3977 ProcessDataPacketAtLevel(kDefaultPathId, kFirstDecimatedPacket + 19, 0, | 3643 ProcessDataPacketAtLevel(kDefaultPathId, kFirstDecimatedPacket + 19, |
3978 !kEntropyFlag, !kHasStopWaiting, ENCRYPTION_INITIAL); | 3644 !kEntropyFlag, !kHasStopWaiting, ENCRYPTION_INITIAL); |
3979 ack_time = clock_.ApproximateNow().Add(QuicTime::Delta::FromMilliseconds(5)); | 3645 ack_time = clock_.ApproximateNow().Add(QuicTime::Delta::FromMilliseconds(5)); |
3980 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); | 3646 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); |
3981 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline()); | 3647 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline()); |
3982 | 3648 |
3983 // The 10th received packet causes an ack to be sent. | 3649 // The 10th received packet causes an ack to be sent. |
3984 for (int i = 0; i < 8; ++i) { | 3650 for (int i = 0; i < 8; ++i) { |
3985 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); | 3651 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); |
3986 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 3652 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
3987 ProcessDataPacketAtLevel(kDefaultPathId, kFirstDecimatedPacket + 1 + i, 0, | 3653 ProcessDataPacketAtLevel(kDefaultPathId, kFirstDecimatedPacket + 1 + i, |
3988 !kEntropyFlag, !kHasStopWaiting, | 3654 !kEntropyFlag, !kHasStopWaiting, |
3989 ENCRYPTION_INITIAL); | 3655 ENCRYPTION_INITIAL); |
3990 } | 3656 } |
3991 // Check that ack is sent and that delayed ack alarm is reset. | 3657 // Check that ack is sent and that delayed ack alarm is reset. |
3992 EXPECT_EQ(2u, writer_->frame_count()); | 3658 EXPECT_EQ(2u, writer_->frame_count()); |
3993 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); | 3659 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); |
3994 EXPECT_FALSE(writer_->ack_frames().empty()); | 3660 EXPECT_FALSE(writer_->ack_frames().empty()); |
3995 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 3661 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
3996 | 3662 |
3997 // The next packet received in order will cause an immediate ack, | 3663 // The next packet received in order will cause an immediate ack, |
3998 // because it fills a hole. | 3664 // because it fills a hole. |
3999 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 3665 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
4000 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); | 3666 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1); |
4001 ProcessDataPacketAtLevel(kDefaultPathId, kFirstDecimatedPacket + 10, 0, | 3667 ProcessDataPacketAtLevel(kDefaultPathId, kFirstDecimatedPacket + 10, |
4002 !kEntropyFlag, !kHasStopWaiting, ENCRYPTION_INITIAL); | 3668 !kEntropyFlag, !kHasStopWaiting, ENCRYPTION_INITIAL); |
4003 // Check that ack is sent and that delayed ack alarm is reset. | 3669 // Check that ack is sent and that delayed ack alarm is reset. |
4004 EXPECT_EQ(2u, writer_->frame_count()); | 3670 EXPECT_EQ(2u, writer_->frame_count()); |
4005 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); | 3671 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); |
4006 EXPECT_FALSE(writer_->ack_frames().empty()); | 3672 EXPECT_FALSE(writer_->ack_frames().empty()); |
4007 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 3673 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
4008 } | 3674 } |
4009 | 3675 |
4010 TEST_P(QuicConnectionTest, SendDelayedAckOnHandshakeConfirmed) { | 3676 TEST_P(QuicConnectionTest, SendDelayedAckOnHandshakeConfirmed) { |
4011 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3677 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4171 EXPECT_EQ(1u, writer_->stream_frames().size()); | 3837 EXPECT_EQ(1u, writer_->stream_frames().size()); |
4172 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 3838 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
4173 } | 3839 } |
4174 | 3840 |
4175 TEST_P(QuicConnectionTest, NoAckSentForClose) { | 3841 TEST_P(QuicConnectionTest, NoAckSentForClose) { |
4176 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3842 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
4177 ProcessPacket(kDefaultPathId, 1); | 3843 ProcessPacket(kDefaultPathId, 1); |
4178 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, | 3844 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, |
4179 ConnectionCloseSource::FROM_PEER)); | 3845 ConnectionCloseSource::FROM_PEER)); |
4180 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); | 3846 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); |
4181 ProcessClosePacket(kDefaultPathId, 2, 0); | 3847 ProcessClosePacket(kDefaultPathId, 2); |
4182 } | 3848 } |
4183 | 3849 |
4184 TEST_P(QuicConnectionTest, SendWhenDisconnected) { | 3850 TEST_P(QuicConnectionTest, SendWhenDisconnected) { |
4185 EXPECT_TRUE(connection_.connected()); | 3851 EXPECT_TRUE(connection_.connected()); |
4186 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, | 3852 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, |
4187 ConnectionCloseSource::FROM_SELF)); | 3853 ConnectionCloseSource::FROM_SELF)); |
4188 connection_.CloseConnection(QUIC_PEER_GOING_AWAY, | 3854 connection_.CloseConnection(QUIC_PEER_GOING_AWAY, |
4189 ConnectionCloseSource::FROM_SELF); | 3855 ConnectionCloseSource::FROM_SELF); |
4190 EXPECT_FALSE(connection_.connected()); | 3856 EXPECT_FALSE(connection_.connected()); |
4191 EXPECT_FALSE(connection_.CanWriteStreamData()); | 3857 EXPECT_FALSE(connection_.CanWriteStreamData()); |
4192 QuicPacket* packet = ConstructDataPacket(kDefaultPathId, 1, 0, !kEntropyFlag, | 3858 QuicPacket* packet = |
4193 !kHasStopWaiting); | 3859 ConstructDataPacket(kDefaultPathId, 1, !kEntropyFlag, !kHasStopWaiting); |
4194 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0); | 3860 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0); |
4195 connection_.SendPacket(ENCRYPTION_NONE, kDefaultPathId, 1, packet, | 3861 connection_.SendPacket(ENCRYPTION_NONE, kDefaultPathId, 1, packet, |
4196 kTestEntropyHash, HAS_RETRANSMITTABLE_DATA, false, | 3862 kTestEntropyHash, HAS_RETRANSMITTABLE_DATA, false, |
4197 false); | 3863 false); |
4198 } | 3864 } |
4199 | 3865 |
4200 TEST_P(QuicConnectionTest, PublicReset) { | 3866 TEST_P(QuicConnectionTest, PublicReset) { |
4201 QuicPublicResetPacket header; | 3867 QuicPublicResetPacket header; |
4202 header.public_header.connection_id = connection_id_; | 3868 header.public_header.connection_id = connection_id_; |
4203 header.public_header.reset_flag = true; | 3869 header.public_header.reset_flag = true; |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4261 QuicPacketCreatorPeer::SetPacketNumber(&peer_creator_, 3); | 3927 QuicPacketCreatorPeer::SetPacketNumber(&peer_creator_, 3); |
4262 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3928 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
4263 QuicStopWaitingFrame frame = InitStopWaitingFrame(4); | 3929 QuicStopWaitingFrame frame = InitStopWaitingFrame(4); |
4264 ProcessStopWaitingPacket(&frame); | 3930 ProcessStopWaitingPacket(&frame); |
4265 EXPECT_TRUE(outgoing_ack()->missing_packets.Empty()); | 3931 EXPECT_TRUE(outgoing_ack()->missing_packets.Empty()); |
4266 } | 3932 } |
4267 | 3933 |
4268 TEST_P(QuicConnectionTest, ReceivedEntropyHashCalculation) { | 3934 TEST_P(QuicConnectionTest, ReceivedEntropyHashCalculation) { |
4269 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(AtLeast(1)); | 3935 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(AtLeast(1)); |
4270 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3936 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
4271 ProcessDataPacket(kDefaultPathId, 1, 1, kEntropyFlag); | 3937 ProcessDataPacket(kDefaultPathId, 1, kEntropyFlag); |
4272 ProcessDataPacket(kDefaultPathId, 4, 1, kEntropyFlag); | 3938 ProcessDataPacket(kDefaultPathId, 4, kEntropyFlag); |
4273 ProcessDataPacket(kDefaultPathId, 3, 1, !kEntropyFlag); | 3939 ProcessDataPacket(kDefaultPathId, 3, !kEntropyFlag); |
4274 ProcessDataPacket(kDefaultPathId, 7, 1, kEntropyFlag); | 3940 ProcessDataPacket(kDefaultPathId, 7, kEntropyFlag); |
4275 EXPECT_EQ(146u, outgoing_ack()->entropy_hash); | |
4276 } | |
4277 | |
4278 TEST_P(QuicConnectionTest, ReceivedEntropyHashCalculationHalfFEC) { | |
4279 // FEC packets should not change the entropy hash calculation. | |
4280 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(AtLeast(1)); | |
4281 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
4282 ProcessDataPacket(kDefaultPathId, 1, 1, kEntropyFlag); | |
4283 ProcessFecPacket(kDefaultPathId, 4, 1, false, kEntropyFlag, nullptr); | |
4284 ProcessDataPacket(kDefaultPathId, 3, 3, !kEntropyFlag); | |
4285 ProcessFecPacket(kDefaultPathId, 7, 3, false, kEntropyFlag, nullptr); | |
4286 EXPECT_EQ(146u, outgoing_ack()->entropy_hash); | 3941 EXPECT_EQ(146u, outgoing_ack()->entropy_hash); |
4287 } | 3942 } |
4288 | 3943 |
4289 TEST_P(QuicConnectionTest, UpdateEntropyForReceivedPackets) { | 3944 TEST_P(QuicConnectionTest, UpdateEntropyForReceivedPackets) { |
4290 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(AtLeast(1)); | 3945 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(AtLeast(1)); |
4291 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3946 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
4292 ProcessDataPacket(kDefaultPathId, 1, 1, kEntropyFlag); | 3947 ProcessDataPacket(kDefaultPathId, 1, kEntropyFlag); |
4293 ProcessDataPacket(kDefaultPathId, 5, 1, kEntropyFlag); | 3948 ProcessDataPacket(kDefaultPathId, 5, kEntropyFlag); |
4294 ProcessDataPacket(kDefaultPathId, 4, 1, !kEntropyFlag); | 3949 ProcessDataPacket(kDefaultPathId, 4, !kEntropyFlag); |
4295 EXPECT_EQ(34u, outgoing_ack()->entropy_hash); | 3950 EXPECT_EQ(34u, outgoing_ack()->entropy_hash); |
4296 // Make 4th packet my least unacked, and update entropy for 2, 3 packets. | 3951 // Make 4th packet my least unacked, and update entropy for 2, 3 packets. |
4297 QuicPacketCreatorPeer::SetPacketNumber(&peer_creator_, 5); | 3952 QuicPacketCreatorPeer::SetPacketNumber(&peer_creator_, 5); |
4298 QuicPacketEntropyHash six_packet_entropy_hash = 0; | 3953 QuicPacketEntropyHash six_packet_entropy_hash = 0; |
4299 QuicPacketEntropyHash random_entropy_hash = 129u; | 3954 QuicPacketEntropyHash random_entropy_hash = 129u; |
4300 QuicStopWaitingFrame frame = InitStopWaitingFrame(4); | 3955 QuicStopWaitingFrame frame = InitStopWaitingFrame(4); |
4301 frame.entropy_hash = random_entropy_hash; | 3956 frame.entropy_hash = random_entropy_hash; |
4302 if (ProcessStopWaitingPacket(&frame)) { | 3957 if (ProcessStopWaitingPacket(&frame)) { |
4303 six_packet_entropy_hash = 1 << 6; | 3958 six_packet_entropy_hash = 1 << 6; |
4304 } | 3959 } |
4305 | 3960 |
4306 EXPECT_EQ((random_entropy_hash + (1 << 5) + six_packet_entropy_hash), | 3961 EXPECT_EQ((random_entropy_hash + (1 << 5) + six_packet_entropy_hash), |
4307 outgoing_ack()->entropy_hash); | 3962 outgoing_ack()->entropy_hash); |
4308 } | 3963 } |
4309 | 3964 |
4310 TEST_P(QuicConnectionTest, UpdateEntropyHashUptoCurrentPacket) { | 3965 TEST_P(QuicConnectionTest, UpdateEntropyHashUptoCurrentPacket) { |
4311 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(AtLeast(1)); | 3966 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(AtLeast(1)); |
4312 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3967 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
4313 ProcessDataPacket(kDefaultPathId, 1, 1, kEntropyFlag); | 3968 ProcessDataPacket(kDefaultPathId, 1, kEntropyFlag); |
4314 ProcessDataPacket(kDefaultPathId, 5, 1, !kEntropyFlag); | 3969 ProcessDataPacket(kDefaultPathId, 5, !kEntropyFlag); |
4315 ProcessDataPacket(kDefaultPathId, 22, 1, kEntropyFlag); | 3970 ProcessDataPacket(kDefaultPathId, 22, kEntropyFlag); |
4316 EXPECT_EQ(66u, outgoing_ack()->entropy_hash); | 3971 EXPECT_EQ(66u, outgoing_ack()->entropy_hash); |
4317 QuicPacketCreatorPeer::SetPacketNumber(&peer_creator_, 22); | 3972 QuicPacketCreatorPeer::SetPacketNumber(&peer_creator_, 22); |
4318 QuicPacketEntropyHash random_entropy_hash = 85u; | 3973 QuicPacketEntropyHash random_entropy_hash = 85u; |
4319 // Current packet is the least unacked packet. | 3974 // Current packet is the least unacked packet. |
4320 QuicPacketEntropyHash ack_entropy_hash; | 3975 QuicPacketEntropyHash ack_entropy_hash; |
4321 QuicStopWaitingFrame frame = InitStopWaitingFrame(23); | 3976 QuicStopWaitingFrame frame = InitStopWaitingFrame(23); |
4322 frame.entropy_hash = random_entropy_hash; | 3977 frame.entropy_hash = random_entropy_hash; |
4323 ack_entropy_hash = ProcessStopWaitingPacket(&frame); | 3978 ack_entropy_hash = ProcessStopWaitingPacket(&frame); |
4324 EXPECT_EQ((random_entropy_hash + ack_entropy_hash), | 3979 EXPECT_EQ((random_entropy_hash + ack_entropy_hash), |
4325 outgoing_ack()->entropy_hash); | 3980 outgoing_ack()->entropy_hash); |
4326 ProcessDataPacket(kDefaultPathId, 25, 1, kEntropyFlag); | 3981 ProcessDataPacket(kDefaultPathId, 25, kEntropyFlag); |
4327 EXPECT_EQ((random_entropy_hash + ack_entropy_hash + (1 << (25 % 8))), | 3982 EXPECT_EQ((random_entropy_hash + ack_entropy_hash + (1 << (25 % 8))), |
4328 outgoing_ack()->entropy_hash); | 3983 outgoing_ack()->entropy_hash); |
4329 } | 3984 } |
4330 | 3985 |
4331 TEST_P(QuicConnectionTest, EntropyCalculationForTruncatedAck) { | 3986 TEST_P(QuicConnectionTest, EntropyCalculationForTruncatedAck) { |
4332 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(AtLeast(1)); | 3987 EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(AtLeast(1)); |
4333 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3988 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
4334 QuicPacketEntropyHash entropy[51]; | 3989 QuicPacketEntropyHash entropy[51]; |
4335 entropy[0] = 0; | 3990 entropy[0] = 0; |
4336 for (int i = 1; i < 51; ++i) { | 3991 for (int i = 1; i < 51; ++i) { |
4337 bool should_send = i % 10 != 1; | 3992 bool should_send = i % 10 != 1; |
4338 bool entropy_flag = (i & (i - 1)) != 0; | 3993 bool entropy_flag = (i & (i - 1)) != 0; |
4339 if (!should_send) { | 3994 if (!should_send) { |
4340 entropy[i] = entropy[i - 1]; | 3995 entropy[i] = entropy[i - 1]; |
4341 continue; | 3996 continue; |
4342 } | 3997 } |
4343 if (entropy_flag) { | 3998 if (entropy_flag) { |
4344 entropy[i] = entropy[i - 1] ^ (1 << (i % 8)); | 3999 entropy[i] = entropy[i - 1] ^ (1 << (i % 8)); |
4345 } else { | 4000 } else { |
4346 entropy[i] = entropy[i - 1]; | 4001 entropy[i] = entropy[i - 1]; |
4347 } | 4002 } |
4348 ProcessDataPacket(kDefaultPathId, i, 1, entropy_flag); | 4003 ProcessDataPacket(kDefaultPathId, i, entropy_flag); |
4349 } | 4004 } |
4350 for (int i = 1; i < 50; ++i) { | 4005 for (int i = 1; i < 50; ++i) { |
4351 EXPECT_EQ(entropy[i], | 4006 EXPECT_EQ(entropy[i], |
4352 QuicConnectionPeer::ReceivedEntropyHash(&connection_, i)); | 4007 QuicConnectionPeer::ReceivedEntropyHash(&connection_, i)); |
4353 } | 4008 } |
4354 } | 4009 } |
4355 | 4010 |
4356 TEST_P(QuicConnectionTest, ServerSendsVersionNegotiationPacket) { | 4011 TEST_P(QuicConnectionTest, ServerSendsVersionNegotiationPacket) { |
4357 connection_.SetSupportedVersions(QuicSupportedVersions()); | 4012 connection_.SetSupportedVersions(QuicSupportedVersions()); |
4358 framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED); | 4013 framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED); |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4542 EXPECT_EQ(3 * first_packet_size + 2 * second_packet_size - kQuicVersionSize, | 4197 EXPECT_EQ(3 * first_packet_size + 2 * second_packet_size - kQuicVersionSize, |
4543 stats.bytes_sent); | 4198 stats.bytes_sent); |
4544 EXPECT_EQ(5u, stats.packets_sent); | 4199 EXPECT_EQ(5u, stats.packets_sent); |
4545 EXPECT_EQ(2 * first_packet_size + second_packet_size - kQuicVersionSize, | 4200 EXPECT_EQ(2 * first_packet_size + second_packet_size - kQuicVersionSize, |
4546 stats.bytes_retransmitted); | 4201 stats.bytes_retransmitted); |
4547 EXPECT_EQ(3u, stats.packets_retransmitted); | 4202 EXPECT_EQ(3u, stats.packets_retransmitted); |
4548 EXPECT_EQ(1u, stats.rto_count); | 4203 EXPECT_EQ(1u, stats.rto_count); |
4549 EXPECT_EQ(kDefaultMaxPacketSize, stats.max_packet_size); | 4204 EXPECT_EQ(kDefaultMaxPacketSize, stats.max_packet_size); |
4550 } | 4205 } |
4551 | 4206 |
4552 TEST_P(QuicConnectionTest, CheckReceiveStats) { | |
4553 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
4554 | |
4555 size_t received_bytes = 0; | |
4556 received_bytes += ProcessFecProtectedPacket(kDefaultPathId, 1, false, | |
4557 !kEntropyFlag, !kHasStopWaiting); | |
4558 received_bytes += ProcessFecProtectedPacket(kDefaultPathId, 3, false, | |
4559 !kEntropyFlag, !kHasStopWaiting); | |
4560 // Should be counted against dropped packets. | |
4561 received_bytes += ProcessDataPacket(kDefaultPathId, 3, 1, !kEntropyFlag); | |
4562 received_bytes += | |
4563 ProcessFecPacket(kDefaultPathId, 4, 1, true, !kEntropyFlag, nullptr); | |
4564 | |
4565 EXPECT_CALL(*send_algorithm_, BandwidthEstimate()) | |
4566 .WillOnce(Return(QuicBandwidth::Zero())); | |
4567 | |
4568 const QuicConnectionStats& stats = connection_.GetStats(); | |
4569 EXPECT_EQ(received_bytes, stats.bytes_received); | |
4570 EXPECT_EQ(4u, stats.packets_received); | |
4571 | |
4572 EXPECT_EQ(1u, stats.packets_revived); | |
4573 EXPECT_EQ(1u, stats.packets_dropped); | |
4574 } | |
4575 | |
4576 TEST_P(QuicConnectionTest, TestFecGroupLimits) { | |
4577 // Create and return a group for 1. | |
4578 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 1) != nullptr); | |
4579 | |
4580 // Create and return a group for 2. | |
4581 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 2) != nullptr); | |
4582 | |
4583 // Create and return a group for 4. This should remove 1 but not 2. | |
4584 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 4) != nullptr); | |
4585 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 1) == nullptr); | |
4586 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 2) != nullptr); | |
4587 | |
4588 // Create and return a group for 3. This will kill off 2. | |
4589 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 3) != nullptr); | |
4590 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 2) == nullptr); | |
4591 | |
4592 // Verify that adding 5 kills off 3, despite 4 being created before 3. | |
4593 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 5) != nullptr); | |
4594 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 4) != nullptr); | |
4595 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 3) == nullptr); | |
4596 } | |
4597 | |
4598 TEST_P(QuicConnectionTest, ProcessFramesIfPacketClosedConnection) { | 4207 TEST_P(QuicConnectionTest, ProcessFramesIfPacketClosedConnection) { |
4599 // Construct a packet with stream frame and connection close frame. | 4208 // Construct a packet with stream frame and connection close frame. |
4600 QuicPacketHeader header; | 4209 QuicPacketHeader header; |
4601 header.public_header.connection_id = connection_id_; | 4210 header.public_header.connection_id = connection_id_; |
4602 header.packet_number = 1; | 4211 header.packet_number = 1; |
4603 header.public_header.version_flag = false; | 4212 header.public_header.version_flag = false; |
4604 | 4213 |
4605 QuicConnectionCloseFrame qccf; | 4214 QuicConnectionCloseFrame qccf; |
4606 qccf.error_code = QUIC_PEER_GOING_AWAY; | 4215 qccf.error_code = QUIC_PEER_GOING_AWAY; |
4607 | 4216 |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4850 // the callback. | 4459 // the callback. |
4851 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); | 4460 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); |
4852 QuicAckFrame frame = InitAckFrame(2); | 4461 QuicAckFrame frame = InitAckFrame(2); |
4853 NackPacket(1, &frame); | 4462 NackPacket(1, &frame); |
4854 frame.latest_revived_packet = 1; | 4463 frame.latest_revived_packet = 1; |
4855 ProcessAckPacket(&frame); | 4464 ProcessAckPacket(&frame); |
4856 // If the ack is processed again, the notifier should not be called again. | 4465 // If the ack is processed again, the notifier should not be called again. |
4857 ProcessAckPacket(&frame); | 4466 ProcessAckPacket(&frame); |
4858 } | 4467 } |
4859 | 4468 |
4860 TEST_P(QuicConnectionTest, AckNotifierCallbackAfterFECRecovery) { | |
4861 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
4862 EXPECT_CALL(visitor_, OnCanWrite()); | |
4863 | |
4864 // Create a listener which we expect to be called. | |
4865 scoped_refptr<MockAckListener> listener(new MockAckListener); | |
4866 EXPECT_CALL(*listener, OnPacketAcked(_, _)).Times(1); | |
4867 | |
4868 // Expect ACKs for 1 packet. | |
4869 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); | |
4870 | |
4871 // Send one packet, and register to be notified on ACK. | |
4872 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, listener.get()); | |
4873 | |
4874 // Ack packet gets dropped, but we receive an FEC packet that covers it. | |
4875 // Should recover the Ack packet and trigger the notification callback. | |
4876 QuicFrames frames; | |
4877 | |
4878 QuicAckFrame ack_frame = InitAckFrame(1); | |
4879 frames.push_back(QuicFrame(&ack_frame)); | |
4880 | |
4881 // Dummy stream frame to satisfy expectations set elsewhere. | |
4882 frames.push_back(QuicFrame(&frame1_)); | |
4883 | |
4884 QuicPacketHeader ack_header; | |
4885 ack_header.public_header.connection_id = connection_id_; | |
4886 ack_header.public_header.reset_flag = false; | |
4887 ack_header.public_header.version_flag = false; | |
4888 ack_header.entropy_flag = !kEntropyFlag; | |
4889 ack_header.fec_flag = true; | |
4890 ack_header.packet_number = 1; | |
4891 ack_header.is_in_fec_group = IN_FEC_GROUP; | |
4892 ack_header.fec_group = 1; | |
4893 | |
4894 QuicPacket* packet = BuildUnsizedDataPacket(&framer_, ack_header, frames); | |
4895 | |
4896 // Take the packet which contains the ACK frame, and construct and deliver an | |
4897 // FEC packet which allows the ACK packet to be recovered. | |
4898 ProcessFecPacket(kDefaultPathId, 2, 1, true, !kEntropyFlag, packet); | |
4899 } | |
4900 | |
4901 TEST_P(QuicConnectionTest, OnPacketHeaderDebugVisitor) { | 4469 TEST_P(QuicConnectionTest, OnPacketHeaderDebugVisitor) { |
4902 QuicPacketHeader header; | 4470 QuicPacketHeader header; |
4903 | 4471 |
4904 scoped_ptr<MockQuicConnectionDebugVisitor> debug_visitor( | 4472 scoped_ptr<MockQuicConnectionDebugVisitor> debug_visitor( |
4905 new MockQuicConnectionDebugVisitor()); | 4473 new MockQuicConnectionDebugVisitor()); |
4906 connection_.set_debug_visitor(debug_visitor.get()); | 4474 connection_.set_debug_visitor(debug_visitor.get()); |
4907 EXPECT_CALL(*debug_visitor, OnPacketHeader(Ref(header))).Times(1); | 4475 EXPECT_CALL(*debug_visitor, OnPacketHeader(Ref(header))).Times(1); |
4908 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)).Times(1); | 4476 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)).Times(1); |
4909 EXPECT_CALL(*debug_visitor, OnSuccessfulVersionNegotiation(_)).Times(1); | 4477 EXPECT_CALL(*debug_visitor, OnSuccessfulVersionNegotiation(_)).Times(1); |
4910 connection_.OnPacketHeader(header); | 4478 connection_.OnPacketHeader(header); |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5095 // result in multiple attempts to close the connection - it will be marked as | 4663 // result in multiple attempts to close the connection - it will be marked as |
5096 // disconnected after the first call. | 4664 // disconnected after the first call. |
5097 EXPECT_CALL(visitor_, OnConnectionClosed(_, _)).Times(1); | 4665 EXPECT_CALL(visitor_, OnConnectionClosed(_, _)).Times(1); |
5098 connection_.SendConnectionCloseWithDetails(QUIC_NO_ERROR, "no reason"); | 4666 connection_.SendConnectionCloseWithDetails(QUIC_NO_ERROR, "no reason"); |
5099 connection_.SendConnectionCloseWithDetails(QUIC_NO_ERROR, "no reason"); | 4667 connection_.SendConnectionCloseWithDetails(QUIC_NO_ERROR, "no reason"); |
5100 } | 4668 } |
5101 | 4669 |
5102 } // namespace | 4670 } // namespace |
5103 } // namespace test | 4671 } // namespace test |
5104 } // namespace net | 4672 } // namespace net |
OLD | NEW |