1package packp
2
3import (
4	"bytes"
5	"io/ioutil"
6
7	"github.com/go-git/go-git/v5/plumbing"
8	"github.com/go-git/go-git/v5/plumbing/protocol/packp/capability"
9
10	. "gopkg.in/check.v1"
11)
12
13type UploadPackResponseSuite struct{}
14
15var _ = Suite(&UploadPackResponseSuite{})
16
17func (s *UploadPackResponseSuite) TestDecodeNAK(c *C) {
18	raw := "0008NAK\nPACK"
19
20	req := NewUploadPackRequest()
21	res := NewUploadPackResponse(req)
22	defer res.Close()
23
24	err := res.Decode(ioutil.NopCloser(bytes.NewBufferString(raw)))
25	c.Assert(err, IsNil)
26
27	pack, err := ioutil.ReadAll(res)
28	c.Assert(err, IsNil)
29	c.Assert(pack, DeepEquals, []byte("PACK"))
30}
31
32func (s *UploadPackResponseSuite) TestDecodeDepth(c *C) {
33	raw := "00000008NAK\nPACK"
34
35	req := NewUploadPackRequest()
36	req.Depth = DepthCommits(1)
37
38	res := NewUploadPackResponse(req)
39	defer res.Close()
40
41	err := res.Decode(ioutil.NopCloser(bytes.NewBufferString(raw)))
42	c.Assert(err, IsNil)
43
44	pack, err := ioutil.ReadAll(res)
45	c.Assert(err, IsNil)
46	c.Assert(pack, DeepEquals, []byte("PACK"))
47}
48
49func (s *UploadPackResponseSuite) TestDecodeMalformed(c *C) {
50	raw := "00000008ACK\nPACK"
51
52	req := NewUploadPackRequest()
53	req.Depth = DepthCommits(1)
54
55	res := NewUploadPackResponse(req)
56	defer res.Close()
57
58	err := res.Decode(ioutil.NopCloser(bytes.NewBufferString(raw)))
59	c.Assert(err, NotNil)
60}
61
62func (s *UploadPackResponseSuite) TestDecodeMultiACK(c *C) {
63	req := NewUploadPackRequest()
64	req.Capabilities.Set(capability.MultiACK)
65
66	res := NewUploadPackResponse(req)
67	defer res.Close()
68
69	err := res.Decode(ioutil.NopCloser(bytes.NewBuffer(nil)))
70	c.Assert(err, NotNil)
71}
72
73func (s *UploadPackResponseSuite) TestReadNoDecode(c *C) {
74	req := NewUploadPackRequest()
75	req.Capabilities.Set(capability.MultiACK)
76
77	res := NewUploadPackResponse(req)
78	defer res.Close()
79
80	n, err := res.Read(nil)
81	c.Assert(err, Equals, ErrUploadPackResponseNotDecoded)
82	c.Assert(n, Equals, 0)
83}
84
85func (s *UploadPackResponseSuite) TestEncodeNAK(c *C) {
86	pf := ioutil.NopCloser(bytes.NewBuffer([]byte("[PACK]")))
87	req := NewUploadPackRequest()
88	res := NewUploadPackResponseWithPackfile(req, pf)
89	defer func() { c.Assert(res.Close(), IsNil) }()
90
91	b := bytes.NewBuffer(nil)
92	c.Assert(res.Encode(b), IsNil)
93
94	expected := "0008NAK\n[PACK]"
95	c.Assert(b.String(), Equals, expected)
96}
97
98func (s *UploadPackResponseSuite) TestEncodeDepth(c *C) {
99	pf := ioutil.NopCloser(bytes.NewBuffer([]byte("PACK")))
100	req := NewUploadPackRequest()
101	req.Depth = DepthCommits(1)
102
103	res := NewUploadPackResponseWithPackfile(req, pf)
104	defer func() { c.Assert(res.Close(), IsNil) }()
105
106	b := bytes.NewBuffer(nil)
107	c.Assert(res.Encode(b), IsNil)
108
109	expected := "00000008NAK\nPACK"
110	c.Assert(b.String(), Equals, expected)
111}
112
113func (s *UploadPackResponseSuite) TestEncodeMultiACK(c *C) {
114	pf := ioutil.NopCloser(bytes.NewBuffer([]byte("[PACK]")))
115	req := NewUploadPackRequest()
116
117	res := NewUploadPackResponseWithPackfile(req, pf)
118	defer func() { c.Assert(res.Close(), IsNil) }()
119	res.ACKs = []plumbing.Hash{
120		plumbing.NewHash("5dc01c595e6c6ec9ccda4f6f69c131c0dd945f81"),
121		plumbing.NewHash("5dc01c595e6c6ec9ccda4f6f69c131c0dd945f82"),
122	}
123
124	b := bytes.NewBuffer(nil)
125	c.Assert(res.Encode(b), NotNil)
126}
127