diff options
| author | Kyren223 <Kyren223@proton.me> | 2024-11-02 13:00:37 +0200 |
|---|---|---|
| committer | Kyren223 <Kyren223@proton.me> | 2024-11-02 13:18:07 +0200 |
| commit | 08d88c425b4cfe4918eabe83b003ee01314e636a (patch) | |
| tree | 025edf7ccc3d7cf47a68b0a99daa06a26733b3e2 /internal/packet/packet_test.go | |
| parent | 31e3778061a20e0787c076d9353e82b2e223841e (diff) | |
test(packet): test packet framer and packet encoding/decoding
Diffstat (limited to 'internal/packet/packet_test.go')
| -rw-r--r-- | internal/packet/packet_test.go | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/internal/packet/packet_test.go b/internal/packet/packet_test.go new file mode 100644 index 0000000..e5a3612 --- /dev/null +++ b/internal/packet/packet_test.go @@ -0,0 +1,115 @@ +package packet + +import ( + "context" + "reflect" + "slices" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/kyren223/eko/internal/data" + "github.com/kyren223/eko/pkg/snowflake" +) + +func TestPacketEncodingDecoding(t *testing.T) { + testPacketEncodingDecoding(t, &ErrorMessage{"Hello, World!"}) + + node := snowflake.NewNode(1) + id := node.Generate() + testPacketEncodingDecoding(t, &Messages{Messages: []data.Message{ + { + ID: node.Generate(), + SenderID: node.Generate(), + Content: "MyMessage", + FrequencyID: &id, + ReceiverID: nil, + }, + { + ID: node.Generate(), + SenderID: node.Generate(), + Content: "Another Message\nWith a bunch of stuff", + FrequencyID: nil, + ReceiverID: &id, + }, + }}) +} + +func testPacketEncodingDecoding(t *testing.T, payload Payload) { + t.Helper() + + jsonEncoder := NewJsonEncoder(payload) + jsonPacket := NewPacket(jsonEncoder) + + msgPackEncoder := NewJsonEncoder(payload) + msgPackPacket := NewPacket(msgPackEncoder) + + jsonPayload, err := jsonPacket.DecodedPayload() + require.NoError(t, err, "json payload decoding should not fail") + require.True(t, reflect.DeepEqual(payload, jsonPayload), "json payload mismatch", "got", jsonPayload, "want", payload) + + msgPackPayload, err := msgPackPacket.DecodedPayload() + require.NoError(t, err, "msgpack payload decoding should not fail") + require.True(t, reflect.DeepEqual(payload, msgPackPayload), "msgpack payload mismatch", "got", msgPackPayload, "want", payload) +} + +func TestPacketFramer(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*20) + defer cancel() + framer := NewFramer() + + pkt := NewPacket(NewJsonEncoder(&ErrorMessage{"Hello, World!"})) + length := len(pkt.data) + count := 5 + data := make([]byte, length*count) + for i := 0; i < count; i++ { + copy(data[i*length:], pkt.data) + } + + first := 2 + require.True(t, first < HEADER_SIZE, "TEST ERROR size needs to be less than the header") + err := framer.Push(ctx, data[:first]) + data = data[first:] + require.NoError(t, err, "expecting framer to return nil and wait for more data for header") + require.False(t, doesChannelHaveValue(framer.Out), "expecting channel to block with no value") + + err = framer.Push(ctx, data[:HEADER_SIZE]) + data = data[HEADER_SIZE:] + require.NoError(t, err, "expecting framer to return nil and wait for more data for payload") + require.False(t, doesChannelHaveValue(framer.Out), "expecting channel to block with no value") + + err = framer.Push(ctx, data[:length]) + data = data[length:] + require.NoError(t, err, "expecting framer to return nil and process exactly 1 packet") + select { + case p, ok := <-framer.Out: + require.True(t, ok, "expecting a value from the framer") + require.True(t, slices.Equal(p.data, pkt.data), "expecting packet to be equal", "got", p.data, "want", pkt.data) + default: + require.Fail(t, "expected packet but channel was blocking") + } + require.False(t, doesChannelHaveValue(framer.Out), "expecting channel to block with no value because it was consumed already") + + err = framer.Push(ctx, data[:]) + require.NoError(t, err, "expecting framer to return nil and process the rest of the packets") + for i := 0; i < count-1; i++ { + select { + case p, ok := <-framer.Out: + require.True(t, ok, "expecting a value from the framer") + require.True(t, slices.Equal(p.data, pkt.data), "expecting packet to be equal", "got", p.data, "want", pkt.data) + default: + require.Failf(t, "channel blocked", "%v expected packet", i) + } + } + require.False(t, doesChannelHaveValue(framer.Out), "expecting channel to block with no value because it was consumed already") +} + +func doesChannelHaveValue[T any](c <-chan T) bool { + select { + case _, ok := <-c: + return ok + default: + return false + } +} |
