diff --git a/ackhandlerlegacy/sent_packet_handler_test.go b/ackhandlerlegacy/sent_packet_handler_test.go index 212590788..cbbdc6f13 100644 --- a/ackhandlerlegacy/sent_packet_handler_test.go +++ b/ackhandlerlegacy/sent_packet_handler_test.go @@ -435,6 +435,20 @@ var _ = Describe("SentPacketHandler", func() { Expect(handler.highestInOrderAckedPacketNumber).To(Equal(protocol.PacketNumber(0))) Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(6))) }) + + It("correctly treats a belated ACK for a packet that has already been RTO retransmitted", func() { + // lose packet by NACKing it often enough + for i := uint8(0); i < protocol.RetransmissionThreshold+1; i++ { + _, err := handler.nackPacket(2) + Expect(err).ToNot(HaveOccurred()) + } + packet := handler.DequeuePacketForRetransmission() + Expect(packet).ToNot(BeNil()) + // this is the belated ACK + err := handler.ReceivedAck(&frames.AckFrameLegacy{LargestObserved: 3}, 1) + Expect(handler.LargestObserved).To(Equal(protocol.PacketNumber(3))) + Expect(err).ToNot(HaveOccurred()) + }) }) Context("calculating RTT", func() { diff --git a/ackhandlernew/sent_packet_handler_test.go b/ackhandlernew/sent_packet_handler_test.go index c88be2d37..880c27ce2 100644 --- a/ackhandlernew/sent_packet_handler_test.go +++ b/ackhandlernew/sent_packet_handler_test.go @@ -545,6 +545,22 @@ var _ = Describe("SentPacketHandler", func() { Expect(handler.ProbablyHasPacketForRetransmission()).To(BeTrue()) Expect(handler.DequeuePacketForRetransmission()).To(BeNil()) }) + + It("correctly treats a belated ACK for a packet that has already been RTO retransmitted", func() { + // lose packet by NACKing it often enough + for i := uint8(0); i < protocol.RetransmissionThreshold+1; i++ { + _, err := handler.nackPacket(2) + Expect(err).ToNot(HaveOccurred()) + } + packet := handler.DequeuePacketForRetransmission() + Expect(packet).ToNot(BeNil()) + Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(2))) + // this is the belated ACK + err := handler.ReceivedAck(&frames.AckFrameNew{LowestAcked: 2, LargestAcked: 3}, 1) + Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(0))) + Expect(handler.LargestAcked).To(Equal(protocol.PacketNumber(3))) + Expect(err).ToNot(HaveOccurred()) + }) }) Context("calculating bytes in flight", func() {