package main import ( "bytes" "io" "testing" ) func allPackets(buf []byte) ([][]byte, error) { var packets [][]byte r := bytes.NewReader(buf) for { p, err := nextPacket(r) if err != nil { return packets, err } packets = append(packets, p) } } func packetsEqual(a, b [][]byte) bool { if len(a) != len(b) { return false } for i := range a { if !bytes.Equal(a[i], b[i]) { return false } } return true } func TestNextPacket(t *testing.T) { for _, test := range []struct { input string packets [][]byte err error }{ {"", [][]byte{}, io.EOF}, {"\x00", [][]byte{}, io.ErrUnexpectedEOF}, {"\x00\x00", [][]byte{{}}, io.EOF}, {"\x00\x00\x00", [][]byte{{}}, io.ErrUnexpectedEOF}, {"\x00\x01", [][]byte{}, io.ErrUnexpectedEOF}, {"\x00\x05hello\x00\x05world", [][]byte{[]byte("hello"), []byte("world")}, io.EOF}, } { packets, err := allPackets([]byte(test.input)) if !packetsEqual(packets, test.packets) || err != test.err { t.Errorf("%x\nreturned %x %v\nexpected %x %v", test.input, packets, err, test.packets, test.err) } } }