github.com/stffabi/git-lfs@v2.3.5-0.20180214015214-8eeaa8d88902+incompatible/git/odb/object_reader_test.go (about) 1 package odb 2 3 import ( 4 "bytes" 5 "compress/zlib" 6 "errors" 7 "io" 8 "sync/atomic" 9 "testing" 10 11 "github.com/stretchr/testify/assert" 12 ) 13 14 func TestObjectReaderReadsHeaders(t *testing.T) { 15 var compressed bytes.Buffer 16 17 zw := zlib.NewWriter(&compressed) 18 zw.Write([]byte("blob 1\x00")) 19 zw.Close() 20 21 or, err := NewObjectReader(&compressed) 22 assert.Nil(t, err) 23 24 typ, size, err := or.Header() 25 26 assert.Nil(t, err) 27 assert.EqualValues(t, 1, size) 28 assert.Equal(t, BlobObjectType, typ) 29 } 30 31 func TestObjectReaderConsumesHeaderBeforeReads(t *testing.T) { 32 var compressed bytes.Buffer 33 34 zw := zlib.NewWriter(&compressed) 35 zw.Write([]byte("blob 1\x00asdf")) 36 zw.Close() 37 38 or, err := NewObjectReader(&compressed) 39 assert.Nil(t, err) 40 41 var buf [4]byte 42 n, err := or.Read(buf[:]) 43 44 assert.Equal(t, 4, n) 45 assert.Equal(t, []byte{'a', 's', 'd', 'f'}, buf[:]) 46 assert.Nil(t, err) 47 } 48 49 type ReadCloserFn struct { 50 io.Reader 51 closeFn func() error 52 } 53 54 func (r *ReadCloserFn) Close() error { 55 return r.closeFn() 56 } 57 58 func TestObjectReaderCallsClose(t *testing.T) { 59 var calls uint32 60 expected := errors.New("expected") 61 62 or, err := NewObjectReadCloser(&ReadCloserFn{ 63 Reader: bytes.NewBuffer([]byte{0x78, 0x01}), 64 closeFn: func() error { 65 atomic.AddUint32(&calls, 1) 66 return expected 67 }, 68 }) 69 assert.Nil(t, err) 70 71 got := or.Close() 72 73 assert.Equal(t, expected, got) 74 assert.EqualValues(t, 1, atomic.LoadUint32(&calls)) 75 76 }