blob: 2f7f4d2c64bf663b223bd705274e07b18d0fd6ad [file] [log] [blame]
// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build go1.21
package quic
import "testing"
func TestSentPacketListSlidingWindow(t *testing.T) {
// Record 1000 sent packets, acking everything outside the most recent 10.
list := &sentPacketList{}
const window = 10
for i := packetNumber(0); i < 1000; i++ {
list.add(&sentPacket{num: i})
if i < window {
continue
}
prev := i - window
sent := list.num(prev)
if sent == nil {
t.Fatalf("packet %v not in list", prev)
}
if sent.num != prev {
t.Fatalf("list.num(%v) = packet %v", prev, sent.num)
}
if got := list.nth(0); got != sent {
t.Fatalf("list.nth(0) != list.num(%v)", prev)
}
sent.acked = true
list.clean()
if got := list.num(prev); got != nil {
t.Fatalf("list.num(%v) = packet %v, expected it to be discarded", prev, got.num)
}
if got, want := list.start(), prev+1; got != want {
t.Fatalf("list.start() = %v, want %v", got, want)
}
if got, want := list.end(), i+1; got != want {
t.Fatalf("list.end() = %v, want %v", got, want)
}
if got, want := list.size, window; got != want {
t.Fatalf("list.size = %v, want %v", got, want)
}
}
}
func TestSentPacketListGrows(t *testing.T) {
// Record 1000 sent packets.
list := &sentPacketList{}
const count = 1000
for i := packetNumber(0); i < count; i++ {
list.add(&sentPacket{num: i})
}
if got, want := list.start(), packetNumber(0); got != want {
t.Fatalf("list.start() = %v, want %v", got, want)
}
if got, want := list.end(), packetNumber(count); got != want {
t.Fatalf("list.end() = %v, want %v", got, want)
}
if got, want := list.size, count; got != want {
t.Fatalf("list.size = %v, want %v", got, want)
}
for i := packetNumber(0); i < count; i++ {
sent := list.num(i)
if sent == nil {
t.Fatalf("packet %v not in list", i)
}
if sent.num != i {
t.Fatalf("list.num(%v) = packet %v", i, sent.num)
}
if got := list.nth(int(i)); got != sent {
t.Fatalf("list.nth(%v) != list.num(%v)", int(i), i)
}
}
}
func TestSentPacketListCleanAll(t *testing.T) {
list := &sentPacketList{}
// Record 10 sent packets.
const count = 10
for i := packetNumber(0); i < count; i++ {
list.add(&sentPacket{num: i})
}
// Mark all the packets as acked.
for i := packetNumber(0); i < count; i++ {
list.num(i).acked = true
}
list.clean()
if got, want := list.size, 0; got != want {
t.Fatalf("list.size = %v, want %v", got, want)
}
list.add(&sentPacket{num: 10})
if got, want := list.size, 1; got != want {
t.Fatalf("list.size = %v, want %v", got, want)
}
sent := list.num(10)
if sent == nil {
t.Fatalf("packet %v not in list", 10)
}
if sent.num != 10 {
t.Fatalf("list.num(10) = %v", sent.num)
}
if got := list.nth(0); got != sent {
t.Fatalf("list.nth(0) != list.num(10)")
}
}