func GoServe(t *testing.T, tr smux.Transport, l net.Listener) (done func()) { closed := make(chan struct{}, 1) go func() { for { c1, err := l.Accept() if err != nil { select { case <-closed: return // closed naturally. default: checkErr(t, err) } } log("accepted connection") sc1, err := tr.NewConn(c1, true) checkErr(t, err) go sc1.Serve(echoStream) } }() return func() { closed <- struct{}{} } }
func SubtestSimpleWrite(t *testing.T, tr smux.Transport) { l, err := net.Listen("tcp", "localhost:0") checkErr(t, err) log("listening at %s", l.Addr().String()) done := GoServe(t, tr, l) defer done() log("dialing to %s", l.Addr().String()) nc1, err := net.Dial("tcp", l.Addr().String()) checkErr(t, err) defer nc1.Close() log("wrapping conn") c1, err := tr.NewConn(nc1, false) checkErr(t, err) defer c1.Close() // serve the outgoing conn, because some muxers assume // that we _always_ call serve. (this is an error?) go c1.Serve(smux.NoOpHandler) log("creating stream") s1, err := c1.OpenStream() checkErr(t, err) defer s1.Close() buf1 := randBuf(4096) log("writing %d bytes to stream", len(buf1)) _, err = s1.Write(buf1) checkErr(t, err) buf2 := make([]byte, len(buf1)) log("reading %d bytes from stream (echoed)", len(buf2)) _, err = s1.Read(buf2) checkErr(t, err) if string(buf2) != string(buf1) { t.Error("buf1 and buf2 not equal: %s != %s", string(buf1), string(buf2)) } log("done") }