Imported Upstream version 2.5.0
[scm/test.git] / vendor / github.com / git-lfs / gitobj / object_reader_test.go
1 package gitobj
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 }