From ffb39b103493eecbfa3fa648257d2cb6491ddf76 Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Mon, 8 Dec 2025 18:03:09 -0600 Subject: [PATCH] add tests for framers --- internal/framer/framer.go | 1 + internal/framer/separator.go | 4 ++ internal/framer/separator_test.go | 69 +++++++++++++++++++++++++++++++ internal/framer/slip.go | 4 ++ internal/framer/slip_test.go | 45 ++++++++++++++++++++ 5 files changed, 123 insertions(+) create mode 100644 internal/framer/separator_test.go create mode 100644 internal/framer/slip_test.go diff --git a/internal/framer/framer.go b/internal/framer/framer.go index f5f418f..91db58b 100644 --- a/internal/framer/framer.go +++ b/internal/framer/framer.go @@ -8,6 +8,7 @@ type Framer interface { Decode([]byte) [][]byte Encode([]byte) []byte Clear() + Buffer() []byte } func GetFramer(framingType string) (Framer, error) { diff --git a/internal/framer/separator.go b/internal/framer/separator.go index b82d031..fb5f9b7 100644 --- a/internal/framer/separator.go +++ b/internal/framer/separator.go @@ -35,3 +35,7 @@ func (bsf *ByteSeparatorFramer) Encode(data []byte) []byte { func (bsf *ByteSeparatorFramer) Clear() { bsf.buffer = []byte{} } + +func (bsf *ByteSeparatorFramer) Buffer() []byte { + return bsf.buffer +} diff --git a/internal/framer/separator_test.go b/internal/framer/separator_test.go new file mode 100644 index 0000000..a5e1ddf --- /dev/null +++ b/internal/framer/separator_test.go @@ -0,0 +1,69 @@ +package framer_test + +import ( + "slices" + "testing" + + "github.com/jwetzell/showbridge-go/internal/framer" +) + +func TestGoodSeparatorFramer(t *testing.T) { + tests := []struct { + name string + framer framer.Framer + input []byte + expected [][]byte + buffer []byte + }{ + { + name: "new line separator", + framer: framer.NewByteSeparatorFramer([]byte{0x0a}), + input: []byte("Hello\nWorld\nThis is a test\n"), + expected: [][]byte{ + []byte("Hello"), + []byte("World"), + []byte("This is a test"), + }, + buffer: []byte{}, + }, + { + name: "CRLF separator", + framer: framer.NewByteSeparatorFramer([]byte{0x0d, 0x0a}), + input: []byte("Hello\r\nWorld\r\nThis is a test\r\n"), + expected: [][]byte{ + []byte("Hello"), + []byte("World"), + []byte("This is a test"), + }, + buffer: []byte{}, + }, + { + name: "extra data after separator", + framer: framer.NewByteSeparatorFramer([]byte{0x0d, 0x0a}), + input: []byte("Hello\r\nWorld\r\nThis is a test\r\nextra"), + expected: [][]byte{ + []byte("Hello"), + []byte("World"), + []byte("This is a test"), + }, + buffer: []byte("extra"), + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + frames := test.framer.Decode(test.input) + if len(frames) != len(test.expected) { + t.Errorf("separator framer got %d frames, expected %d", len(frames), len(test.expected)) + } + for i, frame := range frames { + if !slices.Equal(frame, test.expected[i]) { + t.Errorf("separator framer frame %d got %s, expected %s", i, frame, test.expected[i]) + } + } + if !slices.Equal(test.framer.Buffer(), test.buffer) { + t.Errorf("separator framer buffer got %s, expected %s", test.framer.Buffer(), test.buffer) + } + }) + } +} diff --git a/internal/framer/slip.go b/internal/framer/slip.go index a0b067c..40551f9 100644 --- a/internal/framer/slip.go +++ b/internal/framer/slip.go @@ -74,3 +74,7 @@ func (sf *SlipFramer) Encode(data []byte) []byte { func (sf *SlipFramer) Clear() { sf.buffer = []byte{} } + +func (sf *SlipFramer) Buffer() []byte { + return sf.buffer +} diff --git a/internal/framer/slip_test.go b/internal/framer/slip_test.go new file mode 100644 index 0000000..7d8bb64 --- /dev/null +++ b/internal/framer/slip_test.go @@ -0,0 +1,45 @@ +package framer_test + +import ( + "slices" + "testing" + + "github.com/jwetzell/showbridge-go/internal/framer" +) + +func TestGoodSLIPFramer(t *testing.T) { + tests := []struct { + name string + framer framer.Framer + input []byte + expected [][]byte + buffer []byte + }{ + { + name: "OSC SLIP messages", + framer: framer.NewSlipFramer(), + input: []byte{0xc0, 0x2f, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0xc0}, + expected: [][]byte{ + {0x2f, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00}, + }, + buffer: []byte{}, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + frames := test.framer.Decode(test.input) + if len(frames) != len(test.expected) { + t.Errorf("SLIP framer got %d frames, expected %d", len(frames), len(test.expected)) + } + for i, frame := range frames { + if !slices.Equal(frame, test.expected[i]) { + t.Errorf("SLIP framer frame %d got %s, expected %s", i, frame, test.expected[i]) + } + } + if !slices.Equal(test.framer.Buffer(), test.buffer) { + t.Errorf("SLIP framer buffer got %s, expected %s", test.framer.Buffer(), test.buffer) + } + }) + } +}