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
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
|
|
}
|
|
|