rpcenc: More reliably failing TestReaderRedirectDrop

This commit is contained in:
Łukasz Magiera 2023-03-07 16:48:09 +01:00
parent 64b9b532c0
commit f2a652f29f

View File

@ -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)
@ -313,6 +326,8 @@ func TestReaderRedirectDrop(t *testing.T) {
// kill redirecting server connection // kill redirecting server connection
testServ.CloseClientConnections() testServ.CloseClientConnections()
//time.Sleep(200 * time.Millisecond)
// ReadAllWaiting should fail // ReadAllWaiting should fail
done.Wait() done.Wait()
@ -322,5 +337,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)
} }