diff --git a/ackhandler/outgoing_packet_ack_handler.go b/ackhandler/outgoing_packet_ack_handler.go index 67ab085fa..9b47ddc3b 100644 --- a/ackhandler/outgoing_packet_ack_handler.go +++ b/ackhandler/outgoing_packet_ack_handler.go @@ -35,8 +35,7 @@ func (h *outgoingPacketAckHandler) SentPacket(packet *Packet) error { } var lastPacketEntropy EntropyAccumulator - // ToDo: write tests for this - if packet.PacketNumber == 0 { + if packet.PacketNumber == 1 { lastPacketEntropy = EntropyAccumulator(0) } else { if h.highestInOrderAckedPacketNumber == packet.PacketNumber-1 { diff --git a/ackhandler/outgoing_packet_ack_handler_test.go b/ackhandler/outgoing_packet_ack_handler_test.go index 680e13c16..2f6b8948a 100644 --- a/ackhandler/outgoing_packet_ack_handler_test.go +++ b/ackhandler/outgoing_packet_ack_handler_test.go @@ -56,6 +56,26 @@ var _ = Describe("AckHandler", func() { Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(2))) Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(2))) }) + + It("correctly calculates the entropy, even if the last packet has already been ACKed", func() { + packet1 := Packet{PacketNumber: 1, Plaintext: []byte{0x13, 0x37}, EntropyBit: true} + packet2 := Packet{PacketNumber: 2, Plaintext: []byte{0xBE, 0xEF}, EntropyBit: true} + err := handler.SentPacket(&packet1) + Expect(err).ToNot(HaveOccurred()) + expectedEntropy := EntropyAccumulator(0) + expectedEntropy.Add(packet1.PacketNumber, packet1.EntropyBit) + ack := frames.AckFrame{ + LargestObserved: 1, + Entropy: byte(expectedEntropy), + } + err = handler.ReceivedAck(&ack) + Expect(err).ToNot(HaveOccurred()) + err = handler.SentPacket(&packet2) + Expect(err).ToNot(HaveOccurred()) + Expect(handler.lastSentPacketNumber).To(Equal(protocol.PacketNumber(2))) + expectedEntropy.Add(packet2.PacketNumber, packet2.EntropyBit) + Expect(handler.packetHistory[2].Entropy).To(Equal(expectedEntropy)) + }) }) Context("ACK handling", func() {