repeatable_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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. func TestRepeatableReader(t *testing.T) {
  10. var dst []byte
  11. var n int
  12. var pos int64
  13. var err error
  14. b := []byte("Testbuffer")
  15. buf := bytes.NewBuffer(b)
  16. r := NewRepeatableReader(buf)
  17. dst = make([]byte, 100)
  18. n, err = r.Read(dst)
  19. assert.Nil(t, err)
  20. assert.Equal(t, 10, n)
  21. require.Equal(t, b, dst[0:10])
  22. // Test read EOF
  23. n, err = r.Read(dst)
  24. assert.Equal(t, io.EOF, err)
  25. assert.Equal(t, 0, n)
  26. // Test Seek Back to start
  27. dst = make([]byte, 10)
  28. pos, err = r.Seek(0, io.SeekStart)
  29. assert.Nil(t, err)
  30. require.Equal(t, 0, int(pos))
  31. n, err = r.Read(dst)
  32. assert.Nil(t, err)
  33. assert.Equal(t, 10, n)
  34. require.Equal(t, b, dst)
  35. // Test partial read
  36. buf = bytes.NewBuffer(b)
  37. r = NewRepeatableReader(buf)
  38. dst = make([]byte, 5)
  39. n, err = r.Read(dst)
  40. assert.Nil(t, err)
  41. assert.Equal(t, 5, n)
  42. require.Equal(t, b[0:5], dst)
  43. n, err = r.Read(dst)
  44. assert.Nil(t, err)
  45. assert.Equal(t, 5, n)
  46. require.Equal(t, b[5:], dst)
  47. // Test Seek
  48. buf = bytes.NewBuffer(b)
  49. r = NewRepeatableReader(buf)
  50. // Should not allow seek past cache index
  51. pos, err = r.Seek(5, io.SeekCurrent)
  52. assert.NotNil(t, err)
  53. assert.Equal(t, "fs.RepeatableReader.Seek: offset is unavailable", err.Error())
  54. assert.Equal(t, 0, int(pos))
  55. // Should not allow seek to negative position start
  56. pos, err = r.Seek(-1, io.SeekCurrent)
  57. assert.NotNil(t, err)
  58. assert.Equal(t, "fs.RepeatableReader.Seek: negative position", err.Error())
  59. assert.Equal(t, 0, int(pos))
  60. // Should not allow seek with invalid whence
  61. pos, err = r.Seek(0, 3)
  62. assert.NotNil(t, err)
  63. assert.Equal(t, "fs.RepeatableReader.Seek: invalid whence", err.Error())
  64. assert.Equal(t, 0, int(pos))
  65. // Should seek from index with io.SeekCurrent(1) whence
  66. dst = make([]byte, 5)
  67. _, _ = r.Read(dst)
  68. pos, err = r.Seek(-3, io.SeekCurrent)
  69. assert.Nil(t, err)
  70. require.Equal(t, 2, int(pos))
  71. pos, err = r.Seek(1, io.SeekCurrent)
  72. assert.Nil(t, err)
  73. require.Equal(t, 3, int(pos))
  74. // Should seek from cache end with io.SeekEnd(2) whence
  75. pos, err = r.Seek(-3, io.SeekEnd)
  76. assert.Nil(t, err)
  77. require.Equal(t, 2, int(pos))
  78. // Should read from seek position and past it
  79. dst = make([]byte, 5)
  80. n, err = io.ReadFull(r, dst)
  81. assert.Nil(t, err)
  82. assert.Equal(t, 5, n)
  83. assert.Equal(t, b[2:7], dst)
  84. }