| 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 |
| } |