test(pty/ptytest): fix error message on deadline exceeded (#8337)

This commit is contained in:
Mathias Fredriksson 2023-07-06 16:18:03 +03:00 committed by GitHub
parent 814534d6b7
commit 4a13c58077
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 17 additions and 16 deletions

View File

@ -158,9 +158,9 @@ func (e *outExpecter) ExpectMatchContext(ctx context.Context, str string) string
e.t.Helper() e.t.Helper()
var buffer bytes.Buffer var buffer bytes.Buffer
err := e.doMatchWithDeadline(ctx, "ExpectMatchContext", func() error { err := e.doMatchWithDeadline(ctx, "ExpectMatchContext", func(rd *bufio.Reader) error {
for { for {
r, _, err := e.runeReader.ReadRune() r, _, err := rd.ReadRune()
if err != nil { if err != nil {
return err return err
} }
@ -186,9 +186,9 @@ func (e *outExpecter) ExpectNoMatchBefore(ctx context.Context, match, before str
e.t.Helper() e.t.Helper()
var buffer bytes.Buffer var buffer bytes.Buffer
err := e.doMatchWithDeadline(ctx, "ExpectNoMatchBefore", func() error { err := e.doMatchWithDeadline(ctx, "ExpectNoMatchBefore", func(rd *bufio.Reader) error {
for { for {
r, _, err := e.runeReader.ReadRune() r, _, err := rd.ReadRune()
if err != nil { if err != nil {
return err return err
} }
@ -218,9 +218,9 @@ func (e *outExpecter) Peek(ctx context.Context, n int) []byte {
e.t.Helper() e.t.Helper()
var out []byte var out []byte
err := e.doMatchWithDeadline(ctx, "Peek", func() error { err := e.doMatchWithDeadline(ctx, "Peek", func(rd *bufio.Reader) error {
var err error var err error
out, err = e.runeReader.Peek(n) out, err = rd.Peek(n)
return err return err
}) })
if err != nil { if err != nil {
@ -235,9 +235,9 @@ func (e *outExpecter) ReadRune(ctx context.Context) rune {
e.t.Helper() e.t.Helper()
var r rune var r rune
err := e.doMatchWithDeadline(ctx, "ReadRune", func() error { err := e.doMatchWithDeadline(ctx, "ReadRune", func(rd *bufio.Reader) error {
var err error var err error
r, _, err = e.runeReader.ReadRune() r, _, err = rd.ReadRune()
return err return err
}) })
if err != nil { if err != nil {
@ -252,9 +252,9 @@ func (e *outExpecter) ReadLine(ctx context.Context) string {
e.t.Helper() e.t.Helper()
var buffer bytes.Buffer var buffer bytes.Buffer
err := e.doMatchWithDeadline(ctx, "ReadLine", func() error { err := e.doMatchWithDeadline(ctx, "ReadLine", func(rd *bufio.Reader) error {
for { for {
r, _, err := e.runeReader.ReadRune() r, _, err := rd.ReadRune()
if err != nil { if err != nil {
return err return err
} }
@ -267,14 +267,14 @@ func (e *outExpecter) ReadLine(ctx context.Context) string {
// Unicode code points can be up to 4 bytes, but the // Unicode code points can be up to 4 bytes, but the
// ones we're looking for are only 1 byte. // ones we're looking for are only 1 byte.
b, _ := e.runeReader.Peek(1) b, _ := rd.Peek(1)
if len(b) == 0 { if len(b) == 0 {
return nil return nil
} }
r, _ = utf8.DecodeRune(b) r, _ = utf8.DecodeRune(b)
if r == '\n' { if r == '\n' {
_, _, err = e.runeReader.ReadRune() _, _, err = rd.ReadRune()
if err != nil { if err != nil {
return err return err
} }
@ -297,7 +297,7 @@ func (e *outExpecter) ReadLine(ctx context.Context) string {
return buffer.String() return buffer.String()
} }
func (e *outExpecter) doMatchWithDeadline(ctx context.Context, name string, fn func() error) error { func (e *outExpecter) doMatchWithDeadline(ctx context.Context, name string, fn func(*bufio.Reader) error) error {
e.t.Helper() e.t.Helper()
// A timeout is mandatory, caller can decide by passing a context // A timeout is mandatory, caller can decide by passing a context
@ -314,14 +314,15 @@ func (e *outExpecter) doMatchWithDeadline(ctx context.Context, name string, fn f
match := make(chan error, 1) match := make(chan error, 1)
go func() { go func() {
defer close(match) defer close(match)
match <- fn() match <- fn(e.runeReader)
}() }()
select { select {
case err := <-match: case err := <-match:
return err return err
case <-ctx.Done(): case <-ctx.Done():
// Ensure goroutine is cleaned up before test exit. // Ensure goroutine is cleaned up before test exit, do not call
_ = e.close("match deadline exceeded") // (*outExpecter).close here to let the caller decide.
_ = e.out.Close()
<-match <-match
return xerrors.Errorf("match deadline exceeded: %w", ctx.Err()) return xerrors.Errorf("match deadline exceeded: %w", ctx.Err())