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

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

Issue 304293009: Cleanup in QuicConnection to always cancel the send alarm when CanWrite (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.cc ('k') | no next file » | 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 896 matching lines...) Expand 10 before | Expand all | Expand 10 after
907 ProcessDataPacket(6000, 0, !kEntropyFlag); 907 ProcessDataPacket(6000, 0, !kEntropyFlag);
908 EXPECT_FALSE( 908 EXPECT_FALSE(
909 QuicConnectionPeer::GetConnectionClosePacket(&connection_) == NULL); 909 QuicConnectionPeer::GetConnectionClosePacket(&connection_) == NULL);
910 } 910 }
911 911
912 void BlockOnNextWrite() { 912 void BlockOnNextWrite() {
913 writer_->BlockOnNextWrite(); 913 writer_->BlockOnNextWrite();
914 EXPECT_CALL(visitor_, OnWriteBlocked()).Times(AtLeast(1)); 914 EXPECT_CALL(visitor_, OnWriteBlocked()).Times(AtLeast(1));
915 } 915 }
916 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
917 QuicConnectionId connection_id_; 929 QuicConnectionId connection_id_;
918 QuicFramer framer_; 930 QuicFramer framer_;
919 QuicPacketCreator peer_creator_; 931 QuicPacketCreator peer_creator_;
920 MockEntropyCalculator entropy_calculator_; 932 MockEntropyCalculator entropy_calculator_;
921 933
922 MockSendAlgorithm* send_algorithm_; 934 MockSendAlgorithm* send_algorithm_;
923 MockLossAlgorithm* loss_algorithm_; 935 MockLossAlgorithm* loss_algorithm_;
924 TestReceiveAlgorithm* receive_algorithm_; 936 TestReceiveAlgorithm* receive_algorithm_;
925 MockClock clock_; 937 MockClock clock_;
926 MockRandom random_generator_; 938 MockRandom random_generator_;
(...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after
1561 1573
1562 // Abandon all packets 1574 // Abandon all packets
1563 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(false)); 1575 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(false));
1564 connection_.GetRetransmissionAlarm()->Fire(); 1576 connection_.GetRetransmissionAlarm()->Fire();
1565 1577
1566 // 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.
1567 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); 1579 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
1568 } 1580 }
1569 1581
1570 TEST_P(QuicConnectionTest, FramePacking) { 1582 TEST_P(QuicConnectionTest, FramePacking) {
1571 // Block the connection. 1583 CongestionBlockWrites();
1572 connection_.GetSendAlarm()->Set(
1573 clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(1)));
1574 1584
1575 // 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.
1576 connection_.SendAck(); 1586 connection_.SendAck();
1577 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( 1587 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1578 IgnoreResult(InvokeWithoutArgs(&connection_, 1588 IgnoreResult(InvokeWithoutArgs(&connection_,
1579 &TestConnection::SendStreamData3)), 1589 &TestConnection::SendStreamData3)),
1580 IgnoreResult(InvokeWithoutArgs(&connection_, 1590 IgnoreResult(InvokeWithoutArgs(&connection_,
1581 &TestConnection::SendStreamData5)))); 1591 &TestConnection::SendStreamData5))));
1582 1592
1583 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); 1593 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
1584 // Unblock the connection. 1594 CongestionUnblockWrites();
1585 connection_.GetSendAlarm()->Fire(); 1595 connection_.GetSendAlarm()->Fire();
1586 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 1596 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1587 EXPECT_FALSE(connection_.HasQueuedData()); 1597 EXPECT_FALSE(connection_.HasQueuedData());
1588 1598
1589 // 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
1590 // two different streams. 1600 // two different streams.
1591 if (version() > QUIC_VERSION_15) { 1601 if (version() > QUIC_VERSION_15) {
1592 EXPECT_EQ(4u, writer_->frame_count()); 1602 EXPECT_EQ(4u, writer_->frame_count());
1593 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); 1603 EXPECT_FALSE(writer_->stop_waiting_frames().empty());
1594 } else { 1604 } else {
1595 EXPECT_EQ(3u, writer_->frame_count()); 1605 EXPECT_EQ(3u, writer_->frame_count());
1596 } 1606 }
1597 EXPECT_FALSE(writer_->ack_frames().empty()); 1607 EXPECT_FALSE(writer_->ack_frames().empty());
1598 EXPECT_EQ(2u, writer_->stream_frames().size()); 1608 ASSERT_EQ(2u, writer_->stream_frames().size());
1599 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id); 1609 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id);
1600 EXPECT_EQ(kClientDataStreamId2, writer_->stream_frames()[1].stream_id); 1610 EXPECT_EQ(kClientDataStreamId2, writer_->stream_frames()[1].stream_id);
1601 } 1611 }
1602 1612
1603 TEST_P(QuicConnectionTest, FramePackingNonCryptoThenCrypto) { 1613 TEST_P(QuicConnectionTest, FramePackingNonCryptoThenCrypto) {
1604 // Block the connection. 1614 CongestionBlockWrites();
1605 connection_.GetSendAlarm()->Set(
1606 clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(1)));
1607 1615
1608 // 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
1609 // packets by queueing them. 1617 // packets by queueing them.
1610 connection_.SendAck(); 1618 connection_.SendAck();
1611 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( 1619 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1612 IgnoreResult(InvokeWithoutArgs(&connection_, 1620 IgnoreResult(InvokeWithoutArgs(&connection_,
1613 &TestConnection::SendStreamData3)), 1621 &TestConnection::SendStreamData3)),
1614 IgnoreResult(InvokeWithoutArgs(&connection_, 1622 IgnoreResult(InvokeWithoutArgs(&connection_,
1615 &TestConnection::SendCryptoStreamData)))); 1623 &TestConnection::SendCryptoStreamData))));
1616 1624
1617 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); 1625 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2);
1618 // Unblock the connection. 1626 CongestionUnblockWrites();
1619 connection_.GetSendAlarm()->Fire(); 1627 connection_.GetSendAlarm()->Fire();
1620 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 1628 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1621 EXPECT_FALSE(connection_.HasQueuedData()); 1629 EXPECT_FALSE(connection_.HasQueuedData());
1622 1630
1623 // 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.
1624 EXPECT_EQ(1u, writer_->frame_count()); 1632 EXPECT_EQ(1u, writer_->frame_count());
1625 EXPECT_EQ(1u, writer_->stream_frames().size()); 1633 ASSERT_EQ(1u, writer_->stream_frames().size());
1626 EXPECT_EQ(kCryptoStreamId, writer_->stream_frames()[0].stream_id); 1634 EXPECT_EQ(kCryptoStreamId, writer_->stream_frames()[0].stream_id);
1627 } 1635 }
1628 1636
1629 TEST_P(QuicConnectionTest, FramePackingCryptoThenNonCrypto) { 1637 TEST_P(QuicConnectionTest, FramePackingCryptoThenNonCrypto) {
1630 // Block the connection. 1638 CongestionBlockWrites();
1631 connection_.GetSendAlarm()->Set(
1632 clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(1)));
1633 1639
1634 // 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
1635 // packets by queueing them. 1641 // packets by queueing them.
1636 connection_.SendAck(); 1642 connection_.SendAck();
1637 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( 1643 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1638 IgnoreResult(InvokeWithoutArgs(&connection_, 1644 IgnoreResult(InvokeWithoutArgs(&connection_,
1639 &TestConnection::SendCryptoStreamData)), 1645 &TestConnection::SendCryptoStreamData)),
1640 IgnoreResult(InvokeWithoutArgs(&connection_, 1646 IgnoreResult(InvokeWithoutArgs(&connection_,
1641 &TestConnection::SendStreamData3)))); 1647 &TestConnection::SendStreamData3))));
1642 1648
1643 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3); 1649 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3);
1644 // Unblock the connection. 1650 CongestionUnblockWrites();
1645 connection_.GetSendAlarm()->Fire(); 1651 connection_.GetSendAlarm()->Fire();
1646 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 1652 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1647 EXPECT_FALSE(connection_.HasQueuedData()); 1653 EXPECT_FALSE(connection_.HasQueuedData());
1648 1654
1649 // 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.
1650 EXPECT_EQ(1u, writer_->frame_count()); 1656 EXPECT_EQ(1u, writer_->frame_count());
1651 EXPECT_EQ(1u, writer_->stream_frames().size()); 1657 ASSERT_EQ(1u, writer_->stream_frames().size());
1652 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id); 1658 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id);
1653 } 1659 }
1654 1660
1655 TEST_P(QuicConnectionTest, FramePackingFEC) { 1661 TEST_P(QuicConnectionTest, FramePackingFEC) {
1656 if (version() < QUIC_VERSION_15) {
1657 return;
1658 }
1659 // Enable fec. 1662 // Enable fec.
1660 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn( 1663 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn(
1661 QuicConnectionPeer::GetPacketCreator(&connection_), 6)); 1664 QuicConnectionPeer::GetPacketCreator(&connection_), 6));
1662 1665
1663 // Block the connection. 1666 CongestionBlockWrites();
1664 connection_.GetSendAlarm()->Set(
1665 clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(1)));
1666 1667
1667 // 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.
1668 connection_.SendAck(); 1669 connection_.SendAck();
1669 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( 1670 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1670 IgnoreResult(InvokeWithoutArgs(&connection_, 1671 IgnoreResult(InvokeWithoutArgs(&connection_,
1671 &TestConnection::SendStreamData3)), 1672 &TestConnection::SendStreamData3)),
1672 IgnoreResult(InvokeWithoutArgs(&connection_, 1673 IgnoreResult(InvokeWithoutArgs(&connection_,
1673 &TestConnection::SendStreamData5)))); 1674 &TestConnection::SendStreamData5))));
1674 1675
1675 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); 1676 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2);
1676 // Unblock the connection. 1677 CongestionUnblockWrites();
1677 connection_.GetSendAlarm()->Fire(); 1678 connection_.GetSendAlarm()->Fire();
1678 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 1679 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1679 EXPECT_FALSE(connection_.HasQueuedData()); 1680 EXPECT_FALSE(connection_.HasQueuedData());
1680 1681
1681 // 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.
1682 EXPECT_EQ(1u, writer_->header().fec_group); 1683 EXPECT_EQ(1u, writer_->header().fec_group);
1683 EXPECT_EQ(0u, writer_->frame_count()); 1684 EXPECT_EQ(0u, writer_->frame_count());
1684 } 1685 }
1685 1686
1686 TEST_P(QuicConnectionTest, FramePackingAckResponse) { 1687 TEST_P(QuicConnectionTest, FramePackingAckResponse) {
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after
2100 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); 2101 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
2101 frame = InitAckFrame(7, 0); 2102 frame = InitAckFrame(7, 0);
2102 NackPacket(5, &frame); 2103 NackPacket(5, &frame);
2103 NackPacket(6, &frame); 2104 NackPacket(6, &frame);
2104 ProcessAckPacket(&frame); 2105 ProcessAckPacket(&frame);
2105 2106
2106 EXPECT_EQ(6u, outgoing_ack()->sent_info.least_unacked); 2107 EXPECT_EQ(6u, outgoing_ack()->sent_info.least_unacked);
2107 } 2108 }
2108 2109
2109 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterFecPacket) { 2110 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterFecPacket) {
2110 if (version() < QUIC_VERSION_15) {
2111 return;
2112 }
2113 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 2111 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2114 2112
2115 // Don't send missing packet 1. 2113 // Don't send missing packet 1.
2116 ProcessFecPacket(2, 1, true, !kEntropyFlag, NULL); 2114 ProcessFecPacket(2, 1, true, !kEntropyFlag, NULL);
2117 // Entropy flag should be false, so entropy should be 0. 2115 // Entropy flag should be false, so entropy should be 0.
2118 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); 2116 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
2119 } 2117 }
2120 2118
2121 TEST_P(QuicConnectionTest, ReviveMissingPacketWithVaryingSeqNumLengths) { 2119 TEST_P(QuicConnectionTest, ReviveMissingPacketWithVaryingSeqNumLengths) {
2122 if (version() < QUIC_VERSION_15) {
2123 return;
2124 }
2125 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 2120 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2126 2121
2127 // Set up a debug visitor to the connection. 2122 // Set up a debug visitor to the connection.
2128 scoped_ptr<FecQuicConnectionDebugVisitor> 2123 scoped_ptr<FecQuicConnectionDebugVisitor>
2129 fec_visitor(new FecQuicConnectionDebugVisitor); 2124 fec_visitor(new FecQuicConnectionDebugVisitor);
2130 connection_.set_debug_visitor(fec_visitor.get()); 2125 connection_.set_debug_visitor(fec_visitor.get());
2131 2126
2132 QuicPacketSequenceNumber fec_packet = 0; 2127 QuicPacketSequenceNumber fec_packet = 0;
2133 QuicSequenceNumberLength lengths[] = {PACKET_6BYTE_SEQUENCE_NUMBER, 2128 QuicSequenceNumberLength lengths[] = {PACKET_6BYTE_SEQUENCE_NUMBER,
2134 PACKET_4BYTE_SEQUENCE_NUMBER, 2129 PACKET_4BYTE_SEQUENCE_NUMBER,
2135 PACKET_2BYTE_SEQUENCE_NUMBER, 2130 PACKET_2BYTE_SEQUENCE_NUMBER,
2136 PACKET_1BYTE_SEQUENCE_NUMBER}; 2131 PACKET_1BYTE_SEQUENCE_NUMBER};
2137 // 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
2138 // number length in the revived packet. 2133 // number length in the revived packet.
2139 for (size_t i = 0; i < arraysize(lengths); ++i) { 2134 for (size_t i = 0; i < arraysize(lengths); ++i) {
2140 // Set sequence_number_length_ (for data and FEC packets). 2135 // Set sequence_number_length_ (for data and FEC packets).
2141 sequence_number_length_ = lengths[i]; 2136 sequence_number_length_ = lengths[i];
2142 fec_packet += 2; 2137 fec_packet += 2;
2143 // 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.
2144 ProcessFecPacket(/*seq_num=*/fec_packet, /*fec_group=*/fec_packet - 1, 2139 ProcessFecPacket(/*seq_num=*/fec_packet, /*fec_group=*/fec_packet - 1,
2145 true, !kEntropyFlag, NULL); 2140 true, !kEntropyFlag, NULL);
2146 // 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
2147 // in the original data/fec packet headers. 2142 // in the original data/fec packet headers.
2148 EXPECT_EQ(sequence_number_length_, fec_visitor->revived_header(). 2143 EXPECT_EQ(sequence_number_length_, fec_visitor->revived_header().
2149 public_header.sequence_number_length); 2144 public_header.sequence_number_length);
2150 } 2145 }
2151 } 2146 }
2152 2147
2153 TEST_P(QuicConnectionTest, ReviveMissingPacketWithVaryingConnectionIdLengths) { 2148 TEST_P(QuicConnectionTest, ReviveMissingPacketWithVaryingConnectionIdLengths) {
2154 if (version() < QUIC_VERSION_15) {
2155 return;
2156 }
2157 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 2149 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2158 2150
2159 // Set up a debug visitor to the connection. 2151 // Set up a debug visitor to the connection.
2160 scoped_ptr<FecQuicConnectionDebugVisitor> 2152 scoped_ptr<FecQuicConnectionDebugVisitor>
2161 fec_visitor(new FecQuicConnectionDebugVisitor); 2153 fec_visitor(new FecQuicConnectionDebugVisitor);
2162 connection_.set_debug_visitor(fec_visitor.get()); 2154 connection_.set_debug_visitor(fec_visitor.get());
2163 2155
2164 QuicPacketSequenceNumber fec_packet = 0; 2156 QuicPacketSequenceNumber fec_packet = 0;
2165 QuicConnectionIdLength lengths[] = {PACKET_8BYTE_CONNECTION_ID, 2157 QuicConnectionIdLength lengths[] = {PACKET_8BYTE_CONNECTION_ID,
2166 PACKET_4BYTE_CONNECTION_ID, 2158 PACKET_4BYTE_CONNECTION_ID,
2167 PACKET_1BYTE_CONNECTION_ID, 2159 PACKET_1BYTE_CONNECTION_ID,
2168 PACKET_0BYTE_CONNECTION_ID}; 2160 PACKET_0BYTE_CONNECTION_ID};
2169 // 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
2170 // id length in the revived packet. 2162 // id length in the revived packet.
2171 for (size_t i = 0; i < arraysize(lengths); ++i) { 2163 for (size_t i = 0; i < arraysize(lengths); ++i) {
2172 // Set connection id length (for data and FEC packets). 2164 // Set connection id length (for data and FEC packets).
2173 connection_id_length_ = lengths[i]; 2165 connection_id_length_ = lengths[i];
2174 fec_packet += 2; 2166 fec_packet += 2;
2175 // 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.
2176 ProcessFecPacket(/*seq_num=*/fec_packet, /*fec_group=*/fec_packet - 1, 2168 ProcessFecPacket(/*seq_num=*/fec_packet, /*fec_group=*/fec_packet - 1,
2177 true, !kEntropyFlag, NULL); 2169 true, !kEntropyFlag, NULL);
2178 // 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
2179 // in the original data/fec packet headers. 2171 // in the original data/fec packet headers.
2180 EXPECT_EQ(connection_id_length_, 2172 EXPECT_EQ(connection_id_length_,
2181 fec_visitor->revived_header().public_header.connection_id_length); 2173 fec_visitor->revived_header().public_header.connection_id_length);
2182 } 2174 }
2183 } 2175 }
2184 2176
2185 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacketThenFecPacket) { 2177 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacketThenFecPacket) {
2186 if (version() < QUIC_VERSION_15) {
2187 return;
2188 }
2189 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 2178 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2190 2179
2191 ProcessFecProtectedPacket(1, false, kEntropyFlag); 2180 ProcessFecProtectedPacket(1, false, kEntropyFlag);
2192 // Don't send missing packet 2. 2181 // Don't send missing packet 2.
2193 ProcessFecPacket(3, 1, true, !kEntropyFlag, NULL); 2182 ProcessFecPacket(3, 1, true, !kEntropyFlag, NULL);
2194 // Entropy flag should be true, so entropy should not be 0. 2183 // Entropy flag should be true, so entropy should not be 0.
2195 EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); 2184 EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
2196 } 2185 }
2197 2186
2198 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacketsThenFecPacket) { 2187 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacketsThenFecPacket) {
2199 if (version() < QUIC_VERSION_15) {
2200 return;
2201 }
2202 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 2188 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2203 2189
2204 ProcessFecProtectedPacket(1, false, !kEntropyFlag); 2190 ProcessFecProtectedPacket(1, false, !kEntropyFlag);
2205 // Don't send missing packet 2. 2191 // Don't send missing packet 2.
2206 ProcessFecProtectedPacket(3, false, !kEntropyFlag); 2192 ProcessFecProtectedPacket(3, false, !kEntropyFlag);
2207 ProcessFecPacket(4, 1, true, kEntropyFlag, NULL); 2193 ProcessFecPacket(4, 1, true, kEntropyFlag, NULL);
2208 // Ensure QUIC no longer revives entropy for lost packets. 2194 // Ensure QUIC no longer revives entropy for lost packets.
2209 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); 2195 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
2210 EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 4)); 2196 EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 4));
2211 } 2197 }
2212 2198
2213 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacket) { 2199 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacket) {
2214 if (version() < QUIC_VERSION_15) {
2215 return;
2216 }
2217 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 2200 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2218 2201
2219 // Don't send missing packet 1. 2202 // Don't send missing packet 1.
2220 ProcessFecPacket(3, 1, false, !kEntropyFlag, NULL); 2203 ProcessFecPacket(3, 1, false, !kEntropyFlag, NULL);
2221 // Out of order. 2204 // Out of order.
2222 ProcessFecProtectedPacket(2, true, !kEntropyFlag); 2205 ProcessFecProtectedPacket(2, true, !kEntropyFlag);
2223 // Entropy flag should be false, so entropy should be 0. 2206 // Entropy flag should be false, so entropy should be 0.
2224 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); 2207 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
2225 } 2208 }
2226 2209
2227 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPackets) { 2210 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPackets) {
2228 if (version() < QUIC_VERSION_15) {
2229 return;
2230 }
2231 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 2211 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2232 2212
2233 ProcessFecProtectedPacket(1, false, !kEntropyFlag); 2213 ProcessFecProtectedPacket(1, false, !kEntropyFlag);
2234 // Don't send missing packet 2. 2214 // Don't send missing packet 2.
2235 ProcessFecPacket(6, 1, false, kEntropyFlag, NULL); 2215 ProcessFecPacket(6, 1, false, kEntropyFlag, NULL);
2236 ProcessFecProtectedPacket(3, false, kEntropyFlag); 2216 ProcessFecProtectedPacket(3, false, kEntropyFlag);
2237 ProcessFecProtectedPacket(4, false, kEntropyFlag); 2217 ProcessFecProtectedPacket(4, false, kEntropyFlag);
2238 ProcessFecProtectedPacket(5, true, !kEntropyFlag); 2218 ProcessFecProtectedPacket(5, true, !kEntropyFlag);
2239 // Ensure entropy is not revived for the missing packet. 2219 // Ensure entropy is not revived for the missing packet.
2240 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); 2220 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after
2586 } 2566 }
2587 2567
2588 TEST_P(QuicConnectionTest, UpdateQuicCongestionFeedbackFrame) { 2568 TEST_P(QuicConnectionTest, UpdateQuicCongestionFeedbackFrame) {
2589 SendAckPacketToPeer(); 2569 SendAckPacketToPeer();
2590 EXPECT_CALL(*receive_algorithm_, RecordIncomingPacket(_, _, _)); 2570 EXPECT_CALL(*receive_algorithm_, RecordIncomingPacket(_, _, _));
2591 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 2571 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2592 ProcessPacket(1); 2572 ProcessPacket(1);
2593 } 2573 }
2594 2574
2595 TEST_P(QuicConnectionTest, DontUpdateQuicCongestionFeedbackFrameForRevived) { 2575 TEST_P(QuicConnectionTest, DontUpdateQuicCongestionFeedbackFrameForRevived) {
2596 if (version() < QUIC_VERSION_15) {
2597 return;
2598 }
2599 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 2576 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2600 SendAckPacketToPeer(); 2577 SendAckPacketToPeer();
2601 // Process an FEC packet, and revive the missing data packet 2578 // Process an FEC packet, and revive the missing data packet
2602 // but only contact the receive_algorithm once. 2579 // but only contact the receive_algorithm once.
2603 EXPECT_CALL(*receive_algorithm_, RecordIncomingPacket(_, _, _)); 2580 EXPECT_CALL(*receive_algorithm_, RecordIncomingPacket(_, _, _));
2604 ProcessFecPacket(2, 1, true, !kEntropyFlag, NULL); 2581 ProcessFecPacket(2, 1, true, !kEntropyFlag, NULL);
2605 } 2582 }
2606 2583
2607 TEST_P(QuicConnectionTest, InitialTimeout) { 2584 TEST_P(QuicConnectionTest, InitialTimeout) {
2608 EXPECT_TRUE(connection_.connected()); 2585 EXPECT_TRUE(connection_.connected());
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
2760 EXPECT_CALL(*send_algorithm_, 2737 EXPECT_CALL(*send_algorithm_,
2761 TimeUntilSend(_, _, _)).WillRepeatedly( 2738 TimeUntilSend(_, _, _)).WillRepeatedly(
2762 testing::Return(QuicTime::Delta::Zero())); 2739 testing::Return(QuicTime::Delta::Zero()));
2763 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1)); 2740 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1));
2764 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); 2741 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
2765 connection_.GetSendAlarm()->Fire(); 2742 connection_.GetSendAlarm()->Fire();
2766 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 2743 EXPECT_EQ(0u, connection_.NumQueuedPackets());
2767 } 2744 }
2768 2745
2769 TEST_P(QuicConnectionTest, SendSchedulerDelayThenRetransmit) { 2746 TEST_P(QuicConnectionTest, SendSchedulerDelayThenRetransmit) {
2770 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)) 2747 CongestionUnblockWrites();
2771 .WillRepeatedly(testing::Return(QuicTime::Delta::Zero()));
2772 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)); 2748 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _));
2773 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); 2749 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
2774 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 2750 EXPECT_EQ(0u, connection_.NumQueuedPackets());
2775 // Advance the time for retransmission of lost packet. 2751 // Advance the time for retransmission of lost packet.
2776 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(501)); 2752 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(501));
2777 // 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
2778 // sent packet manager, but not yet serialized. 2754 // sent packet manager, but not yet serialized.
2779 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); 2755 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
2780 EXPECT_CALL(*send_algorithm_, 2756 CongestionBlockWrites();
2781 TimeUntilSend(_, _, _)).WillOnce(
2782 testing::Return(QuicTime::Delta::FromMicroseconds(1)));
2783 connection_.GetRetransmissionAlarm()->Fire(); 2757 connection_.GetRetransmissionAlarm()->Fire();
2784 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 2758 EXPECT_EQ(0u, connection_.NumQueuedPackets());
2785 2759
2786 // Advance the clock to fire the alarm, and configure the scheduler 2760 // Advance the clock to fire the alarm, and configure the scheduler
2787 // to permit the packet to be sent. 2761 // to permit the packet to be sent.
2788 EXPECT_CALL(*send_algorithm_, 2762 CongestionUnblockWrites();
2789 TimeUntilSend(_, _, _)).Times(3).
2790 WillRepeatedly(testing::Return(QuicTime::Delta::Zero()));
2791 2763
2792 // Ensure the scheduler is notified this is a retransmit. 2764 // Ensure the scheduler is notified this is a retransmit.
2793 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); 2765 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
2794 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1)); 2766 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1));
2795 connection_.GetSendAlarm()->Fire(); 2767 connection_.GetSendAlarm()->Fire();
2796 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 2768 EXPECT_EQ(0u, connection_.NumQueuedPackets());
2797 } 2769 }
2798 2770
2799 TEST_P(QuicConnectionTest, SendSchedulerDelayAndQueue) { 2771 TEST_P(QuicConnectionTest, SendSchedulerDelayAndQueue) {
2800 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
2855 testing::Return(QuicTime::Delta::FromMicroseconds(1))); 2827 testing::Return(QuicTime::Delta::FromMicroseconds(1)));
2856 ProcessAckPacket(&frame); 2828 ProcessAckPacket(&frame);
2857 2829
2858 EXPECT_EQ(1u, connection_.NumQueuedPackets()); 2830 EXPECT_EQ(1u, connection_.NumQueuedPackets());
2859 } 2831 }
2860 2832
2861 TEST_P(QuicConnectionTest, SendSchedulerDelayThenOnCanWrite) { 2833 TEST_P(QuicConnectionTest, SendSchedulerDelayThenOnCanWrite) {
2862 // TODO(ianswett): This test is unrealistic, because we would not serialize 2834 // TODO(ianswett): This test is unrealistic, because we would not serialize
2863 // new data if the send algorithm said not to. 2835 // new data if the send algorithm said not to.
2864 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); 2836 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
2865 EXPECT_CALL(*send_algorithm_, 2837 CongestionBlockWrites();
2866 TimeUntilSend(_, _, _)).WillOnce(
2867 testing::Return(QuicTime::Delta::FromMicroseconds(10)));
2868 connection_.SendPacket( 2838 connection_.SendPacket(
2869 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA); 2839 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
2870 EXPECT_EQ(1u, connection_.NumQueuedPackets()); 2840 EXPECT_EQ(1u, connection_.NumQueuedPackets());
2871 2841
2872 // 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
2873 // algorithm for queued packets. 2843 // algorithm for queued packets.
2874 connection_.OnCanWrite(); 2844 connection_.OnCanWrite();
2875 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 2845 EXPECT_EQ(0u, connection_.NumQueuedPackets());
2876 } 2846 }
2877 2847
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
3187 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1)); 3157 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1));
3188 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 3158 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3189 ProcessDataPacket(1, 1, kEntropyFlag); 3159 ProcessDataPacket(1, 1, kEntropyFlag);
3190 ProcessDataPacket(4, 1, kEntropyFlag); 3160 ProcessDataPacket(4, 1, kEntropyFlag);
3191 ProcessDataPacket(3, 1, !kEntropyFlag); 3161 ProcessDataPacket(3, 1, !kEntropyFlag);
3192 ProcessDataPacket(7, 1, kEntropyFlag); 3162 ProcessDataPacket(7, 1, kEntropyFlag);
3193 EXPECT_EQ(146u, outgoing_ack()->received_info.entropy_hash); 3163 EXPECT_EQ(146u, outgoing_ack()->received_info.entropy_hash);
3194 } 3164 }
3195 3165
3196 TEST_P(QuicConnectionTest, ReceivedEntropyHashCalculationHalfFEC) { 3166 TEST_P(QuicConnectionTest, ReceivedEntropyHashCalculationHalfFEC) {
3197 if (version() < QUIC_VERSION_15) {
3198 return;
3199 }
3200 // FEC packets should not change the entropy hash calculation. 3167 // FEC packets should not change the entropy hash calculation.
3201 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1)); 3168 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1));
3202 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 3169 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3203 ProcessDataPacket(1, 1, kEntropyFlag); 3170 ProcessDataPacket(1, 1, kEntropyFlag);
3204 ProcessFecPacket(4, 1, false, kEntropyFlag, NULL); 3171 ProcessFecPacket(4, 1, false, kEntropyFlag, NULL);
3205 ProcessDataPacket(3, 3, !kEntropyFlag); 3172 ProcessDataPacket(3, 3, !kEntropyFlag);
3206 ProcessFecPacket(7, 3, false, kEntropyFlag, NULL); 3173 ProcessFecPacket(7, 3, false, kEntropyFlag, NULL);
3207 EXPECT_EQ(146u, outgoing_ack()->received_info.entropy_hash); 3174 EXPECT_EQ(146u, outgoing_ack()->received_info.entropy_hash);
3208 } 3175 }
3209 3176
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
3536 EXPECT_EQ(3 * first_packet_size + 2 * second_packet_size - kQuicVersionSize, 3503 EXPECT_EQ(3 * first_packet_size + 2 * second_packet_size - kQuicVersionSize,
3537 stats.bytes_sent); 3504 stats.bytes_sent);
3538 EXPECT_EQ(5u, stats.packets_sent); 3505 EXPECT_EQ(5u, stats.packets_sent);
3539 EXPECT_EQ(2 * first_packet_size + second_packet_size - kQuicVersionSize, 3506 EXPECT_EQ(2 * first_packet_size + second_packet_size - kQuicVersionSize,
3540 stats.bytes_retransmitted); 3507 stats.bytes_retransmitted);
3541 EXPECT_EQ(3u, stats.packets_retransmitted); 3508 EXPECT_EQ(3u, stats.packets_retransmitted);
3542 EXPECT_EQ(1u, stats.rto_count); 3509 EXPECT_EQ(1u, stats.rto_count);
3543 } 3510 }
3544 3511
3545 TEST_P(QuicConnectionTest, CheckReceiveStats) { 3512 TEST_P(QuicConnectionTest, CheckReceiveStats) {
3546 if (version() < QUIC_VERSION_15) {
3547 return;
3548 }
3549 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 3513 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3550 3514
3551 size_t received_bytes = 0; 3515 size_t received_bytes = 0;
3552 received_bytes += ProcessFecProtectedPacket(1, false, !kEntropyFlag); 3516 received_bytes += ProcessFecProtectedPacket(1, false, !kEntropyFlag);
3553 received_bytes += ProcessFecProtectedPacket(3, false, !kEntropyFlag); 3517 received_bytes += ProcessFecProtectedPacket(3, false, !kEntropyFlag);
3554 // Should be counted against dropped packets. 3518 // Should be counted against dropped packets.
3555 received_bytes += ProcessDataPacket(3, 1, !kEntropyFlag); 3519 received_bytes += ProcessDataPacket(3, 1, !kEntropyFlag);
3556 received_bytes += ProcessFecPacket(4, 1, true, !kEntropyFlag, NULL); 3520 received_bytes += ProcessFecPacket(4, 1, true, !kEntropyFlag, NULL);
3557 3521
3558 EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce( 3522 EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce(
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
4000 QuicBlockedFrame blocked; 3964 QuicBlockedFrame blocked;
4001 blocked.stream_id = 3; 3965 blocked.stream_id = 3;
4002 EXPECT_CALL(visitor_, OnBlockedFrames(_)); 3966 EXPECT_CALL(visitor_, OnBlockedFrames(_));
4003 ProcessFramePacket(QuicFrame(&blocked)); 3967 ProcessFramePacket(QuicFrame(&blocked));
4004 EXPECT_TRUE(ack_alarm->IsSet()); 3968 EXPECT_TRUE(ack_alarm->IsSet());
4005 } 3969 }
4006 3970
4007 } // namespace 3971 } // namespace
4008 } // namespace test 3972 } // namespace test
4009 } // namespace net 3973 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698