| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/quic_connection.h" | 5 #include "net/quic/quic_connection.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "net/base/net_errors.h" | 9 #include "net/base/net_errors.h" |
| 10 #include "net/quic/congestion_control/receive_algorithm_interface.h" | 10 #include "net/quic/congestion_control/receive_algorithm_interface.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 | 39 |
| 40 namespace net { | 40 namespace net { |
| 41 namespace test { | 41 namespace test { |
| 42 namespace { | 42 namespace { |
| 43 | 43 |
| 44 const char data1[] = "foo"; | 44 const char data1[] = "foo"; |
| 45 const char data2[] = "bar"; | 45 const char data2[] = "bar"; |
| 46 | 46 |
| 47 const bool kFin = true; | 47 const bool kFin = true; |
| 48 const bool kEntropyFlag = true; | 48 const bool kEntropyFlag = true; |
| 49 const bool kFecEntropyFlag = true; | 49 |
| 50 const QuicPacketEntropyHash kTestEntropyHash = 76; | 50 const QuicPacketEntropyHash kTestEntropyHash = 76; |
| 51 | 51 |
| 52 class TestReceiveAlgorithm : public ReceiveAlgorithmInterface { | 52 class TestReceiveAlgorithm : public ReceiveAlgorithmInterface { |
| 53 public: | 53 public: |
| 54 explicit TestReceiveAlgorithm(QuicCongestionFeedbackFrame* feedback) | 54 explicit TestReceiveAlgorithm(QuicCongestionFeedbackFrame* feedback) |
| 55 : feedback_(feedback) { | 55 : feedback_(feedback) { |
| 56 } | 56 } |
| 57 | 57 |
| 58 bool GenerateCongestionFeedback( | 58 bool GenerateCongestionFeedback( |
| 59 QuicCongestionFeedbackFrame* congestion_feedback) { | 59 QuicCongestionFeedbackFrame* congestion_feedback) { |
| (...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce(DoAll( | 513 EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce(DoAll( |
| 514 SaveArg<2>(&revived_header_), Return(accept_packet_))); | 514 SaveArg<2>(&revived_header_), Return(accept_packet_))); |
| 515 } | 515 } |
| 516 EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce(Return(accept_packet_)) | 516 EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce(Return(accept_packet_)) |
| 517 .RetiresOnSaturation(); | 517 .RetiresOnSaturation(); |
| 518 return ProcessDataPacket(number, 1, entropy_flag); | 518 return ProcessDataPacket(number, 1, entropy_flag); |
| 519 } | 519 } |
| 520 | 520 |
| 521 // Sends an FEC packet that covers the packets that would have been sent. | 521 // Sends an FEC packet that covers the packets that would have been sent. |
| 522 size_t ProcessFecPacket(QuicPacketSequenceNumber number, | 522 size_t ProcessFecPacket(QuicPacketSequenceNumber number, |
| 523 QuicPacketSequenceNumber min_protected_packet, | 523 QuicPacketSequenceNumber min_protected_packet, |
| 524 bool expect_revival, | 524 bool expect_revival, |
| 525 bool fec_entropy_flag) { | 525 bool entropy_flag) { |
| 526 if (expect_revival) { | 526 if (expect_revival) { |
| 527 EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce(DoAll( | 527 EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce(DoAll( |
| 528 SaveArg<2>(&revived_header_), Return(accept_packet_))); | 528 SaveArg<2>(&revived_header_), Return(accept_packet_))); |
| 529 } | 529 } |
| 530 | 530 |
| 531 // Construct the decrypted data packet so we can compute the correct | 531 // Construct the decrypted data packet so we can compute the correct |
| 532 // redundancy. | 532 // redundancy. |
| 533 scoped_ptr<QuicPacket> data_packet(ConstructDataPacket(number, 1, | 533 scoped_ptr<QuicPacket> data_packet(ConstructDataPacket(number, 1, |
| 534 !kEntropyFlag)); | 534 !kEntropyFlag)); |
| 535 | 535 |
| 536 header_.public_header.guid = guid_; | 536 header_.public_header.guid = guid_; |
| 537 header_.public_header.reset_flag = false; | 537 header_.public_header.reset_flag = false; |
| 538 header_.public_header.version_flag = false; | 538 header_.public_header.version_flag = false; |
| 539 header_.entropy_flag = kEntropyFlag; | 539 header_.entropy_flag = entropy_flag; |
| 540 header_.fec_flag = true; | 540 header_.fec_flag = true; |
| 541 header_.fec_entropy_flag = fec_entropy_flag; | |
| 542 header_.packet_sequence_number = number; | 541 header_.packet_sequence_number = number; |
| 542 header_.is_in_fec_group = IN_FEC_GROUP; |
| 543 header_.fec_group = min_protected_packet; | 543 header_.fec_group = min_protected_packet; |
| 544 QuicFecData fec_data; | 544 QuicFecData fec_data; |
| 545 fec_data.fec_group = header_.fec_group; | 545 fec_data.fec_group = header_.fec_group; |
| 546 // Since all data packets in this test have the same payload, the | 546 // Since all data packets in this test have the same payload, the |
| 547 // redundancy is either equal to that payload or the xor of that payload | 547 // redundancy is either equal to that payload or the xor of that payload |
| 548 // with itself, depending on the number of packets. | 548 // with itself, depending on the number of packets. |
| 549 if (((number - min_protected_packet) % 2) == 0) { | 549 if (((number - min_protected_packet) % 2) == 0) { |
| 550 for (size_t i = GetStartOfFecProtectedData( | 550 for (size_t i = GetStartOfFecProtectedData( |
| 551 header_.public_header.guid_length, |
| 551 header_.public_header.version_flag); | 552 header_.public_header.version_flag); |
| 552 i < data_packet->length(); ++i) { | 553 i < data_packet->length(); ++i) { |
| 553 data_packet->mutable_data()[i] ^= data_packet->data()[i]; | 554 data_packet->mutable_data()[i] ^= data_packet->data()[i]; |
| 554 } | 555 } |
| 555 } | 556 } |
| 556 fec_data.redundancy = data_packet->FecProtectedData(); | 557 fec_data.redundancy = data_packet->FecProtectedData(); |
| 557 scoped_ptr<QuicPacket> fec_packet( | 558 scoped_ptr<QuicPacket> fec_packet( |
| 558 framer_.ConstructFecPacket(header_, fec_data).packet); | 559 framer_.ConstructFecPacket(header_, fec_data).packet); |
| 559 scoped_ptr<QuicEncryptedPacket> encrypted( | 560 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 560 framer_.EncryptPacket(ENCRYPTION_NONE, number, *fec_packet)); | 561 framer_.EncryptPacket(ENCRYPTION_NONE, number, *fec_packet)); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 } | 598 } |
| 598 | 599 |
| 599 QuicPacket* ConstructDataPacket(QuicPacketSequenceNumber number, | 600 QuicPacket* ConstructDataPacket(QuicPacketSequenceNumber number, |
| 600 QuicFecGroupNumber fec_group, | 601 QuicFecGroupNumber fec_group, |
| 601 bool entropy_flag) { | 602 bool entropy_flag) { |
| 602 header_.public_header.guid = guid_; | 603 header_.public_header.guid = guid_; |
| 603 header_.public_header.reset_flag = false; | 604 header_.public_header.reset_flag = false; |
| 604 header_.public_header.version_flag = false; | 605 header_.public_header.version_flag = false; |
| 605 header_.entropy_flag = entropy_flag; | 606 header_.entropy_flag = entropy_flag; |
| 606 header_.fec_flag = false; | 607 header_.fec_flag = false; |
| 607 header_.fec_entropy_flag = false; | |
| 608 header_.packet_sequence_number = number; | 608 header_.packet_sequence_number = number; |
| 609 header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; |
| 609 header_.fec_group = fec_group; | 610 header_.fec_group = fec_group; |
| 610 | 611 |
| 611 QuicFrames frames; | 612 QuicFrames frames; |
| 612 QuicFrame frame(&frame1_); | 613 QuicFrame frame(&frame1_); |
| 613 frames.push_back(frame); | 614 frames.push_back(frame); |
| 614 QuicPacket* packet = | 615 QuicPacket* packet = |
| 615 framer_.ConstructFrameDataPacket(header_, frames).packet; | 616 framer_.ConstructFrameDataPacket(header_, frames).packet; |
| 616 EXPECT_TRUE(packet != NULL); | 617 EXPECT_TRUE(packet != NULL); |
| 617 return packet; | 618 return packet; |
| 618 } | 619 } |
| 619 | 620 |
| 620 QuicPacket* ConstructClosePacket(QuicPacketSequenceNumber number, | 621 QuicPacket* ConstructClosePacket(QuicPacketSequenceNumber number, |
| 621 QuicFecGroupNumber fec_group) { | 622 QuicFecGroupNumber fec_group) { |
| 622 header_.public_header.guid = guid_; | 623 header_.public_header.guid = guid_; |
| 623 header_.packet_sequence_number = number; | 624 header_.packet_sequence_number = number; |
| 624 header_.public_header.reset_flag = false; | 625 header_.public_header.reset_flag = false; |
| 625 header_.public_header.version_flag = false; | 626 header_.public_header.version_flag = false; |
| 626 header_.entropy_flag = false; | 627 header_.entropy_flag = false; |
| 627 header_.fec_flag = false; | 628 header_.fec_flag = false; |
| 628 header_.fec_entropy_flag = false; | 629 header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; |
| 629 header_.fec_group = fec_group; | 630 header_.fec_group = fec_group; |
| 630 | 631 |
| 631 QuicConnectionCloseFrame qccf; | 632 QuicConnectionCloseFrame qccf; |
| 632 qccf.error_code = QUIC_PEER_GOING_AWAY; | 633 qccf.error_code = QUIC_PEER_GOING_AWAY; |
| 633 qccf.ack_frame = QuicAckFrame(0, QuicTime::Zero(), 1); | 634 qccf.ack_frame = QuicAckFrame(0, QuicTime::Zero(), 1); |
| 634 | 635 |
| 635 QuicFrames frames; | 636 QuicFrames frames; |
| 636 QuicFrame frame(&qccf); | 637 QuicFrame frame(&qccf); |
| 637 frames.push_back(frame); | 638 frames.push_back(frame); |
| 638 QuicPacket* packet = | 639 QuicPacket* packet = |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 930 SendStreamDataToPeer(1, "eep", 6, !kFin, &last_packet); // Packet 9 | 931 SendStreamDataToPeer(1, "eep", 6, !kFin, &last_packet); // Packet 9 |
| 931 EXPECT_EQ(9u, last_packet); | 932 EXPECT_EQ(9u, last_packet); |
| 932 SendAckPacketToPeer(); // Packet10 | 933 SendAckPacketToPeer(); // Packet10 |
| 933 EXPECT_EQ(9u, last_ack()->sent_info.least_unacked); | 934 EXPECT_EQ(9u, last_ack()->sent_info.least_unacked); |
| 934 } | 935 } |
| 935 | 936 |
| 936 TEST_F(QuicConnectionTest, FECSending) { | 937 TEST_F(QuicConnectionTest, FECSending) { |
| 937 // Limit to one byte per packet. | 938 // Limit to one byte per packet. |
| 938 // All packets carry version info till version is negotiated. | 939 // All packets carry version info till version is negotiated. |
| 939 connection_.options()->max_packet_length = | 940 connection_.options()->max_packet_length = |
| 940 GetPacketLengthForOneStream(kIncludeVersion, 4); | 941 GetPacketLengthForOneStream(kIncludeVersion, IN_FEC_GROUP, 4); |
| 941 // And send FEC every two packets. | 942 // And send FEC every two packets. |
| 942 connection_.options()->max_packets_per_fec_group = 2; | 943 connection_.options()->max_packets_per_fec_group = 2; |
| 943 | 944 |
| 944 // Send 4 data packets and 2 FEC packets. | 945 // Send 4 data packets and 2 FEC packets. |
| 945 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(6); | 946 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(6); |
| 946 connection_.SendStreamData(1, "foodfoodfoodfood", 0, !kFin); | 947 connection_.SendStreamData(1, "foodfoodfoodfood", 0, !kFin); |
| 947 // Expect the FEC group to be closed after SendStreamData. | 948 // Expect the FEC group to be closed after SendStreamData. |
| 948 EXPECT_FALSE(creator_.ShouldSendFec(true)); | 949 EXPECT_FALSE(creator_.ShouldSendFec(true)); |
| 949 } | 950 } |
| 950 | 951 |
| 951 TEST_F(QuicConnectionTest, FECQueueing) { | 952 TEST_F(QuicConnectionTest, FECQueueing) { |
| 952 // Limit to one byte per packet. | 953 // Limit to one byte per packet. |
| 953 // All packets carry version info till version is negotiated. | 954 // All packets carry version info till version is negotiated. |
| 954 connection_.options()->max_packet_length = | 955 connection_.options()->max_packet_length = |
| 955 GetPacketLengthForOneStream(kIncludeVersion, 4); | 956 GetPacketLengthForOneStream(kIncludeVersion, IN_FEC_GROUP, 4); |
| 956 // And send FEC every two packets. | 957 // And send FEC every two packets. |
| 957 connection_.options()->max_packets_per_fec_group = 2; | 958 connection_.options()->max_packets_per_fec_group = 2; |
| 958 | 959 |
| 959 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 960 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 960 helper_->set_blocked(true); | 961 helper_->set_blocked(true); |
| 961 connection_.SendStreamData(1, "food", 0, !kFin); | 962 connection_.SendStreamData(1, "food", 0, !kFin); |
| 962 EXPECT_FALSE(creator_.ShouldSendFec(true)); | 963 EXPECT_FALSE(creator_.ShouldSendFec(true)); |
| 963 // Expect the first data packet and the fec packet to be queued. | 964 // Expect the first data packet and the fec packet to be queued. |
| 964 EXPECT_EQ(2u, connection_.NumQueuedPackets()); | 965 EXPECT_EQ(2u, connection_.NumQueuedPackets()); |
| 965 } | 966 } |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1271 EXPECT_EQ(3u, last_ack()->sent_info.least_unacked); | 1272 EXPECT_EQ(3u, last_ack()->sent_info.least_unacked); |
| 1272 | 1273 |
| 1273 SendStreamDataToPeer(1, "bar", 3, false, NULL); // Packet 4 | 1274 SendStreamDataToPeer(1, "bar", 3, false, NULL); // Packet 4 |
| 1274 EXPECT_EQ(4u, outgoing_ack()->sent_info.least_unacked); | 1275 EXPECT_EQ(4u, outgoing_ack()->sent_info.least_unacked); |
| 1275 SendAckPacketToPeer(); // Packet 5 | 1276 SendAckPacketToPeer(); // Packet 5 |
| 1276 EXPECT_EQ(4u, last_ack()->sent_info.least_unacked); | 1277 EXPECT_EQ(4u, last_ack()->sent_info.least_unacked); |
| 1277 } | 1278 } |
| 1278 | 1279 |
| 1279 TEST_F(QuicConnectionTest, ReviveMissingPacketAfterFecPacket) { | 1280 TEST_F(QuicConnectionTest, ReviveMissingPacketAfterFecPacket) { |
| 1280 // Don't send missing packet 1. | 1281 // Don't send missing packet 1. |
| 1281 ProcessFecPacket(2, 1, true, !kFecEntropyFlag); | 1282 ProcessFecPacket(2, 1, true, !kEntropyFlag); |
| 1282 EXPECT_FALSE(revived_header_.entropy_flag); | 1283 EXPECT_FALSE(revived_header_.entropy_flag); |
| 1283 } | 1284 } |
| 1284 | 1285 |
| 1285 TEST_F(QuicConnectionTest, ReviveMissingPacketAfterDataPacketThenFecPacket) { | 1286 TEST_F(QuicConnectionTest, ReviveMissingPacketAfterDataPacketThenFecPacket) { |
| 1286 ProcessFecProtectedPacket(1, false, kEntropyFlag); | 1287 ProcessFecProtectedPacket(1, false, kEntropyFlag); |
| 1287 // Don't send missing packet 2. | 1288 // Don't send missing packet 2. |
| 1288 ProcessFecPacket(3, 1, true, !kFecEntropyFlag); | 1289 ProcessFecPacket(3, 1, true, !kEntropyFlag); |
| 1289 EXPECT_TRUE(revived_header_.entropy_flag); | 1290 EXPECT_TRUE(revived_header_.entropy_flag); |
| 1290 } | 1291 } |
| 1291 | 1292 |
| 1292 TEST_F(QuicConnectionTest, ReviveMissingPacketAfterDataPacketsThenFecPacket) { | 1293 TEST_F(QuicConnectionTest, ReviveMissingPacketAfterDataPacketsThenFecPacket) { |
| 1293 ProcessFecProtectedPacket(1, false, !kEntropyFlag); | 1294 ProcessFecProtectedPacket(1, false, !kEntropyFlag); |
| 1294 // Don't send missing packet 2. | 1295 // Don't send missing packet 2. |
| 1295 ProcessFecProtectedPacket(3, false, !kEntropyFlag); | 1296 ProcessFecProtectedPacket(3, false, !kEntropyFlag); |
| 1296 ProcessFecPacket(4, 1, true, kFecEntropyFlag); | 1297 ProcessFecPacket(4, 1, true, kEntropyFlag); |
| 1297 EXPECT_TRUE(revived_header_.entropy_flag); | 1298 EXPECT_TRUE(revived_header_.entropy_flag); |
| 1298 } | 1299 } |
| 1299 | 1300 |
| 1300 TEST_F(QuicConnectionTest, ReviveMissingPacketAfterDataPacket) { | 1301 TEST_F(QuicConnectionTest, ReviveMissingPacketAfterDataPacket) { |
| 1301 // Don't send missing packet 1. | 1302 // Don't send missing packet 1. |
| 1302 ProcessFecPacket(3, 1, false, !kFecEntropyFlag); | 1303 ProcessFecPacket(3, 1, false, !kEntropyFlag); |
| 1303 // out of order | 1304 // out of order |
| 1304 ProcessFecProtectedPacket(2, true, !kEntropyFlag); | 1305 ProcessFecProtectedPacket(2, true, !kEntropyFlag); |
| 1305 EXPECT_FALSE(revived_header_.entropy_flag); | 1306 EXPECT_FALSE(revived_header_.entropy_flag); |
| 1306 } | 1307 } |
| 1307 | 1308 |
| 1308 TEST_F(QuicConnectionTest, ReviveMissingPacketAfterDataPackets) { | 1309 TEST_F(QuicConnectionTest, ReviveMissingPacketAfterDataPackets) { |
| 1309 ProcessFecProtectedPacket(1, false, !kEntropyFlag); | 1310 ProcessFecProtectedPacket(1, false, !kEntropyFlag); |
| 1310 // Don't send missing packet 2. | 1311 // Don't send missing packet 2. |
| 1311 ProcessFecPacket(6, 1, false, kFecEntropyFlag); | 1312 ProcessFecPacket(6, 1, false, kEntropyFlag); |
| 1312 ProcessFecProtectedPacket(3, false, kEntropyFlag); | 1313 ProcessFecProtectedPacket(3, false, kEntropyFlag); |
| 1313 ProcessFecProtectedPacket(4, false, kEntropyFlag); | 1314 ProcessFecProtectedPacket(4, false, kEntropyFlag); |
| 1314 ProcessFecProtectedPacket(5, true, !kEntropyFlag); | 1315 ProcessFecProtectedPacket(5, true, !kEntropyFlag); |
| 1315 EXPECT_TRUE(revived_header_.entropy_flag); | 1316 EXPECT_TRUE(revived_header_.entropy_flag); |
| 1316 } | 1317 } |
| 1317 | 1318 |
| 1318 TEST_F(QuicConnectionTest, TestRetransmit) { | 1319 TEST_F(QuicConnectionTest, TestRetransmit) { |
| 1319 const QuicTime::Delta kDefaultRetransmissionTime = | 1320 const QuicTime::Delta kDefaultRetransmissionTime = |
| 1320 QuicTime::Delta::FromMilliseconds(500); | 1321 QuicTime::Delta::FromMilliseconds(500); |
| 1321 | 1322 |
| (...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1789 // OnCanWrite should not send the packet (because of the delay) | 1790 // OnCanWrite should not send the packet (because of the delay) |
| 1790 // but should still return true. | 1791 // but should still return true. |
| 1791 EXPECT_TRUE(connection_.OnCanWrite()); | 1792 EXPECT_TRUE(connection_.OnCanWrite()); |
| 1792 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 1793 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 1793 } | 1794 } |
| 1794 | 1795 |
| 1795 TEST_F(QuicConnectionTest, TestQueueLimitsOnSendStreamData) { | 1796 TEST_F(QuicConnectionTest, TestQueueLimitsOnSendStreamData) { |
| 1796 // Limit to one byte per packet. | 1797 // Limit to one byte per packet. |
| 1797 // All packets carry version info till version is negotiated. | 1798 // All packets carry version info till version is negotiated. |
| 1798 connection_.options()->max_packet_length = | 1799 connection_.options()->max_packet_length = |
| 1799 GetPacketLengthForOneStream(kIncludeVersion, 4); | 1800 GetPacketLengthForOneStream(kIncludeVersion, NOT_IN_FEC_GROUP, 4); |
| 1800 | 1801 |
| 1801 // Queue the first packet. | 1802 // Queue the first packet. |
| 1802 EXPECT_CALL(*send_algorithm_, | 1803 EXPECT_CALL(*send_algorithm_, |
| 1803 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( | 1804 TimeUntilSend(_, NOT_RETRANSMISSION, _)).WillOnce( |
| 1804 testing::Return(QuicTime::Delta::FromMicroseconds(10))); | 1805 testing::Return(QuicTime::Delta::FromMicroseconds(10))); |
| 1805 EXPECT_EQ(0u, connection_.SendStreamData( | 1806 EXPECT_EQ(0u, connection_.SendStreamData( |
| 1806 1, "EnoughDataToQueue", 0, !kFin).bytes_consumed); | 1807 1, "EnoughDataToQueue", 0, !kFin).bytes_consumed); |
| 1807 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1808 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 1808 } | 1809 } |
| 1809 | 1810 |
| 1810 TEST_F(QuicConnectionTest, LoopThroughSendingPackets) { | 1811 TEST_F(QuicConnectionTest, LoopThroughSendingPackets) { |
| 1811 // Limit to 4 bytes per packet. | 1812 // Limit to 4 bytes per packet. |
| 1812 // All packets carry version info till version is negotiated. | 1813 // All packets carry version info till version is negotiated. |
| 1813 connection_.options()->max_packet_length = | 1814 connection_.options()->max_packet_length = |
| 1814 GetPacketLengthForOneStream(kIncludeVersion, 4); | 1815 GetPacketLengthForOneStream(kIncludeVersion, NOT_IN_FEC_GROUP, 4); |
| 1815 | 1816 |
| 1816 // Queue the first packet. | 1817 // Queue the first packet. |
| 1817 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(7); | 1818 EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(7); |
| 1818 EXPECT_EQ(27u, connection_.SendStreamData( | 1819 EXPECT_EQ(27u, connection_.SendStreamData( |
| 1819 1, "EnoughDataToQueueStreamData", 0, !kFin).bytes_consumed); | 1820 1, "EnoughDataToQueueStreamData", 0, !kFin).bytes_consumed); |
| 1820 } | 1821 } |
| 1821 | 1822 |
| 1822 TEST_F(QuicConnectionTest, NoAckForClose) { | 1823 TEST_F(QuicConnectionTest, NoAckForClose) { |
| 1823 ProcessPacket(1); | 1824 ProcessPacket(1); |
| 1824 EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(0); | 1825 EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(0); |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1973 TEST_F(QuicConnectionTest, SendVersionNegotiationPacket) { | 1974 TEST_F(QuicConnectionTest, SendVersionNegotiationPacket) { |
| 1974 QuicTag kRandomVersion = 143; | 1975 QuicTag kRandomVersion = 143; |
| 1975 QuicFramerPeer::SetVersion(&framer_, kRandomVersion); | 1976 QuicFramerPeer::SetVersion(&framer_, kRandomVersion); |
| 1976 | 1977 |
| 1977 QuicPacketHeader header; | 1978 QuicPacketHeader header; |
| 1978 header.public_header.guid = guid_; | 1979 header.public_header.guid = guid_; |
| 1979 header.public_header.reset_flag = false; | 1980 header.public_header.reset_flag = false; |
| 1980 header.public_header.version_flag = true; | 1981 header.public_header.version_flag = true; |
| 1981 header.entropy_flag = false; | 1982 header.entropy_flag = false; |
| 1982 header.fec_flag = false; | 1983 header.fec_flag = false; |
| 1983 header.fec_entropy_flag = false; | |
| 1984 header.packet_sequence_number = 12; | 1984 header.packet_sequence_number = 12; |
| 1985 header.fec_group = 0; | 1985 header.fec_group = 0; |
| 1986 | 1986 |
| 1987 QuicFrames frames; | 1987 QuicFrames frames; |
| 1988 QuicFrame frame(&frame1_); | 1988 QuicFrame frame(&frame1_); |
| 1989 frames.push_back(frame); | 1989 frames.push_back(frame); |
| 1990 scoped_ptr<QuicPacket> packet( | 1990 scoped_ptr<QuicPacket> packet( |
| 1991 framer_.ConstructFrameDataPacket(header, frames).packet); | 1991 framer_.ConstructFrameDataPacket(header, frames).packet); |
| 1992 scoped_ptr<QuicEncryptedPacket> encrypted( | 1992 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 1993 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); | 1993 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet)); |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2098 } | 2098 } |
| 2099 | 2099 |
| 2100 TEST_F(QuicConnectionTest, DontProcessFramesIfPacketClosedConnection) { | 2100 TEST_F(QuicConnectionTest, DontProcessFramesIfPacketClosedConnection) { |
| 2101 // Construct a packet with stream frame and connection close frame. | 2101 // Construct a packet with stream frame and connection close frame. |
| 2102 header_.public_header.guid = guid_; | 2102 header_.public_header.guid = guid_; |
| 2103 header_.packet_sequence_number = 1; | 2103 header_.packet_sequence_number = 1; |
| 2104 header_.public_header.reset_flag = false; | 2104 header_.public_header.reset_flag = false; |
| 2105 header_.public_header.version_flag = false; | 2105 header_.public_header.version_flag = false; |
| 2106 header_.entropy_flag = false; | 2106 header_.entropy_flag = false; |
| 2107 header_.fec_flag = false; | 2107 header_.fec_flag = false; |
| 2108 header_.fec_entropy_flag = false; | |
| 2109 header_.fec_group = 0; | 2108 header_.fec_group = 0; |
| 2110 | 2109 |
| 2111 QuicConnectionCloseFrame qccf; | 2110 QuicConnectionCloseFrame qccf; |
| 2112 qccf.error_code = QUIC_PEER_GOING_AWAY; | 2111 qccf.error_code = QUIC_PEER_GOING_AWAY; |
| 2113 qccf.ack_frame = QuicAckFrame(0, QuicTime::Zero(), 1); | 2112 qccf.ack_frame = QuicAckFrame(0, QuicTime::Zero(), 1); |
| 2114 QuicFrame close_frame(&qccf); | 2113 QuicFrame close_frame(&qccf); |
| 2115 QuicFrame stream_frame(&frame1_); | 2114 QuicFrame stream_frame(&frame1_); |
| 2116 | 2115 |
| 2117 QuicFrames frames; | 2116 QuicFrames frames; |
| 2118 frames.push_back(stream_frame); | 2117 frames.push_back(stream_frame); |
| 2119 frames.push_back(close_frame); | 2118 frames.push_back(close_frame); |
| 2120 scoped_ptr<QuicPacket> packet( | 2119 scoped_ptr<QuicPacket> packet( |
| 2121 framer_.ConstructFrameDataPacket(header_, frames).packet); | 2120 framer_.ConstructFrameDataPacket(header_, frames).packet); |
| 2122 EXPECT_TRUE(NULL != packet.get()); | 2121 EXPECT_TRUE(NULL != packet.get()); |
| 2123 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket( | 2122 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket( |
| 2124 ENCRYPTION_NONE, 1, *packet)); | 2123 ENCRYPTION_NONE, 1, *packet)); |
| 2125 | 2124 |
| 2126 EXPECT_CALL(visitor_, ConnectionClose(QUIC_PEER_GOING_AWAY, true)); | 2125 EXPECT_CALL(visitor_, ConnectionClose(QUIC_PEER_GOING_AWAY, true)); |
| 2127 EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).Times(0); | 2126 EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).Times(0); |
| 2128 | 2127 |
| 2129 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); | 2128 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
| 2130 } | 2129 } |
| 2131 | 2130 |
| 2132 } // namespace | 2131 } // namespace |
| 2133 } // namespace test | 2132 } // namespace test |
| 2134 } // namespace net | 2133 } // namespace net |
| OLD | NEW |