parse and write ACKs that for packet number 0

This commit is contained in:
Marten Seemann
2017-12-04 11:12:55 +07:00
parent cc3bfc1fa7
commit 6ce3336be5
2 changed files with 36 additions and 6 deletions

View File

@@ -89,7 +89,7 @@ func ParseAckFrame(r *bytes.Reader, version protocol.VersionNumber) (*AckFrame,
return nil, ErrInvalidFirstAckRange
}
if ackBlockLength > largestAcked {
if ackBlockLength > largestAcked+1 {
return nil, ErrInvalidAckRanges
}

View File

@@ -27,11 +27,11 @@ var _ = Describe("AckFrame", func() {
Expect(b.Len()).To(BeZero())
})
It("parses a frame where the largest acked is 0", func() {
It("parses a frame that acks packet number 0", func() {
b := bytes.NewReader([]byte{0x40,
0x0, // largest acked
0x0, 0x0, // delay time
0x0, // block length
0x1, // block length
0,
})
frame, err := ParseAckFrame(b, protocol.VersionWhatever)
@@ -57,6 +57,21 @@ var _ = Describe("AckFrame", func() {
Expect(b.Len()).To(BeZero())
})
It("parses a frame that acks multiple packets, starting with 0", func() {
b := bytes.NewReader([]byte{0x40,
0x10, // largest acked
0x0, 0x0, // delay time
0x11, // block length
0,
})
frame, err := ParseAckFrame(b, protocol.VersionWhatever)
Expect(err).ToNot(HaveOccurred())
Expect(frame.LargestAcked).To(Equal(protocol.PacketNumber(0x10)))
Expect(frame.LowestAcked).To(Equal(protocol.PacketNumber(0)))
Expect(frame.HasMissingRanges()).To(BeFalse())
Expect(b.Len()).To(BeZero())
})
It("parses a frame with multiple timestamps", func() {
b := bytes.NewReader([]byte{0x40,
0x10, // largest acked
@@ -79,7 +94,7 @@ var _ = Describe("AckFrame", func() {
b := bytes.NewReader([]byte{0x40,
0x1c, // largest acked
0x0, 0x0, // delay time
0x1d, // block length
0x1e, // block length
0,
})
_, err := ParseAckFrame(b, protocol.VersionWhatever)
@@ -499,6 +514,21 @@ var _ = Describe("AckFrame", func() {
Expect(r.Len()).To(BeZero())
})
It("writes an ACK that also acks packet 0", func() {
frameOrig := &AckFrame{
LargestAcked: 1,
LowestAcked: 0,
}
err := frameOrig.Write(b, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
r := bytes.NewReader(b.Bytes())
frame, err := ParseAckFrame(r, versionBigEndian)
Expect(err).ToNot(HaveOccurred())
Expect(frame.LargestAcked).To(Equal(frameOrig.LargestAcked))
Expect(frame.HasMissingRanges()).To(BeFalse())
Expect(r.Len()).To(BeZero())
})
It("writes the correct block length in a simple ACK frame", func() {
frameOrig := &AckFrame{
LargestAcked: 20,
@@ -533,10 +563,10 @@ var _ = Describe("AckFrame", func() {
It("writes an ACK frame with one packet missing", func() {
frameOrig := &AckFrame{
LargestAcked: 40,
LowestAcked: 1,
LowestAcked: 0,
AckRanges: []AckRange{
{First: 25, Last: 40},
{First: 1, Last: 23},
{First: 0, Last: 23},
},
}
err := frameOrig.Write(b, versionBigEndian)