package pktline_test import ( "io" "io/ioutil" "os" "strings" "testing" "gopkg.in/src-d/go-git.v4/formats/packp/pktline" . "gopkg.in/check.v1" ) func Test(t *testing.T) { TestingT(t) } type SuitePktLine struct { } var _ = Suite(&SuitePktLine{}) func (s *SuitePktLine) TestNewIsEmpty(c *C) { p := pktline.New() b, err := ioutil.ReadAll(p) c.Assert(err, IsNil) c.Assert(b, DeepEquals, []byte{}) } func (s *SuitePktLine) TestAddFlush(c *C) { p := pktline.New() p.AddFlush() b, err := ioutil.ReadAll(p) c.Assert(err, IsNil) c.Assert(string(b), DeepEquals, "0000") } func (s *SuitePktLine) TestAdd(c *C) { for i, test := range [...]struct { input [][]byte expected []byte }{ { input: [][]byte{ []byte("hello\n"), }, expected: []byte("000ahello\n"), }, { input: [][]byte{ []byte("hello\n"), []byte("world!\n"), []byte("foo"), }, expected: []byte("000ahello\n000bworld!\n0007foo"), }, { input: [][]byte{ []byte(strings.Repeat("a", pktline.MaxPayloadSize)), }, expected: []byte( "fff0" + strings.Repeat("a", pktline.MaxPayloadSize)), }, { input: [][]byte{ []byte(strings.Repeat("a", pktline.MaxPayloadSize)), []byte(strings.Repeat("b", pktline.MaxPayloadSize)), }, expected: []byte( "fff0" + strings.Repeat("a", pktline.MaxPayloadSize) + "fff0" + strings.Repeat("b", pktline.MaxPayloadSize)), }, } { p := pktline.New() err := p.Add(test.input...) c.Assert(err, IsNil, Commentf("input %d = %v", i, test.input)) obtained, err := ioutil.ReadAll(p) c.Assert(err, IsNil, Commentf("input %d = %v", i, test.input)) c.Assert(obtained, DeepEquals, test.expected, Commentf("input %d = %v", i, test.input)) } } func (s *SuitePktLine) TestAddErrEmptyPayload(c *C) { for _, input := range [...][][]byte{ [][]byte{ []byte{}, }, [][]byte{ []byte(nil), }, [][]byte{ []byte("hello world!"), []byte{}, }, [][]byte{ []byte{}, []byte("hello world!"), }, } { p := pktline.New() err := p.Add(input...) c.Assert(err, Equals, pktline.ErrEmptyPayload) } } func (s *SuitePktLine) TestAddErrPayloadTooLong(c *C) { for _, input := range [...][][]byte{ [][]byte{ []byte(strings.Repeat("a", pktline.MaxPayloadSize+1)), }, [][]byte{ []byte("hello world!"), []byte(strings.Repeat("a", pktline.MaxPayloadSize+1)), }, [][]byte{ []byte("hello world!"), []byte(strings.Repeat("a", pktline.MaxPayloadSize+1)), []byte("foo"), }, } { p := pktline.New() err := p.Add(input...) c.Assert(err, Equals, pktline.ErrPayloadTooLong, Commentf("%v\n", input)) } } func (s *SuitePktLine) TestAddString(c *C) { for i, test := range [...]struct { input []string expected []byte }{ { input: []string{ "hello\n", }, expected: []byte("000ahello\n"), }, { input: []string{ "hello\n", "world!\n", "foo", }, expected: []byte("000ahello\n000bworld!\n0007foo"), }, { input: []string{ strings.Repeat("a", pktline.MaxPayloadSize), }, expected: []byte( "fff0" + strings.Repeat("a", pktline.MaxPayloadSize)), }, { input: []string{ strings.Repeat("a", pktline.MaxPayloadSize), strings.Repeat("b", pktline.MaxPayloadSize), }, expected: []byte( "fff0" + strings.Repeat("a", pktline.MaxPayloadSize) + "fff0" + strings.Repeat("b", pktline.MaxPayloadSize)), }, } { p := pktline.New() err := p.AddString(test.input...) c.Assert(err, IsNil, Commentf("input %d = %v", i, test.input)) obtained, err := ioutil.ReadAll(p) c.Assert(err, IsNil, Commentf("input %d = %v", i, test.input)) c.Assert(obtained, DeepEquals, test.expected, Commentf("input %d = %v", i, test.input)) } } func (s *SuitePktLine) TestAddStringErrEmptyPayload(c *C) { for _, input := range [...][]string{ []string{""}, []string{"hello world!", ""}, []string{"", "hello world!"}, } { p := pktline.New() err := p.AddString(input...) c.Assert(err, Equals, pktline.ErrEmptyPayload) } } func (s *SuitePktLine) TestAddStringErrPayloadTooLong(c *C) { for _, input := range [...][]string{ []string{ strings.Repeat("a", pktline.MaxPayloadSize+1), }, []string{ "hello world!", strings.Repeat("a", pktline.MaxPayloadSize+1), }, []string{ "hello world!", strings.Repeat("a", pktline.MaxPayloadSize+1), "foo", }, } { p := pktline.New() err := p.AddString(input...) c.Assert(err, Equals, pktline.ErrPayloadTooLong, Commentf("%v\n", input)) } } func ExamplePktLines() { // Create an empty collection of pktlines. p := pktline.New() // Add two strings as payloads ("foo\n" and "bar\n"), they will // end up as two consecutive pktlines. p.AddString("foo\n", "bar\n") // error checks removed for brevity // You can also add byte slices as payloads... p.Add([]byte("hello\n"), []byte("world!\n")) // Add a flush-pkt. p.AddFlush() // PktLines are Readers, so you can directly read the full sequence. io.Copy(os.Stdout, p) // Output: // 0008foo // 0008bar // 000ahello // 000bworld! // 0000 }