174 lines
4.1 KiB
Go
174 lines
4.1 KiB
Go
package packets
|
|
|
|
import (
|
|
"eq2emu/internal/common"
|
|
"eq2emu/internal/packets/parser"
|
|
"testing"
|
|
)
|
|
|
|
func TestPacketBuilderSimpleFields(t *testing.T) {
|
|
// Create a simple packet definition for testing
|
|
def := parser.NewPacketDef(5)
|
|
|
|
// Add some basic fields
|
|
def.Fields["field1"] = parser.FieldDesc{
|
|
Type: common.TypeInt8,
|
|
}
|
|
def.Fields["field2"] = parser.FieldDesc{
|
|
Type: common.TypeString8,
|
|
}
|
|
def.Fields["field3"] = parser.FieldDesc{
|
|
Type: common.TypeInt32,
|
|
}
|
|
|
|
// Set field order
|
|
def.Orders[1] = []string{"field1", "field2", "field3"}
|
|
|
|
// Create test data
|
|
data := map[string]any{
|
|
"field1": uint8(42),
|
|
"field2": "hello",
|
|
"field3": uint32(12345),
|
|
}
|
|
|
|
// Build packet
|
|
builder := NewPacketBuilder(def, 1, 0)
|
|
packetData, err := builder.Build(data)
|
|
if err != nil {
|
|
t.Errorf("Failed to build simple packet: %v", err)
|
|
return
|
|
}
|
|
|
|
expectedMinLength := 1 + 1 + 5 + 4 // uint8 + string8(len+data) + uint32
|
|
if len(packetData) < expectedMinLength {
|
|
t.Errorf("Built packet too short: got %d bytes, expected at least %d", len(packetData), expectedMinLength)
|
|
return
|
|
}
|
|
|
|
t.Logf("Successfully built simple packet (%d bytes)", len(packetData))
|
|
|
|
// Verify the first byte is correct
|
|
if packetData[0] != 42 {
|
|
t.Errorf("First field incorrect: got %d, expected 42", packetData[0])
|
|
}
|
|
}
|
|
|
|
func TestPacketBuilderOptionalFields(t *testing.T) {
|
|
// Create a packet definition with optional fields
|
|
def := parser.NewPacketDef(3)
|
|
|
|
def.Fields["required"] = parser.FieldDesc{
|
|
Type: common.TypeInt8,
|
|
}
|
|
def.Fields["optional"] = parser.FieldDesc{
|
|
Type: common.TypeInt8,
|
|
Optional: true,
|
|
}
|
|
|
|
def.Orders[1] = []string{"required", "optional"}
|
|
|
|
// Test with only required field
|
|
data := map[string]any{
|
|
"required": uint8(123),
|
|
}
|
|
|
|
builder := NewPacketBuilder(def, 1, 0)
|
|
packetData, err := builder.Build(data)
|
|
if err != nil {
|
|
t.Errorf("Failed to build packet with optional fields: %v", err)
|
|
return
|
|
}
|
|
|
|
expectedLength := 2 // required + optional default
|
|
if len(packetData) != expectedLength {
|
|
t.Errorf("Built packet wrong length: got %d bytes, expected %d", len(packetData), expectedLength)
|
|
return
|
|
}
|
|
|
|
t.Logf("Successfully built packet with optional fields (%d bytes)", len(packetData))
|
|
}
|
|
|
|
func TestPacketBuilderMissingRequiredField(t *testing.T) {
|
|
// Create a packet definition
|
|
def := parser.NewPacketDef(2)
|
|
|
|
def.Fields["required"] = parser.FieldDesc{
|
|
Type: common.TypeInt8,
|
|
}
|
|
def.Fields["also_required"] = parser.FieldDesc{
|
|
Type: common.TypeInt16,
|
|
}
|
|
|
|
def.Orders[1] = []string{"required", "also_required"}
|
|
|
|
// Test with missing required field
|
|
data := map[string]any{
|
|
"required": uint8(123),
|
|
// missing "also_required"
|
|
}
|
|
|
|
builder := NewPacketBuilder(def, 1, 0)
|
|
_, err := builder.Build(data)
|
|
if err == nil {
|
|
t.Error("Expected error for missing required field, but got none")
|
|
return
|
|
}
|
|
|
|
t.Logf("Correctly detected missing required field: %v", err)
|
|
}
|
|
|
|
func TestPacketBuilderStringTypes(t *testing.T) {
|
|
// Test different string types
|
|
def := parser.NewPacketDef(3)
|
|
|
|
def.Fields["str8"] = parser.FieldDesc{
|
|
Type: common.TypeString8,
|
|
}
|
|
def.Fields["str16"] = parser.FieldDesc{
|
|
Type: common.TypeString16,
|
|
}
|
|
def.Fields["str32"] = parser.FieldDesc{
|
|
Type: common.TypeString32,
|
|
}
|
|
|
|
def.Orders[1] = []string{"str8", "str16", "str32"}
|
|
|
|
data := map[string]any{
|
|
"str8": "test8",
|
|
"str16": "test16",
|
|
"str32": "test32",
|
|
}
|
|
|
|
builder := NewPacketBuilder(def, 1, 0)
|
|
packetData, err := builder.Build(data)
|
|
if err != nil {
|
|
t.Errorf("Failed to build packet with strings: %v", err)
|
|
return
|
|
}
|
|
|
|
// Verify we have some data
|
|
if len(packetData) < 20 { // rough estimate
|
|
t.Errorf("Built packet too short for string data: %d bytes", len(packetData))
|
|
return
|
|
}
|
|
|
|
t.Logf("Successfully built packet with strings (%d bytes)", len(packetData))
|
|
}
|
|
|
|
func TestBuildPacketConvenienceFunction(t *testing.T) {
|
|
// Test the convenience function
|
|
data := map[string]any{
|
|
"username": "testuser",
|
|
"password": "testpass",
|
|
}
|
|
|
|
// This should fail since we don't have a "TestPacket" defined
|
|
_, err := BuildPacket("NonExistentPacket", data, 1, 0)
|
|
if err == nil {
|
|
t.Error("Expected error for non-existent packet, but got none")
|
|
return
|
|
}
|
|
|
|
t.Logf("Correctly detected non-existent packet: %v", err)
|
|
}
|