| // 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)") |
| } |
| } |