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) TestNew(c *C) {
for i, test := range [...]struct {
input [][]byte
expected []byte
}{
{
input: [][]byte{},
expected: []byte{},
}, {
input: [][]byte{
[]byte(nil),
},
expected: []byte("0000"),
}, {
input: [][]byte{
[]byte{},
},
expected: []byte("0000"),
}, {
input: [][]byte{
[]byte(""),
},
expected: []byte("0000"),
}, {
input: [][]byte{
[]byte("hello\n"),
},
expected: []byte("000ahello\n"),
}, {
input: [][]byte{
[]byte("hello\n"),
[]byte("world!\n"),
[]byte(""),
[]byte("foo"),
[]byte(""),
},
expected: []byte("000ahello\n000bworld!\n00000007foo0000"),
}, {
input: [][]byte{
[]byte(strings.Repeat("a", pktline.MaxPayloadSize)),
},
expected: []byte("fff0" + strings.Repeat("a", pktline.MaxPayloadSize)),
},
} {
r, err := pktline.New(test.input...)
c.Assert(err, IsNil, Commentf("input %d = %v", i, test.input))
obtained, err := ioutil.ReadAll(r)
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) TestNewErrPayloadTooLong(c *C) {
for _, input := range [...][][]byte{
[][]byte{
[]byte(strings.Repeat("a", pktline.MaxPayloadSize+1)),
},
[][]byte{
[]byte("hello world!"),
[]byte(""),
[]byte(strings.Repeat("a", pktline.MaxPayloadSize+1)),
},
[][]byte{
[]byte("hello world!"),
[]byte(strings.Repeat("a", pktline.MaxPayloadSize+1)),
[]byte("foo"),
},
} {
_, err := pktline.New(input...)
c.Assert(err, Equals, pktline.ErrPayloadTooLong,
Commentf("%v\n", input))
}
}
func (s *SuitePktLine) TestNewFromStrings(c *C) {
for _, test := range [...]struct {
input []string
expected []byte
}{
{
input: []string(nil),
expected: []byte{},
}, {
input: []string{},
expected: []byte{},
}, {
input: []string{""},
expected: []byte("0000"),
}, {
input: []string{"hello\n"},
expected: []byte("000ahello\n"),
}, {
input: []string{"hello\n", "world!\n", "", "foo", ""},
expected: []byte("000ahello\n000bworld!\n00000007foo0000"),
}, {
input: []string{
strings.Repeat("a", pktline.MaxPayloadSize),
},
expected: []byte("fff0" + strings.Repeat("a", pktline.MaxPayloadSize)),
},
} {
r, err := pktline.NewFromStrings(test.input...)
c.Assert(err, IsNil)
obtained, err := ioutil.ReadAll(r)
c.Assert(err, IsNil)
c.Assert(obtained, DeepEquals, test.expected,
Commentf("input = %v\n", test.input))
}
}
func (s *SuitePktLine) TestNewFromStringsErrPayloadTooLong(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",
},
} {
_, err := pktline.NewFromStrings(input...)
c.Assert(err, Equals, pktline.ErrPayloadTooLong,
Commentf("%v\n", input))
}
}
func ExampleNew() {
// These are the payloads we want to turn into pkt-lines,
// the empty slice at the end will generate a flush-pkt.
payloads := [][]byte{
[]byte{'h', 'e', 'l', 'l', 'o', '\n'},
[]byte{'w', 'o', 'r', 'l', 'd', '!', '\n'},
[]byte{},
}
// Create the pkt-lines, ignoring errors...
pktlines, _ := pktline.New(payloads...)
// Send the raw data to stdout, ignoring errors...
_, _ = io.Copy(os.Stdout, pktlines)
// Output: 000ahello
// 000bworld!
// 0000
}
func ExampleNewFromStrings() {
// These are the payloads we want to turn into pkt-lines,
// the empty string at the end will generate a flush-pkt.
payloads := []string{
"hello\n",
"world!\n",
"",
}
// Create the pkt-lines, ignoring errors...
pktlines, _ := pktline.NewFromStrings(payloads...)
// Send the raw data to stdout, ignoring errors...
_, _ = io.Copy(os.Stdout, pktlines)
// Output: 000ahello
// 000bworld!
// 0000
}