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  }