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