Path: blob/main/vendor/github.com/onsi/gomega/gbytes/io_wrappers.go
2880 views
package gbytes12import (3"errors"4"io"5"time"6)78// ErrTimeout is returned by TimeoutCloser, TimeoutReader, and TimeoutWriter when the underlying Closer/Reader/Writer does not return within the specified timeout9var ErrTimeout = errors.New("timeout occurred")1011// TimeoutCloser returns an io.Closer that wraps the passed-in io.Closer. If the underlying Closer fails to close within the allotted timeout ErrTimeout is returned.12func TimeoutCloser(c io.Closer, timeout time.Duration) io.Closer {13return timeoutReaderWriterCloser{c: c, d: timeout}14}1516// TimeoutReader returns an io.Reader that wraps the passed-in io.Reader. If the underlying Reader fails to read within the allotted timeout ErrTimeout is returned.17func TimeoutReader(r io.Reader, timeout time.Duration) io.Reader {18return timeoutReaderWriterCloser{r: r, d: timeout}19}2021// TimeoutWriter returns an io.Writer that wraps the passed-in io.Writer. If the underlying Writer fails to write within the allotted timeout ErrTimeout is returned.22func TimeoutWriter(w io.Writer, timeout time.Duration) io.Writer {23return timeoutReaderWriterCloser{w: w, d: timeout}24}2526type timeoutReaderWriterCloser struct {27c io.Closer28w io.Writer29r io.Reader30d time.Duration31}3233func (t timeoutReaderWriterCloser) Close() error {34done := make(chan struct{})35var err error3637go func() {38err = t.c.Close()39close(done)40}()4142select {43case <-done:44return err45case <-time.After(t.d):46return ErrTimeout47}48}4950func (t timeoutReaderWriterCloser) Read(p []byte) (int, error) {51done := make(chan struct{})52var n int53var err error5455go func() {56n, err = t.r.Read(p)57close(done)58}()5960select {61case <-done:62return n, err63case <-time.After(t.d):64return 0, ErrTimeout65}66}6768func (t timeoutReaderWriterCloser) Write(p []byte) (int, error) {69done := make(chan struct{})70var n int71var err error7273go func() {74n, err = t.w.Write(p)75close(done)76}()7778select {79case <-done:80return n, err81case <-time.After(t.d):82return 0, ErrTimeout83}84}858687