summaryrefslogtreecommitdiff
path: root/internal/packet/packet_test.go
blob: a523d5974e66310386a9d32d2fac2c6e5b5106c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package packet

import (
	"context"
	"io"
	"testing"
	"time"

	"github.com/vmihailenco/msgpack/v5"
)

func TestMsgPackEncoding(t *testing.T) {
	request := EkoMessage{Message: "test"}
	data, err := msgpack.Marshal(&request)
	if err != nil {
		t.Errorf("encoding error: %v", err)
		return
	}
	var response EkoMessage
	err = msgpack.Unmarshal(data, &response)
	if err != nil {
		t.Errorf("decoding error: %v", err)
		return
	}
	if request.Message != response.Message {
		t.Errorf("%v != %v", request.Message, response.Message)
		return
	}
}

func TestPacketMsgPackEncoding(t *testing.T) {
	request := EkoMessage{Message: "test"}
	encoder1, err := NewMsgPackEncoder(&request)
	encoder2, _ := NewMsgPackEncoder(&request)
	if err != nil {
		t.Errorf("encoding error: %v", err)
		return
	}
	encodedBytes := make([]byte, PACKET_MAX_SIZE)
	n, _ := encoder2.Read(encodedBytes[HEADER_SIZE:])

	packet := NewPacket(encoder1)
	var response EkoMessage
	err = packet.DecodePayload(&response)
	if err != nil {
		t.Errorf("decoding error: %#v: packet: %v encoder: %v", err, packet.Payload(), encodedBytes[HEADER_SIZE:HEADER_SIZE+n])
		return
	}
	if request.Message != response.Message {
		t.Errorf("%v != %v", request.Message, response.Message)
		return
	}
}

type TestIoReader struct {
	data []byte
	len  int
}

func (r *TestIoReader) Read(data []byte) (int, error) {
	if len(r.data) <= r.len {
		// log.Println("RETURNING EOF:", len(data), r.len)
		return 0, io.EOF
	}
	n := copy(data, r.data[r.len:])
	r.len += n
	// log.Println("RETURNING N:", len(r.data), r.len)
	return n, nil
}

func (r *TestIoReader) start(msg TypedMessage, t *testing.T) {
	encoder, err := NewMsgPackEncoder(msg)
	if err != nil {
		t.Errorf("encoding error: %v", err)
		return
	}
	r.data = NewPacket(encoder).data
	// log.Println("LEN:", len(r.data))
}

func TestPacketFramer(t *testing.T) {
	reader := &TestIoReader{}

	// Long msg to test multiple
	msg := EkoMessage{"Testing FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting Framer"}
	reader.start(&msg, t)

	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	out, outErr := RunFramer(ctx, reader)

	var message EkoMessage
	select {
	case packet := <-out:
		if err := packet.DecodePayload(&message); err != nil {
			t.Errorf("error decoding response: %v", err)
			return
		}
		if msg.Message != message.Message {
			t.Errorf("%v != %v", msg.Message, message.Message)
			return
		}

	case err := <-outErr:
		t.Errorf("error receiving packet: %v", err)
		return
	}
}