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+185219func TestMuxChannelCloseWriteUnblock(t *testing.T) {
186220reader, writer, mux := channelPair(t)
187221defer 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.
758829func TestDebug(t *testing.T) {
759830if debugMux {