| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/quic_connection.h" | 5 #include "net/quic/quic_connection.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
| 10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
| (...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 EXPECT_TRUE(CanWriteStreamData()); | 513 EXPECT_TRUE(CanWriteStreamData()); |
| 514 return SendStreamData5(); | 514 return SendStreamData5(); |
| 515 } | 515 } |
| 516 | 516 |
| 517 // The crypto stream has special semantics so that it is not blocked by a | 517 // The crypto stream has special semantics so that it is not blocked by a |
| 518 // congestion window limitation, and also so that it gets put into a separate | 518 // congestion window limitation, and also so that it gets put into a separate |
| 519 // packet (so that it is easier to reason about a crypto frame not being | 519 // packet (so that it is easier to reason about a crypto frame not being |
| 520 // split needlessly across packet boundaries). As a result, we have separate | 520 // split needlessly across packet boundaries). As a result, we have separate |
| 521 // tests for some cases for this stream. | 521 // tests for some cases for this stream. |
| 522 QuicConsumedData SendCryptoStreamData() { | 522 QuicConsumedData SendCryptoStreamData() { |
| 523 this->Flush(); | 523 return SendStreamDataWithString(kCryptoStreamId, "chlo", 0, !kFin, NULL); |
| 524 QuicConsumedData consumed = | |
| 525 SendStreamDataWithString(kCryptoStreamId, "chlo", 0, !kFin, NULL); | |
| 526 this->Flush(); | |
| 527 return consumed; | |
| 528 } | 524 } |
| 529 | 525 |
| 530 bool is_server() { | 526 bool is_server() { |
| 531 return QuicConnectionPeer::IsServer(this); | 527 return QuicConnectionPeer::IsServer(this); |
| 532 } | 528 } |
| 533 | 529 |
| 534 void set_version(QuicVersion version) { | 530 void set_version(QuicVersion version) { |
| 535 QuicConnectionPeer::GetFramer(this)->set_version(version); | 531 QuicConnectionPeer::GetFramer(this)->set_version(version); |
| 536 } | 532 } |
| 537 | 533 |
| (...skipping 1124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1662 | 1658 |
| 1663 // Parse the last packet and ensure it's the crypto stream frame. | 1659 // Parse the last packet and ensure it's the crypto stream frame. |
| 1664 EXPECT_EQ(1u, writer_->frame_count()); | 1660 EXPECT_EQ(1u, writer_->frame_count()); |
| 1665 ASSERT_EQ(1u, writer_->stream_frames().size()); | 1661 ASSERT_EQ(1u, writer_->stream_frames().size()); |
| 1666 EXPECT_EQ(kCryptoStreamId, writer_->stream_frames()[0].stream_id); | 1662 EXPECT_EQ(kCryptoStreamId, writer_->stream_frames()[0].stream_id); |
| 1667 } | 1663 } |
| 1668 | 1664 |
| 1669 TEST_P(QuicConnectionTest, FramePackingCryptoThenNonCrypto) { | 1665 TEST_P(QuicConnectionTest, FramePackingCryptoThenNonCrypto) { |
| 1670 CongestionBlockWrites(); | 1666 CongestionBlockWrites(); |
| 1671 | 1667 |
| 1672 // Send an ack and two stream frames (one crypto, then one non-crypto) in 3 | 1668 // Send an ack and two stream frames (one crypto, then one non-crypto) in 2 |
| 1673 // packets by queueing them. | 1669 // packets by queueing them. |
| 1674 connection_.SendAck(); | 1670 connection_.SendAck(); |
| 1675 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( | 1671 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( |
| 1676 IgnoreResult(InvokeWithoutArgs(&connection_, | 1672 IgnoreResult(InvokeWithoutArgs(&connection_, |
| 1677 &TestConnection::SendCryptoStreamData)), | 1673 &TestConnection::SendCryptoStreamData)), |
| 1678 IgnoreResult(InvokeWithoutArgs(&connection_, | 1674 IgnoreResult(InvokeWithoutArgs(&connection_, |
| 1679 &TestConnection::SendStreamData3)))); | 1675 &TestConnection::SendStreamData3)))); |
| 1680 | 1676 |
| 1681 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3); | 1677 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); |
| 1682 CongestionUnblockWrites(); | 1678 CongestionUnblockWrites(); |
| 1683 connection_.GetSendAlarm()->Fire(); | 1679 connection_.GetSendAlarm()->Fire(); |
| 1684 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1680 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 1685 EXPECT_FALSE(connection_.HasQueuedData()); | 1681 EXPECT_FALSE(connection_.HasQueuedData()); |
| 1686 | 1682 |
| 1687 // Parse the last packet and ensure it's the stream frame from stream 3. | 1683 // Parse the last packet and ensure it's the stream frame from stream 3. |
| 1688 EXPECT_EQ(1u, writer_->frame_count()); | 1684 EXPECT_EQ(1u, writer_->frame_count()); |
| 1689 ASSERT_EQ(1u, writer_->stream_frames().size()); | 1685 ASSERT_EQ(1u, writer_->stream_frames().size()); |
| 1690 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id); | 1686 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id); |
| 1691 } | 1687 } |
| (...skipping 1363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3055 TEST_P(QuicConnectionTest, SendDelayedAckOnOutgoingCryptoPacket) { | 3051 TEST_P(QuicConnectionTest, SendDelayedAckOnOutgoingCryptoPacket) { |
| 3056 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3052 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 3057 ProcessPacket(1); | 3053 ProcessPacket(1); |
| 3058 connection_.SendStreamDataWithString(kCryptoStreamId, "foo", 0, !kFin, NULL); | 3054 connection_.SendStreamDataWithString(kCryptoStreamId, "foo", 0, !kFin, NULL); |
| 3059 // Check that ack is bundled with outgoing crypto data. | 3055 // Check that ack is bundled with outgoing crypto data. |
| 3060 EXPECT_EQ(version() <= QUIC_VERSION_15 ? 2u : 3u, writer_->frame_count()); | 3056 EXPECT_EQ(version() <= QUIC_VERSION_15 ? 2u : 3u, writer_->frame_count()); |
| 3061 EXPECT_FALSE(writer_->ack_frames().empty()); | 3057 EXPECT_FALSE(writer_->ack_frames().empty()); |
| 3062 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 3058 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
| 3063 } | 3059 } |
| 3064 | 3060 |
| 3061 TEST_P(QuicConnectionTest, BundleAckForSecondCHLO) { |
| 3062 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 3063 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
| 3064 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce( |
| 3065 IgnoreResult(InvokeWithoutArgs(&connection_, |
| 3066 &TestConnection::SendCryptoStreamData))); |
| 3067 // Process a packet from the crypto stream, which is frame1_'s default. |
| 3068 // Receiving the CHLO as packet 2 first will cause the connection to |
| 3069 // immediately send an ack, due to the packet gap. |
| 3070 ProcessPacket(2); |
| 3071 // Check that ack is sent and that delayed ack alarm is reset. |
| 3072 if (version() > QUIC_VERSION_15) { |
| 3073 EXPECT_EQ(3u, writer_->frame_count()); |
| 3074 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); |
| 3075 } else { |
| 3076 EXPECT_EQ(2u, writer_->frame_count()); |
| 3077 } |
| 3078 EXPECT_EQ(1u, writer_->stream_frames().size()); |
| 3079 EXPECT_FALSE(writer_->ack_frames().empty()); |
| 3080 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
| 3081 } |
| 3082 |
| 3065 TEST_P(QuicConnectionTest, BundleAckWithDataOnIncomingAck) { | 3083 TEST_P(QuicConnectionTest, BundleAckWithDataOnIncomingAck) { |
| 3066 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3084 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 3067 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0, | 3085 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0, |
| 3068 !kFin, NULL); | 3086 !kFin, NULL); |
| 3069 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 3, | 3087 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 3, |
| 3070 !kFin, NULL); | 3088 !kFin, NULL); |
| 3071 // Ack the second packet, which will retransmit the first packet. | 3089 // Ack the second packet, which will retransmit the first packet. |
| 3072 QuicAckFrame ack = InitAckFrame(2, 0); | 3090 QuicAckFrame ack = InitAckFrame(2, 0); |
| 3073 NackPacket(1, &ack); | 3091 NackPacket(1, &ack); |
| 3074 SequenceNumberSet lost_packets; | 3092 SequenceNumberSet lost_packets; |
| (...skipping 941 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4016 QuicBlockedFrame blocked; | 4034 QuicBlockedFrame blocked; |
| 4017 blocked.stream_id = 3; | 4035 blocked.stream_id = 3; |
| 4018 EXPECT_CALL(visitor_, OnBlockedFrames(_)); | 4036 EXPECT_CALL(visitor_, OnBlockedFrames(_)); |
| 4019 ProcessFramePacket(QuicFrame(&blocked)); | 4037 ProcessFramePacket(QuicFrame(&blocked)); |
| 4020 EXPECT_TRUE(ack_alarm->IsSet()); | 4038 EXPECT_TRUE(ack_alarm->IsSet()); |
| 4021 } | 4039 } |
| 4022 | 4040 |
| 4023 } // namespace | 4041 } // namespace |
| 4024 } // namespace test | 4042 } // namespace test |
| 4025 } // namespace net | 4043 } // namespace net |
| OLD | NEW |