github.com/markusbkk/elvish@v0.0.0-20231204143114-91dc52438621/pkg/cli/term/file_reader_unix_test.go (about)

     1  //go:build !windows && !plan9
     2  // +build !windows,!plan9
     3  
     4  package term
     5  
     6  import (
     7  	"fmt"
     8  	"io"
     9  	"os"
    10  	"testing"
    11  	"time"
    12  
    13  	"github.com/markusbkk/elvish/pkg/testutil"
    14  )
    15  
    16  func TestFileReader_ReadByteWithTimeout(t *testing.T) {
    17  	r, w, cleanup := setupFileReader()
    18  	defer cleanup()
    19  
    20  	content := []byte("0123456789")
    21  	w.Write(content)
    22  
    23  	// Test successful ReadByteWithTimeout calls.
    24  	for i := 0; i < len(content); i++ {
    25  		t.Run(fmt.Sprintf("byte %d", i), func(t *testing.T) {
    26  			b, err := r.ReadByteWithTimeout(-1)
    27  			if err != nil {
    28  				t.Errorf("got err %v, want nil", err)
    29  			}
    30  			if b != content[i] {
    31  				t.Errorf("got byte %q, want %q", b, content[i])
    32  			}
    33  		})
    34  	}
    35  }
    36  
    37  func TestFileReader_ReadByteWithTimeout_EOF(t *testing.T) {
    38  	r, w, cleanup := setupFileReader()
    39  	defer cleanup()
    40  
    41  	w.Close()
    42  	_, err := r.ReadByteWithTimeout(-1)
    43  	if err != io.EOF {
    44  		t.Errorf("got byte %v, want %v", err, io.EOF)
    45  	}
    46  }
    47  
    48  func TestFileReader_ReadByteWithTimeout_Timeout(t *testing.T) {
    49  	r, _, cleanup := setupFileReader()
    50  	defer cleanup()
    51  
    52  	_, err := r.ReadByteWithTimeout(testutil.Scaled(time.Millisecond))
    53  	if err != errTimeout {
    54  		t.Errorf("got err %v, want %v", err, errTimeout)
    55  	}
    56  }
    57  
    58  func TestFileReader_Stop(t *testing.T) {
    59  	r, _, cleanup := setupFileReader()
    60  	defer cleanup()
    61  
    62  	errCh := make(chan error, 1)
    63  	go func() {
    64  		_, err := r.ReadByteWithTimeout(-1)
    65  		errCh <- err
    66  	}()
    67  	r.Stop()
    68  
    69  	if err := <-errCh; err != ErrStopped {
    70  		t.Errorf("got err %v, want %v", err, ErrStopped)
    71  	}
    72  }
    73  
    74  func setupFileReader() (reader fileReader, writer *os.File, cleanup func()) {
    75  	pr, pw := testutil.MustPipe()
    76  	r, err := newFileReader(pr)
    77  	if err != nil {
    78  		panic(err)
    79  	}
    80  	return r, pw, func() {
    81  		r.Close()
    82  		pr.Close()
    83  		pw.Close()
    84  	}
    85  }