ssh: defer channel window adjustment · golang/crypto@fdfe1f8

@@ -182,6 +182,40 @@ func TestMuxChannelOverflow(t *testing.T) {

182182

}

183183

}

184184185+

func TestMuxChannelReadUnblock(t *testing.T) {

186+

reader, writer, mux := channelPair(t)

187+

defer reader.Close()

188+

defer writer.Close()

189+

defer mux.Close()

190+191+

var wg sync.WaitGroup

192+

t.Cleanup(wg.Wait)

193+

wg.Add(1)

194+

go func() {

195+

defer wg.Done()

196+

if _, err := writer.Write(make([]byte, channelWindowSize)); err != nil {

197+

t.Errorf("could not fill window: %v", err)

198+

}

199+

if _, err := writer.Write(make([]byte, 1)); err != nil {

200+

t.Errorf("Write: %v", err)

201+

}

202+

writer.Close()

203+

}()

204+205+

writer.remoteWin.waitWriterBlocked()

206+207+

buf := make([]byte, 32768)

208+

for {

209+

_, err := reader.Read(buf)

210+

if err == io.EOF {

211+

break

212+

}

213+

if err != nil {

214+

t.Fatalf("Read: %v", err)

215+

}

216+

}

217+

}

218+185219

func TestMuxChannelCloseWriteUnblock(t *testing.T) {

186220

reader, writer, mux := channelPair(t)

187221

defer reader.Close()

@@ -754,6 +788,43 @@ func TestMuxMaxPacketSize(t *testing.T) {

754788

}

755789

}

756790791+

func TestMuxChannelWindowDeferredUpdates(t *testing.T) {

792+

s, c, mux := channelPair(t)

793+

cTransport := mux.conn.(*memTransport)

794+

defer s.Close()

795+

defer c.Close()

796+

defer mux.Close()

797+798+

var wg sync.WaitGroup

799+

t.Cleanup(wg.Wait)

800+801+

data := make([]byte, 1024)

802+803+

wg.Add(1)

804+

go func() {

805+

defer wg.Done()

806+

_, err := s.Write(data)

807+

if err != nil {

808+

t.Errorf("Write: %v", err)

809+

return

810+

}

811+

}()

812+

cWritesInit := cTransport.getWriteCount()

813+

buf := make([]byte, 1)

814+

for i := 0; i < len(data); i++ {

815+

n, err := c.Read(buf)

816+

if n != len(buf) || err != nil {

817+

t.Fatalf("Read: %v, %v", n, err)

818+

}

819+

}

820+

cWrites := cTransport.getWriteCount() - cWritesInit

821+

// reading 1 KiB should not cause any window updates to be sent, but allow

822+

// for some unexpected writes

823+

if cWrites > 30 {

824+

t.Fatalf("reading 1 KiB from channel caused %v writes", cWrites)

825+

}

826+

}

827+757828

// Don't ship code with debug=true.

758829

func TestDebug(t *testing.T) {

759830

if debugMux {