diff --git a/internal/decoders/data_packet_chunk_test.go b/internal/decoders/data_packet_chunk_test.go new file mode 100644 index 0000000..f8943ed --- /dev/null +++ b/internal/decoders/data_packet_chunk_test.go @@ -0,0 +1,170 @@ +package decoders + +import ( + "fmt" + "reflect" + "testing" +) + +func TestGoodDataPacketChunkDecoding(t *testing.T) { + testCases := []struct { + description string + bytes []byte + expected DataPacketChunk + }{ + { + description: "DataPacketChunk", + bytes: []byte{ + 85, 103, 124, 128, 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, + 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, + 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, + 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, + }, + expected: DataPacketChunk{ + Chunk: Chunk{ + ChunkData: []byte{ + 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, + 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, + 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, + 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, + }, + Header: ChunkHeader{ + DataLen: 124, Id: 26453, HasSubchunks: true, + }, + }, + Data: DataPacketChunkData{ + PacketHeader: &PacketHeaderChunk{ + Chunk: Chunk{ + ChunkData: []byte{210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123}, + Header: ChunkHeader{DataLen: 12, Id: 0, HasSubchunks: false}, + }, + Data: PacketHeaderChunkData{ + PacketTimestamp: 1234567890, + VersionHigh: 2, + VersionLow: 3, + FrameId: 1, + FramePacketCount: 123, + }, + }, + TrackerList: &DataTrackerListChunk{ + Chunk: Chunk{ + ChunkData: []byte{ + 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, + 0, 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, + 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, + }, + Header: ChunkHeader{DataLen: 104, Id: 1, HasSubchunks: true}, + }, + Data: DataTrackerListChunkData{ + Trackers: []DataTrackerChunk{ + DataTrackerChunk{ + Chunk: Chunk{ + ChunkData: []byte{ + 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, + 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, + 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, + 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, + }, + Header: ChunkHeader{DataLen: 100, Id: 1, HasSubchunks: true}, + }, + Data: DataTrackerChunkData{ + Pos: &DataTrackerXYZChunk{ + Chunk: Chunk{ + ChunkData: []byte{0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64}, + Header: ChunkHeader{DataLen: 12, Id: 0, HasSubchunks: false}, + }, + Data: DataTrackerXYZChunkData{ + X: 1.0, + Y: 2.0, + Z: 3.0, + }, + }, + Speed: &DataTrackerXYZChunk{ + Chunk: Chunk{ + ChunkData: []byte{0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64}, + Header: ChunkHeader{DataLen: 12, Id: 1, HasSubchunks: false}, + }, + Data: DataTrackerXYZChunkData{ + X: 1.0, + Y: 2.0, + Z: 3.0, + }, + }, + Ori: &DataTrackerXYZChunk{ + Chunk: Chunk{ + ChunkData: []byte{0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64}, + Header: ChunkHeader{DataLen: 12, Id: 2, HasSubchunks: false}, + }, + Data: DataTrackerXYZChunkData{ + X: 1.0, + Y: 2.0, + Z: 3.0, + }, + }, + Status: &DataTrackerStatusChunk{ + Chunk: Chunk{ + ChunkData: []byte{0, 0, 128, 63}, + Header: ChunkHeader{DataLen: 4, Id: 3, HasSubchunks: false}, + }, + Data: DataTrackerStatusChunkData{ + Validity: 1.0, + }, + }, + Accel: &DataTrackerXYZChunk{ + Chunk: Chunk{ + ChunkData: []byte{0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64}, + Header: ChunkHeader{DataLen: 12, Id: 4, HasSubchunks: false}, + }, + Data: DataTrackerXYZChunkData{ + X: 1.0, + Y: 2.0, + Z: 3.0, + }, + }, + TrgtPos: &DataTrackerXYZChunk{ + Chunk: Chunk{ + ChunkData: []byte{0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64}, + Header: ChunkHeader{DataLen: 12, Id: 5, HasSubchunks: false}, + }, + Data: DataTrackerXYZChunkData{ + X: 1.0, + Y: 2.0, + Z: 3.0, + }, + }, + Timestamp: &DataTrackerTimestampChunk{ + Chunk: Chunk{ + ChunkData: []byte{210, 2, 150, 73, 0, 0, 0, 0}, + Header: ChunkHeader{DataLen: 8, Id: 6, HasSubchunks: false}, + }, + Data: DataTrackerTimestampChunkData{ + Timestamp: 1234567890, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + } + + for _, testCase := range testCases { + + actual, err := DecodeDataPacketChunk(testCase.bytes) + + if err != nil { + t.Errorf("Test '%s' failed to decode chunk properly", testCase.description) + fmt.Println(err) + } + + if !reflect.DeepEqual(actual, testCase.expected) { + t.Errorf("Test '%s' failed to decode chunk properly", testCase.description) + fmt.Printf("expected: %+v\n", testCase.expected) + fmt.Printf("actual: %+v\n", actual) + } + } +} diff --git a/internal/decoders/info_packet_chunk_test.go b/internal/decoders/info_packet_chunk_test.go new file mode 100644 index 0000000..1faf7dd --- /dev/null +++ b/internal/decoders/info_packet_chunk_test.go @@ -0,0 +1,99 @@ +package decoders + +import ( + "fmt" + "reflect" + "testing" +) + +func TestGoodInfoPacketChunkDecoding(t *testing.T) { + testCases := []struct { + description string + bytes []byte + expected InfoPacketChunk + }{ + { + description: "InfoPacketChunk", + bytes: []byte{ + 86, 103, 51, 128, 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, 1, 0, 10, 0, 80, 83, 78, 32, 83, 101, + 114, 118, 101, 114, 2, 0, 17, 128, 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, + }, + expected: InfoPacketChunk{ + Chunk: Chunk{ + ChunkData: []byte{ + 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, 1, 0, 10, 0, 80, 83, 78, 32, 83, 101, 114, 118, 101, + 114, 2, 0, 17, 128, 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, + }, + Header: ChunkHeader{DataLen: 51, Id: 26454, HasSubchunks: true}, + }, + Data: InfoPacketChunkData{ + PacketHeader: &PacketHeaderChunk{ + Chunk: Chunk{ + ChunkData: []byte{210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123}, + Header: ChunkHeader{DataLen: 12, Id: 0, HasSubchunks: false}, + }, + Data: PacketHeaderChunkData{ + PacketTimestamp: 1234567890, + VersionHigh: 2, + VersionLow: 3, + FrameId: 1, + FramePacketCount: 123, + }, + }, + SystemName: &InfoSystemNameChunk{ + Chunk: Chunk{ + ChunkData: []byte{80, 83, 78, 32, 83, 101, 114, 118, 101, 114}, + Header: ChunkHeader{DataLen: 10, Id: 1, HasSubchunks: false}, + }, + Data: InfoSystemNameChunkData{ + SystemName: "PSN Server", + }, + }, + TrackerList: &InfoTrackerListChunk{ + Chunk: Chunk{ + ChunkData: []byte{1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49}, + Header: ChunkHeader{DataLen: 17, Id: 2, HasSubchunks: true}, + }, + Data: InfoTrackerListChunkData{ + Trackers: []InfoTrackerChunk{ + { + Chunk: Chunk{ + ChunkData: []byte{0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49}, + Header: ChunkHeader{DataLen: 13, Id: 1, HasSubchunks: true}, + }, + Data: InfoTrackerChunkData{ + TrackerName: &InfoTrackerNameChunk{ + Chunk: Chunk{ + ChunkData: []byte{84, 114, 97, 99, 107, 101, 114, 32, 49}, + Header: ChunkHeader{DataLen: 9, Id: 0, HasSubchunks: false}, + }, + Data: InfoTrackerNameChunkData{ + TrackerName: "Tracker 1", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + } + + for _, testCase := range testCases { + + actual, err := DecodeInfoPacketChunk(testCase.bytes) + + if err != nil { + t.Errorf("Test '%s' failed to decode chunk properly", testCase.description) + fmt.Println(err) + } + + if !reflect.DeepEqual(actual, testCase.expected) { + t.Errorf("Test '%s' failed to decode chunk properly", testCase.description) + fmt.Printf("expected: %+v\n", testCase.expected) + fmt.Printf("actual: %+v\n", actual) + } + } +}