golang.org/x/net@v0.25.1-0.20240516223405-c87a5b62e243/http2/writesched_random_test.go (about) 1 // Copyright 2016 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package http2 6 7 import "testing" 8 9 func TestRandomScheduler(t *testing.T) { 10 ws := NewRandomWriteScheduler() 11 ws.Push(makeWriteHeadersRequest(3)) 12 ws.Push(makeWriteHeadersRequest(4)) 13 ws.Push(makeWriteHeadersRequest(1)) 14 ws.Push(makeWriteHeadersRequest(2)) 15 ws.Push(makeWriteNonStreamRequest()) 16 ws.Push(makeWriteNonStreamRequest()) 17 ws.Push(makeWriteRSTStream(1)) 18 19 // Pop all frames. Should get the non-stream and RST stream requests first, 20 // followed by the stream requests in any order. 21 var order []FrameWriteRequest 22 for { 23 wr, ok := ws.Pop() 24 if !ok { 25 break 26 } 27 order = append(order, wr) 28 } 29 t.Logf("got frames: %v", order) 30 if len(order) != 7 { 31 t.Fatalf("got %d frames, expected 6", len(order)) 32 } 33 if order[0].StreamID() != 0 || order[1].StreamID() != 0 { 34 t.Fatal("expected non-stream frames first", order[0], order[1]) 35 } 36 if _, ok := order[2].write.(StreamError); !ok { 37 t.Fatal("expected RST stream frames first", order[2]) 38 } 39 got := make(map[uint32]bool) 40 for _, wr := range order[2:] { 41 got[wr.StreamID()] = true 42 } 43 for id := uint32(1); id <= 4; id++ { 44 if !got[id] { 45 t.Errorf("frame not found for stream %d", id) 46 } 47 } 48 49 // Verify that we clean up maps for empty queues in all cases (golang.org/issue/33812) 50 const arbitraryStreamID = 123 51 ws.Push(makeHandlerPanicRST(arbitraryStreamID)) 52 rws := ws.(*randomWriteScheduler) 53 if got, want := len(rws.sq), 1; got != want { 54 t.Fatalf("len of 123 stream = %v; want %v", got, want) 55 } 56 _, ok := ws.Pop() 57 if !ok { 58 t.Fatal("expected to be able to Pop") 59 } 60 if got, want := len(rws.sq), 0; got != want { 61 t.Fatalf("len of 123 stream = %v; want %v", got, want) 62 } 63 64 }