github.com/x-oss-byte/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  }