// Copyright 2016 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.

package http2

import "testing"

func TestRandomScheduler(t *testing.T) {
	ws := NewRandomWriteScheduler()
	ws.Push(makeWriteHeadersRequest(3))
	ws.Push(makeWriteHeadersRequest(4))
	ws.Push(makeWriteHeadersRequest(1))
	ws.Push(makeWriteHeadersRequest(2))
	ws.Push(makeWriteNonStreamRequest())
	ws.Push(makeWriteNonStreamRequest())

	// Pop all frames. Should get the non-stream requests first,
	// followed by the stream requests in any order.
	var order []FrameWriteRequest
	for {
		wr, ok := ws.Pop()
		if !ok {
			break
		}
		order = append(order, wr)
	}
	t.Logf("got frames: %v", order)
	if len(order) != 6 {
		t.Fatalf("got %d frames, expected 6", len(order))
	}
	if order[0].StreamID() != 0 || order[1].StreamID() != 0 {
		t.Fatal("expected non-stream frames first", order[0], order[1])
	}
	got := make(map[uint32]bool)
	for _, wr := range order[2:] {
		got[wr.StreamID()] = true
	}
	for id := uint32(1); id <= 4; id++ {
		if !got[id] {
			t.Errorf("frame not found for stream %d", id)
		}
	}

	// Verify that we clean up maps for empty queues in all cases (golang.org/issue/33812)
	const arbitraryStreamID = 123
	ws.Push(makeHandlerPanicRST(arbitraryStreamID))
	rws := ws.(*randomWriteScheduler)
	if got, want := len(rws.sq), 1; got != want {
		t.Fatalf("len of 123 stream = %v; want %v", got, want)
	}
	_, ok := ws.Pop()
	if !ok {
		t.Fatal("expected to be able to Pop")
	}
	if got, want := len(rws.sq), 0; got != want {
		t.Fatalf("len of 123 stream = %v; want %v", got, want)
	}

}
