OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/quic_connection.h" | 5 #include "net/quic/quic_connection.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
11 #include "net/quic/congestion_control/loss_detection_interface.h" | 11 #include "net/quic/congestion_control/loss_detection_interface.h" |
12 #include "net/quic/congestion_control/receive_algorithm_interface.h" | 12 #include "net/quic/congestion_control/receive_algorithm_interface.h" |
13 #include "net/quic/congestion_control/send_algorithm_interface.h" | 13 #include "net/quic/congestion_control/send_algorithm_interface.h" |
14 #include "net/quic/crypto/null_encrypter.h" | 14 #include "net/quic/crypto/null_encrypter.h" |
15 #include "net/quic/crypto/quic_decrypter.h" | 15 #include "net/quic/crypto/quic_decrypter.h" |
16 #include "net/quic/crypto/quic_encrypter.h" | 16 #include "net/quic/crypto/quic_encrypter.h" |
17 #include "net/quic/quic_flags.h" | 17 #include "net/quic/quic_flags.h" |
18 #include "net/quic/quic_protocol.h" | 18 #include "net/quic/quic_protocol.h" |
19 #include "net/quic/quic_utils.h" | 19 #include "net/quic/quic_utils.h" |
20 #include "net/quic/test_tools/mock_clock.h" | 20 #include "net/quic/test_tools/mock_clock.h" |
21 #include "net/quic/test_tools/mock_random.h" | 21 #include "net/quic/test_tools/mock_random.h" |
| 22 #include "net/quic/test_tools/quic_config_peer.h" |
22 #include "net/quic/test_tools/quic_connection_peer.h" | 23 #include "net/quic/test_tools/quic_connection_peer.h" |
23 #include "net/quic/test_tools/quic_framer_peer.h" | 24 #include "net/quic/test_tools/quic_framer_peer.h" |
24 #include "net/quic/test_tools/quic_packet_creator_peer.h" | 25 #include "net/quic/test_tools/quic_packet_creator_peer.h" |
25 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" | 26 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" |
26 #include "net/quic/test_tools/quic_test_utils.h" | 27 #include "net/quic/test_tools/quic_test_utils.h" |
27 #include "net/quic/test_tools/simple_quic_framer.h" | 28 #include "net/quic/test_tools/simple_quic_framer.h" |
28 #include "testing/gmock/include/gmock/gmock.h" | 29 #include "testing/gmock/include/gmock/gmock.h" |
29 #include "testing/gtest/include/gtest/gtest.h" | 30 #include "testing/gtest/include/gtest/gtest.h" |
30 | 31 |
31 using base::StringPiece; | 32 using base::StringPiece; |
(...skipping 1475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1507 // All packets carry version info till version is negotiated. | 1508 // All packets carry version info till version is negotiated. |
1508 QuicPacketCreator* creator = | 1509 QuicPacketCreator* creator = |
1509 QuicConnectionPeer::GetPacketCreator(&connection_); | 1510 QuicConnectionPeer::GetPacketCreator(&connection_); |
1510 size_t payload_length; | 1511 size_t payload_length; |
1511 // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining | 1512 // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining |
1512 // packet length. The size of the offset field in a stream frame is 0 for | 1513 // packet length. The size of the offset field in a stream frame is 0 for |
1513 // offset 0, and 2 for non-zero offsets up through 64K. Increase | 1514 // offset 0, and 2 for non-zero offsets up through 64K. Increase |
1514 // max_packet_length by 2 so that subsequent packets containing subsequent | 1515 // max_packet_length by 2 so that subsequent packets containing subsequent |
1515 // stream frames with non-zero offets will fit within the packet length. | 1516 // stream frames with non-zero offets will fit within the packet length. |
1516 size_t length = 2 + GetPacketLengthForOneStream( | 1517 size_t length = 2 + GetPacketLengthForOneStream( |
1517 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, | 1518 connection_.version(), kIncludeVersion, |
| 1519 PACKET_8BYTE_CONNECTION_ID, PACKET_1BYTE_SEQUENCE_NUMBER, |
1518 IN_FEC_GROUP, &payload_length); | 1520 IN_FEC_GROUP, &payload_length); |
1519 creator->set_max_packet_length(length); | 1521 creator->set_max_packet_length(length); |
1520 | 1522 |
1521 // Send 4 protected data packets, which should also trigger 1 FEC packet. | 1523 // Send 4 protected data packets, which should also trigger 1 FEC packet. |
1522 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(5); | 1524 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(5); |
1523 // The first stream frame will have 2 fewer overhead bytes than the other 3. | 1525 // The first stream frame will have 2 fewer overhead bytes than the other 3. |
1524 const string payload(payload_length * 4 + 2, 'a'); | 1526 const string payload(payload_length * 4 + 2, 'a'); |
1525 connection_.SendStreamDataWithStringWithFec(1, payload, 0, !kFin, nullptr); | 1527 connection_.SendStreamDataWithStringWithFec(1, payload, 0, !kFin, nullptr); |
1526 // Expect the FEC group to be closed after SendStreamDataWithString. | 1528 // Expect the FEC group to be closed after SendStreamDataWithString. |
1527 EXPECT_FALSE(creator->IsFecGroupOpen()); | 1529 EXPECT_FALSE(creator->IsFecGroupOpen()); |
1528 EXPECT_FALSE(creator->IsFecProtected()); | 1530 EXPECT_FALSE(creator->IsFecProtected()); |
1529 } | 1531 } |
1530 | 1532 |
1531 TEST_P(QuicConnectionTest, FECQueueing) { | 1533 TEST_P(QuicConnectionTest, FECQueueing) { |
1532 // All packets carry version info till version is negotiated. | 1534 // All packets carry version info till version is negotiated. |
1533 size_t payload_length; | 1535 size_t payload_length; |
1534 QuicPacketCreator* creator = | 1536 QuicPacketCreator* creator = |
1535 QuicConnectionPeer::GetPacketCreator(&connection_); | 1537 QuicConnectionPeer::GetPacketCreator(&connection_); |
1536 size_t length = GetPacketLengthForOneStream( | 1538 size_t length = GetPacketLengthForOneStream( |
1537 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, | 1539 connection_.version(), kIncludeVersion, |
| 1540 PACKET_8BYTE_CONNECTION_ID, PACKET_1BYTE_SEQUENCE_NUMBER, |
1538 IN_FEC_GROUP, &payload_length); | 1541 IN_FEC_GROUP, &payload_length); |
1539 creator->set_max_packet_length(length); | 1542 creator->set_max_packet_length(length); |
1540 EXPECT_TRUE(creator->IsFecEnabled()); | 1543 EXPECT_TRUE(creator->IsFecEnabled()); |
1541 | 1544 |
1542 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1545 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
1543 BlockOnNextWrite(); | 1546 BlockOnNextWrite(); |
1544 const string payload(payload_length, 'a'); | 1547 const string payload(payload_length, 'a'); |
1545 connection_.SendStreamDataWithStringWithFec(1, payload, 0, !kFin, nullptr); | 1548 connection_.SendStreamDataWithStringWithFec(1, payload, 0, !kFin, nullptr); |
1546 EXPECT_FALSE(creator->IsFecGroupOpen()); | 1549 EXPECT_FALSE(creator->IsFecGroupOpen()); |
1547 EXPECT_FALSE(creator->IsFecProtected()); | 1550 EXPECT_FALSE(creator->IsFecProtected()); |
(...skipping 1351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2899 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0); | 2902 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0); |
2900 connection_.SendPacket( | 2903 connection_.SendPacket( |
2901 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); | 2904 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); |
2902 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 2905 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
2903 } | 2906 } |
2904 | 2907 |
2905 TEST_P(QuicConnectionTest, TestQueueLimitsOnSendStreamData) { | 2908 TEST_P(QuicConnectionTest, TestQueueLimitsOnSendStreamData) { |
2906 // All packets carry version info till version is negotiated. | 2909 // All packets carry version info till version is negotiated. |
2907 size_t payload_length; | 2910 size_t payload_length; |
2908 size_t length = GetPacketLengthForOneStream( | 2911 size_t length = GetPacketLengthForOneStream( |
2909 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, | 2912 connection_.version(), kIncludeVersion, |
| 2913 PACKET_8BYTE_CONNECTION_ID, PACKET_1BYTE_SEQUENCE_NUMBER, |
2910 NOT_IN_FEC_GROUP, &payload_length); | 2914 NOT_IN_FEC_GROUP, &payload_length); |
2911 QuicConnectionPeer::GetPacketCreator(&connection_)->set_max_packet_length( | 2915 QuicConnectionPeer::GetPacketCreator(&connection_)->set_max_packet_length( |
2912 length); | 2916 length); |
2913 | 2917 |
2914 // Queue the first packet. | 2918 // Queue the first packet. |
2915 EXPECT_CALL(*send_algorithm_, | 2919 EXPECT_CALL(*send_algorithm_, |
2916 TimeUntilSend(_, _, _)).WillOnce( | 2920 TimeUntilSend(_, _, _)).WillOnce( |
2917 testing::Return(QuicTime::Delta::FromMicroseconds(10))); | 2921 testing::Return(QuicTime::Delta::FromMicroseconds(10))); |
2918 const string payload(payload_length, 'a'); | 2922 const string payload(payload_length, 'a'); |
2919 EXPECT_EQ(0u, connection_.SendStreamDataWithString(3, payload, 0, !kFin, | 2923 EXPECT_EQ(0u, connection_.SendStreamDataWithString(3, payload, 0, !kFin, |
2920 nullptr).bytes_consumed); | 2924 nullptr).bytes_consumed); |
2921 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 2925 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
2922 } | 2926 } |
2923 | 2927 |
2924 TEST_P(QuicConnectionTest, LoopThroughSendingPackets) { | 2928 TEST_P(QuicConnectionTest, LoopThroughSendingPackets) { |
2925 // All packets carry version info till version is negotiated. | 2929 // All packets carry version info till version is negotiated. |
2926 size_t payload_length; | 2930 size_t payload_length; |
2927 // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining | 2931 // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining |
2928 // packet length. The size of the offset field in a stream frame is 0 for | 2932 // packet length. The size of the offset field in a stream frame is 0 for |
2929 // offset 0, and 2 for non-zero offsets up through 16K. Increase | 2933 // offset 0, and 2 for non-zero offsets up through 16K. Increase |
2930 // max_packet_length by 2 so that subsequent packets containing subsequent | 2934 // max_packet_length by 2 so that subsequent packets containing subsequent |
2931 // stream frames with non-zero offets will fit within the packet length. | 2935 // stream frames with non-zero offets will fit within the packet length. |
2932 size_t length = 2 + GetPacketLengthForOneStream( | 2936 size_t length = 2 + GetPacketLengthForOneStream( |
2933 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, | 2937 connection_.version(), kIncludeVersion, |
| 2938 PACKET_8BYTE_CONNECTION_ID, PACKET_1BYTE_SEQUENCE_NUMBER, |
2934 NOT_IN_FEC_GROUP, &payload_length); | 2939 NOT_IN_FEC_GROUP, &payload_length); |
2935 QuicConnectionPeer::GetPacketCreator(&connection_)->set_max_packet_length( | 2940 QuicConnectionPeer::GetPacketCreator(&connection_)->set_max_packet_length( |
2936 length); | 2941 length); |
2937 | 2942 |
2938 // Queue the first packet. | 2943 // Queue the first packet. |
2939 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(7); | 2944 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(7); |
2940 // The first stream frame will have 2 fewer overhead bytes than the other six. | 2945 // The first stream frame will have 2 fewer overhead bytes than the other six. |
2941 const string payload(payload_length * 7 + 2, 'a'); | 2946 const string payload(payload_length * 7 + 2, 'a'); |
2942 EXPECT_EQ(payload.size(), | 2947 EXPECT_EQ(payload.size(), |
2943 connection_.SendStreamDataWithString(1, payload, 0, !kFin, nullptr) | 2948 connection_.SendStreamDataWithString(1, payload, 0, !kFin, nullptr) |
2944 .bytes_consumed); | 2949 .bytes_consumed); |
2945 } | 2950 } |
2946 | 2951 |
| 2952 TEST_P(QuicConnectionTest, LoopThroughSendingPacketsWithTruncation) { |
| 2953 ValueRestore<bool> old_flag(&FLAGS_allow_truncated_connection_ids_for_quic, |
| 2954 true); |
| 2955 |
| 2956 // Set up a larger payload than will fit in one packet. |
| 2957 const string payload(connection_.max_packet_length(), 'a'); |
| 2958 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)).Times(AnyNumber()); |
| 2959 |
| 2960 // Now send some packets with no truncation. |
| 2961 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); |
| 2962 EXPECT_EQ(payload.size(), |
| 2963 connection_.SendStreamDataWithString( |
| 2964 3, payload, 0, !kFin, nullptr).bytes_consumed); |
| 2965 // Track the size of the second packet here. The overhead will be the largest |
| 2966 // we see in this test, due to the non-truncated CID. |
| 2967 size_t non_truncated_packet_size = writer_->last_packet_size(); |
| 2968 |
| 2969 // Change to a 4 byte CID. |
| 2970 QuicConfig config; |
| 2971 QuicConfigPeer::SetReceivedBytesForConnectionId(&config, 4); |
| 2972 connection_.SetFromConfig(config); |
| 2973 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); |
| 2974 EXPECT_EQ(payload.size(), |
| 2975 connection_.SendStreamDataWithString( |
| 2976 3, payload, 0, !kFin, nullptr).bytes_consumed); |
| 2977 // Verify that we have 8 fewer bytes than in the non-truncated case. The |
| 2978 // first packet got 4 bytes of extra payload due to the truncation, and the |
| 2979 // headers here are also 4 byte smaller. |
| 2980 EXPECT_EQ(non_truncated_packet_size, writer_->last_packet_size() + 8); |
| 2981 |
| 2982 |
| 2983 // Change to a 1 byte CID. |
| 2984 QuicConfigPeer::SetReceivedBytesForConnectionId(&config, 1); |
| 2985 connection_.SetFromConfig(config); |
| 2986 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); |
| 2987 EXPECT_EQ(payload.size(), |
| 2988 connection_.SendStreamDataWithString( |
| 2989 3, payload, 0, !kFin, nullptr).bytes_consumed); |
| 2990 // Just like above, we save 7 bytes on payload, and 7 on truncation. |
| 2991 EXPECT_EQ(non_truncated_packet_size, writer_->last_packet_size() + 7 * 2); |
| 2992 |
| 2993 // Change to a 0 byte CID. |
| 2994 QuicConfigPeer::SetReceivedBytesForConnectionId(&config, 0); |
| 2995 connection_.SetFromConfig(config); |
| 2996 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); |
| 2997 EXPECT_EQ(payload.size(), |
| 2998 connection_.SendStreamDataWithString( |
| 2999 3, payload, 0, !kFin, nullptr).bytes_consumed); |
| 3000 // Just like above, we save 8 bytes on payload, and 8 on truncation. |
| 3001 EXPECT_EQ(non_truncated_packet_size, writer_->last_packet_size() + 8 * 2); |
| 3002 } |
| 3003 |
2947 TEST_P(QuicConnectionTest, SendDelayedAck) { | 3004 TEST_P(QuicConnectionTest, SendDelayedAck) { |
2948 QuicTime ack_time = clock_.ApproximateNow().Add(DefaultDelayedAckTime()); | 3005 QuicTime ack_time = clock_.ApproximateNow().Add(DefaultDelayedAckTime()); |
2949 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3006 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2950 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 3007 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
2951 const uint8 tag = 0x07; | 3008 const uint8 tag = 0x07; |
2952 connection_.SetDecrypter(new StrictTaggingDecrypter(tag), | 3009 connection_.SetDecrypter(new StrictTaggingDecrypter(tag), |
2953 ENCRYPTION_INITIAL); | 3010 ENCRYPTION_INITIAL); |
2954 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); | 3011 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag)); |
2955 // Process a packet from the non-crypto stream. | 3012 // Process a packet from the non-crypto stream. |
2956 frame1_.stream_id = 3; | 3013 frame1_.stream_id = 3; |
(...skipping 1050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4007 QuicBlockedFrame blocked; | 4064 QuicBlockedFrame blocked; |
4008 blocked.stream_id = 3; | 4065 blocked.stream_id = 3; |
4009 EXPECT_CALL(visitor_, OnBlockedFrames(_)); | 4066 EXPECT_CALL(visitor_, OnBlockedFrames(_)); |
4010 ProcessFramePacket(QuicFrame(&blocked)); | 4067 ProcessFramePacket(QuicFrame(&blocked)); |
4011 EXPECT_TRUE(ack_alarm->IsSet()); | 4068 EXPECT_TRUE(ack_alarm->IsSet()); |
4012 } | 4069 } |
4013 | 4070 |
4014 } // namespace | 4071 } // namespace |
4015 } // namespace test | 4072 } // namespace test |
4016 } // namespace net | 4073 } // namespace net |
OLD | NEW |