8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/require"
12 type PacketReadTestCase struct {
19 func (c *PacketReadTestCase) Assert(t *testing.T) {
20 buf := bytes.NewReader(c.In)
21 rw := newPktline(buf, nil)
23 pkt, err := rw.readPacket()
25 if len(c.Payload) > 0 {
26 assert.Equal(t, c.Payload, pkt)
32 require.NotNil(t, err)
33 assert.Equal(t, c.Err, err.Error())
39 func TestPktLineReadsWholePackets(t *testing.T) {
40 tc := &PacketReadTestCase{
42 0x30, 0x30, 0x30, 0x38, // 0008 (hex. length)
43 0x1, 0x2, 0x3, 0x4, // payload
45 Payload: []byte{0x1, 0x2, 0x3, 0x4},
51 func TestPktLineNoPacket(t *testing.T) {
52 tc := &PacketReadTestCase{
60 func TestPktLineEmptyPacket(t *testing.T) {
61 tc := &PacketReadTestCase{
63 0x30, 0x30, 0x30, 0x34,
67 Err: "Invalid packet length.",
74 func TestPktLineFlushPacket(t *testing.T) {
75 tc := &PacketReadTestCase{
76 In: []byte{0x30, 0x30, 0x30, 0x30}, // Flush packet
85 func TestPktLineDiscardsPacketsWithUnparseableLength(t *testing.T) {
86 tc := &PacketReadTestCase{
88 0xff, 0xff, 0xff, 0xff, // ÿÿÿÿ (invalid hex. length)
91 Err: "strconv.ParseInt: parsing \"\\xff\\xff\\xff\\xff\": invalid syntax",
97 func TestPktLineReadsTextWithNewline(t *testing.T) {
98 rw := newPktline(bytes.NewReader([]byte{
99 0x30, 0x30, 0x30, 0x39, // 0009 (hex. length)
100 0x61, 0x62, 0x63, 0x64, 0xa,
104 str, err := rw.readPacketText()
107 assert.Equal(t, "abcd", str)
110 func TestPktLineReadsTextWithoutNewline(t *testing.T) {
111 rw := newPktline(bytes.NewReader([]byte{
112 0x30, 0x30, 0x30, 0x38, // 0009 (hex. length)
113 0x61, 0x62, 0x63, 0x64,
116 str, err := rw.readPacketText()
119 assert.Equal(t, "abcd", str)
122 func TestPktLineReadsTextWithErr(t *testing.T) {
123 rw := newPktline(bytes.NewReader([]byte{
124 0x30, 0x30, 0x30, 0x34, // 0004 (hex. length)
128 str, err := rw.readPacketText()
130 require.NotNil(t, err)
131 assert.Equal(t, "Invalid packet length.", err.Error())
132 assert.Equal(t, "", str)
135 func TestPktLineAppendsPacketLists(t *testing.T) {
136 rw := newPktline(bytes.NewReader([]byte{
137 0x30, 0x30, 0x30, 0x38, // 0009 (hex. length)
138 0x61, 0x62, 0x63, 0x64, // "abcd"
140 0x30, 0x30, 0x30, 0x38, // 0008 (hex. length)
141 0x65, 0x66, 0x67, 0x68, // "efgh"
143 0x30, 0x30, 0x30, 0x30, // 0000 (hex. length)
146 str, err := rw.readPacketList()
149 assert.Equal(t, []string{"abcd", "efgh"}, str)
152 func TestPktLineAppendsPacketListsAndReturnsErrs(t *testing.T) {
153 rw := newPktline(bytes.NewReader([]byte{
154 0x30, 0x30, 0x30, 0x38, // 0009 (hex. length)
155 0x61, 0x62, 0x63, 0x64, // "abcd"
157 0x30, 0x30, 0x30, 0x34, // 0004 (hex. length)
161 str, err := rw.readPacketList()
163 require.NotNil(t, err)
164 assert.Equal(t, "Invalid packet length.", err.Error())
168 func TestPktLineWritesPackets(t *testing.T) {
171 rw := newPktline(nil, &buf)
172 require.Nil(t, rw.writePacket([]byte{
175 require.Nil(t, rw.writeFlush())
177 assert.Equal(t, []byte{
178 0x30, 0x30, 0x30, 0x38, // 0008 (hex. length)
179 0x1, 0x2, 0x3, 0x4, // payload
180 0x30, 0x30, 0x30, 0x30, // 0000 (flush packet)
184 func TestPktLineWritesPacketsEqualToMaxLength(t *testing.T) {
187 rw := newPktline(nil, &buf)
188 err := rw.writePacket(make([]byte, MaxPacketLength))
191 assert.Equal(t, 4+MaxPacketLength, len(buf.Bytes()))
194 func TestPktLineDoesNotWritePacketsExceedingMaxLength(t *testing.T) {
197 rw := newPktline(nil, &buf)
198 err := rw.writePacket(make([]byte, MaxPacketLength+1))
200 require.NotNil(t, err)
201 assert.Equal(t, "Packet length exceeds maximal length", err.Error())
202 assert.Empty(t, buf.Bytes())
205 func TestPktLineWritesPacketText(t *testing.T) {
208 rw := newPktline(nil, &buf)
210 require.Nil(t, rw.writePacketText("abcd"))
211 require.Nil(t, rw.writeFlush())
213 assert.Equal(t, []byte{
214 0x30, 0x30, 0x30, 0x39, // 0009 (hex. length)
215 0x61, 0x62, 0x63, 0x64, 0xa, // "abcd\n" (payload)
216 0x30, 0x30, 0x30, 0x30, // 0000 (flush packet)
220 func TestPktLineWritesPacketLists(t *testing.T) {
223 rw := newPktline(nil, &buf)
224 err := rw.writePacketList([]string{"foo", "bar"})
227 assert.Equal(t, []byte{
228 0x30, 0x30, 0x30, 0x38, // 0008 (hex. length)
229 0x66, 0x6f, 0x6f, 0xa, // "foo\n" (payload)
231 0x30, 0x30, 0x30, 0x38, // 0008 (hex. length)
232 0x62, 0x61, 0x72, 0xa, // "bar\n" (payload)
234 0x30, 0x30, 0x30, 0x30, // 0000 (hex. length)