1package object 2 3import ( 4 "bytes" 5 "io" 6 "io/ioutil" 7 8 "github.com/go-git/go-git/v5/plumbing" 9 10 . "gopkg.in/check.v1" 11) 12 13type BlobsSuite struct { 14 BaseObjectsSuite 15} 16 17var _ = Suite(&BlobsSuite{}) 18 19func (s *BlobsSuite) TestBlobHash(c *C) { 20 o := &plumbing.MemoryObject{} 21 o.SetType(plumbing.BlobObject) 22 o.SetSize(3) 23 24 writer, err := o.Writer() 25 c.Assert(err, IsNil) 26 defer func() { c.Assert(writer.Close(), IsNil) }() 27 28 writer.Write([]byte{'F', 'O', 'O'}) 29 30 blob := &Blob{} 31 c.Assert(blob.Decode(o), IsNil) 32 33 c.Assert(blob.Size, Equals, int64(3)) 34 c.Assert(blob.Hash.String(), Equals, "d96c7efbfec2814ae0301ad054dc8d9fc416c9b5") 35 36 reader, err := blob.Reader() 37 c.Assert(err, IsNil) 38 defer func() { c.Assert(reader.Close(), IsNil) }() 39 40 data, err := ioutil.ReadAll(reader) 41 c.Assert(err, IsNil) 42 c.Assert(string(data), Equals, "FOO") 43} 44 45func (s *BlobsSuite) TestBlobDecodeEncodeIdempotent(c *C) { 46 var objects []*plumbing.MemoryObject 47 for _, str := range []string{"foo", "foo\n"} { 48 obj := &plumbing.MemoryObject{} 49 obj.Write([]byte(str)) 50 obj.SetType(plumbing.BlobObject) 51 obj.Hash() 52 objects = append(objects, obj) 53 } 54 for _, object := range objects { 55 blob := &Blob{} 56 err := blob.Decode(object) 57 c.Assert(err, IsNil) 58 newObject := &plumbing.MemoryObject{} 59 err = blob.Encode(newObject) 60 c.Assert(err, IsNil) 61 newObject.Hash() // Ensure Hash is pre-computed before deep comparison 62 c.Assert(newObject, DeepEquals, object) 63 } 64} 65 66func (s *BlobsSuite) TestBlobIter(c *C) { 67 encIter, err := s.Storer.IterEncodedObjects(plumbing.BlobObject) 68 c.Assert(err, IsNil) 69 iter := NewBlobIter(s.Storer, encIter) 70 71 blobs := []*Blob{} 72 iter.ForEach(func(b *Blob) error { 73 blobs = append(blobs, b) 74 return nil 75 }) 76 77 c.Assert(len(blobs) > 0, Equals, true) 78 iter.Close() 79 80 encIter, err = s.Storer.IterEncodedObjects(plumbing.BlobObject) 81 c.Assert(err, IsNil) 82 iter = NewBlobIter(s.Storer, encIter) 83 84 i := 0 85 for { 86 b, err := iter.Next() 87 if err == io.EOF { 88 break 89 } 90 91 c.Assert(err, IsNil) 92 c.Assert(b.ID(), Equals, blobs[i].ID()) 93 c.Assert(b.Size, Equals, blobs[i].Size) 94 c.Assert(b.Type(), Equals, blobs[i].Type()) 95 96 r1, err := b.Reader() 97 c.Assert(err, IsNil) 98 99 b1, err := ioutil.ReadAll(r1) 100 c.Assert(err, IsNil) 101 c.Assert(r1.Close(), IsNil) 102 103 r2, err := blobs[i].Reader() 104 c.Assert(err, IsNil) 105 106 b2, err := ioutil.ReadAll(r2) 107 c.Assert(err, IsNil) 108 c.Assert(r2.Close(), IsNil) 109 110 c.Assert(bytes.Compare(b1, b2), Equals, 0) 111 i++ 112 } 113 114 iter.Close() 115} 116