You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

54 lines
1.4 KiB

package dcmux
import (
"encoding/binary"
"testing"
)
func TestCleanupStreamRemovesClosedStream(t *testing.T) {
t.Parallel()
mux := New(1, func([]byte) error { return nil })
mux.maxStreams = 1
dataReady := mux.WaitForData(7)
mux.HandleFrame(testFrame(1, 7, 0, []byte("hello")))
if got := mux.GetStreams(); len(got) != 1 || got[0] != 7 {
t.Fatalf("GetStreams() = %v, want [7]", got)
}
select {
case <-dataReady:
default:
t.Fatal("expected dataReady signal after HandleFrame")
}
select {
case <-mux.WaitForActivity():
default:
t.Fatal("expected activity signal after HandleFrame")
}
mux.CleanupStream(7)
if _, ok := <-dataReady; ok {
t.Fatal("dataReady channel stayed open after CleanupStream")
}
if got := mux.GetStreams(); len(got) != 0 {
t.Fatalf("GetStreams() after CleanupStream = %v, want empty", got)
}
mux.HandleFrame(testFrame(1, 8, 0, []byte("world")))
if got := mux.GetStreams(); len(got) != 1 || got[0] != 8 {
t.Fatalf("GetStreams() after reusing capacity = %v, want [8]", got)
}
}
func testFrame(clientID uint32, sid uint16, seq uint32, payload []byte) []byte {
frame := make([]byte, 12+len(payload))
binary.BigEndian.PutUint32(frame[0:4], clientID)
binary.BigEndian.PutUint16(frame[4:6], sid)
binary.BigEndian.PutUint16(frame[6:8], uint16(len(payload)))
binary.BigEndian.PutUint32(frame[8:12], seq)
copy(frame[12:], payload)
return frame
}