Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Side by Side Diff: net/quic/quic_connection_test.cc

Issue 312553003: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_connection_logger.h ('k') | net/quic/quic_crypto_client_stream.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/quic_connection_logger.h ('k') | net/quic/quic_crypto_client_stream.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698