github.com/stffabi/git-lfs@v2.3.5-0.20180214015214-8eeaa8d88902+incompatible/git/odb/object_writer_test.go (about) 1 package odb 2 3 import ( 4 "bytes" 5 "compress/zlib" 6 "encoding/hex" 7 "errors" 8 "io" 9 "io/ioutil" 10 "sync/atomic" 11 "testing" 12 13 "github.com/stretchr/testify/assert" 14 ) 15 16 func TestObjectWriterWritesHeaders(t *testing.T) { 17 var buf bytes.Buffer 18 19 w := NewObjectWriter(&buf) 20 21 n, err := w.WriteHeader(BlobObjectType, 1) 22 assert.Equal(t, 7, n) 23 assert.Nil(t, err) 24 25 assert.Nil(t, w.Close()) 26 27 r, err := zlib.NewReader(&buf) 28 assert.Nil(t, err) 29 30 all, err := ioutil.ReadAll(r) 31 assert.Nil(t, err) 32 assert.Equal(t, []byte("blob 1\x00"), all) 33 34 assert.Nil(t, r.Close()) 35 } 36 37 func TestObjectWriterWritesData(t *testing.T) { 38 var buf bytes.Buffer 39 40 w := NewObjectWriter(&buf) 41 w.WriteHeader(BlobObjectType, 1) 42 43 n, err := w.Write([]byte{0x31}) 44 assert.Equal(t, 1, n) 45 assert.Nil(t, err) 46 47 assert.Nil(t, w.Close()) 48 49 r, err := zlib.NewReader(&buf) 50 assert.Nil(t, err) 51 52 all, err := ioutil.ReadAll(r) 53 assert.Nil(t, err) 54 assert.Equal(t, []byte("blob 1\x001"), all) 55 56 assert.Nil(t, r.Close()) 57 } 58 59 func TestObjectWriterPanicsOnWritesWithoutHeader(t *testing.T) { 60 defer func() { 61 err := recover() 62 63 assert.NotNil(t, err) 64 assert.Equal(t, "git/odb: cannot write data without header", err) 65 }() 66 67 w := NewObjectWriter(new(bytes.Buffer)) 68 w.Write(nil) 69 } 70 71 func TestObjectWriterPanicsOnMultipleHeaderWrites(t *testing.T) { 72 defer func() { 73 err := recover() 74 75 assert.NotNil(t, err) 76 assert.Equal(t, "git/odb: cannot write headers more than once", err) 77 }() 78 79 w := NewObjectWriter(new(bytes.Buffer)) 80 w.WriteHeader(BlobObjectType, 1) 81 w.WriteHeader(TreeObjectType, 2) 82 } 83 84 func TestObjectWriterKeepsTrackOfHash(t *testing.T) { 85 w := NewObjectWriter(new(bytes.Buffer)) 86 n, err := w.WriteHeader(BlobObjectType, 1) 87 88 assert.Nil(t, err) 89 assert.Equal(t, 7, n) 90 91 assert.Equal(t, "bb6ca78b66403a67c6281df142de5ef472186283", hex.EncodeToString(w.Sha())) 92 } 93 94 type WriteCloserFn struct { 95 io.Writer 96 closeFn func() error 97 } 98 99 func (r *WriteCloserFn) Close() error { return r.closeFn() } 100 101 func TestObjectWriterCallsClose(t *testing.T) { 102 var calls uint32 103 104 expected := errors.New("close error") 105 106 w := NewObjectWriteCloser(&WriteCloserFn{ 107 Writer: new(bytes.Buffer), 108 closeFn: func() error { 109 atomic.AddUint32(&calls, 1) 110 return expected 111 }, 112 }) 113 114 got := w.Close() 115 116 assert.EqualValues(t, 1, calls) 117 assert.Equal(t, expected, got) 118 }