|
|
|
|
@ -17,17 +17,14 @@ func readStream(t *testing.T, s io.Reader) string {
|
|
|
|
|
return string(data[0:n])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestMuxConn(t *testing.T) {
|
|
|
|
|
func testMux(t *testing.T) (client *MuxConn, server *MuxConn) {
|
|
|
|
|
l, err := net.Listen("tcp", ":0")
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// When the server is done
|
|
|
|
|
// Server side
|
|
|
|
|
doneCh := make(chan struct{})
|
|
|
|
|
readyCh := make(chan struct{})
|
|
|
|
|
|
|
|
|
|
// The server side
|
|
|
|
|
go func() {
|
|
|
|
|
defer close(doneCh)
|
|
|
|
|
conn, err := l.Accept()
|
|
|
|
|
@ -35,15 +32,42 @@ func TestMuxConn(t *testing.T) {
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
|
}
|
|
|
|
|
defer conn.Close()
|
|
|
|
|
|
|
|
|
|
mux := NewMuxConn(conn)
|
|
|
|
|
s0, err := mux.Stream(0)
|
|
|
|
|
server = NewMuxConn(conn)
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
// Client side
|
|
|
|
|
conn, err := net.Dial("tcp", l.Addr().String())
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
|
}
|
|
|
|
|
client = NewMuxConn(conn)
|
|
|
|
|
|
|
|
|
|
// Wait for the server
|
|
|
|
|
<-doneCh
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestMuxConn(t *testing.T) {
|
|
|
|
|
client, server := testMux(t)
|
|
|
|
|
defer client.Close()
|
|
|
|
|
defer server.Close()
|
|
|
|
|
|
|
|
|
|
// When the server is done
|
|
|
|
|
doneCh := make(chan struct{})
|
|
|
|
|
readyCh := make(chan struct{})
|
|
|
|
|
|
|
|
|
|
// The server side
|
|
|
|
|
go func() {
|
|
|
|
|
defer close(doneCh)
|
|
|
|
|
|
|
|
|
|
s0, err := server.Stream(0)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s1, err := mux.Stream(1)
|
|
|
|
|
s1, err := server.Stream(1)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
|
}
|
|
|
|
|
@ -72,20 +96,12 @@ func TestMuxConn(t *testing.T) {
|
|
|
|
|
wg.Wait()
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
// Client side
|
|
|
|
|
conn, err := net.Dial("tcp", l.Addr().String())
|
|
|
|
|
s0, err := client.Stream(0)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
|
}
|
|
|
|
|
defer conn.Close()
|
|
|
|
|
|
|
|
|
|
mux := NewMuxConn(conn)
|
|
|
|
|
s0, err := mux.Stream(0)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s1, err := mux.Stream(1)
|
|
|
|
|
s1, err := client.Stream(1)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
|
}
|
|
|
|
|
@ -103,3 +119,47 @@ func TestMuxConn(t *testing.T) {
|
|
|
|
|
// Wait for the server to be done
|
|
|
|
|
<-doneCh
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestMuxConn_clientClosesStreams(t *testing.T) {
|
|
|
|
|
client, server := testMux(t)
|
|
|
|
|
defer client.Close()
|
|
|
|
|
defer server.Close()
|
|
|
|
|
|
|
|
|
|
s0, err := client.Stream(0)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := client.Close(); err != nil {
|
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// This should block forever since we never write onto this stream.
|
|
|
|
|
var data [1024]byte
|
|
|
|
|
_, err = s0.Read(data[:])
|
|
|
|
|
if err != io.EOF {
|
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestMuxConn_serverClosesStreams(t *testing.T) {
|
|
|
|
|
client, server := testMux(t)
|
|
|
|
|
defer client.Close()
|
|
|
|
|
defer server.Close()
|
|
|
|
|
|
|
|
|
|
s0, err := client.Stream(0)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := server.Close(); err != nil {
|
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// This should block forever since we never write onto this stream.
|
|
|
|
|
var data [1024]byte
|
|
|
|
|
_, err = s0.Read(data[:])
|
|
|
|
|
if err != io.EOF {
|
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|