OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/quic_connection.h" | 5 #include "net/quic/quic_connection.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
549 using QuicConnection::SelectMutualVersion; | 549 using QuicConnection::SelectMutualVersion; |
550 | 550 |
551 private: | 551 private: |
552 TestPacketWriter* writer_; | 552 TestPacketWriter* writer_; |
553 | 553 |
554 DISALLOW_COPY_AND_ASSIGN(TestConnection); | 554 DISALLOW_COPY_AND_ASSIGN(TestConnection); |
555 }; | 555 }; |
556 | 556 |
557 // Used for testing packets revived from FEC packets. | 557 // Used for testing packets revived from FEC packets. |
558 class FecQuicConnectionDebugVisitor | 558 class FecQuicConnectionDebugVisitor |
559 : public QuicConnectionDebugVisitorInterface { | 559 : public QuicConnectionDebugVisitor { |
560 public: | 560 public: |
561 virtual void OnRevivedPacket(const QuicPacketHeader& header, | 561 virtual void OnRevivedPacket(const QuicPacketHeader& header, |
562 StringPiece data) OVERRIDE { | 562 StringPiece data) OVERRIDE { |
563 revived_header_ = header; | 563 revived_header_ = header; |
564 } | 564 } |
565 | 565 |
566 // Public accessor method. | 566 // Public accessor method. |
567 QuicPacketHeader revived_header() const { | 567 QuicPacketHeader revived_header() const { |
568 return revived_header_; | 568 return revived_header_; |
569 } | 569 } |
570 | 570 |
571 private: | 571 private: |
572 QuicPacketHeader revived_header_; | 572 QuicPacketHeader revived_header_; |
573 }; | 573 }; |
574 | 574 |
575 class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> { | 575 class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> { |
576 protected: | 576 protected: |
577 QuicConnectionTest() | 577 QuicConnectionTest() |
578 : connection_id_(42), | 578 : connection_id_(42), |
579 framer_(SupportedVersions(version()), QuicTime::Zero(), false), | 579 framer_(SupportedVersions(version()), QuicTime::Zero(), false), |
580 creator_(connection_id_, &framer_, &random_generator_, false), | 580 peer_creator_(connection_id_, &framer_, &random_generator_, false), |
581 send_algorithm_(new StrictMock<MockSendAlgorithm>), | 581 send_algorithm_(new StrictMock<MockSendAlgorithm>), |
582 loss_algorithm_(new MockLossAlgorithm()), | 582 loss_algorithm_(new MockLossAlgorithm()), |
583 helper_(new TestConnectionHelper(&clock_, &random_generator_)), | 583 helper_(new TestConnectionHelper(&clock_, &random_generator_)), |
584 writer_(new TestPacketWriter(version())), | 584 writer_(new TestPacketWriter(version())), |
585 connection_(connection_id_, IPEndPoint(), helper_.get(), | 585 connection_(connection_id_, IPEndPoint(), helper_.get(), |
586 writer_.get(), false, version()), | 586 writer_.get(), false, version()), |
587 frame1_(1, false, 0, MakeIOVector(data1)), | 587 frame1_(1, false, 0, MakeIOVector(data1)), |
588 frame2_(1, false, 3, MakeIOVector(data2)), | 588 frame2_(1, false, 3, MakeIOVector(data2)), |
589 sequence_number_length_(PACKET_6BYTE_SEQUENCE_NUMBER), | 589 sequence_number_length_(PACKET_6BYTE_SEQUENCE_NUMBER), |
590 connection_id_length_(PACKET_8BYTE_CONNECTION_ID) { | 590 connection_id_length_(PACKET_8BYTE_CONNECTION_ID) { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 } | 645 } |
646 | 646 |
647 void ProcessPacket(QuicPacketSequenceNumber number) { | 647 void ProcessPacket(QuicPacketSequenceNumber number) { |
648 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1); | 648 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1); |
649 ProcessDataPacket(number, 0, !kEntropyFlag); | 649 ProcessDataPacket(number, 0, !kEntropyFlag); |
650 } | 650 } |
651 | 651 |
652 QuicPacketEntropyHash ProcessFramePacket(QuicFrame frame) { | 652 QuicPacketEntropyHash ProcessFramePacket(QuicFrame frame) { |
653 QuicFrames frames; | 653 QuicFrames frames; |
654 frames.push_back(QuicFrame(frame)); | 654 frames.push_back(QuicFrame(frame)); |
655 QuicPacketCreatorPeer::SetSendVersionInPacket(&creator_, | 655 QuicPacketCreatorPeer::SetSendVersionInPacket(&peer_creator_, |
656 connection_.is_server()); | 656 connection_.is_server()); |
657 SerializedPacket serialized_packet = creator_.SerializeAllFrames(frames); | 657 SerializedPacket serialized_packet = |
| 658 peer_creator_.SerializeAllFrames(frames); |
658 scoped_ptr<QuicPacket> packet(serialized_packet.packet); | 659 scoped_ptr<QuicPacket> packet(serialized_packet.packet); |
659 scoped_ptr<QuicEncryptedPacket> encrypted( | 660 scoped_ptr<QuicEncryptedPacket> encrypted( |
660 framer_.EncryptPacket(ENCRYPTION_NONE, | 661 framer_.EncryptPacket(ENCRYPTION_NONE, |
661 serialized_packet.sequence_number, *packet)); | 662 serialized_packet.sequence_number, *packet)); |
662 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 663 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
663 return serialized_packet.entropy_hash; | 664 return serialized_packet.entropy_hash; |
664 } | 665 } |
665 | 666 |
666 size_t ProcessDataPacket(QuicPacketSequenceNumber number, | 667 size_t ProcessDataPacket(QuicPacketSequenceNumber number, |
667 QuicFecGroupNumber fec_group, | 668 QuicFecGroupNumber fec_group, |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
809 header_.entropy_flag = entropy_flag; | 810 header_.entropy_flag = entropy_flag; |
810 header_.fec_flag = false; | 811 header_.fec_flag = false; |
811 header_.packet_sequence_number = number; | 812 header_.packet_sequence_number = number; |
812 header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; | 813 header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; |
813 header_.fec_group = fec_group; | 814 header_.fec_group = fec_group; |
814 | 815 |
815 QuicFrames frames; | 816 QuicFrames frames; |
816 QuicFrame frame(&frame1_); | 817 QuicFrame frame(&frame1_); |
817 frames.push_back(frame); | 818 frames.push_back(frame); |
818 QuicPacket* packet = | 819 QuicPacket* packet = |
819 framer_.BuildUnsizedDataPacket(header_, frames).packet; | 820 BuildUnsizedDataPacket(&framer_, header_, frames).packet; |
820 EXPECT_TRUE(packet != NULL); | 821 EXPECT_TRUE(packet != NULL); |
821 return packet; | 822 return packet; |
822 } | 823 } |
823 | 824 |
824 QuicPacket* ConstructClosePacket(QuicPacketSequenceNumber number, | 825 QuicPacket* ConstructClosePacket(QuicPacketSequenceNumber number, |
825 QuicFecGroupNumber fec_group) { | 826 QuicFecGroupNumber fec_group) { |
826 header_.public_header.connection_id = connection_id_; | 827 header_.public_header.connection_id = connection_id_; |
827 header_.packet_sequence_number = number; | 828 header_.packet_sequence_number = number; |
828 header_.public_header.reset_flag = false; | 829 header_.public_header.reset_flag = false; |
829 header_.public_header.version_flag = false; | 830 header_.public_header.version_flag = false; |
830 header_.entropy_flag = false; | 831 header_.entropy_flag = false; |
831 header_.fec_flag = false; | 832 header_.fec_flag = false; |
832 header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; | 833 header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; |
833 header_.fec_group = fec_group; | 834 header_.fec_group = fec_group; |
834 | 835 |
835 QuicConnectionCloseFrame qccf; | 836 QuicConnectionCloseFrame qccf; |
836 qccf.error_code = QUIC_PEER_GOING_AWAY; | 837 qccf.error_code = QUIC_PEER_GOING_AWAY; |
837 | 838 |
838 QuicFrames frames; | 839 QuicFrames frames; |
839 QuicFrame frame(&qccf); | 840 QuicFrame frame(&qccf); |
840 frames.push_back(frame); | 841 frames.push_back(frame); |
841 QuicPacket* packet = | 842 QuicPacket* packet = |
842 framer_.BuildUnsizedDataPacket(header_, frames).packet; | 843 BuildUnsizedDataPacket(&framer_, header_, frames).packet; |
843 EXPECT_TRUE(packet != NULL); | 844 EXPECT_TRUE(packet != NULL); |
844 return packet; | 845 return packet; |
845 } | 846 } |
846 | 847 |
847 void SetFeedback(QuicCongestionFeedbackFrame* feedback) { | 848 void SetFeedback(QuicCongestionFeedbackFrame* feedback) { |
848 receive_algorithm_ = new TestReceiveAlgorithm(feedback); | 849 receive_algorithm_ = new TestReceiveAlgorithm(feedback); |
849 connection_.SetReceiveAlgorithm(receive_algorithm_); | 850 connection_.SetReceiveAlgorithm(receive_algorithm_); |
850 } | 851 } |
851 | 852 |
852 QuicTime::Delta DefaultRetransmissionTime() { | 853 QuicTime::Delta DefaultRetransmissionTime() { |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
906 ProcessDataPacket(6000, 0, !kEntropyFlag); | 907 ProcessDataPacket(6000, 0, !kEntropyFlag); |
907 EXPECT_FALSE( | 908 EXPECT_FALSE( |
908 QuicConnectionPeer::GetConnectionClosePacket(&connection_) == NULL); | 909 QuicConnectionPeer::GetConnectionClosePacket(&connection_) == NULL); |
909 } | 910 } |
910 | 911 |
911 void BlockOnNextWrite() { | 912 void BlockOnNextWrite() { |
912 writer_->BlockOnNextWrite(); | 913 writer_->BlockOnNextWrite(); |
913 EXPECT_CALL(visitor_, OnWriteBlocked()).Times(AtLeast(1)); | 914 EXPECT_CALL(visitor_, OnWriteBlocked()).Times(AtLeast(1)); |
914 } | 915 } |
915 | 916 |
| 917 void CongestionBlockWrites() { |
| 918 EXPECT_CALL(*send_algorithm_, |
| 919 TimeUntilSend(_, _, _)).WillRepeatedly( |
| 920 testing::Return(QuicTime::Delta::FromSeconds(1))); |
| 921 } |
| 922 |
| 923 void CongestionUnblockWrites() { |
| 924 EXPECT_CALL(*send_algorithm_, |
| 925 TimeUntilSend(_, _, _)).WillRepeatedly( |
| 926 testing::Return(QuicTime::Delta::Zero())); |
| 927 } |
| 928 |
916 QuicConnectionId connection_id_; | 929 QuicConnectionId connection_id_; |
917 QuicFramer framer_; | 930 QuicFramer framer_; |
918 QuicPacketCreator creator_; | 931 QuicPacketCreator peer_creator_; |
919 MockEntropyCalculator entropy_calculator_; | 932 MockEntropyCalculator entropy_calculator_; |
920 | 933 |
921 MockSendAlgorithm* send_algorithm_; | 934 MockSendAlgorithm* send_algorithm_; |
922 MockLossAlgorithm* loss_algorithm_; | 935 MockLossAlgorithm* loss_algorithm_; |
923 TestReceiveAlgorithm* receive_algorithm_; | 936 TestReceiveAlgorithm* receive_algorithm_; |
924 MockClock clock_; | 937 MockClock clock_; |
925 MockRandom random_generator_; | 938 MockRandom random_generator_; |
926 scoped_ptr<TestConnectionHelper> helper_; | 939 scoped_ptr<TestConnectionHelper> helper_; |
927 scoped_ptr<TestPacketWriter> writer_; | 940 scoped_ptr<TestPacketWriter> writer_; |
928 TestConnection connection_; | 941 TestConnection connection_; |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1009 | 1022 |
1010 ProcessPacket(5); | 1023 ProcessPacket(5); |
1011 EXPECT_EQ(5u, outgoing_ack()->received_info.largest_observed); | 1024 EXPECT_EQ(5u, outgoing_ack()->received_info.largest_observed); |
1012 EXPECT_TRUE(IsMissing(1)); | 1025 EXPECT_TRUE(IsMissing(1)); |
1013 EXPECT_TRUE(IsMissing(4)); | 1026 EXPECT_TRUE(IsMissing(4)); |
1014 | 1027 |
1015 // Pretend at this point the client has gotten acks for 2 and 3 and 1 is a | 1028 // Pretend at this point the client has gotten acks for 2 and 3 and 1 is a |
1016 // packet the peer will not retransmit. It indicates this by sending 'least | 1029 // packet the peer will not retransmit. It indicates this by sending 'least |
1017 // awaiting' is 4. The connection should then realize 1 will not be | 1030 // awaiting' is 4. The connection should then realize 1 will not be |
1018 // retransmitted, and will remove it from the missing list. | 1031 // retransmitted, and will remove it from the missing list. |
1019 creator_.set_sequence_number(5); | 1032 peer_creator_.set_sequence_number(5); |
1020 QuicAckFrame frame = InitAckFrame(1, 4); | 1033 QuicAckFrame frame = InitAckFrame(1, 4); |
1021 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(_, _, _, _)); | 1034 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(_, _, _, _)); |
1022 ProcessAckPacket(&frame); | 1035 ProcessAckPacket(&frame); |
1023 | 1036 |
1024 // Force an ack to be sent. | 1037 // Force an ack to be sent. |
1025 SendAckPacketToPeer(); | 1038 SendAckPacketToPeer(); |
1026 EXPECT_TRUE(IsMissing(4)); | 1039 EXPECT_TRUE(IsMissing(4)); |
1027 } | 1040 } |
1028 | 1041 |
1029 TEST_P(QuicConnectionTest, RejectPacketTooFarOut) { | 1042 TEST_P(QuicConnectionTest, RejectPacketTooFarOut) { |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1102 TimeUntilSend(_, _, _)).WillOnce( | 1115 TimeUntilSend(_, _, _)).WillOnce( |
1103 testing::Return(QuicTime::Delta::FromMicroseconds(1))); | 1116 testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
1104 QuicConnectionPeer::SendAck(&connection_); | 1117 QuicConnectionPeer::SendAck(&connection_); |
1105 | 1118 |
1106 // Process an ack with a least unacked of the received ack. | 1119 // Process an ack with a least unacked of the received ack. |
1107 // This causes an ack to be sent when TimeUntilSend returns 0. | 1120 // This causes an ack to be sent when TimeUntilSend returns 0. |
1108 EXPECT_CALL(*send_algorithm_, | 1121 EXPECT_CALL(*send_algorithm_, |
1109 TimeUntilSend(_, _, _)).WillRepeatedly( | 1122 TimeUntilSend(_, _, _)).WillRepeatedly( |
1110 testing::Return(QuicTime::Delta::Zero())); | 1123 testing::Return(QuicTime::Delta::Zero())); |
1111 // Skip a packet and then record an ack. | 1124 // Skip a packet and then record an ack. |
1112 creator_.set_sequence_number(2); | 1125 peer_creator_.set_sequence_number(2); |
1113 QuicAckFrame frame = InitAckFrame(0, 3); | 1126 QuicAckFrame frame = InitAckFrame(0, 3); |
1114 ProcessAckPacket(&frame); | 1127 ProcessAckPacket(&frame); |
1115 } | 1128 } |
1116 | 1129 |
1117 TEST_P(QuicConnectionTest, OutOfOrderReceiptCausesAckSend) { | 1130 TEST_P(QuicConnectionTest, OutOfOrderReceiptCausesAckSend) { |
1118 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1131 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
1119 | 1132 |
1120 ProcessPacket(3); | 1133 ProcessPacket(3); |
1121 // Should ack immediately since we have missing packets. | 1134 // Should ack immediately since we have missing packets. |
1122 EXPECT_EQ(1u, writer_->packets_write_attempts()); | 1135 EXPECT_EQ(1u, writer_->packets_write_attempts()); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1198 } | 1211 } |
1199 | 1212 |
1200 TEST_P(QuicConnectionTest, LeastUnackedLower) { | 1213 TEST_P(QuicConnectionTest, LeastUnackedLower) { |
1201 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1214 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
1202 | 1215 |
1203 SendStreamDataToPeer(1, "foo", 0, !kFin, NULL); | 1216 SendStreamDataToPeer(1, "foo", 0, !kFin, NULL); |
1204 SendStreamDataToPeer(1, "bar", 3, !kFin, NULL); | 1217 SendStreamDataToPeer(1, "bar", 3, !kFin, NULL); |
1205 SendStreamDataToPeer(1, "eep", 6, !kFin, NULL); | 1218 SendStreamDataToPeer(1, "eep", 6, !kFin, NULL); |
1206 | 1219 |
1207 // Start out saying the least unacked is 2. | 1220 // Start out saying the least unacked is 2. |
1208 creator_.set_sequence_number(5); | 1221 peer_creator_.set_sequence_number(5); |
1209 if (version() > QUIC_VERSION_15) { | 1222 if (version() > QUIC_VERSION_15) { |
1210 QuicStopWaitingFrame frame = InitStopWaitingFrame(2); | 1223 QuicStopWaitingFrame frame = InitStopWaitingFrame(2); |
1211 ProcessStopWaitingPacket(&frame); | 1224 ProcessStopWaitingPacket(&frame); |
1212 } else { | 1225 } else { |
1213 QuicAckFrame frame = InitAckFrame(0, 2); | 1226 QuicAckFrame frame = InitAckFrame(0, 2); |
1214 ProcessAckPacket(&frame); | 1227 ProcessAckPacket(&frame); |
1215 } | 1228 } |
1216 | 1229 |
1217 // Change it to 1, but lower the sequence number to fake out-of-order packets. | 1230 // Change it to 1, but lower the sequence number to fake out-of-order packets. |
1218 // This should be fine. | 1231 // This should be fine. |
1219 creator_.set_sequence_number(1); | 1232 peer_creator_.set_sequence_number(1); |
1220 // The scheduler will not process out of order acks, but all packet processing | 1233 // The scheduler will not process out of order acks, but all packet processing |
1221 // causes the connection to try to write. | 1234 // causes the connection to try to write. |
1222 EXPECT_CALL(visitor_, OnCanWrite()); | 1235 EXPECT_CALL(visitor_, OnCanWrite()); |
1223 if (version() > QUIC_VERSION_15) { | 1236 if (version() > QUIC_VERSION_15) { |
1224 QuicStopWaitingFrame frame2 = InitStopWaitingFrame(1); | 1237 QuicStopWaitingFrame frame2 = InitStopWaitingFrame(1); |
1225 ProcessStopWaitingPacket(&frame2); | 1238 ProcessStopWaitingPacket(&frame2); |
1226 } else { | 1239 } else { |
1227 QuicAckFrame frame2 = InitAckFrame(0, 1); | 1240 QuicAckFrame frame2 = InitAckFrame(0, 1); |
1228 ProcessAckPacket(&frame2); | 1241 ProcessAckPacket(&frame2); |
1229 } | 1242 } |
1230 | 1243 |
1231 // Now claim it's one, but set the ordering so it was sent "after" the first | 1244 // Now claim it's one, but set the ordering so it was sent "after" the first |
1232 // one. This should cause a connection error. | 1245 // one. This should cause a connection error. |
1233 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 1246 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
1234 creator_.set_sequence_number(7); | 1247 peer_creator_.set_sequence_number(7); |
1235 if (version() > QUIC_VERSION_15) { | 1248 if (version() > QUIC_VERSION_15) { |
1236 EXPECT_CALL(visitor_, | 1249 EXPECT_CALL(visitor_, |
1237 OnConnectionClosed(QUIC_INVALID_STOP_WAITING_DATA, false)); | 1250 OnConnectionClosed(QUIC_INVALID_STOP_WAITING_DATA, false)); |
1238 QuicStopWaitingFrame frame2 = InitStopWaitingFrame(1); | 1251 QuicStopWaitingFrame frame2 = InitStopWaitingFrame(1); |
1239 ProcessStopWaitingPacket(&frame2); | 1252 ProcessStopWaitingPacket(&frame2); |
1240 } else { | 1253 } else { |
1241 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_ACK_DATA, false)); | 1254 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_ACK_DATA, false)); |
1242 QuicAckFrame frame2 = InitAckFrame(0, 1); | 1255 QuicAckFrame frame2 = InitAckFrame(0, 1); |
1243 ProcessAckPacket(&frame2); | 1256 ProcessAckPacket(&frame2); |
1244 } | 1257 } |
(...skipping 25 matching lines...) Expand all Loading... |
1270 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 1283 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
1271 QuicAckFrame frame(MakeAckFrame(1, 0)); | 1284 QuicAckFrame frame(MakeAckFrame(1, 0)); |
1272 EXPECT_CALL(visitor_, OnCanWrite()).Times(0); | 1285 EXPECT_CALL(visitor_, OnCanWrite()).Times(0); |
1273 ProcessAckPacket(&frame); | 1286 ProcessAckPacket(&frame); |
1274 } | 1287 } |
1275 | 1288 |
1276 TEST_P(QuicConnectionTest, AckAll) { | 1289 TEST_P(QuicConnectionTest, AckAll) { |
1277 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1290 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
1278 ProcessPacket(1); | 1291 ProcessPacket(1); |
1279 | 1292 |
1280 creator_.set_sequence_number(1); | 1293 peer_creator_.set_sequence_number(1); |
1281 QuicAckFrame frame1 = InitAckFrame(0, 1); | 1294 QuicAckFrame frame1 = InitAckFrame(0, 1); |
1282 ProcessAckPacket(&frame1); | 1295 ProcessAckPacket(&frame1); |
1283 } | 1296 } |
1284 | 1297 |
1285 TEST_P(QuicConnectionTest, SendingDifferentSequenceNumberLengthsBandwidth) { | 1298 TEST_P(QuicConnectionTest, SendingDifferentSequenceNumberLengthsBandwidth) { |
1286 QuicPacketSequenceNumber last_packet; | 1299 QuicPacketSequenceNumber last_packet; |
| 1300 QuicPacketCreator* creator = |
| 1301 QuicConnectionPeer::GetPacketCreator(&connection_); |
1287 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); | 1302 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); |
1288 EXPECT_EQ(1u, last_packet); | 1303 EXPECT_EQ(1u, last_packet); |
1289 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, | 1304 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, |
1290 connection_.options()->send_sequence_number_length); | 1305 creator->next_sequence_number_length()); |
1291 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, | 1306 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, |
1292 writer_->header().public_header.sequence_number_length); | 1307 writer_->header().public_header.sequence_number_length); |
1293 | 1308 |
1294 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly( | 1309 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly( |
1295 Return(kMaxPacketSize * 256)); | 1310 Return(kMaxPacketSize * 256)); |
1296 | 1311 |
1297 SendStreamDataToPeer(1, "bar", 3, !kFin, &last_packet); | 1312 SendStreamDataToPeer(1, "bar", 3, !kFin, &last_packet); |
1298 EXPECT_EQ(2u, last_packet); | 1313 EXPECT_EQ(2u, last_packet); |
1299 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER, | 1314 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER, |
1300 connection_.options()->send_sequence_number_length); | 1315 creator->next_sequence_number_length()); |
1301 // The 1 packet lag is due to the sequence number length being recalculated in | 1316 // The 1 packet lag is due to the sequence number length being recalculated in |
1302 // QuicConnection after a packet is sent. | 1317 // QuicConnection after a packet is sent. |
1303 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, | 1318 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, |
1304 writer_->header().public_header.sequence_number_length); | 1319 writer_->header().public_header.sequence_number_length); |
1305 | 1320 |
1306 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly( | 1321 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly( |
1307 Return(kMaxPacketSize * 256 * 256)); | 1322 Return(kMaxPacketSize * 256 * 256)); |
1308 | 1323 |
1309 SendStreamDataToPeer(1, "foo", 6, !kFin, &last_packet); | 1324 SendStreamDataToPeer(1, "foo", 6, !kFin, &last_packet); |
1310 EXPECT_EQ(3u, last_packet); | 1325 EXPECT_EQ(3u, last_packet); |
1311 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, | 1326 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, |
1312 connection_.options()->send_sequence_number_length); | 1327 creator->next_sequence_number_length()); |
1313 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER, | 1328 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER, |
1314 writer_->header().public_header.sequence_number_length); | 1329 writer_->header().public_header.sequence_number_length); |
1315 | 1330 |
1316 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly( | 1331 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly( |
1317 Return(kMaxPacketSize * 256 * 256 * 256)); | 1332 Return(kMaxPacketSize * 256 * 256 * 256)); |
1318 | 1333 |
1319 SendStreamDataToPeer(1, "bar", 9, !kFin, &last_packet); | 1334 SendStreamDataToPeer(1, "bar", 9, !kFin, &last_packet); |
1320 EXPECT_EQ(4u, last_packet); | 1335 EXPECT_EQ(4u, last_packet); |
1321 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, | 1336 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, |
1322 connection_.options()->send_sequence_number_length); | 1337 creator->next_sequence_number_length()); |
1323 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, | 1338 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, |
1324 writer_->header().public_header.sequence_number_length); | 1339 writer_->header().public_header.sequence_number_length); |
1325 | 1340 |
1326 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly( | 1341 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly( |
1327 Return(kMaxPacketSize * 256 * 256 * 256 * 256)); | 1342 Return(kMaxPacketSize * 256 * 256 * 256 * 256)); |
1328 | 1343 |
1329 SendStreamDataToPeer(1, "foo", 12, !kFin, &last_packet); | 1344 SendStreamDataToPeer(1, "foo", 12, !kFin, &last_packet); |
1330 EXPECT_EQ(5u, last_packet); | 1345 EXPECT_EQ(5u, last_packet); |
1331 EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER, | 1346 EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER, |
1332 connection_.options()->send_sequence_number_length); | 1347 creator->next_sequence_number_length()); |
1333 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, | 1348 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, |
1334 writer_->header().public_header.sequence_number_length); | 1349 writer_->header().public_header.sequence_number_length); |
1335 } | 1350 } |
1336 | 1351 |
1337 TEST_P(QuicConnectionTest, SendingDifferentSequenceNumberLengthsUnackedDelta) { | 1352 TEST_P(QuicConnectionTest, SendingDifferentSequenceNumberLengthsUnackedDelta) { |
1338 QuicPacketSequenceNumber last_packet; | 1353 QuicPacketSequenceNumber last_packet; |
| 1354 QuicPacketCreator* creator = |
| 1355 QuicConnectionPeer::GetPacketCreator(&connection_); |
1339 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); | 1356 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); |
1340 EXPECT_EQ(1u, last_packet); | 1357 EXPECT_EQ(1u, last_packet); |
1341 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, | 1358 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, |
1342 connection_.options()->send_sequence_number_length); | 1359 creator->next_sequence_number_length()); |
1343 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, | 1360 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, |
1344 writer_->header().public_header.sequence_number_length); | 1361 writer_->header().public_header.sequence_number_length); |
1345 | 1362 |
1346 QuicConnectionPeer::GetPacketCreator(&connection_)->set_sequence_number(100); | 1363 creator->set_sequence_number(100); |
1347 | 1364 |
1348 SendStreamDataToPeer(1, "bar", 3, !kFin, &last_packet); | 1365 SendStreamDataToPeer(1, "bar", 3, !kFin, &last_packet); |
1349 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER, | 1366 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER, |
1350 connection_.options()->send_sequence_number_length); | 1367 creator->next_sequence_number_length()); |
1351 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, | 1368 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER, |
1352 writer_->header().public_header.sequence_number_length); | 1369 writer_->header().public_header.sequence_number_length); |
1353 | 1370 |
1354 QuicConnectionPeer::GetPacketCreator(&connection_)->set_sequence_number( | 1371 creator->set_sequence_number(100 * 256); |
1355 100 * 256); | |
1356 | 1372 |
1357 SendStreamDataToPeer(1, "foo", 6, !kFin, &last_packet); | 1373 SendStreamDataToPeer(1, "foo", 6, !kFin, &last_packet); |
1358 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, | 1374 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, |
1359 connection_.options()->send_sequence_number_length); | 1375 creator->next_sequence_number_length()); |
1360 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER, | 1376 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER, |
1361 writer_->header().public_header.sequence_number_length); | 1377 writer_->header().public_header.sequence_number_length); |
1362 | 1378 |
1363 QuicConnectionPeer::GetPacketCreator(&connection_)->set_sequence_number( | 1379 creator->set_sequence_number(100 * 256 * 256); |
1364 100 * 256 * 256); | |
1365 | 1380 |
1366 SendStreamDataToPeer(1, "bar", 9, !kFin, &last_packet); | 1381 SendStreamDataToPeer(1, "bar", 9, !kFin, &last_packet); |
1367 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, | 1382 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, |
1368 connection_.options()->send_sequence_number_length); | 1383 creator->next_sequence_number_length()); |
1369 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, | 1384 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, |
1370 writer_->header().public_header.sequence_number_length); | 1385 writer_->header().public_header.sequence_number_length); |
1371 | 1386 |
1372 QuicConnectionPeer::GetPacketCreator(&connection_)->set_sequence_number( | 1387 creator->set_sequence_number(100 * 256 * 256 * 256); |
1373 100 * 256 * 256 * 256); | |
1374 | 1388 |
1375 SendStreamDataToPeer(1, "foo", 12, !kFin, &last_packet); | 1389 SendStreamDataToPeer(1, "foo", 12, !kFin, &last_packet); |
1376 EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER, | 1390 EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER, |
1377 connection_.options()->send_sequence_number_length); | 1391 creator->next_sequence_number_length()); |
1378 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, | 1392 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER, |
1379 writer_->header().public_header.sequence_number_length); | 1393 writer_->header().public_header.sequence_number_length); |
1380 } | 1394 } |
1381 | 1395 |
1382 TEST_P(QuicConnectionTest, BasicSending) { | 1396 TEST_P(QuicConnectionTest, BasicSending) { |
1383 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1397 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
1384 QuicPacketSequenceNumber last_packet; | 1398 QuicPacketSequenceNumber last_packet; |
1385 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1 | 1399 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1 |
1386 EXPECT_EQ(1u, last_packet); | 1400 EXPECT_EQ(1u, last_packet); |
1387 SendAckPacketToPeer(); // Packet 2 | 1401 SendAckPacketToPeer(); // Packet 2 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1425 | 1439 |
1426 // But if we send more data it should. | 1440 // But if we send more data it should. |
1427 SendStreamDataToPeer(1, "eep", 6, !kFin, &last_packet); // Packet 8 | 1441 SendStreamDataToPeer(1, "eep", 6, !kFin, &last_packet); // Packet 8 |
1428 EXPECT_EQ(8u, last_packet); | 1442 EXPECT_EQ(8u, last_packet); |
1429 SendAckPacketToPeer(); // Packet 9 | 1443 SendAckPacketToPeer(); // Packet 9 |
1430 EXPECT_EQ(7u, least_unacked()); | 1444 EXPECT_EQ(7u, least_unacked()); |
1431 } | 1445 } |
1432 | 1446 |
1433 TEST_P(QuicConnectionTest, FECSending) { | 1447 TEST_P(QuicConnectionTest, FECSending) { |
1434 // All packets carry version info till version is negotiated. | 1448 // All packets carry version info till version is negotiated. |
| 1449 QuicPacketCreator* creator = |
| 1450 QuicConnectionPeer::GetPacketCreator(&connection_); |
1435 size_t payload_length; | 1451 size_t payload_length; |
1436 // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining | 1452 // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining |
1437 // packet length. The size of the offset field in a stream frame is 0 for | 1453 // packet length. The size of the offset field in a stream frame is 0 for |
1438 // offset 0, and 2 for non-zero offsets up through 16K. Increase | 1454 // offset 0, and 2 for non-zero offsets up through 64K. Increase |
1439 // max_packet_length by 2 so that subsequent packets containing subsequent | 1455 // max_packet_length by 2 so that subsequent packets containing subsequent |
1440 // stream frames with non-zero offets will fit within the packet length. | 1456 // stream frames with non-zero offets will fit within the packet length. |
1441 connection_.options()->max_packet_length = 2 + GetPacketLengthForOneStream( | 1457 size_t length = 2 + GetPacketLengthForOneStream( |
1442 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, | 1458 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, |
1443 IN_FEC_GROUP, &payload_length); | 1459 IN_FEC_GROUP, &payload_length); |
| 1460 creator->set_max_packet_length(length); |
| 1461 |
1444 // And send FEC every two packets. | 1462 // And send FEC every two packets. |
1445 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn( | 1463 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(creator, 2)); |
1446 QuicConnectionPeer::GetPacketCreator(&connection_), 2)); | |
1447 | 1464 |
1448 // Send 4 data packets and 2 FEC packets. | 1465 // Send 4 data packets and 2 FEC packets. |
1449 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6); | 1466 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6); |
1450 // The first stream frame will have 2 fewer overhead bytes than the other 3. | 1467 // The first stream frame will have 2 fewer overhead bytes than the other 3. |
1451 const string payload(payload_length * 4 + 2, 'a'); | 1468 const string payload(payload_length * 4 + 2, 'a'); |
1452 connection_.SendStreamDataWithString(1, payload, 0, !kFin, NULL); | 1469 connection_.SendStreamDataWithString(1, payload, 0, !kFin, NULL); |
1453 // Expect the FEC group to be closed after SendStreamDataWithString. | 1470 // Expect the FEC group to be closed after SendStreamDataWithString. |
1454 EXPECT_FALSE(creator_.ShouldSendFec(true)); | 1471 EXPECT_FALSE(creator->ShouldSendFec(true)); |
| 1472 EXPECT_TRUE(creator->IsFecProtected()); |
1455 } | 1473 } |
1456 | 1474 |
1457 TEST_P(QuicConnectionTest, FECQueueing) { | 1475 TEST_P(QuicConnectionTest, FECQueueing) { |
1458 // All packets carry version info till version is negotiated. | 1476 // All packets carry version info till version is negotiated. |
1459 size_t payload_length; | 1477 size_t payload_length; |
1460 connection_.options()->max_packet_length = | 1478 QuicPacketCreator* creator = |
1461 GetPacketLengthForOneStream( | 1479 QuicConnectionPeer::GetPacketCreator(&connection_); |
1462 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, | 1480 size_t length = GetPacketLengthForOneStream( |
1463 IN_FEC_GROUP, &payload_length); | 1481 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, |
| 1482 IN_FEC_GROUP, &payload_length); |
| 1483 creator->set_max_packet_length(length); |
1464 // And send FEC every two packets. | 1484 // And send FEC every two packets. |
1465 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn( | 1485 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(creator, 2)); |
1466 QuicConnectionPeer::GetPacketCreator(&connection_), 2)); | |
1467 | 1486 |
1468 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1487 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
1469 BlockOnNextWrite(); | 1488 BlockOnNextWrite(); |
1470 const string payload(payload_length, 'a'); | 1489 const string payload(payload_length, 'a'); |
1471 connection_.SendStreamDataWithString(1, payload, 0, !kFin, NULL); | 1490 connection_.SendStreamDataWithString(1, payload, 0, !kFin, NULL); |
1472 EXPECT_FALSE(creator_.ShouldSendFec(true)); | 1491 EXPECT_FALSE(creator->ShouldSendFec(true)); |
| 1492 EXPECT_TRUE(creator->IsFecProtected()); |
1473 // Expect the first data packet and the fec packet to be queued. | 1493 // Expect the first data packet and the fec packet to be queued. |
1474 EXPECT_EQ(2u, connection_.NumQueuedPackets()); | 1494 EXPECT_EQ(2u, connection_.NumQueuedPackets()); |
1475 } | 1495 } |
1476 | 1496 |
1477 TEST_P(QuicConnectionTest, AbandonFECFromCongestionWindow) { | 1497 TEST_P(QuicConnectionTest, AbandonFECFromCongestionWindow) { |
1478 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn( | 1498 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn( |
1479 QuicConnectionPeer::GetPacketCreator(&connection_), 1)); | 1499 QuicConnectionPeer::GetPacketCreator(&connection_), 1)); |
1480 | 1500 |
1481 // 1 Data and 1 FEC packet. | 1501 // 1 Data and 1 FEC packet. |
1482 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); | 1502 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1553 | 1573 |
1554 // Abandon all packets | 1574 // Abandon all packets |
1555 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(false)); | 1575 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(false)); |
1556 connection_.GetRetransmissionAlarm()->Fire(); | 1576 connection_.GetRetransmissionAlarm()->Fire(); |
1557 | 1577 |
1558 // Ensure the alarm is not set since all packets have been abandoned. | 1578 // Ensure the alarm is not set since all packets have been abandoned. |
1559 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); | 1579 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); |
1560 } | 1580 } |
1561 | 1581 |
1562 TEST_P(QuicConnectionTest, FramePacking) { | 1582 TEST_P(QuicConnectionTest, FramePacking) { |
1563 // Block the connection. | 1583 CongestionBlockWrites(); |
1564 connection_.GetSendAlarm()->Set( | |
1565 clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(1))); | |
1566 | 1584 |
1567 // Send an ack and two stream frames in 1 packet by queueing them. | 1585 // Send an ack and two stream frames in 1 packet by queueing them. |
1568 connection_.SendAck(); | 1586 connection_.SendAck(); |
1569 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( | 1587 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( |
1570 IgnoreResult(InvokeWithoutArgs(&connection_, | 1588 IgnoreResult(InvokeWithoutArgs(&connection_, |
1571 &TestConnection::SendStreamData3)), | 1589 &TestConnection::SendStreamData3)), |
1572 IgnoreResult(InvokeWithoutArgs(&connection_, | 1590 IgnoreResult(InvokeWithoutArgs(&connection_, |
1573 &TestConnection::SendStreamData5)))); | 1591 &TestConnection::SendStreamData5)))); |
1574 | 1592 |
1575 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 1593 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
1576 // Unblock the connection. | 1594 CongestionUnblockWrites(); |
1577 connection_.GetSendAlarm()->Fire(); | 1595 connection_.GetSendAlarm()->Fire(); |
1578 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1596 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
1579 EXPECT_FALSE(connection_.HasQueuedData()); | 1597 EXPECT_FALSE(connection_.HasQueuedData()); |
1580 | 1598 |
1581 // Parse the last packet and ensure it's an ack and two stream frames from | 1599 // Parse the last packet and ensure it's an ack and two stream frames from |
1582 // two different streams. | 1600 // two different streams. |
1583 if (version() > QUIC_VERSION_15) { | 1601 if (version() > QUIC_VERSION_15) { |
1584 EXPECT_EQ(4u, writer_->frame_count()); | 1602 EXPECT_EQ(4u, writer_->frame_count()); |
1585 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); | 1603 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); |
1586 } else { | 1604 } else { |
1587 EXPECT_EQ(3u, writer_->frame_count()); | 1605 EXPECT_EQ(3u, writer_->frame_count()); |
1588 } | 1606 } |
1589 EXPECT_FALSE(writer_->ack_frames().empty()); | 1607 EXPECT_FALSE(writer_->ack_frames().empty()); |
1590 EXPECT_EQ(2u, writer_->stream_frames().size()); | 1608 ASSERT_EQ(2u, writer_->stream_frames().size()); |
1591 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id); | 1609 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id); |
1592 EXPECT_EQ(kClientDataStreamId2, writer_->stream_frames()[1].stream_id); | 1610 EXPECT_EQ(kClientDataStreamId2, writer_->stream_frames()[1].stream_id); |
1593 } | 1611 } |
1594 | 1612 |
1595 TEST_P(QuicConnectionTest, FramePackingNonCryptoThenCrypto) { | 1613 TEST_P(QuicConnectionTest, FramePackingNonCryptoThenCrypto) { |
1596 // Block the connection. | 1614 CongestionBlockWrites(); |
1597 connection_.GetSendAlarm()->Set( | |
1598 clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(1))); | |
1599 | 1615 |
1600 // Send an ack and two stream frames (one non-crypto, then one crypto) in 2 | 1616 // Send an ack and two stream frames (one non-crypto, then one crypto) in 2 |
1601 // packets by queueing them. | 1617 // packets by queueing them. |
1602 connection_.SendAck(); | 1618 connection_.SendAck(); |
1603 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( | 1619 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( |
1604 IgnoreResult(InvokeWithoutArgs(&connection_, | 1620 IgnoreResult(InvokeWithoutArgs(&connection_, |
1605 &TestConnection::SendStreamData3)), | 1621 &TestConnection::SendStreamData3)), |
1606 IgnoreResult(InvokeWithoutArgs(&connection_, | 1622 IgnoreResult(InvokeWithoutArgs(&connection_, |
1607 &TestConnection::SendCryptoStreamData)))); | 1623 &TestConnection::SendCryptoStreamData)))); |
1608 | 1624 |
1609 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); | 1625 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); |
1610 // Unblock the connection. | 1626 CongestionUnblockWrites(); |
1611 connection_.GetSendAlarm()->Fire(); | 1627 connection_.GetSendAlarm()->Fire(); |
1612 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1628 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
1613 EXPECT_FALSE(connection_.HasQueuedData()); | 1629 EXPECT_FALSE(connection_.HasQueuedData()); |
1614 | 1630 |
1615 // Parse the last packet and ensure it's the crypto stream frame. | 1631 // Parse the last packet and ensure it's the crypto stream frame. |
1616 EXPECT_EQ(1u, writer_->frame_count()); | 1632 EXPECT_EQ(1u, writer_->frame_count()); |
1617 EXPECT_EQ(1u, writer_->stream_frames().size()); | 1633 ASSERT_EQ(1u, writer_->stream_frames().size()); |
1618 EXPECT_EQ(kCryptoStreamId, writer_->stream_frames()[0].stream_id); | 1634 EXPECT_EQ(kCryptoStreamId, writer_->stream_frames()[0].stream_id); |
1619 } | 1635 } |
1620 | 1636 |
1621 TEST_P(QuicConnectionTest, FramePackingCryptoThenNonCrypto) { | 1637 TEST_P(QuicConnectionTest, FramePackingCryptoThenNonCrypto) { |
1622 // Block the connection. | 1638 CongestionBlockWrites(); |
1623 connection_.GetSendAlarm()->Set( | |
1624 clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(1))); | |
1625 | 1639 |
1626 // Send an ack and two stream frames (one crypto, then one non-crypto) in 3 | 1640 // Send an ack and two stream frames (one crypto, then one non-crypto) in 3 |
1627 // packets by queueing them. | 1641 // packets by queueing them. |
1628 connection_.SendAck(); | 1642 connection_.SendAck(); |
1629 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( | 1643 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( |
1630 IgnoreResult(InvokeWithoutArgs(&connection_, | 1644 IgnoreResult(InvokeWithoutArgs(&connection_, |
1631 &TestConnection::SendCryptoStreamData)), | 1645 &TestConnection::SendCryptoStreamData)), |
1632 IgnoreResult(InvokeWithoutArgs(&connection_, | 1646 IgnoreResult(InvokeWithoutArgs(&connection_, |
1633 &TestConnection::SendStreamData3)))); | 1647 &TestConnection::SendStreamData3)))); |
1634 | 1648 |
1635 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3); | 1649 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3); |
1636 // Unblock the connection. | 1650 CongestionUnblockWrites(); |
1637 connection_.GetSendAlarm()->Fire(); | 1651 connection_.GetSendAlarm()->Fire(); |
1638 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1652 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
1639 EXPECT_FALSE(connection_.HasQueuedData()); | 1653 EXPECT_FALSE(connection_.HasQueuedData()); |
1640 | 1654 |
1641 // Parse the last packet and ensure it's the stream frame from stream 3. | 1655 // Parse the last packet and ensure it's the stream frame from stream 3. |
1642 EXPECT_EQ(1u, writer_->frame_count()); | 1656 EXPECT_EQ(1u, writer_->frame_count()); |
1643 EXPECT_EQ(1u, writer_->stream_frames().size()); | 1657 ASSERT_EQ(1u, writer_->stream_frames().size()); |
1644 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id); | 1658 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id); |
1645 } | 1659 } |
1646 | 1660 |
1647 TEST_P(QuicConnectionTest, FramePackingFEC) { | 1661 TEST_P(QuicConnectionTest, FramePackingFEC) { |
1648 if (version() < QUIC_VERSION_15) { | |
1649 return; | |
1650 } | |
1651 // Enable fec. | 1662 // Enable fec. |
1652 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn( | 1663 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn( |
1653 QuicConnectionPeer::GetPacketCreator(&connection_), 6)); | 1664 QuicConnectionPeer::GetPacketCreator(&connection_), 6)); |
1654 | 1665 |
1655 // Block the connection. | 1666 CongestionBlockWrites(); |
1656 connection_.GetSendAlarm()->Set( | |
1657 clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(1))); | |
1658 | 1667 |
1659 // Send an ack and two stream frames in 1 packet by queueing them. | 1668 // Send an ack and two stream frames in 1 packet by queueing them. |
1660 connection_.SendAck(); | 1669 connection_.SendAck(); |
1661 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( | 1670 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( |
1662 IgnoreResult(InvokeWithoutArgs(&connection_, | 1671 IgnoreResult(InvokeWithoutArgs(&connection_, |
1663 &TestConnection::SendStreamData3)), | 1672 &TestConnection::SendStreamData3)), |
1664 IgnoreResult(InvokeWithoutArgs(&connection_, | 1673 IgnoreResult(InvokeWithoutArgs(&connection_, |
1665 &TestConnection::SendStreamData5)))); | 1674 &TestConnection::SendStreamData5)))); |
1666 | 1675 |
1667 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); | 1676 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); |
1668 // Unblock the connection. | 1677 CongestionUnblockWrites(); |
1669 connection_.GetSendAlarm()->Fire(); | 1678 connection_.GetSendAlarm()->Fire(); |
1670 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1679 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
1671 EXPECT_FALSE(connection_.HasQueuedData()); | 1680 EXPECT_FALSE(connection_.HasQueuedData()); |
1672 | 1681 |
1673 // Parse the last packet and ensure it's in an fec group. | 1682 // Parse the last packet and ensure it's in an fec group. |
1674 EXPECT_EQ(1u, writer_->header().fec_group); | 1683 EXPECT_EQ(1u, writer_->header().fec_group); |
1675 EXPECT_EQ(0u, writer_->frame_count()); | 1684 EXPECT_EQ(0u, writer_->frame_count()); |
1676 } | 1685 } |
1677 | 1686 |
1678 TEST_P(QuicConnectionTest, FramePackingAckResponse) { | 1687 TEST_P(QuicConnectionTest, FramePackingAckResponse) { |
1679 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1688 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
1680 // Process a data packet to queue up a pending ack. | 1689 // Process a data packet to queue up a pending ack. |
1681 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1); | 1690 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1); |
1682 ProcessDataPacket(1, 1, kEntropyFlag); | 1691 ProcessDataPacket(1, 1, kEntropyFlag); |
1683 | 1692 |
1684 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( | 1693 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( |
1685 IgnoreResult(InvokeWithoutArgs(&connection_, | 1694 IgnoreResult(InvokeWithoutArgs(&connection_, |
1686 &TestConnection::SendStreamData3)), | 1695 &TestConnection::SendStreamData3)), |
1687 IgnoreResult(InvokeWithoutArgs(&connection_, | 1696 IgnoreResult(InvokeWithoutArgs(&connection_, |
1688 &TestConnection::SendStreamData5)))); | 1697 &TestConnection::SendStreamData5)))); |
1689 | 1698 |
1690 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 1699 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
1691 | 1700 |
1692 // Process an ack to cause the visitor's OnCanWrite to be invoked. | 1701 // Process an ack to cause the visitor's OnCanWrite to be invoked. |
1693 creator_.set_sequence_number(2); | 1702 peer_creator_.set_sequence_number(2); |
1694 QuicAckFrame ack_one = InitAckFrame(0, 0); | 1703 QuicAckFrame ack_one = InitAckFrame(0, 0); |
1695 ProcessAckPacket(&ack_one); | 1704 ProcessAckPacket(&ack_one); |
1696 | 1705 |
1697 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1706 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
1698 EXPECT_FALSE(connection_.HasQueuedData()); | 1707 EXPECT_FALSE(connection_.HasQueuedData()); |
1699 | 1708 |
1700 // Parse the last packet and ensure it's an ack and two stream frames from | 1709 // Parse the last packet and ensure it's an ack and two stream frames from |
1701 // two different streams. | 1710 // two different streams. |
1702 if (version() > QUIC_VERSION_15) { | 1711 if (version() > QUIC_VERSION_15) { |
1703 EXPECT_EQ(4u, writer_->frame_count()); | 1712 EXPECT_EQ(4u, writer_->frame_count()); |
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2092 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); | 2101 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); |
2093 frame = InitAckFrame(7, 0); | 2102 frame = InitAckFrame(7, 0); |
2094 NackPacket(5, &frame); | 2103 NackPacket(5, &frame); |
2095 NackPacket(6, &frame); | 2104 NackPacket(6, &frame); |
2096 ProcessAckPacket(&frame); | 2105 ProcessAckPacket(&frame); |
2097 | 2106 |
2098 EXPECT_EQ(6u, outgoing_ack()->sent_info.least_unacked); | 2107 EXPECT_EQ(6u, outgoing_ack()->sent_info.least_unacked); |
2099 } | 2108 } |
2100 | 2109 |
2101 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterFecPacket) { | 2110 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterFecPacket) { |
2102 if (version() < QUIC_VERSION_15) { | |
2103 return; | |
2104 } | |
2105 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2111 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2106 | 2112 |
2107 // Don't send missing packet 1. | 2113 // Don't send missing packet 1. |
2108 ProcessFecPacket(2, 1, true, !kEntropyFlag, NULL); | 2114 ProcessFecPacket(2, 1, true, !kEntropyFlag, NULL); |
2109 // Entropy flag should be false, so entropy should be 0. | 2115 // Entropy flag should be false, so entropy should be 0. |
2110 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); | 2116 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); |
2111 } | 2117 } |
2112 | 2118 |
2113 TEST_P(QuicConnectionTest, ReviveMissingPacketWithVaryingSeqNumLengths) { | 2119 TEST_P(QuicConnectionTest, ReviveMissingPacketWithVaryingSeqNumLengths) { |
2114 if (version() < QUIC_VERSION_15) { | |
2115 return; | |
2116 } | |
2117 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2120 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2118 | 2121 |
2119 // Set up a debug visitor to the connection. | 2122 // Set up a debug visitor to the connection. |
2120 scoped_ptr<FecQuicConnectionDebugVisitor> | 2123 scoped_ptr<FecQuicConnectionDebugVisitor> |
2121 fec_visitor(new FecQuicConnectionDebugVisitor); | 2124 fec_visitor(new FecQuicConnectionDebugVisitor); |
2122 connection_.set_debug_visitor(fec_visitor.get()); | 2125 connection_.set_debug_visitor(fec_visitor.get()); |
2123 | 2126 |
2124 QuicPacketSequenceNumber fec_packet = 0; | 2127 QuicPacketSequenceNumber fec_packet = 0; |
2125 QuicSequenceNumberLength lengths[] = {PACKET_6BYTE_SEQUENCE_NUMBER, | 2128 QuicSequenceNumberLength lengths[] = {PACKET_6BYTE_SEQUENCE_NUMBER, |
2126 PACKET_4BYTE_SEQUENCE_NUMBER, | 2129 PACKET_4BYTE_SEQUENCE_NUMBER, |
2127 PACKET_2BYTE_SEQUENCE_NUMBER, | 2130 PACKET_2BYTE_SEQUENCE_NUMBER, |
2128 PACKET_1BYTE_SEQUENCE_NUMBER}; | 2131 PACKET_1BYTE_SEQUENCE_NUMBER}; |
2129 // For each sequence number length size, revive a packet and check sequence | 2132 // For each sequence number length size, revive a packet and check sequence |
2130 // number length in the revived packet. | 2133 // number length in the revived packet. |
2131 for (size_t i = 0; i < arraysize(lengths); ++i) { | 2134 for (size_t i = 0; i < arraysize(lengths); ++i) { |
2132 // Set sequence_number_length_ (for data and FEC packets). | 2135 // Set sequence_number_length_ (for data and FEC packets). |
2133 sequence_number_length_ = lengths[i]; | 2136 sequence_number_length_ = lengths[i]; |
2134 fec_packet += 2; | 2137 fec_packet += 2; |
2135 // Don't send missing packet, but send fec packet right after it. | 2138 // Don't send missing packet, but send fec packet right after it. |
2136 ProcessFecPacket(/*seq_num=*/fec_packet, /*fec_group=*/fec_packet - 1, | 2139 ProcessFecPacket(/*seq_num=*/fec_packet, /*fec_group=*/fec_packet - 1, |
2137 true, !kEntropyFlag, NULL); | 2140 true, !kEntropyFlag, NULL); |
2138 // Sequence number length in the revived header should be the same as | 2141 // Sequence number length in the revived header should be the same as |
2139 // in the original data/fec packet headers. | 2142 // in the original data/fec packet headers. |
2140 EXPECT_EQ(sequence_number_length_, fec_visitor->revived_header(). | 2143 EXPECT_EQ(sequence_number_length_, fec_visitor->revived_header(). |
2141 public_header.sequence_number_length); | 2144 public_header.sequence_number_length); |
2142 } | 2145 } |
2143 } | 2146 } |
2144 | 2147 |
2145 TEST_P(QuicConnectionTest, ReviveMissingPacketWithVaryingConnectionIdLengths) { | 2148 TEST_P(QuicConnectionTest, ReviveMissingPacketWithVaryingConnectionIdLengths) { |
2146 if (version() < QUIC_VERSION_15) { | |
2147 return; | |
2148 } | |
2149 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2149 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2150 | 2150 |
2151 // Set up a debug visitor to the connection. | 2151 // Set up a debug visitor to the connection. |
2152 scoped_ptr<FecQuicConnectionDebugVisitor> | 2152 scoped_ptr<FecQuicConnectionDebugVisitor> |
2153 fec_visitor(new FecQuicConnectionDebugVisitor); | 2153 fec_visitor(new FecQuicConnectionDebugVisitor); |
2154 connection_.set_debug_visitor(fec_visitor.get()); | 2154 connection_.set_debug_visitor(fec_visitor.get()); |
2155 | 2155 |
2156 QuicPacketSequenceNumber fec_packet = 0; | 2156 QuicPacketSequenceNumber fec_packet = 0; |
2157 QuicConnectionIdLength lengths[] = {PACKET_8BYTE_CONNECTION_ID, | 2157 QuicConnectionIdLength lengths[] = {PACKET_8BYTE_CONNECTION_ID, |
2158 PACKET_4BYTE_CONNECTION_ID, | 2158 PACKET_4BYTE_CONNECTION_ID, |
2159 PACKET_1BYTE_CONNECTION_ID, | 2159 PACKET_1BYTE_CONNECTION_ID, |
2160 PACKET_0BYTE_CONNECTION_ID}; | 2160 PACKET_0BYTE_CONNECTION_ID}; |
2161 // For each connection id length size, revive a packet and check connection | 2161 // For each connection id length size, revive a packet and check connection |
2162 // id length in the revived packet. | 2162 // id length in the revived packet. |
2163 for (size_t i = 0; i < arraysize(lengths); ++i) { | 2163 for (size_t i = 0; i < arraysize(lengths); ++i) { |
2164 // Set connection id length (for data and FEC packets). | 2164 // Set connection id length (for data and FEC packets). |
2165 connection_id_length_ = lengths[i]; | 2165 connection_id_length_ = lengths[i]; |
2166 fec_packet += 2; | 2166 fec_packet += 2; |
2167 // Don't send missing packet, but send fec packet right after it. | 2167 // Don't send missing packet, but send fec packet right after it. |
2168 ProcessFecPacket(/*seq_num=*/fec_packet, /*fec_group=*/fec_packet - 1, | 2168 ProcessFecPacket(/*seq_num=*/fec_packet, /*fec_group=*/fec_packet - 1, |
2169 true, !kEntropyFlag, NULL); | 2169 true, !kEntropyFlag, NULL); |
2170 // Connection id length in the revived header should be the same as | 2170 // Connection id length in the revived header should be the same as |
2171 // in the original data/fec packet headers. | 2171 // in the original data/fec packet headers. |
2172 EXPECT_EQ(connection_id_length_, | 2172 EXPECT_EQ(connection_id_length_, |
2173 fec_visitor->revived_header().public_header.connection_id_length); | 2173 fec_visitor->revived_header().public_header.connection_id_length); |
2174 } | 2174 } |
2175 } | 2175 } |
2176 | 2176 |
2177 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacketThenFecPacket) { | 2177 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacketThenFecPacket) { |
2178 if (version() < QUIC_VERSION_15) { | |
2179 return; | |
2180 } | |
2181 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2178 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2182 | 2179 |
2183 ProcessFecProtectedPacket(1, false, kEntropyFlag); | 2180 ProcessFecProtectedPacket(1, false, kEntropyFlag); |
2184 // Don't send missing packet 2. | 2181 // Don't send missing packet 2. |
2185 ProcessFecPacket(3, 1, true, !kEntropyFlag, NULL); | 2182 ProcessFecPacket(3, 1, true, !kEntropyFlag, NULL); |
2186 // Entropy flag should be true, so entropy should not be 0. | 2183 // Entropy flag should be true, so entropy should not be 0. |
2187 EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); | 2184 EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); |
2188 } | 2185 } |
2189 | 2186 |
2190 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacketsThenFecPacket) { | 2187 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacketsThenFecPacket) { |
2191 if (version() < QUIC_VERSION_15) { | |
2192 return; | |
2193 } | |
2194 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2188 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2195 | 2189 |
2196 ProcessFecProtectedPacket(1, false, !kEntropyFlag); | 2190 ProcessFecProtectedPacket(1, false, !kEntropyFlag); |
2197 // Don't send missing packet 2. | 2191 // Don't send missing packet 2. |
2198 ProcessFecProtectedPacket(3, false, !kEntropyFlag); | 2192 ProcessFecProtectedPacket(3, false, !kEntropyFlag); |
2199 ProcessFecPacket(4, 1, true, kEntropyFlag, NULL); | 2193 ProcessFecPacket(4, 1, true, kEntropyFlag, NULL); |
2200 // Ensure QUIC no longer revives entropy for lost packets. | 2194 // Ensure QUIC no longer revives entropy for lost packets. |
2201 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); | 2195 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); |
2202 EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 4)); | 2196 EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 4)); |
2203 } | 2197 } |
2204 | 2198 |
2205 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacket) { | 2199 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacket) { |
2206 if (version() < QUIC_VERSION_15) { | |
2207 return; | |
2208 } | |
2209 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2200 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2210 | 2201 |
2211 // Don't send missing packet 1. | 2202 // Don't send missing packet 1. |
2212 ProcessFecPacket(3, 1, false, !kEntropyFlag, NULL); | 2203 ProcessFecPacket(3, 1, false, !kEntropyFlag, NULL); |
2213 // Out of order. | 2204 // Out of order. |
2214 ProcessFecProtectedPacket(2, true, !kEntropyFlag); | 2205 ProcessFecProtectedPacket(2, true, !kEntropyFlag); |
2215 // Entropy flag should be false, so entropy should be 0. | 2206 // Entropy flag should be false, so entropy should be 0. |
2216 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); | 2207 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); |
2217 } | 2208 } |
2218 | 2209 |
2219 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPackets) { | 2210 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPackets) { |
2220 if (version() < QUIC_VERSION_15) { | |
2221 return; | |
2222 } | |
2223 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2211 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2224 | 2212 |
2225 ProcessFecProtectedPacket(1, false, !kEntropyFlag); | 2213 ProcessFecProtectedPacket(1, false, !kEntropyFlag); |
2226 // Don't send missing packet 2. | 2214 // Don't send missing packet 2. |
2227 ProcessFecPacket(6, 1, false, kEntropyFlag, NULL); | 2215 ProcessFecPacket(6, 1, false, kEntropyFlag, NULL); |
2228 ProcessFecProtectedPacket(3, false, kEntropyFlag); | 2216 ProcessFecProtectedPacket(3, false, kEntropyFlag); |
2229 ProcessFecProtectedPacket(4, false, kEntropyFlag); | 2217 ProcessFecProtectedPacket(4, false, kEntropyFlag); |
2230 ProcessFecProtectedPacket(5, true, !kEntropyFlag); | 2218 ProcessFecProtectedPacket(5, true, !kEntropyFlag); |
2231 // Ensure entropy is not revived for the missing packet. | 2219 // Ensure entropy is not revived for the missing packet. |
2232 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); | 2220 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2541 | 2529 |
2542 TEST_P(QuicConnectionTest, CloseFecGroup) { | 2530 TEST_P(QuicConnectionTest, CloseFecGroup) { |
2543 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2531 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2544 // Don't send missing packet 1. | 2532 // Don't send missing packet 1. |
2545 // Don't send missing packet 2. | 2533 // Don't send missing packet 2. |
2546 ProcessFecProtectedPacket(3, false, !kEntropyFlag); | 2534 ProcessFecProtectedPacket(3, false, !kEntropyFlag); |
2547 // Don't send missing FEC packet 3. | 2535 // Don't send missing FEC packet 3. |
2548 ASSERT_EQ(1u, connection_.NumFecGroups()); | 2536 ASSERT_EQ(1u, connection_.NumFecGroups()); |
2549 | 2537 |
2550 // Now send non-fec protected ack packet and close the group. | 2538 // Now send non-fec protected ack packet and close the group. |
2551 creator_.set_sequence_number(4); | 2539 peer_creator_.set_sequence_number(4); |
2552 if (version() > QUIC_VERSION_15) { | 2540 if (version() > QUIC_VERSION_15) { |
2553 QuicStopWaitingFrame frame = InitStopWaitingFrame(5); | 2541 QuicStopWaitingFrame frame = InitStopWaitingFrame(5); |
2554 ProcessStopWaitingPacket(&frame); | 2542 ProcessStopWaitingPacket(&frame); |
2555 } else { | 2543 } else { |
2556 QuicAckFrame frame = InitAckFrame(0, 5); | 2544 QuicAckFrame frame = InitAckFrame(0, 5); |
2557 ProcessAckPacket(&frame); | 2545 ProcessAckPacket(&frame); |
2558 } | 2546 } |
2559 ASSERT_EQ(0u, connection_.NumFecGroups()); | 2547 ASSERT_EQ(0u, connection_.NumFecGroups()); |
2560 } | 2548 } |
2561 | 2549 |
(...skipping 16 matching lines...) Expand all Loading... |
2578 } | 2566 } |
2579 | 2567 |
2580 TEST_P(QuicConnectionTest, UpdateQuicCongestionFeedbackFrame) { | 2568 TEST_P(QuicConnectionTest, UpdateQuicCongestionFeedbackFrame) { |
2581 SendAckPacketToPeer(); | 2569 SendAckPacketToPeer(); |
2582 EXPECT_CALL(*receive_algorithm_, RecordIncomingPacket(_, _, _)); | 2570 EXPECT_CALL(*receive_algorithm_, RecordIncomingPacket(_, _, _)); |
2583 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2571 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2584 ProcessPacket(1); | 2572 ProcessPacket(1); |
2585 } | 2573 } |
2586 | 2574 |
2587 TEST_P(QuicConnectionTest, DontUpdateQuicCongestionFeedbackFrameForRevived) { | 2575 TEST_P(QuicConnectionTest, DontUpdateQuicCongestionFeedbackFrameForRevived) { |
2588 if (version() < QUIC_VERSION_15) { | |
2589 return; | |
2590 } | |
2591 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2576 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2592 SendAckPacketToPeer(); | 2577 SendAckPacketToPeer(); |
2593 // Process an FEC packet, and revive the missing data packet | 2578 // Process an FEC packet, and revive the missing data packet |
2594 // but only contact the receive_algorithm once. | 2579 // but only contact the receive_algorithm once. |
2595 EXPECT_CALL(*receive_algorithm_, RecordIncomingPacket(_, _, _)); | 2580 EXPECT_CALL(*receive_algorithm_, RecordIncomingPacket(_, _, _)); |
2596 ProcessFecPacket(2, 1, true, !kEntropyFlag, NULL); | 2581 ProcessFecPacket(2, 1, true, !kEntropyFlag, NULL); |
2597 } | 2582 } |
2598 | 2583 |
2599 TEST_P(QuicConnectionTest, InitialTimeout) { | 2584 TEST_P(QuicConnectionTest, InitialTimeout) { |
2600 EXPECT_TRUE(connection_.connected()); | 2585 EXPECT_TRUE(connection_.connected()); |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2752 EXPECT_CALL(*send_algorithm_, | 2737 EXPECT_CALL(*send_algorithm_, |
2753 TimeUntilSend(_, _, _)).WillRepeatedly( | 2738 TimeUntilSend(_, _, _)).WillRepeatedly( |
2754 testing::Return(QuicTime::Delta::Zero())); | 2739 testing::Return(QuicTime::Delta::Zero())); |
2755 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1)); | 2740 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1)); |
2756 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 2741 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
2757 connection_.GetSendAlarm()->Fire(); | 2742 connection_.GetSendAlarm()->Fire(); |
2758 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 2743 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
2759 } | 2744 } |
2760 | 2745 |
2761 TEST_P(QuicConnectionTest, SendSchedulerDelayThenRetransmit) { | 2746 TEST_P(QuicConnectionTest, SendSchedulerDelayThenRetransmit) { |
2762 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)) | 2747 CongestionUnblockWrites(); |
2763 .WillRepeatedly(testing::Return(QuicTime::Delta::Zero())); | |
2764 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)); | 2748 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)); |
2765 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); | 2749 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); |
2766 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 2750 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
2767 // Advance the time for retransmission of lost packet. | 2751 // Advance the time for retransmission of lost packet. |
2768 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(501)); | 2752 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(501)); |
2769 // Test that if we send a retransmit with a delay, it ends up queued in the | 2753 // Test that if we send a retransmit with a delay, it ends up queued in the |
2770 // sent packet manager, but not yet serialized. | 2754 // sent packet manager, but not yet serialized. |
2771 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 2755 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
2772 EXPECT_CALL(*send_algorithm_, | 2756 CongestionBlockWrites(); |
2773 TimeUntilSend(_, _, _)).WillOnce( | |
2774 testing::Return(QuicTime::Delta::FromMicroseconds(1))); | |
2775 connection_.GetRetransmissionAlarm()->Fire(); | 2757 connection_.GetRetransmissionAlarm()->Fire(); |
2776 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 2758 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
2777 | 2759 |
2778 // Advance the clock to fire the alarm, and configure the scheduler | 2760 // Advance the clock to fire the alarm, and configure the scheduler |
2779 // to permit the packet to be sent. | 2761 // to permit the packet to be sent. |
2780 EXPECT_CALL(*send_algorithm_, | 2762 CongestionUnblockWrites(); |
2781 TimeUntilSend(_, _, _)).Times(3). | |
2782 WillRepeatedly(testing::Return(QuicTime::Delta::Zero())); | |
2783 | 2763 |
2784 // Ensure the scheduler is notified this is a retransmit. | 2764 // Ensure the scheduler is notified this is a retransmit. |
2785 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 2765 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
2786 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1)); | 2766 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1)); |
2787 connection_.GetSendAlarm()->Fire(); | 2767 connection_.GetSendAlarm()->Fire(); |
2788 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 2768 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
2789 } | 2769 } |
2790 | 2770 |
2791 TEST_P(QuicConnectionTest, SendSchedulerDelayAndQueue) { | 2771 TEST_P(QuicConnectionTest, SendSchedulerDelayAndQueue) { |
2792 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | 2772 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2847 testing::Return(QuicTime::Delta::FromMicroseconds(1))); | 2827 testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
2848 ProcessAckPacket(&frame); | 2828 ProcessAckPacket(&frame); |
2849 | 2829 |
2850 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 2830 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
2851 } | 2831 } |
2852 | 2832 |
2853 TEST_P(QuicConnectionTest, SendSchedulerDelayThenOnCanWrite) { | 2833 TEST_P(QuicConnectionTest, SendSchedulerDelayThenOnCanWrite) { |
2854 // TODO(ianswett): This test is unrealistic, because we would not serialize | 2834 // TODO(ianswett): This test is unrealistic, because we would not serialize |
2855 // new data if the send algorithm said not to. | 2835 // new data if the send algorithm said not to. |
2856 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); | 2836 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
2857 EXPECT_CALL(*send_algorithm_, | 2837 CongestionBlockWrites(); |
2858 TimeUntilSend(_, _, _)).WillOnce( | |
2859 testing::Return(QuicTime::Delta::FromMicroseconds(10))); | |
2860 connection_.SendPacket( | 2838 connection_.SendPacket( |
2861 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | 2839 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
2862 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 2840 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
2863 | 2841 |
2864 // OnCanWrite should send the packet, because it won't consult the send | 2842 // OnCanWrite should send the packet, because it won't consult the send |
2865 // algorithm for queued packets. | 2843 // algorithm for queued packets. |
2866 connection_.OnCanWrite(); | 2844 connection_.OnCanWrite(); |
2867 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 2845 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
2868 } | 2846 } |
2869 | 2847 |
2870 TEST_P(QuicConnectionTest, TestQueueLimitsOnSendStreamData) { | 2848 TEST_P(QuicConnectionTest, TestQueueLimitsOnSendStreamData) { |
2871 // All packets carry version info till version is negotiated. | 2849 // All packets carry version info till version is negotiated. |
2872 size_t payload_length; | 2850 size_t payload_length; |
2873 connection_.options()->max_packet_length = | 2851 size_t length = GetPacketLengthForOneStream( |
2874 GetPacketLengthForOneStream( | 2852 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, |
2875 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, | 2853 NOT_IN_FEC_GROUP, &payload_length); |
2876 NOT_IN_FEC_GROUP, &payload_length); | 2854 QuicConnectionPeer::GetPacketCreator(&connection_)->set_max_packet_length( |
| 2855 length); |
2877 | 2856 |
2878 // Queue the first packet. | 2857 // Queue the first packet. |
2879 EXPECT_CALL(*send_algorithm_, | 2858 EXPECT_CALL(*send_algorithm_, |
2880 TimeUntilSend(_, _, _)).WillOnce( | 2859 TimeUntilSend(_, _, _)).WillOnce( |
2881 testing::Return(QuicTime::Delta::FromMicroseconds(10))); | 2860 testing::Return(QuicTime::Delta::FromMicroseconds(10))); |
2882 const string payload(payload_length, 'a'); | 2861 const string payload(payload_length, 'a'); |
2883 EXPECT_EQ(0u, | 2862 EXPECT_EQ(0u, |
2884 connection_.SendStreamDataWithString(3, payload, 0, | 2863 connection_.SendStreamDataWithString(3, payload, 0, |
2885 !kFin, NULL).bytes_consumed); | 2864 !kFin, NULL).bytes_consumed); |
2886 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 2865 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
2887 } | 2866 } |
2888 | 2867 |
2889 TEST_P(QuicConnectionTest, LoopThroughSendingPackets) { | 2868 TEST_P(QuicConnectionTest, LoopThroughSendingPackets) { |
2890 // All packets carry version info till version is negotiated. | 2869 // All packets carry version info till version is negotiated. |
2891 size_t payload_length; | 2870 size_t payload_length; |
2892 // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining | 2871 // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining |
2893 // packet length. The size of the offset field in a stream frame is 0 for | 2872 // packet length. The size of the offset field in a stream frame is 0 for |
2894 // offset 0, and 2 for non-zero offsets up through 16K. Increase | 2873 // offset 0, and 2 for non-zero offsets up through 16K. Increase |
2895 // max_packet_length by 2 so that subsequent packets containing subsequent | 2874 // max_packet_length by 2 so that subsequent packets containing subsequent |
2896 // stream frames with non-zero offets will fit within the packet length. | 2875 // stream frames with non-zero offets will fit within the packet length. |
2897 connection_.options()->max_packet_length = 2 + GetPacketLengthForOneStream( | 2876 size_t length = 2 + GetPacketLengthForOneStream( |
2898 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, | 2877 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, |
2899 NOT_IN_FEC_GROUP, &payload_length); | 2878 NOT_IN_FEC_GROUP, &payload_length); |
| 2879 QuicConnectionPeer::GetPacketCreator(&connection_)->set_max_packet_length( |
| 2880 length); |
2900 | 2881 |
2901 // Queue the first packet. | 2882 // Queue the first packet. |
2902 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(7); | 2883 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(7); |
2903 // The first stream frame will have 2 fewer overhead bytes than the other six. | 2884 // The first stream frame will have 2 fewer overhead bytes than the other six. |
2904 const string payload(payload_length * 7 + 2, 'a'); | 2885 const string payload(payload_length * 7 + 2, 'a'); |
2905 EXPECT_EQ(payload.size(), | 2886 EXPECT_EQ(payload.size(), |
2906 connection_.SendStreamDataWithString(1, payload, 0, | 2887 connection_.SendStreamDataWithString(1, payload, 0, |
2907 !kFin, NULL).bytes_consumed); | 2888 !kFin, NULL).bytes_consumed); |
2908 } | 2889 } |
2909 | 2890 |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3153 QuicEncryptedPacket encrypted(NULL, 0); | 3134 QuicEncryptedPacket encrypted(NULL, 0); |
3154 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), encrypted); | 3135 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), encrypted); |
3155 // The connection close packet should have error details. | 3136 // The connection close packet should have error details. |
3156 ASSERT_FALSE(writer_->connection_close_frames().empty()); | 3137 ASSERT_FALSE(writer_->connection_close_frames().empty()); |
3157 EXPECT_EQ("Unable to read public flags.", | 3138 EXPECT_EQ("Unable to read public flags.", |
3158 writer_->connection_close_frames()[0].error_details); | 3139 writer_->connection_close_frames()[0].error_details); |
3159 } | 3140 } |
3160 | 3141 |
3161 TEST_P(QuicConnectionTest, MissingPacketsBeforeLeastUnacked) { | 3142 TEST_P(QuicConnectionTest, MissingPacketsBeforeLeastUnacked) { |
3162 // Set the sequence number of the ack packet to be least unacked (4). | 3143 // Set the sequence number of the ack packet to be least unacked (4). |
3163 creator_.set_sequence_number(3); | 3144 peer_creator_.set_sequence_number(3); |
3164 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3145 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
3165 if (version() > QUIC_VERSION_15) { | 3146 if (version() > QUIC_VERSION_15) { |
3166 QuicStopWaitingFrame frame = InitStopWaitingFrame(4); | 3147 QuicStopWaitingFrame frame = InitStopWaitingFrame(4); |
3167 ProcessStopWaitingPacket(&frame); | 3148 ProcessStopWaitingPacket(&frame); |
3168 } else { | 3149 } else { |
3169 QuicAckFrame ack = InitAckFrame(0, 4); | 3150 QuicAckFrame ack = InitAckFrame(0, 4); |
3170 ProcessAckPacket(&ack); | 3151 ProcessAckPacket(&ack); |
3171 } | 3152 } |
3172 EXPECT_TRUE(outgoing_ack()->received_info.missing_packets.empty()); | 3153 EXPECT_TRUE(outgoing_ack()->received_info.missing_packets.empty()); |
3173 } | 3154 } |
3174 | 3155 |
3175 TEST_P(QuicConnectionTest, ReceivedEntropyHashCalculation) { | 3156 TEST_P(QuicConnectionTest, ReceivedEntropyHashCalculation) { |
3176 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1)); | 3157 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1)); |
3177 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3158 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
3178 ProcessDataPacket(1, 1, kEntropyFlag); | 3159 ProcessDataPacket(1, 1, kEntropyFlag); |
3179 ProcessDataPacket(4, 1, kEntropyFlag); | 3160 ProcessDataPacket(4, 1, kEntropyFlag); |
3180 ProcessDataPacket(3, 1, !kEntropyFlag); | 3161 ProcessDataPacket(3, 1, !kEntropyFlag); |
3181 ProcessDataPacket(7, 1, kEntropyFlag); | 3162 ProcessDataPacket(7, 1, kEntropyFlag); |
3182 EXPECT_EQ(146u, outgoing_ack()->received_info.entropy_hash); | 3163 EXPECT_EQ(146u, outgoing_ack()->received_info.entropy_hash); |
3183 } | 3164 } |
3184 | 3165 |
3185 TEST_P(QuicConnectionTest, ReceivedEntropyHashCalculationHalfFEC) { | 3166 TEST_P(QuicConnectionTest, ReceivedEntropyHashCalculationHalfFEC) { |
3186 if (version() < QUIC_VERSION_15) { | |
3187 return; | |
3188 } | |
3189 // FEC packets should not change the entropy hash calculation. | 3167 // FEC packets should not change the entropy hash calculation. |
3190 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1)); | 3168 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1)); |
3191 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3169 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
3192 ProcessDataPacket(1, 1, kEntropyFlag); | 3170 ProcessDataPacket(1, 1, kEntropyFlag); |
3193 ProcessFecPacket(4, 1, false, kEntropyFlag, NULL); | 3171 ProcessFecPacket(4, 1, false, kEntropyFlag, NULL); |
3194 ProcessDataPacket(3, 3, !kEntropyFlag); | 3172 ProcessDataPacket(3, 3, !kEntropyFlag); |
3195 ProcessFecPacket(7, 3, false, kEntropyFlag, NULL); | 3173 ProcessFecPacket(7, 3, false, kEntropyFlag, NULL); |
3196 EXPECT_EQ(146u, outgoing_ack()->received_info.entropy_hash); | 3174 EXPECT_EQ(146u, outgoing_ack()->received_info.entropy_hash); |
3197 } | 3175 } |
3198 | 3176 |
3199 TEST_P(QuicConnectionTest, UpdateEntropyForReceivedPackets) { | 3177 TEST_P(QuicConnectionTest, UpdateEntropyForReceivedPackets) { |
3200 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1)); | 3178 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1)); |
3201 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3179 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
3202 ProcessDataPacket(1, 1, kEntropyFlag); | 3180 ProcessDataPacket(1, 1, kEntropyFlag); |
3203 ProcessDataPacket(5, 1, kEntropyFlag); | 3181 ProcessDataPacket(5, 1, kEntropyFlag); |
3204 ProcessDataPacket(4, 1, !kEntropyFlag); | 3182 ProcessDataPacket(4, 1, !kEntropyFlag); |
3205 EXPECT_EQ(34u, outgoing_ack()->received_info.entropy_hash); | 3183 EXPECT_EQ(34u, outgoing_ack()->received_info.entropy_hash); |
3206 // Make 4th packet my least unacked, and update entropy for 2, 3 packets. | 3184 // Make 4th packet my least unacked, and update entropy for 2, 3 packets. |
3207 creator_.set_sequence_number(5); | 3185 peer_creator_.set_sequence_number(5); |
3208 QuicPacketEntropyHash six_packet_entropy_hash = 0; | 3186 QuicPacketEntropyHash six_packet_entropy_hash = 0; |
3209 QuicPacketEntropyHash kRandomEntropyHash = 129u; | 3187 QuicPacketEntropyHash kRandomEntropyHash = 129u; |
3210 if (version() > QUIC_VERSION_15) { | 3188 if (version() > QUIC_VERSION_15) { |
3211 QuicStopWaitingFrame frame = InitStopWaitingFrame(4); | 3189 QuicStopWaitingFrame frame = InitStopWaitingFrame(4); |
3212 frame.entropy_hash = kRandomEntropyHash; | 3190 frame.entropy_hash = kRandomEntropyHash; |
3213 if (ProcessStopWaitingPacket(&frame)) { | 3191 if (ProcessStopWaitingPacket(&frame)) { |
3214 six_packet_entropy_hash = 1 << 6; | 3192 six_packet_entropy_hash = 1 << 6; |
3215 } | 3193 } |
3216 } else { | 3194 } else { |
3217 QuicAckFrame ack = InitAckFrame(0, 4); | 3195 QuicAckFrame ack = InitAckFrame(0, 4); |
3218 ack.sent_info.entropy_hash = kRandomEntropyHash; | 3196 ack.sent_info.entropy_hash = kRandomEntropyHash; |
3219 if (ProcessAckPacket(&ack)) { | 3197 if (ProcessAckPacket(&ack)) { |
3220 six_packet_entropy_hash = 1 << 6; | 3198 six_packet_entropy_hash = 1 << 6; |
3221 } | 3199 } |
3222 } | 3200 } |
3223 | 3201 |
3224 EXPECT_EQ((kRandomEntropyHash + (1 << 5) + six_packet_entropy_hash), | 3202 EXPECT_EQ((kRandomEntropyHash + (1 << 5) + six_packet_entropy_hash), |
3225 outgoing_ack()->received_info.entropy_hash); | 3203 outgoing_ack()->received_info.entropy_hash); |
3226 } | 3204 } |
3227 | 3205 |
3228 TEST_P(QuicConnectionTest, UpdateEntropyHashUptoCurrentPacket) { | 3206 TEST_P(QuicConnectionTest, UpdateEntropyHashUptoCurrentPacket) { |
3229 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1)); | 3207 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1)); |
3230 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3208 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
3231 ProcessDataPacket(1, 1, kEntropyFlag); | 3209 ProcessDataPacket(1, 1, kEntropyFlag); |
3232 ProcessDataPacket(5, 1, !kEntropyFlag); | 3210 ProcessDataPacket(5, 1, !kEntropyFlag); |
3233 ProcessDataPacket(22, 1, kEntropyFlag); | 3211 ProcessDataPacket(22, 1, kEntropyFlag); |
3234 EXPECT_EQ(66u, outgoing_ack()->received_info.entropy_hash); | 3212 EXPECT_EQ(66u, outgoing_ack()->received_info.entropy_hash); |
3235 creator_.set_sequence_number(22); | 3213 peer_creator_.set_sequence_number(22); |
3236 QuicPacketEntropyHash kRandomEntropyHash = 85u; | 3214 QuicPacketEntropyHash kRandomEntropyHash = 85u; |
3237 // Current packet is the least unacked packet. | 3215 // Current packet is the least unacked packet. |
3238 QuicPacketEntropyHash ack_entropy_hash; | 3216 QuicPacketEntropyHash ack_entropy_hash; |
3239 if (version() > QUIC_VERSION_15) { | 3217 if (version() > QUIC_VERSION_15) { |
3240 QuicStopWaitingFrame frame = InitStopWaitingFrame(23); | 3218 QuicStopWaitingFrame frame = InitStopWaitingFrame(23); |
3241 frame.entropy_hash = kRandomEntropyHash; | 3219 frame.entropy_hash = kRandomEntropyHash; |
3242 ack_entropy_hash = ProcessStopWaitingPacket(&frame); | 3220 ack_entropy_hash = ProcessStopWaitingPacket(&frame); |
3243 } else { | 3221 } else { |
3244 QuicAckFrame ack = InitAckFrame(0, 23); | 3222 QuicAckFrame ack = InitAckFrame(0, 23); |
3245 ack.sent_info.entropy_hash = kRandomEntropyHash; | 3223 ack.sent_info.entropy_hash = kRandomEntropyHash; |
(...skipping 25 matching lines...) Expand all Loading... |
3271 } | 3249 } |
3272 ProcessDataPacket(i, 1, entropy_flag); | 3250 ProcessDataPacket(i, 1, entropy_flag); |
3273 } | 3251 } |
3274 for (int i = 1; i < 50; ++i) { | 3252 for (int i = 1; i < 50; ++i) { |
3275 EXPECT_EQ(entropy[i], QuicConnectionPeer::ReceivedEntropyHash( | 3253 EXPECT_EQ(entropy[i], QuicConnectionPeer::ReceivedEntropyHash( |
3276 &connection_, i)); | 3254 &connection_, i)); |
3277 } | 3255 } |
3278 } | 3256 } |
3279 | 3257 |
3280 TEST_P(QuicConnectionTest, CheckSentEntropyHash) { | 3258 TEST_P(QuicConnectionTest, CheckSentEntropyHash) { |
3281 creator_.set_sequence_number(1); | 3259 peer_creator_.set_sequence_number(1); |
3282 SequenceNumberSet missing_packets; | 3260 SequenceNumberSet missing_packets; |
3283 QuicPacketEntropyHash entropy_hash = 0; | 3261 QuicPacketEntropyHash entropy_hash = 0; |
3284 QuicPacketSequenceNumber max_sequence_number = 51; | 3262 QuicPacketSequenceNumber max_sequence_number = 51; |
3285 for (QuicPacketSequenceNumber i = 1; i <= max_sequence_number; ++i) { | 3263 for (QuicPacketSequenceNumber i = 1; i <= max_sequence_number; ++i) { |
3286 bool is_missing = i % 10 != 0; | 3264 bool is_missing = i % 10 != 0; |
3287 bool entropy_flag = (i & (i - 1)) != 0; | 3265 bool entropy_flag = (i & (i - 1)) != 0; |
3288 QuicPacketEntropyHash packet_entropy_hash = 0; | 3266 QuicPacketEntropyHash packet_entropy_hash = 0; |
3289 if (entropy_flag) { | 3267 if (entropy_flag) { |
3290 packet_entropy_hash = 1 << (i % 8); | 3268 packet_entropy_hash = 1 << (i % 8); |
3291 } | 3269 } |
(...skipping 24 matching lines...) Expand all Loading... |
3316 header.public_header.version_flag = true; | 3294 header.public_header.version_flag = true; |
3317 header.entropy_flag = false; | 3295 header.entropy_flag = false; |
3318 header.fec_flag = false; | 3296 header.fec_flag = false; |
3319 header.packet_sequence_number = 12; | 3297 header.packet_sequence_number = 12; |
3320 header.fec_group = 0; | 3298 header.fec_group = 0; |
3321 | 3299 |
3322 QuicFrames frames; | 3300 QuicFrames frames; |
3323 QuicFrame frame(&frame1_); | 3301 QuicFrame frame(&frame1_); |
3324 frames.push_back(frame); | 3302 frames.push_back(frame); |
3325 scoped_ptr<QuicPacket> packet( | 3303 scoped_ptr<QuicPacket> packet( |
3326 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3304 BuildUnsizedDataPacket(&framer_, header, frames).packet); |
3327 scoped_ptr<QuicEncryptedPacket> encrypted( | 3305 scoped_ptr<QuicEncryptedPacket> encrypted( |
3328 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); | 3306 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); |
3329 | 3307 |
3330 framer_.set_version(version()); | 3308 framer_.set_version(version()); |
3331 connection_.set_is_server(true); | 3309 connection_.set_is_server(true); |
3332 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 3310 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
3333 EXPECT_TRUE(writer_->version_negotiation_packet() != NULL); | 3311 EXPECT_TRUE(writer_->version_negotiation_packet() != NULL); |
3334 | 3312 |
3335 size_t num_versions = arraysize(kSupportedQuicVersions); | 3313 size_t num_versions = arraysize(kSupportedQuicVersions); |
3336 ASSERT_EQ(num_versions, | 3314 ASSERT_EQ(num_versions, |
(...skipping 17 matching lines...) Expand all Loading... |
3354 header.public_header.version_flag = true; | 3332 header.public_header.version_flag = true; |
3355 header.entropy_flag = false; | 3333 header.entropy_flag = false; |
3356 header.fec_flag = false; | 3334 header.fec_flag = false; |
3357 header.packet_sequence_number = 12; | 3335 header.packet_sequence_number = 12; |
3358 header.fec_group = 0; | 3336 header.fec_group = 0; |
3359 | 3337 |
3360 QuicFrames frames; | 3338 QuicFrames frames; |
3361 QuicFrame frame(&frame1_); | 3339 QuicFrame frame(&frame1_); |
3362 frames.push_back(frame); | 3340 frames.push_back(frame); |
3363 scoped_ptr<QuicPacket> packet( | 3341 scoped_ptr<QuicPacket> packet( |
3364 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3342 BuildUnsizedDataPacket(&framer_, header, frames).packet); |
3365 scoped_ptr<QuicEncryptedPacket> encrypted( | 3343 scoped_ptr<QuicEncryptedPacket> encrypted( |
3366 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); | 3344 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); |
3367 | 3345 |
3368 framer_.set_version(version()); | 3346 framer_.set_version(version()); |
3369 connection_.set_is_server(true); | 3347 connection_.set_is_server(true); |
3370 BlockOnNextWrite(); | 3348 BlockOnNextWrite(); |
3371 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 3349 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
3372 EXPECT_EQ(0u, writer_->last_packet_size()); | 3350 EXPECT_EQ(0u, writer_->last_packet_size()); |
3373 EXPECT_TRUE(connection_.HasQueuedData()); | 3351 EXPECT_TRUE(connection_.HasQueuedData()); |
3374 | 3352 |
(...skipping 24 matching lines...) Expand all Loading... |
3399 header.public_header.version_flag = true; | 3377 header.public_header.version_flag = true; |
3400 header.entropy_flag = false; | 3378 header.entropy_flag = false; |
3401 header.fec_flag = false; | 3379 header.fec_flag = false; |
3402 header.packet_sequence_number = 12; | 3380 header.packet_sequence_number = 12; |
3403 header.fec_group = 0; | 3381 header.fec_group = 0; |
3404 | 3382 |
3405 QuicFrames frames; | 3383 QuicFrames frames; |
3406 QuicFrame frame(&frame1_); | 3384 QuicFrame frame(&frame1_); |
3407 frames.push_back(frame); | 3385 frames.push_back(frame); |
3408 scoped_ptr<QuicPacket> packet( | 3386 scoped_ptr<QuicPacket> packet( |
3409 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3387 BuildUnsizedDataPacket(&framer_, header, frames).packet); |
3410 scoped_ptr<QuicEncryptedPacket> encrypted( | 3388 scoped_ptr<QuicEncryptedPacket> encrypted( |
3411 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); | 3389 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); |
3412 | 3390 |
3413 framer_.set_version(version()); | 3391 framer_.set_version(version()); |
3414 connection_.set_is_server(true); | 3392 connection_.set_is_server(true); |
3415 BlockOnNextWrite(); | 3393 BlockOnNextWrite(); |
3416 writer_->set_is_write_blocked_data_buffered(true); | 3394 writer_->set_is_write_blocked_data_buffered(true); |
3417 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 3395 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
3418 EXPECT_EQ(0u, writer_->last_packet_size()); | 3396 EXPECT_EQ(0u, writer_->last_packet_size()); |
3419 EXPECT_FALSE(connection_.HasQueuedData()); | 3397 EXPECT_FALSE(connection_.HasQueuedData()); |
(...skipping 24 matching lines...) Expand all Loading... |
3444 header.public_header, supported_versions)); | 3422 header.public_header, supported_versions)); |
3445 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 3423 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
3446 | 3424 |
3447 // Now force another packet. The connection should transition into | 3425 // Now force another packet. The connection should transition into |
3448 // NEGOTIATED_VERSION state and tell the packet creator to StopSendingVersion. | 3426 // NEGOTIATED_VERSION state and tell the packet creator to StopSendingVersion. |
3449 header.public_header.version_flag = false; | 3427 header.public_header.version_flag = false; |
3450 QuicFrames frames; | 3428 QuicFrames frames; |
3451 QuicFrame frame(&frame1_); | 3429 QuicFrame frame(&frame1_); |
3452 frames.push_back(frame); | 3430 frames.push_back(frame); |
3453 scoped_ptr<QuicPacket> packet( | 3431 scoped_ptr<QuicPacket> packet( |
3454 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3432 BuildUnsizedDataPacket(&framer_, header, frames).packet); |
3455 encrypted.reset(framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); | 3433 encrypted.reset(framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); |
3456 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1); | 3434 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1); |
3457 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3435 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
3458 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 3436 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
3459 | 3437 |
3460 ASSERT_FALSE(QuicPacketCreatorPeer::SendVersionInPacket( | 3438 ASSERT_FALSE(QuicPacketCreatorPeer::SendVersionInPacket( |
3461 QuicConnectionPeer::GetPacketCreator(&connection_))); | 3439 QuicConnectionPeer::GetPacketCreator(&connection_))); |
3462 } | 3440 } |
3463 | 3441 |
3464 TEST_P(QuicConnectionTest, BadVersionNegotiation) { | 3442 TEST_P(QuicConnectionTest, BadVersionNegotiation) { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3525 EXPECT_EQ(3 * first_packet_size + 2 * second_packet_size - kQuicVersionSize, | 3503 EXPECT_EQ(3 * first_packet_size + 2 * second_packet_size - kQuicVersionSize, |
3526 stats.bytes_sent); | 3504 stats.bytes_sent); |
3527 EXPECT_EQ(5u, stats.packets_sent); | 3505 EXPECT_EQ(5u, stats.packets_sent); |
3528 EXPECT_EQ(2 * first_packet_size + second_packet_size - kQuicVersionSize, | 3506 EXPECT_EQ(2 * first_packet_size + second_packet_size - kQuicVersionSize, |
3529 stats.bytes_retransmitted); | 3507 stats.bytes_retransmitted); |
3530 EXPECT_EQ(3u, stats.packets_retransmitted); | 3508 EXPECT_EQ(3u, stats.packets_retransmitted); |
3531 EXPECT_EQ(1u, stats.rto_count); | 3509 EXPECT_EQ(1u, stats.rto_count); |
3532 } | 3510 } |
3533 | 3511 |
3534 TEST_P(QuicConnectionTest, CheckReceiveStats) { | 3512 TEST_P(QuicConnectionTest, CheckReceiveStats) { |
3535 if (version() < QUIC_VERSION_15) { | |
3536 return; | |
3537 } | |
3538 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3513 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
3539 | 3514 |
3540 size_t received_bytes = 0; | 3515 size_t received_bytes = 0; |
3541 received_bytes += ProcessFecProtectedPacket(1, false, !kEntropyFlag); | 3516 received_bytes += ProcessFecProtectedPacket(1, false, !kEntropyFlag); |
3542 received_bytes += ProcessFecProtectedPacket(3, false, !kEntropyFlag); | 3517 received_bytes += ProcessFecProtectedPacket(3, false, !kEntropyFlag); |
3543 // Should be counted against dropped packets. | 3518 // Should be counted against dropped packets. |
3544 received_bytes += ProcessDataPacket(3, 1, !kEntropyFlag); | 3519 received_bytes += ProcessDataPacket(3, 1, !kEntropyFlag); |
3545 received_bytes += ProcessFecPacket(4, 1, true, !kEntropyFlag, NULL); | 3520 received_bytes += ProcessFecPacket(4, 1, true, !kEntropyFlag, NULL); |
3546 | 3521 |
3547 EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce( | 3522 EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce( |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3589 | 3564 |
3590 QuicConnectionCloseFrame qccf; | 3565 QuicConnectionCloseFrame qccf; |
3591 qccf.error_code = QUIC_PEER_GOING_AWAY; | 3566 qccf.error_code = QUIC_PEER_GOING_AWAY; |
3592 QuicFrame close_frame(&qccf); | 3567 QuicFrame close_frame(&qccf); |
3593 QuicFrame stream_frame(&frame1_); | 3568 QuicFrame stream_frame(&frame1_); |
3594 | 3569 |
3595 QuicFrames frames; | 3570 QuicFrames frames; |
3596 frames.push_back(stream_frame); | 3571 frames.push_back(stream_frame); |
3597 frames.push_back(close_frame); | 3572 frames.push_back(close_frame); |
3598 scoped_ptr<QuicPacket> packet( | 3573 scoped_ptr<QuicPacket> packet( |
3599 framer_.BuildUnsizedDataPacket(header_, frames).packet); | 3574 BuildUnsizedDataPacket(&framer_, header_, frames).packet); |
3600 EXPECT_TRUE(NULL != packet.get()); | 3575 EXPECT_TRUE(NULL != packet.get()); |
3601 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket( | 3576 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket( |
3602 ENCRYPTION_NONE, 1, *packet)); | 3577 ENCRYPTION_NONE, 1, *packet)); |
3603 | 3578 |
3604 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, true)); | 3579 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, true)); |
3605 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1); | 3580 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1); |
3606 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3581 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
3607 | 3582 |
3608 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 3583 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
3609 } | 3584 } |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3879 ack_header.public_header.connection_id = connection_id_; | 3854 ack_header.public_header.connection_id = connection_id_; |
3880 ack_header.public_header.reset_flag = false; | 3855 ack_header.public_header.reset_flag = false; |
3881 ack_header.public_header.version_flag = false; | 3856 ack_header.public_header.version_flag = false; |
3882 ack_header.entropy_flag = !kEntropyFlag; | 3857 ack_header.entropy_flag = !kEntropyFlag; |
3883 ack_header.fec_flag = true; | 3858 ack_header.fec_flag = true; |
3884 ack_header.packet_sequence_number = 1; | 3859 ack_header.packet_sequence_number = 1; |
3885 ack_header.is_in_fec_group = IN_FEC_GROUP; | 3860 ack_header.is_in_fec_group = IN_FEC_GROUP; |
3886 ack_header.fec_group = 1; | 3861 ack_header.fec_group = 1; |
3887 | 3862 |
3888 QuicPacket* packet = | 3863 QuicPacket* packet = |
3889 framer_.BuildUnsizedDataPacket(ack_header, frames).packet; | 3864 BuildUnsizedDataPacket(&framer_, ack_header, frames).packet; |
3890 | 3865 |
3891 // Take the packet which contains the ACK frame, and construct and deliver an | 3866 // Take the packet which contains the ACK frame, and construct and deliver an |
3892 // FEC packet which allows the ACK packet to be recovered. | 3867 // FEC packet which allows the ACK packet to be recovered. |
3893 ProcessFecPacket(2, 1, true, !kEntropyFlag, packet); | 3868 ProcessFecPacket(2, 1, true, !kEntropyFlag, packet); |
3894 } | 3869 } |
3895 | 3870 |
3896 class MockQuicConnectionDebugVisitor | 3871 class MockQuicConnectionDebugVisitor |
3897 : public QuicConnectionDebugVisitorInterface { | 3872 : public QuicConnectionDebugVisitor { |
3898 public: | 3873 public: |
3899 MOCK_METHOD1(OnFrameAddedToPacket, | 3874 MOCK_METHOD1(OnFrameAddedToPacket, |
3900 void(const QuicFrame&)); | 3875 void(const QuicFrame&)); |
3901 | 3876 |
3902 MOCK_METHOD5(OnPacketSent, | 3877 MOCK_METHOD5(OnPacketSent, |
3903 void(QuicPacketSequenceNumber, | 3878 void(QuicPacketSequenceNumber, |
3904 EncryptionLevel, | 3879 EncryptionLevel, |
3905 TransmissionType, | 3880 TransmissionType, |
3906 const QuicEncryptedPacket&, | 3881 const QuicEncryptedPacket&, |
3907 WriteResult)); | 3882 WriteResult)); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3989 QuicBlockedFrame blocked; | 3964 QuicBlockedFrame blocked; |
3990 blocked.stream_id = 3; | 3965 blocked.stream_id = 3; |
3991 EXPECT_CALL(visitor_, OnBlockedFrames(_)); | 3966 EXPECT_CALL(visitor_, OnBlockedFrames(_)); |
3992 ProcessFramePacket(QuicFrame(&blocked)); | 3967 ProcessFramePacket(QuicFrame(&blocked)); |
3993 EXPECT_TRUE(ack_alarm->IsSet()); | 3968 EXPECT_TRUE(ack_alarm->IsSet()); |
3994 } | 3969 } |
3995 | 3970 |
3996 } // namespace | 3971 } // namespace |
3997 } // namespace test | 3972 } // namespace test |
3998 } // namespace net | 3973 } // namespace net |
OLD | NEW |