Merge pull request #10406 from filecoin-project/fix/rpcenc-falky-test
fix: rpcenc: deflake TestReaderRedirectDrop
This commit is contained in:
commit
9038e83639
@ -221,7 +221,7 @@ type RpcReader struct {
|
|||||||
|
|
||||||
res chan readRes
|
res chan readRes
|
||||||
beginOnce *sync.Once
|
beginOnce *sync.Once
|
||||||
closeOnce sync.Once
|
closeOnce *sync.Once
|
||||||
}
|
}
|
||||||
|
|
||||||
var ErrHasBody = errors.New("RPCReader has body, either already read from or from a client with no redirect support")
|
var ErrHasBody = errors.New("RPCReader has body, either already read from or from a client with no redirect support")
|
||||||
@ -265,6 +265,7 @@ func (w *RpcReader) beginPost() {
|
|||||||
w.postBody = nr.postBody
|
w.postBody = nr.postBody
|
||||||
w.res = nr.res
|
w.res = nr.res
|
||||||
w.beginOnce = nr.beginOnce
|
w.beginOnce = nr.beginOnce
|
||||||
|
w.closeOnce = nr.closeOnce
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -355,6 +356,7 @@ func ReaderParamDecoder() (http.HandlerFunc, jsonrpc.ServerOption) {
|
|||||||
res: make(chan readRes),
|
res: make(chan readRes),
|
||||||
next: ch,
|
next: ch,
|
||||||
beginOnce: &sync.Once{},
|
beginOnce: &sync.Once{},
|
||||||
|
closeOnce: &sync.Once{},
|
||||||
}
|
}
|
||||||
|
|
||||||
switch req.Method {
|
switch req.Method {
|
||||||
|
@ -3,8 +3,8 @@ package rpcenc
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
@ -77,7 +77,12 @@ func (h *ReaderHandler) CloseReader(ctx context.Context, r io.Reader) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (h *ReaderHandler) ReadAll(ctx context.Context, r io.Reader) ([]byte, error) {
|
func (h *ReaderHandler) ReadAll(ctx context.Context, r io.Reader) ([]byte, error) {
|
||||||
return ioutil.ReadAll(r)
|
b, err := io.ReadAll(r)
|
||||||
|
if err != nil {
|
||||||
|
return nil, xerrors.Errorf("readall: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return b, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *ReaderHandler) ReadNullLen(ctx context.Context, r io.Reader) (int64, error) {
|
func (h *ReaderHandler) ReadNullLen(ctx context.Context, r io.Reader) (int64, error) {
|
||||||
@ -219,9 +224,15 @@ func TestReaderRedirect(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestReaderRedirectDrop(t *testing.T) {
|
func TestReaderRedirectDrop(t *testing.T) {
|
||||||
|
for i := 0; i < 10; i++ {
|
||||||
|
t.Run(fmt.Sprintf("test %d", i), testReaderRedirectDrop)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func testReaderRedirectDrop(t *testing.T) {
|
||||||
// lower timeout so that the dangling connection between client and reader is dropped quickly
|
// lower timeout so that the dangling connection between client and reader is dropped quickly
|
||||||
// after the test. Otherwise httptest.Close is blocked.
|
// after the test. Otherwise httptest.Close is blocked.
|
||||||
Timeout = 200 * time.Millisecond
|
Timeout = 90 * time.Millisecond
|
||||||
|
|
||||||
var allClient struct {
|
var allClient struct {
|
||||||
ReadAll func(ctx context.Context, r io.Reader) ([]byte, error)
|
ReadAll func(ctx context.Context, r io.Reader) ([]byte, error)
|
||||||
@ -294,6 +305,8 @@ func TestReaderRedirectDrop(t *testing.T) {
|
|||||||
|
|
||||||
done.Wait()
|
done.Wait()
|
||||||
|
|
||||||
|
fmt.Println("---------------------")
|
||||||
|
|
||||||
// Redir client drops before subcall
|
// Redir client drops before subcall
|
||||||
done.Add(1)
|
done.Add(1)
|
||||||
|
|
||||||
@ -322,5 +335,9 @@ func TestReaderRedirectDrop(t *testing.T) {
|
|||||||
// wait for subcall to finish
|
// wait for subcall to finish
|
||||||
<-contCh
|
<-contCh
|
||||||
|
|
||||||
require.ErrorContains(t, allServerHandler.subErr, "decoding params for 'ReaderHandler.ReadAll' (param: 0; custom decoder): context canceled")
|
estr := allServerHandler.subErr.Error()
|
||||||
|
|
||||||
|
require.True(t,
|
||||||
|
strings.Contains(estr, "decoding params for 'ReaderHandler.ReadAll' (param: 0; custom decoder): context canceled") ||
|
||||||
|
strings.Contains(estr, "readall: unexpected EOF"), "unexpected error: %s", estr)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user