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