|
@@ -860,3 +860,51 @@ func TestWindowUpdateWriteDuringRead(t *testing.T) {
|
|
|
wg.Wait()
|
|
|
}
|
|
|
|
|
|
+func TestSession_sendNoWait_Timeout(t *testing.T) {
|
|
|
+ client, server := testClientServer()
|
|
|
+ defer client.Close()
|
|
|
+ defer server.Close()
|
|
|
+
|
|
|
+ var wg sync.WaitGroup
|
|
|
+ wg.Add(2)
|
|
|
+
|
|
|
+ go func() {
|
|
|
+ defer wg.Done()
|
|
|
+
|
|
|
+ stream, err := server.AcceptStream()
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("err: %v", err)
|
|
|
+ }
|
|
|
+ defer stream.Close()
|
|
|
+ }()
|
|
|
+
|
|
|
+ // The client will open the stream and then block outbound writes, we'll
|
|
|
+ // probe sendNoWait once it gets into that state.
|
|
|
+ go func() {
|
|
|
+ defer wg.Done()
|
|
|
+
|
|
|
+ stream, err := client.OpenStream()
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("err: %v", err)
|
|
|
+ }
|
|
|
+ defer stream.Close()
|
|
|
+
|
|
|
+ conn := client.conn.(*pipeConn)
|
|
|
+ conn.writeBlocker.Lock()
|
|
|
+
|
|
|
+ hdr := header(make([]byte, headerSize))
|
|
|
+ hdr.encode(typePing, flagACK, 0, 0)
|
|
|
+ for {
|
|
|
+ err = client.sendNoWait(hdr)
|
|
|
+ if err == nil {
|
|
|
+ continue
|
|
|
+ } else if err == ErrHeaderWriteTimeout {
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ t.Fatalf("err: %v", err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ wg.Wait()
|
|
|
+}
|