fakeseeker_test.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package readers
  2. import (
  3. "bytes"
  4. "io"
  5. "testing"
  6. "github.com/stretchr/testify/assert"
  7. "github.com/stretchr/testify/require"
  8. )
  9. // Check interface
  10. var _ io.ReadSeeker = &FakeSeeker{}
  11. func TestFakeSeeker(t *testing.T) {
  12. // Test that passing in an io.ReadSeeker just passes it through
  13. bufReader := bytes.NewReader([]byte{1})
  14. r := NewFakeSeeker(bufReader, 5)
  15. assert.Equal(t, r, bufReader)
  16. in := bytes.NewBufferString("hello")
  17. buf := make([]byte, 16)
  18. r = NewFakeSeeker(in, 5)
  19. assert.NotEqual(t, r, in)
  20. // check the seek offset is as passed in
  21. checkPos := func(pos int64) {
  22. abs, err := r.Seek(0, io.SeekCurrent)
  23. require.NoError(t, err)
  24. assert.Equal(t, pos, abs)
  25. }
  26. // Test some seeking
  27. checkPos(0)
  28. abs, err := r.Seek(2, io.SeekStart)
  29. require.NoError(t, err)
  30. assert.Equal(t, int64(2), abs)
  31. checkPos(2)
  32. abs, err = r.Seek(-1, io.SeekEnd)
  33. require.NoError(t, err)
  34. assert.Equal(t, int64(4), abs)
  35. checkPos(4)
  36. // Check can't read if not at start
  37. _, err = r.Read(buf)
  38. require.ErrorContains(t, err, "not at start")
  39. // Seek back to start
  40. abs, err = r.Seek(-4, io.SeekCurrent)
  41. require.NoError(t, err)
  42. assert.Equal(t, int64(0), abs)
  43. checkPos(0)
  44. _, err = r.Seek(42, 17)
  45. require.ErrorContains(t, err, "invalid whence")
  46. _, err = r.Seek(-1, io.SeekStart)
  47. require.ErrorContains(t, err, "negative position")
  48. // Test reading now seeked back to the start
  49. n, err := r.Read(buf)
  50. require.NoError(t, err)
  51. assert.Equal(t, 5, n)
  52. assert.Equal(t, []byte("hello"), buf[:5])
  53. // Seeking should give an error now
  54. _, err = r.Seek(-1, io.SeekEnd)
  55. require.ErrorContains(t, err, "after reading")
  56. }
  57. func TestFakeSeekerError(t *testing.T) {
  58. in := bytes.NewBufferString("hello")
  59. r := NewFakeSeeker(in, 5)
  60. assert.NotEqual(t, r, in)
  61. buf, err := io.ReadAll(r)
  62. require.NoError(t, err)
  63. assert.Equal(t, []byte("hello"), buf)
  64. _, err = r.Read(buf)
  65. assert.Equal(t, io.EOF, err)
  66. _, err = r.Seek(0, io.SeekStart)
  67. assert.Equal(t, io.EOF, err)
  68. }