file_reader_unix_test.go 1.6 KB

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