github.com/catandhorse/git-lfs@v2.5.2+incompatible/tools/copycallback_test.go (about) 1 package tools 2 3 import ( 4 "io" 5 "sync/atomic" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 ) 10 11 func TestCopyCallbackReaderCallsCallbackUnderfilledBuffer(t *testing.T) { 12 var ( 13 calls uint32 14 actualTotalSize int64 15 actualReadSoFar int64 16 actualReadSinceLast int 17 ) 18 19 cb := func(totalSize int64, readSoFar int64, readSinceLast int) error { 20 atomic.AddUint32(&calls, 1) 21 22 actualTotalSize = totalSize 23 actualReadSoFar = readSoFar 24 actualReadSinceLast = readSinceLast 25 26 return nil 27 } 28 29 buf := []byte{0x1} 30 r := &CallbackReader{ 31 C: cb, 32 TotalSize: 3, 33 ReadSize: 2, 34 Reader: &EOFReader{b: buf}, 35 } 36 37 p := make([]byte, len(buf)+1) 38 n, err := r.Read(p) 39 40 assert.Equal(t, 1, n) 41 assert.Nil(t, err) 42 43 assert.EqualValues(t, 1, calls, "expected 1 call(s) to callback, got %d", calls) 44 assert.EqualValues(t, 3, actualTotalSize) 45 assert.EqualValues(t, 2+1, actualReadSoFar) 46 assert.EqualValues(t, 1, actualReadSinceLast) 47 } 48 49 type EOFReader struct { 50 b []byte 51 i int 52 } 53 54 var _ io.Reader = (*EOFReader)(nil) 55 56 func (r *EOFReader) Read(p []byte) (n int, err error) { 57 n = copy(p, r.b[r.i:]) 58 r.i += n 59 60 if r.i == len(r.b) { 61 err = io.EOF 62 } 63 return 64 } 65 66 func TestEOFReaderReturnsEOFs(t *testing.T) { 67 r := EOFReader{[]byte{0x1}, 0} 68 69 p := make([]byte, 2) 70 n, err := r.Read(p) 71 72 assert.Equal(t, 1, n) 73 assert.Equal(t, io.EOF, err) 74 } 75 76 func TestBodyCallbackReaderCountsReads(t *testing.T) { 77 br := NewByteBodyWithCallback([]byte{0x1, 0x2, 0x3, 0x4}, 4, nil) 78 79 assert.EqualValues(t, 0, br.readSize) 80 81 p := make([]byte, 8) 82 n, err := br.Read(p) 83 84 assert.Equal(t, 4, n) 85 assert.Nil(t, err) 86 assert.EqualValues(t, 4, br.readSize) 87 } 88 89 func TestBodyCallbackReaderUpdatesOffsetOnSeek(t *testing.T) { 90 br := NewByteBodyWithCallback([]byte{0x1, 0x2, 0x3, 0x4}, 4, nil) 91 92 br.Seek(1, io.SeekStart) 93 assert.EqualValues(t, 1, br.readSize) 94 95 br.Seek(1, io.SeekCurrent) 96 assert.EqualValues(t, 2, br.readSize) 97 98 br.Seek(-1, io.SeekEnd) 99 assert.EqualValues(t, 3, br.readSize) 100 }