|  | // 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 TestSentPacket(t *testing.T) { | 
|  | frames := []any{ | 
|  | byte(frameTypePing), | 
|  | byte(frameTypeStreamBase), | 
|  | uint64(1), | 
|  | i64range[int64]{1 << 20, 1<<20 + 1024}, | 
|  | } | 
|  | // Record sent frames. | 
|  | sent := newSentPacket() | 
|  | for _, f := range frames { | 
|  | switch f := f.(type) { | 
|  | case byte: | 
|  | sent.appendAckElicitingFrame(f) | 
|  | case uint64: | 
|  | sent.appendInt(f) | 
|  | case i64range[int64]: | 
|  | sent.appendOffAndSize(f.start, int(f.size())) | 
|  | } | 
|  | } | 
|  | // Read the record. | 
|  | for i, want := range frames { | 
|  | if done := sent.done(); done { | 
|  | t.Fatalf("before consuming contents, sent.done() = true, want false") | 
|  | } | 
|  | switch want := want.(type) { | 
|  | case byte: | 
|  | if got := sent.next(); got != want { | 
|  | t.Fatalf("%v: sent.next() = %v, want %v", i, got, want) | 
|  | } | 
|  | case uint64: | 
|  | if got := sent.nextInt(); got != want { | 
|  | t.Fatalf("%v: sent.nextInt() = %v, want %v", i, got, want) | 
|  | } | 
|  | case i64range[int64]: | 
|  | if start, end := sent.nextRange(); start != want.start || end != want.end { | 
|  | t.Fatalf("%v: sent.nextRange() = [%v,%v), want %v", i, start, end, want) | 
|  | } | 
|  | } | 
|  | } | 
|  | if done := sent.done(); !done { | 
|  | t.Fatalf("after consuming contents, sent.done() = false, want true") | 
|  | } | 
|  | } |