aboutsummaryrefslogblamecommitdiffstats
path: root/formats/packp/pktline/pktlines_test.go
blob: e0ba16bd7d714c5725fcfd2c863dbdc59d1703b6 (plain) (tree)






































































































































































































































                                                                                              
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
}