1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/quic/quic_unacked_packet_map.h" 6 7 #include "net/quic/test_tools/quic_test_utils.h" 8 #include "testing/gtest/include/gtest/gtest.h" 9 10 namespace net { 11 namespace test { 12 namespace { 13 14 // Default packet length. 15 const uint32 kDefaultAckLength = 50; 16 const uint32 kDefaultLength = 1000; 17 18 class QuicUnackedPacketMapTest : public ::testing::Test { 19 protected: 20 QuicUnackedPacketMapTest() 21 : now_(QuicTime::Zero().Add(QuicTime::Delta::FromMilliseconds(1000))) { 22 } 23 24 SerializedPacket CreateRetransmittablePacket( 25 QuicPacketSequenceNumber sequence_number) { 26 return SerializedPacket(sequence_number, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 27 0, new RetransmittableFrames()); 28 } 29 30 SerializedPacket CreateNonRetransmittablePacket( 31 QuicPacketSequenceNumber sequence_number) { 32 return SerializedPacket( 33 sequence_number, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); 34 } 35 36 void VerifyPendingPackets(QuicPacketSequenceNumber* packets, 37 size_t num_packets) { 38 if (num_packets == 0) { 39 EXPECT_FALSE(unacked_packets_.HasInFlightPackets()); 40 EXPECT_FALSE(unacked_packets_.HasMultipleInFlightPackets()); 41 return; 42 } 43 if (num_packets == 1) { 44 EXPECT_TRUE(unacked_packets_.HasInFlightPackets()); 45 EXPECT_FALSE(unacked_packets_.HasMultipleInFlightPackets()); 46 } 47 for (size_t i = 0; i < num_packets; ++i) { 48 ASSERT_TRUE(unacked_packets_.IsUnacked(packets[i])); 49 EXPECT_TRUE(unacked_packets_.GetTransmissionInfo(packets[i]).in_flight); 50 } 51 } 52 53 void VerifyUnackedPackets(QuicPacketSequenceNumber* packets, 54 size_t num_packets) { 55 if (num_packets == 0) { 56 EXPECT_FALSE(unacked_packets_.HasUnackedPackets()); 57 EXPECT_FALSE(unacked_packets_.HasUnackedRetransmittableFrames()); 58 return; 59 } 60 EXPECT_TRUE(unacked_packets_.HasUnackedPackets()); 61 for (size_t i = 0; i < num_packets; ++i) { 62 EXPECT_TRUE(unacked_packets_.IsUnacked(packets[i])) << packets[i]; 63 } 64 } 65 66 void VerifyRetransmittablePackets(QuicPacketSequenceNumber* packets, 67 size_t num_packets) { 68 size_t num_retransmittable_packets = 0; 69 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); 70 it != unacked_packets_.end(); ++it) { 71 if (it->second.retransmittable_frames != NULL) { 72 ++num_retransmittable_packets; 73 } 74 } 75 EXPECT_EQ(num_packets, num_retransmittable_packets); 76 for (size_t i = 0; i < num_packets; ++i) { 77 EXPECT_TRUE(unacked_packets_.HasRetransmittableFrames(packets[i])) 78 << " packets[" << i << "]:" << packets[i]; 79 } 80 } 81 82 QuicUnackedPacketMap unacked_packets_; 83 QuicTime now_; 84 }; 85 86 TEST_F(QuicUnackedPacketMapTest, RttOnly) { 87 // Acks are only tracked for RTT measurement purposes. 88 unacked_packets_.AddPacket(CreateNonRetransmittablePacket(1)); 89 unacked_packets_.SetSent(1, now_, kDefaultAckLength, false); 90 91 QuicPacketSequenceNumber unacked[] = { 1 }; 92 VerifyUnackedPackets(unacked, arraysize(unacked)); 93 VerifyPendingPackets(NULL, 0); 94 VerifyRetransmittablePackets(NULL, 0); 95 96 unacked_packets_.IncreaseLargestObserved(1); 97 VerifyUnackedPackets(NULL, 0); 98 VerifyPendingPackets(NULL, 0); 99 VerifyRetransmittablePackets(NULL, 0); 100 } 101 102 TEST_F(QuicUnackedPacketMapTest, RetransmittableInflightAndRtt) { 103 // Simulate a retransmittable packet being sent and acked. 104 unacked_packets_.AddPacket(CreateRetransmittablePacket(1)); 105 unacked_packets_.SetSent(1, now_, kDefaultLength, true); 106 107 QuicPacketSequenceNumber unacked[] = { 1 }; 108 VerifyUnackedPackets(unacked, arraysize(unacked)); 109 VerifyPendingPackets(unacked, arraysize(unacked)); 110 VerifyRetransmittablePackets(unacked, arraysize(unacked)); 111 112 unacked_packets_.RemoveRetransmittability(1); 113 VerifyUnackedPackets(unacked, arraysize(unacked)); 114 VerifyPendingPackets(unacked, arraysize(unacked)); 115 VerifyRetransmittablePackets(NULL, 0); 116 117 unacked_packets_.IncreaseLargestObserved(1); 118 VerifyUnackedPackets(unacked, arraysize(unacked)); 119 VerifyPendingPackets(unacked, arraysize(unacked)); 120 VerifyRetransmittablePackets(NULL, 0); 121 122 unacked_packets_.RemoveFromInFlight(1); 123 VerifyUnackedPackets(NULL, 0); 124 VerifyPendingPackets(NULL, 0); 125 VerifyRetransmittablePackets(NULL, 0); 126 } 127 128 TEST_F(QuicUnackedPacketMapTest, RetransmittedPacket) { 129 // Simulate a retransmittable packet being sent, retransmitted, and the first 130 // transmission being acked. 131 unacked_packets_.AddPacket(CreateRetransmittablePacket(1)); 132 unacked_packets_.SetSent(1, now_, kDefaultLength, true); 133 unacked_packets_.OnRetransmittedPacket(1, 2, LOSS_RETRANSMISSION); 134 unacked_packets_.SetSent(2, now_, kDefaultLength, true); 135 136 QuicPacketSequenceNumber unacked[] = { 1, 2 }; 137 VerifyUnackedPackets(unacked, arraysize(unacked)); 138 VerifyPendingPackets(unacked, arraysize(unacked)); 139 QuicPacketSequenceNumber retransmittable[] = { 2 }; 140 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); 141 142 unacked_packets_.RemoveRetransmittability(1); 143 VerifyUnackedPackets(unacked, arraysize(unacked)); 144 VerifyPendingPackets(unacked, arraysize(unacked)); 145 VerifyRetransmittablePackets(NULL, 0); 146 147 unacked_packets_.IncreaseLargestObserved(2); 148 VerifyUnackedPackets(unacked, arraysize(unacked)); 149 VerifyPendingPackets(unacked, arraysize(unacked)); 150 VerifyRetransmittablePackets(NULL, 0); 151 152 unacked_packets_.RemoveFromInFlight(2); 153 QuicPacketSequenceNumber unacked2[] = { 1 }; 154 VerifyUnackedPackets(unacked, arraysize(unacked2)); 155 VerifyPendingPackets(unacked, arraysize(unacked2)); 156 VerifyRetransmittablePackets(NULL, 0); 157 158 unacked_packets_.RemoveFromInFlight(1); 159 VerifyUnackedPackets(NULL, 0); 160 VerifyPendingPackets(NULL, 0); 161 VerifyRetransmittablePackets(NULL, 0); 162 } 163 164 } // namespace 165 } // namespace test 166 } // namespace net 167