add implementation for SentPacket in OutgoingPacketAckHandler

This commit is contained in:
Marten Seemann
2016-04-20 18:46:39 +07:00
parent 0164feff8f
commit 184890cb4a
2 changed files with 85 additions and 0 deletions

View File

@@ -0,0 +1,45 @@
package ackhandler
import (
"errors"
"sync"
"github.com/lucas-clemente/quic-go/frames"
"github.com/lucas-clemente/quic-go/protocol"
)
type outgoingPacketAckHandler struct {
lastSentPacketNumber protocol.PacketNumber
packetHistory map[protocol.PacketNumber]*Packet
packetHistoryMutex sync.Mutex
}
// NewOutgoingPacketAckHandler creates a new outgoingPacketAckHandler
func NewOutgoingPacketAckHandler() OutgoingPacketAckHandler {
return &outgoingPacketAckHandler{
packetHistory: make(map[protocol.PacketNumber]*Packet),
}
}
func (h *outgoingPacketAckHandler) SentPacket(packet *Packet) error {
h.packetHistoryMutex.Lock()
defer h.packetHistoryMutex.Unlock()
_, ok := h.packetHistory[packet.PacketNumber]
if ok {
return errors.New("Packet number already exists in Packet History")
}
if h.lastSentPacketNumber+1 != packet.PacketNumber {
return errors.New("Packet number must be increased by exactly 1")
}
h.lastSentPacketNumber = packet.PacketNumber
h.packetHistory[packet.PacketNumber] = packet
return nil
}
func (h *outgoingPacketAckHandler) ReceivedAck(ackFrame *frames.AckFrame) {
return
}
func (h *outgoingPacketAckHandler) DequeuePacketForRetransmission() (packet *Packet) {
return nil
}

View File

@@ -0,0 +1,40 @@
package ackhandler
import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("AckHandler", func() {
Context("SentPacket", func() {
It("accepts two consecutive packets", func() {
packet1 := Packet{PacketNumber: 1, Plaintext: []byte{0x13, 0x37}, EntropyBit: true}
packet2 := Packet{PacketNumber: 2, Plaintext: []byte{0xBE, 0xEF}, EntropyBit: false}
handler := NewOutgoingPacketAckHandler()
err := handler.SentPacket(&packet1)
Expect(err).ToNot(HaveOccurred())
err = handler.SentPacket(&packet2)
Expect(err).ToNot(HaveOccurred())
})
It("rejects two packets with the same packet number", func() {
packet1 := Packet{PacketNumber: 1, Plaintext: []byte{0x13, 0x37}, EntropyBit: true}
packet2 := Packet{PacketNumber: 1, Plaintext: []byte{0xBE, 0xEF}, EntropyBit: false}
handler := NewOutgoingPacketAckHandler()
err := handler.SentPacket(&packet1)
Expect(err).ToNot(HaveOccurred())
err = handler.SentPacket(&packet2)
Expect(err).To(HaveOccurred())
})
It("rejects non-consecutive packets", func() {
packet1 := Packet{PacketNumber: 1, Plaintext: []byte{0x13, 0x37}, EntropyBit: true}
packet2 := Packet{PacketNumber: 3, Plaintext: []byte{0xBE, 0xEF}, EntropyBit: false}
handler := NewOutgoingPacketAckHandler()
err := handler.SentPacket(&packet1)
Expect(err).ToNot(HaveOccurred())
err = handler.SentPacket(&packet2)
Expect(err).To(HaveOccurred())
})
})
})