diff --git a/.mise/config.toml b/.mise/config.toml index c8dfc7b..227d329 100644 --- a/.mise/config.toml +++ b/.mise/config.toml @@ -12,7 +12,11 @@ run = "go test ./..." [tasks.coverage] description = "Run the tests with coverage" -run = "go test -cover ./..." +run = "mkdir -p ./ressources && go test -cover ./... -coverprofile=ressources/coverage.out" + +[tasks.coverage-html] +description = "Run the tests with coverage" +run = "go tool cover -html=ressources/coverage.out" [tasks.lint] description = "Run the linter" diff --git a/internal/command/acknowledge/acknowledge.go b/internal/command/acknowledge/acknowledge.go index e6c9ccd..967a5d3 100644 --- a/internal/command/acknowledge/acknowledge.go +++ b/internal/command/acknowledge/acknowledge.go @@ -5,15 +5,15 @@ import ( "github.com/AutoDruid/photon-parser/internal/types" ) -func Parse(reader *reader.Reader, out *types.Acknowledge) error { +func ParseInto(reader *reader.Reader, dest *types.Acknowledge) error { var err error - out.AckReliableSequenceNumber, err = reader.ReadUInt32BE() + dest.AckReliableSequenceNumber, err = reader.ReadUInt32BE() if err != nil { return err } - out.AckSentTime, err = reader.ReadUInt32BE() + dest.AckSentTime, err = reader.ReadUInt32BE() if err != nil { return err } diff --git a/internal/command/command.go b/internal/command/command.go index 365b484..e941952 100644 --- a/internal/command/command.go +++ b/internal/command/command.go @@ -25,16 +25,16 @@ import ( // The returned Command struct contains all header fields and the raw payload // in the Data field. For SendReliable commands, the Data can be further parsed // using the reliable package. -func Parse[P types.ParameterView](ctx *context.Context[P], out *types.Command[P]) error { - err := parseHeader(out, ctx.Reader) +func ParseInto[P types.ParameterView](ctx *context.Context[P], dest *types.Command[P]) error { + err := readCommandHeaderInto(ctx.Reader, dest) - if out.Type > types.SendReliableFragmentCommand { + if dest.Type > types.SendReliableFragmentCommand { remaining := ctx.Reader.Max - ctx.Reader.Cursor - 1 rest, err := ctx.Reader.ReadBytes(remaining) if err != nil { return err } - out.UnknownPayload = types.UnknownPayload{Raw: rest, Kind: out.Type} + dest.UnknownPayload = types.UnknownPayload{Raw: rest, Kind: dest.Type} return nil } @@ -42,123 +42,123 @@ func Parse[P types.ParameterView](ctx *context.Context[P], out *types.Command[P] return err } - if out.Length < types.COMMAND_HEADER_SIZE { + if dest.Length < types.COMMAND_HEADER_SIZE { return errors.ErrHeaderSize } - err = parsePayload(out, ctx) + err = readCommandPayloadInto(ctx, dest) if err != nil { - rest, _ := ctx.Reader.ReadBytes(int(out.Length - types.COMMAND_HEADER_SIZE)) + rest, _ := ctx.Reader.ReadBytes(int(dest.Length - types.COMMAND_HEADER_SIZE)) // don't fatal — just store raw for encrypted packets - out.UnknownPayload = types.UnknownPayload{Raw: rest, Kind: out.Type} + dest.UnknownPayload = types.UnknownPayload{Raw: rest, Kind: dest.Type} } - emit(ctx.Hooks, out) + emit(ctx.Hooks, dest) return nil } -func emit[P types.ParameterView](hooks *hooks.Hooks[P], out *types.Command[P]) { - if hooks == nil { - return +func readCommandHeaderInto[P types.ParameterView](r *reader.Reader, dest *types.Command[P]) error { + var err error + + b, err := r.ReadUInt8() + if err != nil { + return err } - if hooks.SyncHooks.OnCommand != nil { - hooks.SyncHooks.OnCommand(*out) + dest.Type = types.CommandType(b) + + if dest.Type > types.SendReliableFragmentCommand { + return nil } - if hooks.AsyncHooks.OnCommand == nil { - return + dest.ChannelID, err = r.ReadUInt8() + if err != nil { + return err } - select { - case hooks.AsyncHooks.OnCommand <- *out: - default: // don't block parser + dest.Flags, err = r.ReadUInt8() + if err != nil { + return err + } + + dest.ReservedByte, err = r.ReadUInt8() + if err != nil { + return err } + dest.Length, err = r.ReadUInt32BE() + if err != nil { + return err + } + + dest.ReliableSequenceNumber, err = r.ReadUInt32BE() + if err != nil { + return err + } + + return nil } -func parsePayload[P types.ParameterView](out *types.Command[P], ctx *context.Context[P]) error { - switch out.Type { +func readCommandPayloadInto[P types.ParameterView](ctx *context.Context[P], dest *types.Command[P]) error { + switch dest.Type { case types.SendUnreliableCommand: _, err := ctx.Reader.ReadBytes(4) if err != nil { return err } - err = reliable.Parse(ctx, &out.UnreliablePayload, out.Length) + err = reliable.ParseInto(ctx, dest.Length, &dest.UnreliablePayload) if err != nil { return err } case types.SendReliableCommand: - err := reliable.Parse(ctx, &out.ReliablePayload, out.Length) + err := reliable.ParseInto(ctx, dest.Length, &dest.ReliablePayload) if err != nil { return err } case types.AcknowledgeCommand: - err := acknowledge.Parse(ctx.Reader, &out.AcknowledgePayload) + err := acknowledge.ParseInto(ctx.Reader, &dest.AcknowledgePayload) if err != nil { return err } case types.ConnectCommand, types.VerifyConnectCommand: - err := connect.Parse(ctx.Reader, &out.ConnectPayload) + err := connect.ParseInto(ctx.Reader, &dest.ConnectPayload) if err != nil { return err } case types.SendReliableFragmentCommand: - err := reliable.ParseFragment(ctx, &out.ReliableFragmentPayload, &out.ReliablePayload, out.Length) + err := reliable.ParseIntoFragment(ctx, dest.Length, &dest.ReliableFragmentPayload, &dest.ReliablePayload) if err != nil { return err } case types.PingCommand: - out.PingPayload = struct{}{} + dest.PingPayload = struct{}{} case types.DisconnectCommand: - out.DisconnectPayload = struct{}{} + dest.DisconnectPayload = struct{}{} default: - return fmt.Errorf("unsupported command type %d", out.Type) + return fmt.Errorf("unsupported command type %d", dest.Type) } return nil } -func parseHeader[P types.ParameterView](out *types.Command[P], r *reader.Reader) error { - var err error - - b, err := r.ReadUInt8() - if err != nil { - return err - } - - out.Type = types.CommandType(b) - - if out.Type > types.SendReliableFragmentCommand { - return nil - } - - out.ChannelID, err = r.ReadUInt8() - if err != nil { - return err - } - - out.Flags, err = r.ReadUInt8() - if err != nil { - return err +func emit[P types.ParameterView](hooks *hooks.Hooks[P], dest *types.Command[P]) { + if hooks == nil { + return } - out.ReservedByte, err = r.ReadUInt8() - if err != nil { - return err + if hooks.SyncHooks.OnCommand != nil { + hooks.SyncHooks.OnCommand(*dest) } - out.Length, err = r.ReadUInt32BE() - if err != nil { - return err + if hooks.AsyncHooks.OnCommand == nil { + return } - out.ReliableSequenceNumber, err = r.ReadUInt32BE() - if err != nil { - return err + select { + case hooks.AsyncHooks.OnCommand <- *dest: + default: // don't block parser } - return nil } diff --git a/internal/command/command_test.go b/internal/command/command_test.go index 0a26b48..3657458 100644 --- a/internal/command/command_test.go +++ b/internal/command/command_test.go @@ -25,7 +25,7 @@ func TestParseSession(t *testing.T) { var cmd types.Command[v16.Parameter] - err := command.Parse(ctx, &cmd) + err := command.ParseInto(ctx, &cmd) if err != nil { t.Fatalf("LoadFromWiresharkExport() failed: %v", err) diff --git a/internal/command/connect/connect.go b/internal/command/connect/connect.go index 92511eb..35da5b2 100644 --- a/internal/command/connect/connect.go +++ b/internal/command/connect/connect.go @@ -5,38 +5,38 @@ import ( "github.com/AutoDruid/photon-parser/internal/types" ) -func Parse(reader *reader.Reader, out *types.Connect) error { +func ParseInto(reader *reader.Reader, dest *types.Connect) error { var err error - out.Mtu, err = reader.ReadUInt32BE() + dest.Mtu, err = reader.ReadUInt32BE() if err != nil { return err } - out.WindowSize, err = reader.ReadUInt32BE() + dest.WindowSize, err = reader.ReadUInt32BE() if err != nil { return err } - out.ChannelCount, err = reader.ReadUInt32BE() + dest.ChannelCount, err = reader.ReadUInt32BE() if err != nil { return err } - out.IncomingBandwidth, err = reader.ReadUInt32BE() + dest.IncomingBandwidth, err = reader.ReadUInt32BE() if err != nil { return err } - out.OutgoingBandwidth, err = reader.ReadUInt32BE() + dest.OutgoingBandwidth, err = reader.ReadUInt32BE() if err != nil { return err } - out.DisconnectThrottle, err = reader.ReadUInt32BE() + dest.DisconnectThrottle, err = reader.ReadUInt32BE() if err != nil { return err } - out.PacketThrottleAcceleration, err = reader.ReadUInt32BE() + dest.PacketThrottleAcceleration, err = reader.ReadUInt32BE() if err != nil { return err } - out.PacketThrottleDeceleration, err = reader.ReadUInt32BE() + dest.PacketThrottleDeceleration, err = reader.ReadUInt32BE() if err != nil { return err } diff --git a/internal/command/disconnect/disconnect.go b/internal/command/disconnect/disconnect.go deleted file mode 100644 index 52241c5..0000000 --- a/internal/command/disconnect/disconnect.go +++ /dev/null @@ -1,7 +0,0 @@ -package disconnect - -type Disconnect struct{} - -func Parse() *Disconnect { - return &Disconnect{} -} diff --git a/internal/command/ping/ping.go b/internal/command/ping/ping.go deleted file mode 100644 index 96c9a66..0000000 --- a/internal/command/ping/ping.go +++ /dev/null @@ -1,7 +0,0 @@ -package ping - -type Ping struct{} - -func Parse() Ping { - return Ping{} -} diff --git a/internal/command/reliable/fragment.go b/internal/command/reliable/fragment.go index 8ec0113..29d9d21 100644 --- a/internal/command/reliable/fragment.go +++ b/internal/command/reliable/fragment.go @@ -6,52 +6,56 @@ import ( "github.com/AutoDruid/photon-parser/internal/types" ) -func ParseFragment[P types.ParameterView](ctx *context.Context[P], out *types.Fragment, outt *types.Reliable[P], length uint32) error { +// ParseIntoFragment parses a Photon reliable fragment from a parser.Reader. +// It reads the fragment header, then feeds the fragment into the assembler. +// If the fragment is complete, it parses the reliable message into the destination. +// Returns an error if any part of parsing fails. +func ParseIntoFragment[P types.ParameterView](ctx *context.Context[P], length uint32, destFragment *types.Fragment, destReliable *types.Reliable[P]) error { - err := parseMetadata(ctx.Reader, out) + err := readFragmentHeader(ctx.Reader, destFragment) if err != nil { return err } - data, completed := ctx.Assembler.Feed(*out) + data, completed := ctx.Assembler.Feed(*destFragment) if completed { ctx.Reader.Reset(data) - return Parse(ctx, outt, length) + return ParseInto(ctx, length, destReliable) } return nil } -func parseMetadata(reader *reader.Reader, out *types.Fragment) error { +func readFragmentHeader(reader *reader.Reader, dest *types.Fragment) error { var err error - out.ID, err = reader.ReadUInt32BE() + dest.ID, err = reader.ReadUInt32BE() if err != nil { return err } - out.Count, err = reader.ReadUInt32BE() + dest.Count, err = reader.ReadUInt32BE() if err != nil { return err } - out.Index, err = reader.ReadUInt32BE() + dest.Index, err = reader.ReadUInt32BE() if err != nil { return err } - out.Size, err = reader.ReadUInt32BE() + dest.Size, err = reader.ReadUInt32BE() if err != nil { return err } - out.Offset, err = reader.ReadUInt32BE() + dest.Offset, err = reader.ReadUInt32BE() if err != nil { return err } - out.Data = reader.ReadRemaining() + dest.Data = reader.ReadRemaining() return nil } diff --git a/internal/command/reliable/reliable.go b/internal/command/reliable/reliable.go index 2200af8..044cb6f 100644 --- a/internal/command/reliable/reliable.go +++ b/internal/command/reliable/reliable.go @@ -22,31 +22,31 @@ const READED_HEADER_SIZE = 14 // // Returns a Reliable struct with all fields populated including the Parameters slice, // or an error if any part of parsing fails. -func Parse[P types.ParameterView](ctx *context.Context[P], out *types.Reliable[P], length uint32) error { - err := parseHeader(out, ctx, length) +func ParseInto[P types.ParameterView](ctx *context.Context[P], length uint32, dest *types.Reliable[P]) error { + err := readReliableHeaderInto(ctx, length, dest) if err != nil { return err } - if out.Type >= types.ExchangeKeys { + if dest.Type >= types.ExchangeKeys { return nil } - if out.Signature != 0xF3 { + if dest.Signature != 0xF3 { return errors.ErrEncryptedPacket } - items := ctx.PoolParameter.Get(out.ParameterCount) - out.Parameters = items.Items + items := ctx.PoolParameter.Get(dest.ParameterCount) + dest.Parameters = items.Items - for i := 0; i < out.ParameterCount; i++ { - err := ctx.Decoders.ParameterParser.Parse(ctx.Reader, &out.Parameters[i], ctx.Hooks) + for i := 0; i < dest.ParameterCount; i++ { + err := ctx.Decoders.ParameterParser.ParseInto(ctx.Reader, ctx.Hooks, &dest.Parameters[i]) if err != nil { return err } } - emit(ctx.Hooks, out) + emit(ctx.Hooks, dest) ctx.PoolParameter.Put(items) @@ -54,20 +54,10 @@ func Parse[P types.ParameterView](ctx *context.Context[P], out *types.Reliable[P } -func emit[P types.ParameterView](hooks *hooks.Hooks[P], out *types.Reliable[P]) { - if hooks == nil { - return - } - - if hooks.OnEvents[out.Type] != nil { - hooks.OnEvents[out.Type](*out) - } -} - -func parseHeader[P types.ParameterView](out *types.Reliable[P], ctx *context.Context[P], length uint32) error { +func readReliableHeaderInto[P types.ParameterView](ctx *context.Context[P], length uint32, dest *types.Reliable[P]) error { var err error - out.Signature, err = ctx.Reader.ReadUInt8() + dest.Signature, err = ctx.Reader.ReadUInt8() if err != nil { return err } @@ -77,12 +67,12 @@ func parseHeader[P types.ParameterView](out *types.Reliable[P], ctx *context.Con return err } - out.Type = types.Type(b) + dest.Type = types.MessageType(b) - switch out.Type { + switch dest.Type { case types.OperationResponse, types.OtherOperationResponse: - out.EventCode, err = ctx.Reader.ReadUInt8() + dest.EventCode, err = ctx.Reader.ReadUInt8() if err != nil { return err } @@ -99,7 +89,7 @@ func parseHeader[P types.ParameterView](out *types.Reliable[P], ctx *context.Con return err } case types.EventDataType, types.OperationRequest: - out.EventCode, err = ctx.Reader.ReadUInt8() + dest.EventCode, err = ctx.Reader.ReadUInt8() if err != nil { return err } @@ -111,10 +101,20 @@ func parseHeader[P types.ParameterView](out *types.Reliable[P], ctx *context.Con return nil } - out.ParameterCount, err = ctx.Decoders.ReliableHeaderParameterCount.Count(ctx.Reader) + dest.ParameterCount, err = ctx.Decoders.ReliableHeaderParameterCount.Count(ctx.Reader) if err != nil { return err } return nil } + +func emit[P types.ParameterView](hooks *hooks.Hooks[P], dest *types.Reliable[P]) { + if hooks == nil { + return + } + + if hooks.OnEvents[dest.Type] != nil { + hooks.OnEvents[dest.Type](*dest) + } +} diff --git a/internal/command/reliable/reliable_test.go b/internal/command/reliable/reliable_test.go index 0993f43..5e6e540 100644 --- a/internal/command/reliable/reliable_test.go +++ b/internal/command/reliable/reliable_test.go @@ -24,7 +24,7 @@ func TestReliableParsing(t *testing.T) { PoolParameter: context.NewPool[v16.Parameter](100), } var sd types.Reliable[v16.Parameter] - err := reliable.Parse(ctx, &sd, uint32(len(payload))) + err := reliable.ParseInto(ctx, uint32(len(payload)), &sd) if err != nil { t.Fatalf("LoadFromWiresharkExport() failed: %v", err) diff --git a/internal/context/context.go b/internal/context/context.go index ed16c16..4ca0110 100644 --- a/internal/context/context.go +++ b/internal/context/context.go @@ -7,6 +7,9 @@ import ( "github.com/AutoDruid/photon-parser/internal/types" ) +// Context is the main context for the parser. +// It contains the reader, assembler, hooks, decoders, and pools for the parser. +// It live as long as the parser is used. type Context[P types.ParameterView] struct { Reader *reader.Reader Assembler *assembler.Assembler diff --git a/internal/context/decoders.go b/internal/context/decoders.go index f6ced18..558ee02 100644 --- a/internal/context/decoders.go +++ b/internal/context/decoders.go @@ -10,7 +10,7 @@ import ( // (v16, v18). // It is wired once at Parser construction so the hot path type ParameterParser[P types.ParameterView] interface { - Parse(*reader.Reader, *P, *hooks.Hooks[P]) error + ParseInto(*reader.Reader, *hooks.Hooks[P], *P) error } // ReliableHeaderParameterCount is implemented by each protocol-version reliable header parameter count package diff --git a/internal/hooks/hooks.go b/internal/hooks/hooks.go index 056d6d4..6cf93e8 100644 --- a/internal/hooks/hooks.go +++ b/internal/hooks/hooks.go @@ -17,7 +17,7 @@ func NewHooks[P types.ParameterView]() *Hooks[P] { SyncHooks: types.SyncHooks[P]{ OnSession: nil, OnCommand: nil, - OnEvents: make(map[types.Type]func(types.Reliable[P])), + OnEvents: make(map[types.MessageType]func(types.Reliable[P])), OnParameter: nil, }, } diff --git a/internal/parameters/v16/parameters.go b/internal/parameters/v16/parameters.go index fd9658b..eae528d 100644 --- a/internal/parameters/v16/parameters.go +++ b/internal/parameters/v16/parameters.go @@ -27,7 +27,7 @@ var _ context.ParameterParser[Parameter] = (*Parameter)(nil) // return err // } // fmt.Printf("Parameter %d has value: %v\n", param.ID, param.Value) -func (p *Parameter) Parse(reader *reader.Reader, out *Parameter, hooks *hooks.Hooks[Parameter]) error { +func (p *Parameter) ParseInto(reader *reader.Reader, hooks *hooks.Hooks[Parameter], dest *Parameter) error { header, err := p.parseHeader(reader) if err != nil { @@ -40,8 +40,8 @@ func (p *Parameter) Parse(reader *reader.Reader, out *Parameter, hooks *hooks.Ho return err } - out.Header = header - out.Value = value + dest.Header = header + dest.Value = value p.emit(reader, hooks) diff --git a/internal/parameters/v16/scan_arrays_test.go b/internal/parameters/v16/scan_arrays_test.go index b388138..209a2ff 100644 --- a/internal/parameters/v16/scan_arrays_test.go +++ b/internal/parameters/v16/scan_arrays_test.go @@ -44,7 +44,7 @@ func TestParseInt8ArrayParameterAndAccessor(t *testing.T) { var parser v16.Parameter var got v16.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } @@ -136,7 +136,7 @@ func TestParseStringArrayParameterAndAccessor(t *testing.T) { var parser v16.Parameter var got v16.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } @@ -217,7 +217,7 @@ func TestParseInt32ArrayParameterAndAccessor(t *testing.T) { var parser v16.Parameter var got v16.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } @@ -332,7 +332,7 @@ func TestParseArrayParameterAndAccessor(t *testing.T) { var parser v16.Parameter var got v16.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } diff --git a/internal/parameters/v16/scan_dicts_test.go b/internal/parameters/v16/scan_dicts_test.go index 574a86e..81f0dc5 100644 --- a/internal/parameters/v16/scan_dicts_test.go +++ b/internal/parameters/v16/scan_dicts_test.go @@ -66,7 +66,7 @@ func TestParseDictsParametersAndAccessor(t *testing.T) { var parser v16.Parameter var got v16.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } diff --git a/internal/parameters/v16/scan_scalars_test.go b/internal/parameters/v16/scan_scalars_test.go index 0d29531..27d0d31 100644 --- a/internal/parameters/v16/scan_scalars_test.go +++ b/internal/parameters/v16/scan_scalars_test.go @@ -41,7 +41,7 @@ func TestParseStringParameterAndAccessor(t *testing.T) { r := reader.NewReader(tt.input) var parser v16.Parameter var got v16.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } if got.ID() != tt.wantID { @@ -88,7 +88,7 @@ func TestParseInt8ParameterAndAccessor(t *testing.T) { r := reader.NewReader(tt.input) var parser v16.Parameter var got v16.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } if got.ID() != tt.wantID { @@ -123,7 +123,7 @@ func TestParseInt16ParameterAndAccessor(t *testing.T) { r := reader.NewReader(tt.input) var parser v16.Parameter var got v16.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } if got.ID() != tt.wantID { @@ -158,7 +158,7 @@ func TestParseInt32ParameterAndAccessor(t *testing.T) { r := reader.NewReader(tt.input) var parser v16.Parameter var got v16.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } if got.ID() != tt.wantID { @@ -193,7 +193,7 @@ func TestParseInt64ParameterAndAccessor(t *testing.T) { r := reader.NewReader(tt.input) var parser v16.Parameter var got v16.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } if got.ID() != tt.wantID { @@ -228,7 +228,7 @@ func TestParseFloat32ParameterAndAccessor(t *testing.T) { r := reader.NewReader(tt.input) var parser v16.Parameter var got v16.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } if got.ID() != tt.wantID { @@ -263,7 +263,7 @@ func TestParseFloat64ParameterAndAccessor(t *testing.T) { r := reader.NewReader(tt.input) var parser v16.Parameter var got v16.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } if got.ID() != tt.wantID { @@ -304,7 +304,7 @@ func TestParseBooleanParameterAndAccessor(t *testing.T) { r := reader.NewReader(tt.input) var parser v16.Parameter var got v16.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } if got.ID() != tt.wantID { diff --git a/internal/parameters/v18/parameters.go b/internal/parameters/v18/parameters.go index 91a6307..23008f4 100644 --- a/internal/parameters/v18/parameters.go +++ b/internal/parameters/v18/parameters.go @@ -27,7 +27,7 @@ var _ context.ParameterParser[Parameter] = (*Parameter)(nil) // return err // } // fmt.Printf("Parameter %d has value: %v\n", param.ID, param.Value) -func (p *Parameter) Parse(reader *reader.Reader, out *Parameter, hooks *hooks.Hooks[Parameter]) error { +func (p *Parameter) ParseInto(reader *reader.Reader, hooks *hooks.Hooks[Parameter], dest *Parameter) error { header, err := p.parseHeader(reader) if err != nil { @@ -42,10 +42,10 @@ func (p *Parameter) Parse(reader *reader.Reader, out *Parameter, hooks *hooks.Ho return err } - out.Header = header - out.Value = value + dest.Header = header + dest.Value = value - p.emit(hooks, out) + p.emit(hooks, dest) return nil } diff --git a/internal/parameters/v18/parameters_test.go b/internal/parameters/v18/parameters_test.go index 1a1869c..644dcbe 100644 --- a/internal/parameters/v18/parameters_test.go +++ b/internal/parameters/v18/parameters_test.go @@ -1,15 +1,15 @@ package v18_test import ( - "encoding/json" - "log" + "bytes" "testing" "github.com/AutoDruid/photon-parser" v18 "github.com/AutoDruid/photon-parser/internal/parameters/v18" + "github.com/AutoDruid/photon-parser/internal/types" ) -func TestDecode(t *testing.T) { +func TestDecodeReliableCommand(t *testing.T) { payload := []byte{0x79, 0x9e, 0x0, 0x1, 0x0, 0x0, 0x15, 0x5c, 0x7c, 0x11, 0x66, 0xbd, 0x6, 0x0, 0x1, 0x4, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x1b, 0xf3, 0x2, 0x1, 0x6, 0x0, 0xa, 0xca, 0xd0, 0xa2, 0xb9, 0xa1, 0xf5, 0xce, 0xde, 0x11, 0x1, 0x45, 0x2, 0xbb, 0x8c, 0x7f, 0xc2, 0x60, 0xf3, 0xb6, 0xc3, 0x2, 0x5, 0xab, 0x77, 0xa2, 0x42, 0x3, 0x45, 0x2, 0x52, 0xfc, 0x70, 0xc2, 0x82, 0xab, 0xb6, 0xc3, 0x4, 0x5, 0xd7, 0xa3, 0x32, 0x41, 0xfd, 0x4, 0x16, 0x0} parser := photon.NewV18() @@ -30,7 +30,7 @@ func TestDecode(t *testing.T) { } } -func TestAcknowledgeChainedWithSenReliable(t *testing.T) { +func TestAcknowledgeChainedWithSendReliable(t *testing.T) { payload := []byte{0x79, 0x9e, 0x0, 0x3, 0x0, 0x0, 0x4, 0xef, 0x7c, 0x11, 0x66, 0xbd, 0x1, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, 0xad, 0xb8, 0x93, 0xbc, 0x6, 0x0, 0x1, 0x4, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x5, 0xf3, 0x2, 0x1, 0xc, 0x0, 0x7, 0x8, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x4d, 0x34, 0x1, 0x7, 0x8, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x4d, 0x34, 0x2, 0x7, 0xf, 0x4d, 0x61, 0x63, 0x20, 0x4f, 0x53, 0x20, 0x58, 0x20, 0x32, 0x36, 0x2e, 0x33, 0x2e, 0x30, 0x3, 0xd, 0x60, 0x9, 0x4, 0xd, 0x5c, 0x2f, 0x5, 0xd, 0x0, 0x40, 0x6, 0x7, 0x5, 0x45, 0x4e, 0x2d, 0x55, 0x53, 0x7, 0x7, 0x6, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x8, 0x7, 0x5, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x9, 0xd, 0xbf, 0xd, 0xb, 0x10, 0x1, 0xfd, 0x4, 0x2c, 0x1, 0x6, 0x0, 0x1, 0x4, 0x0, 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, 0x6, 0xf3, 0x2, 0x1, 0x2, 0x0, 0x47, 0x0, 0xfd, 0x4, 0xff, 0x1} @@ -40,9 +40,41 @@ func TestAcknowledgeChainedWithSenReliable(t *testing.T) { err := parser.ParsePacketInto(payload, &sess) if err != nil { - log.Println(err) + t.Fatalf("can't parse due to: %v", err) + } + + if len(sess.Commands) != 3 { + t.Fatalf("session must have at least 2 commands got: %v", len(sess.Commands)) + } + + if sess.Commands[0].Type != types.AcknowledgeCommand { + t.Fatalf("command must be an acknowledge command got: %v", sess.Commands[0].Type) + } + + if sess.Commands[0].AcknowledgePayload.AckReliableSequenceNumber == 0 { + t.Fatalf("acknowledge payload must have a reliable sequence number of 0 got: %v", sess.Commands[0].AcknowledgePayload.AckReliableSequenceNumber) + } + + if sess.Commands[0].AcknowledgePayload.AckSentTime == 0 { + t.Fatalf("acknowledge payload must have a sent time of 0 got: %v", sess.Commands[0].AcknowledgePayload.AckSentTime) + } + + if sess.Commands[1].Type != types.SendReliableCommand { + t.Fatalf("command must be a send reliable command got: %v", sess.Commands[1].Type) + } + + if sess.Commands[1].ReliablePayload.ParameterCount == 0 { + t.Fatalf("reliable payload must have more than 0 parameter count got: %v", sess.Commands[1].ReliablePayload.ParameterCount) + } + + if sess.Commands[2].Type != types.SendReliableCommand { + t.Fatalf("command must be a send reliable command got: %v", sess.Commands[2].Type) } - log.Println(sess.Commands) + + if sess.Commands[2].ReliablePayload.ParameterCount == 0 { + t.Fatalf("reliable payload must have more than 0 parameter count got: %v", sess.Commands[1].ReliablePayload.ParameterCount) + } + } func TestAcknowledgeChainedWithPing(t *testing.T) { @@ -54,9 +86,25 @@ func TestAcknowledgeChainedWithPing(t *testing.T) { err := parser.ParsePacketInto(payload, &sess) if err != nil { - log.Println(err) + t.Fatalf("can't parse due to: %v", err) + } + + if len(sess.Commands) != 2 { + t.Fatalf("session must have at least 2 commands got: %v", len(sess.Commands)) + } + + if sess.Commands[0].AcknowledgePayload.AckReliableSequenceNumber == 0 { + t.Fatalf("acknowledge payload must have a reliable sequence number of 0 got: %v", sess.Commands[0].AcknowledgePayload.AckReliableSequenceNumber) } - log.Println(sess) + + if sess.Commands[0].AcknowledgePayload.AckSentTime == 0 { + t.Fatalf("acknowledge payload must have a sent time of 0 got: %v", sess.Commands[0].AcknowledgePayload.AckSentTime) + } + + if sess.Commands[1].Type != types.PingCommand { + t.Fatalf("command must be a ping command got: %v", sess.Commands[1].Type) + } + } func TestLongSendReliable(t *testing.T) { @@ -68,91 +116,88 @@ func TestLongSendReliable(t *testing.T) { sess := photon.Session[v18.Parameter]{} err := parser.ParsePacketInto(payload, &sess) if err != nil { - log.Println(err) + t.Fatalf("can't parse due to: %v", err) } - log.Println(sess.Commands) -} -func TestSendUnreliable(t *testing.T) { - payload := []byte{0x0, 0x0, 0x0, 0x1, 0xad, 0xb8, 0x96, 0xaa, 0x7c, 0x11, 0x66, 0xbd, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x63, 0x0, 0x0, 0x0, 0xf, 0xf3, 0x4, 0x3, 0x2, 0x0, 0xa, 0xbc, 0xb6, 0x85, 0x1, 0x1, 0x43, 0x1e, 0x3, 0x41, 0x3a, 0x43, 0x9, 0xd5, 0x9d, 0xde, 0x8, 0xfd, 0xd3, 0xda, 0xc2, 0x23, 0x47, 0xa5, 0xc3, 0xa, 0x33, 0x33, 0x13, 0x40, 0x72, 0x4f, 0xda, 0xc2, 0x9f, 0xc3, 0xa4, 0xc3} + if len(sess.Commands) == 0 { + t.Fatalf("session must have more than 0 commands got: 0") + } - parser := photon.NewV18() + if sess.Commands[0].Type != types.AcknowledgeCommand { + t.Fatalf("command must be a send reliable command got: %v", sess.Commands[0].Type) + } - sess := photon.Session[v18.Parameter]{} - err := parser.ParsePacketInto(payload, &sess) - if err != nil { - log.Println(err) + for i := 1; i < len(sess.Commands); i++ { + if sess.Commands[i].Type != types.SendReliableCommand { + t.Fatalf("command must be a send reliable command got: %v", sess.Commands[i].Type) + } + + if sess.Commands[i].ReliablePayload.ParameterCount == 0 { + t.Fatalf("reliable payload must have more than 0 parameter count got: %v", sess.Commands[i].ReliablePayload.ParameterCount) + } } - log.Println(sess.Commands) + } -func TestAcknowledgeChainedWithSenReliableUnreliable(t *testing.T) { - payload := []byte{0x0, 0x0, 0x0, 0x6, 0xad, 0xb8, 0xa9, 0x77, 0x7c, 0x11, 0x66, 0xbd, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x19, 0xf3, 0x4, 0x3, 0x2, 0x0, 0xa, 0xbc, 0xb6, 0x85, 0x1, 0x1, 0x43, 0x1e, 0x3, 0x1b, 0x0, 0x23, 0xc, 0xd5, 0x9d, 0xde, 0x8, 0xd0, 0x30, 0xdb, 0xc2, 0x83, 0xb2, 0xa4, 0xc3, 0xcc, 0x33, 0x33, 0x13, 0x40, 0xae, 0x10, 0xed, 0xc2, 0x2f, 0x57, 0xa3, 0xc3, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x19, 0x1, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x0, 0x0, 0x6d, 0xf3, 0x4, 0x1, 0x2, 0x0, 0xa, 0xbc, 0xb6, 0x85, 0x1, 0xfc, 0x4, 0x1, 0x0, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x18, 0x0, 0x0, 0x0, 0x6e, 0xf3, 0x4, 0x1, 0x2, 0x0, 0x11, 0x65, 0xa, 0xfc, 0x4, 0x1, 0x0, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x0, 0x0, 0x6f, 0xf3, 0x4, 0x1, 0x2, 0x0, 0xa, 0xce, 0xbe, 0x85, 0x1, 0xfc, 0x4, 0x1, 0x0, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x3d, 0x0, 0x0, 0x0, 0x70, 0xf3, 0x4, 0x1, 0x6, 0x0, 0x44, 0x2, 0x71, 0x2, 0x81, 0x2, 0x1, 0x43, 0x2, 0x0, 0x0, 0x2, 0x43, 0x2, 0x1, 0x1, 0x3, 0x45, 0x4, 0x0, 0x0, 0x20, 0xc1, 0x0, 0x80, 0xbc, 0xc3, 0x0, 0x0, 0xe0, 0xc0, 0x0, 0x80, 0xbd, 0xc3, 0x4, 0x43, 0x2, 0x2, 0x2, 0xfc, 0x4, 0x27, 0x0} +func TestSendUnreliable(t *testing.T) { + payload := []byte{0x0, 0x0, 0x0, 0x1, 0xad, 0xb8, 0x96, 0xaa, 0x7c, 0x11, 0x66, 0xbd, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x63, 0x0, 0x0, 0x0, 0xf, 0xf3, 0x4, 0x3, 0x2, 0x0, 0xa, 0xbc, 0xb6, 0x85, 0x1, 0x1, 0x43, 0x1e, 0x3, 0x41, 0x3a, 0x43, 0x9, 0xd5, 0x9d, 0xde, 0x8, 0xfd, 0xd3, 0xda, 0xc2, 0x23, 0x47, 0xa5, 0xc3, 0xa, 0x33, 0x33, 0x13, 0x40, 0x72, 0x4f, 0xda, 0xc2, 0x9f, 0xc3, 0xa4, 0xc3} parser := photon.NewV18() sess := photon.Session[v18.Parameter]{} err := parser.ParsePacketInto(payload, &sess) if err != nil { - log.Println(err) + t.Fatalf("can't parse due to: %v", err) } - log.Println(sess.Commands) -} -func TestStringParameter(t *testing.T) { - payload := []byte{0x79, 0x9e, 0x0, 0x2, 0x0, 0x0, 0x1, 0x1c, 0x7c, 0x11, 0x66, 0xbd, 0x1, 0xff, 0x0, 0x4, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, 0xb8, 0x91, 0x6a, 0x6, 0x0, 0x1, 0x4, 0x0, 0x0, 0x0, 0x35, 0x0, 0x0, 0x0, 0x1, 0xf3, 0x0, 0x1, 0x8, 0x1f, 0x41, 0x8, 0x11, 0x0, 0x41, 0x6c, 0x62, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} - parser := photon.NewV18() + if len(sess.Commands) == 0 { + t.Fatalf("session must have more than 0 commands got: 0") + } - sess := photon.Session[v18.Parameter]{} + if sess.Commands[0].Type != types.SendUnreliableCommand { + t.Fatalf("command must be a send unreliable command got: %v", sess.Commands[0].Type) + } - err := parser.ParsePacketInto(payload, &sess) - if err != nil { - log.Println(err) + if sess.Commands[0].UnreliablePayload.ParameterCount == 0 { + t.Fatalf("unreliable payload must have more than 0 parameter count got: %v", sess.Commands[0].UnreliablePayload.ParameterCount) } - log.Println(sess.Commands) } -func TestFailed(t *testing.T) { - payload := []byte{0x0, 0x0, 0x0, 0x2, 0xad, 0xb8, 0x91, 0x8a, 0x7c, 0x11, 0x66, 0xbd, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, 0x1c, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x1, 0xf3, 0x1, 0x0} +func TestAcknowledgeChainedWithSendReliableAndSendUnreliable(t *testing.T) { + payload := []byte{0x0, 0x0, 0x0, 0x6, 0xad, 0xb8, 0xa9, 0x77, 0x7c, 0x11, 0x66, 0xbd, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x19, 0xf3, 0x4, 0x3, 0x2, 0x0, 0xa, 0xbc, 0xb6, 0x85, 0x1, 0x1, 0x43, 0x1e, 0x3, 0x1b, 0x0, 0x23, 0xc, 0xd5, 0x9d, 0xde, 0x8, 0xd0, 0x30, 0xdb, 0xc2, 0x83, 0xb2, 0xa4, 0xc3, 0xcc, 0x33, 0x33, 0x13, 0x40, 0xae, 0x10, 0xed, 0xc2, 0x2f, 0x57, 0xa3, 0xc3, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x19, 0x1, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x0, 0x0, 0x6d, 0xf3, 0x4, 0x1, 0x2, 0x0, 0xa, 0xbc, 0xb6, 0x85, 0x1, 0xfc, 0x4, 0x1, 0x0, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x18, 0x0, 0x0, 0x0, 0x6e, 0xf3, 0x4, 0x1, 0x2, 0x0, 0x11, 0x65, 0xa, 0xfc, 0x4, 0x1, 0x0, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x0, 0x0, 0x6f, 0xf3, 0x4, 0x1, 0x2, 0x0, 0xa, 0xce, 0xbe, 0x85, 0x1, 0xfc, 0x4, 0x1, 0x0, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x3d, 0x0, 0x0, 0x0, 0x70, 0xf3, 0x4, 0x1, 0x6, 0x0, 0x44, 0x2, 0x71, 0x2, 0x81, 0x2, 0x1, 0x43, 0x2, 0x0, 0x0, 0x2, 0x43, 0x2, 0x1, 0x1, 0x3, 0x45, 0x4, 0x0, 0x0, 0x20, 0xc1, 0x0, 0x80, 0xbc, 0xc3, 0x0, 0x0, 0xe0, 0xc0, 0x0, 0x80, 0xbd, 0xc3, 0x4, 0x43, 0x2, 0x2, 0x2, 0xfc, 0x4, 0x27, 0x0} + parser := photon.NewV18() sess := photon.Session[v18.Parameter]{} err := parser.ParsePacketInto(payload, &sess) if err != nil { - log.Println(err) + t.Fatalf("can't parse due to: %v", err) } - log.Println(sess.Commands) -} -func TestFaiol(t *testing.T) { - payload := []byte{0x0, 0x0, 0x0, 0x2, 0xad, 0xb8, 0x91, 0xc8, 0x7c, 0x11, 0x66, 0xbd, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, 0x3e, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, 0x2, 0xf3, 0x7, 0x0, 0x0, 0x0, 0x8, 0x1, 0x1, 0x43, 0x60, 0x3c, 0x2a, 0xb7, 0x94, 0x4f, 0x36, 0xba, 0xa1, 0x7d, 0x57, 0x52, 0xbc, 0xf, 0x45, 0x99, 0xf6, 0x5b, 0x30, 0x99, 0x8b, 0x91, 0x45, 0xbb, 0x58, 0x75, 0x70, 0x48, 0x52, 0x8b, 0x49, 0xab, 0x20, 0x2e, 0xd5, 0xd3, 0x48, 0x4b, 0x59, 0x13, 0x54, 0x7e, 0x43, 0xe0, 0x17, 0x5b, 0xd7, 0x0, 0x26, 0x33, 0x4c, 0x7a, 0xb6, 0x84, 0x16, 0x39, 0x4b, 0xc3, 0x7a, 0xb2, 0x2, 0xc5, 0x90, 0xc, 0x2c, 0xc4, 0xc5, 0x8a, 0xbe, 0x58, 0x3e, 0x8e, 0x69, 0x54, 0x12, 0x15, 0xdc, 0xa6, 0xfa, 0x90, 0x31, 0x8e, 0x62, 0xef, 0xc5, 0x47, 0x6, 0x4e, 0x63, 0x73, 0xe5, 0x5f, 0xc5, 0xbf, 0xb9, 0x8b, 0x8b} - parser := photon.NewV18() + if len(sess.Commands) == 0 { + t.Fatalf("session must have more than 0 commands got: 0") + } - sess := photon.Session[v18.Parameter]{} + if sess.Commands[0].Type != types.SendUnreliableCommand { + t.Fatalf("command must be a send unreliable command got: %v", sess.Commands[0].Type) + } - err := parser.ParsePacketInto(payload, &sess) - if err != nil { - log.Println(err) + if sess.Commands[1].Type != types.AcknowledgeCommand { + t.Fatalf("command must be a acknowledge command got: %v", sess.Commands[1].Type) } - log.Println(sess.Commands) -} -func BenchmarkFaiol(b *testing.B) { - payload := []byte{0x0, 0x0, 0x0, 0x2, 0xad, 0xb8, 0x91, 0xc8, 0x7c, 0x11, 0x66, 0xbd, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, 0x3e, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, 0x2, 0xf3, 0x7, 0x0, 0x0, 0x0, 0x8, 0x1, 0x1, 0x43, 0x60, 0x3c, 0x2a, 0xb7, 0x94, 0x4f, 0x36, 0xba, 0xa1, 0x7d, 0x57, 0x52, 0xbc, 0xf, 0x45, 0x99, 0xf6, 0x5b, 0x30, 0x99, 0x8b, 0x91, 0x45, 0xbb, 0x58, 0x75, 0x70, 0x48, 0x52, 0x8b, 0x49, 0xab, 0x20, 0x2e, 0xd5, 0xd3, 0x48, 0x4b, 0x59, 0x13, 0x54, 0x7e, 0x43, 0xe0, 0x17, 0x5b, 0xd7, 0x0, 0x26, 0x33, 0x4c, 0x7a, 0xb6, 0x84, 0x16, 0x39, 0x4b, 0xc3, 0x7a, 0xb2, 0x2, 0xc5, 0x90, 0xc, 0x2c, 0xc4, 0xc5, 0x8a, 0xbe, 0x58, 0x3e, 0x8e, 0x69, 0x54, 0x12, 0x15, 0xdc, 0xa6, 0xfa, 0x90, 0x31, 0x8e, 0x62, 0xef, 0xc5, 0x47, 0x6, 0x4e, 0x63, 0x73, 0xe5, 0x5f, 0xc5, 0xbf, 0xb9, 0x8b, 0x8b} - b.ReportAllocs() - parser := photon.NewV18() + for i := 2; i < len(sess.Commands); i++ { + if sess.Commands[i].Type != types.SendReliableCommand { + t.Fatalf("command must be a send reliable command got: %v", sess.Commands[i].Type) + } - sess := photon.Session[v18.Parameter]{} - for b.Loop() { - err := parser.ParsePacketInto(payload, &sess) - if err != nil { - log.Println(err) + if sess.Commands[i].ReliablePayload.ParameterCount == 0 { + t.Fatalf("reliable payload must have more than 0 parameter count got: %v", sess.Commands[i].ReliablePayload.ParameterCount) } } - } -func TestLong(t *testing.T) { +func TestSendReliableWithSendReliableFragment(t *testing.T) { payload := []byte{0x0, 0x0, 0x0, 0x2, 0xad, 0xb8, 0x92, 0x16, 0x7c, 0x11, 0x66, 0xbd, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3, 0xbb, 0x0, 0x0, 0x0, 0x41, 0xf3, 0x4, 0x1, 0x7, 0x0, 0xa, 0xde, 0xd3, 0x86, 0x1, 0x1, 0x44, 0x1d, 0xae, 0x2, 0x8c, 0x2, 0x53, 0x2, 0x13, 0x1, 0xa7, 0x2, 0xf2, 0x1, 0x90, 0x0, 0xb8, 0x0, 0xc2, 0x0, 0xc4, 0x1, 0x4, 0x0, 0x28, 0x0, 0x2e, 0x2, 0x9b, 0x2, 0x0, 0x0, 0xa8, 0x2, 0x8d, 0x2, 0x95, 0x2, 0x2, 0x0, 0x86, 0x0, 0x5, 0x0, 0xb7, 0x2, 0x3, 0x0, 0xa1, 0x2, 0x1, 0x0, 0x83, 0x2, 0xd7, 0x0, 0x91, 0x0, 0x9b, 0x0, 0x2, 0x44, 0x86, 0x2, 0x6, 0x0, 0x18, 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x24, 0x0, 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, 0x0, 0x41, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x50, 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, 0x0, 0x61, 0x0, 0x62, 0x0, 0x63, 0x0, 0x64, 0x0, 0x65, 0x0, 0x66, 0x0, 0x67, 0x0, 0x68, 0x0, 0x69, 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c, 0x0, 0x6d, 0x0, 0x6e, 0x0, 0x6f, 0x0, 0x70, 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, 0x0, 0x7d, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x80, 0x0, 0x81, 0x0, 0x82, 0x0, 0x83, 0x0, 0x84, 0x0, 0x85, 0x0, 0x92, 0x0, 0x93, 0x0, 0x94, 0x0, 0x95, 0x0, 0x96, 0x0, 0x97, 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a, 0x0, 0x9c, 0x0, 0x9d, 0x0, 0x9e, 0x0, 0x9f, 0x0, 0xa0, 0x0, 0xa1, 0x0, 0xa2, 0x0, 0xa3, 0x0, 0xa4, 0x0, 0xa5, 0x0, 0xb9, 0x0, 0xba, 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc0, 0x0, 0xc1, 0x0, 0xc3, 0x0, 0xcd, 0x0, 0xce, 0x0, 0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x0, 0xd8, 0x0, 0xd9, 0x0, 0xda, 0x0, 0xdb, 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0xea, 0x0, 0xeb, 0x0, 0xec, 0x0, 0xed, 0x0, 0xee, 0x0, 0xef, 0x0, 0xf0, 0x0, 0xf1, 0x0, 0xf2, 0x0, 0xfa, 0x0, 0xfb, 0x0, 0xfc, 0x0, 0xfd, 0x0, 0xfe, 0x0, 0xff, 0x0, 0x0, 0x1, 0x1, 0x1, 0x2, 0x1, 0xc, 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10, 0x1, 0x11, 0x1, 0x12, 0x1, 0x14, 0x1, 0x15, 0x1, 0x27, 0x1, 0x2a, 0x1, 0x2b, 0x1, 0x2c, 0x1, 0x2d, 0x1, 0x2e, 0x1, 0x2f, 0x1, 0x30, 0x1, 0x3a, 0x1, 0x3c, 0x1, 0x45, 0x1, 0x46, 0x1, 0x47, 0x1, 0x48, 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b, 0x1, 0x4c, 0x1, 0x4d, 0x1, 0x4e, 0x1, 0x4f, 0x1, 0x50, 0x1, 0x51, 0x1, 0x52, 0x1, 0x53, 0x1, 0x54, 0x1, 0x55, 0x1, 0x56, 0x1, 0x60, 0x1, 0x72, 0x1, 0x73, 0x1, 0x74, 0x1, 0x75, 0x1, 0x76, 0x1, 0x77, 0x1, 0x78, 0x1, 0x79, 0x1, 0x7a, 0x1, 0x7b, 0x1, 0x8d, 0x1, 0x96, 0x1, 0xf3, 0x1, 0xf4, 0x1, 0xf8, 0x1, 0xf9, 0x1, 0xfd, 0x1, 0xfe, 0x1, 0x2, 0x2, 0x3, 0x2, 0x4, 0x2, 0x7, 0x2, 0x8, 0x2, 0x2f, 0x2, 0x33, 0x2, 0x37, 0x2, 0x3b, 0x2, 0x3f, 0x2, 0x43, 0x2, 0x47, 0x2, 0x4a, 0x2, 0x54, 0x2, 0x65, 0x2, 0x66, 0x2, 0x67, 0x2, 0x68, 0x2, 0x69, 0x2, 0x6a, 0x2, 0x6b, 0x2, 0x6c, 0x2, 0x6d, 0x2, 0x6e, 0x2, 0x79, 0x2, 0x7a, 0x2, 0x7b, 0x2, 0x7c, 0x2, 0x7d, 0x2, 0x7e, 0x2, 0x7f, 0x2, 0x80, 0x2, 0x81, 0x2, 0x82, 0x2, 0x84, 0x2, 0x8e, 0x2, 0x93, 0x2, 0x94, 0x2, 0x96, 0x2, 0x9c, 0x2, 0x9d, 0x2, 0xa2, 0x2, 0xa3, 0x2, 0xa4, 0x2, 0xa9, 0x2, 0xaa, 0x2, 0xb4, 0x2, 0x3, 0x43, 0x86, 0x2, 0x0, 0x21, 0x0, 0x14, 0x0, 0xd, 0x0, 0xb, 0x43, 0x0, 0x27, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x4d, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0xb, 0x2d, 0xd, 0x49, 0x0, 0x0, 0x0, 0x6, 0x0, 0x7, 0x5, 0x1, 0x2c, 0x16, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, 0x8, 0x2, 0xc, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0x2, 0x0, 0x0, 0xb, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x2, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x1, 0x0, 0x0, 0x6, 0x1, 0x0, 0x2c, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x44, 0x1a, 0x6, 0x0, 0x3d, 0x0, 0x0, 0x0, 0x4, 0x26, 0x0, 0x1, 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x5, 0x45, 0x1a, 0x0, 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x4d, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0xc, 0x0, 0x42, 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x2, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x3, 0x0, 0x3, 0x1, 0x0, 0x3, 0x0, 0x0, 0x4, 0x42, 0x86, 0x2, 0xa0, 0x1, 0x21, 0x86, 0x18, 0x82, 0x4, 0x51, 0x0, 0x0, 0x18, 0xca, 0x8, 0xb4, 0x5c, 0x0, 0x0, 0x2a, 0x8, 0x8, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x1, 0x60, 0x0, 0x9, 0xc0, 0x3f, 0x5, 0x42, 0x86, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x97, 0x0, 0x8, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbc, 0x0, 0x0, 0x0, 0x0, 0xf3, 0x4, 0x1, 0x6, 0x0, 0xa, 0xde, 0xd3, 0x86, 0x1, 0x1, 0x44, 0x3b, 0x6, 0x0, 0x18, 0x0, 0x1f, 0x0, 0x21, 0x0, 0x29, 0x0, 0x3c, 0x0, 0x45, 0x0, 0x51, 0x0, 0x53, 0x0, 0x6e, 0x0, 0x97, 0x0, 0xa2, 0x0, 0xa5, 0x0, 0xb9, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xd3, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xf0, 0x0, 0x10, 0x1, 0x15, 0x1, 0x27, 0x1, 0x2a, 0x1, 0x2c, 0x1, 0x3a, 0x1, 0x3c, 0x1, 0x72, 0x1, 0x75, 0x1, 0x7b, 0x1, 0x96, 0x1, 0xf3, 0x1, 0xf4, 0x1, 0xf8, 0x1, 0xf9, 0x1, 0xfe, 0x1, 0x2, 0x2, 0x7, 0x2, 0x8, 0x2, 0x2f, 0x2, 0x33, 0x2, 0x3b, 0x2, 0x3f, 0x2, 0x43, 0x2, 0x54, 0x2, 0x65, 0x2, 0x66, 0x2, 0x7a, 0x2, 0x7d, 0x2, 0x8e, 0x2, 0x94, 0x2, 0x96, 0x2, 0x9c, 0x2, 0x9d, 0x2, 0xa3, 0x2, 0xa4, 0x2, 0xa9, 0x2, 0xaa, 0x2, 0xb4, 0x2, 0x2, 0x43, 0x3b, 0x0, 0x21, 0x43, 0x27, 0x4d, 0x2c, 0x8, 0x5, 0x0, 0x6, 0x2c, 0x44, 0x0, 0x3d, 0x0, 0x4, 0x0, 0x31, 0x5, 0x2c, 0x9, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x14, 0x3, 0x0, 0x0, 0x0, 0x3, 0x0, 0x1, 0x0, 0x3, 0x0, 0x0, 0x3, 0x45, 0x3b, 0x5d, 0x6d, 0x41, 0x3d, 0x28} parser := photon.NewV18() @@ -160,127 +205,108 @@ func TestLong(t *testing.T) { sess := photon.Session[v18.Parameter]{} err := parser.ParsePacketInto(payload, &sess) if err != nil { - log.Println(err) + t.Fatalf("can't parse due to: %v", err) } - log.Println(sess.Commands) -} -func TestAssembledRequest(t *testing.T) { - //payload := []byte{0x0, 0x0, 0x0, 0x2, 0xad, 0xb8, 0x92, 0x16, 0x7c, 0x11, 0x66, 0xbd, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3, 0xbb, 0x0, 0x0, 0x0, 0x41, 0xf3, 0x4, 0x1, 0x7, 0x0, 0xa, 0xde, 0xd3, 0x86, 0x1, 0x1, 0x44, 0x1d, 0xae, 0x2, 0x8c, 0x2, 0x53, 0x2, 0x13, 0x1, 0xa7, 0x2, 0xf2, 0x1, 0x90, 0x0, 0xb8, 0x0, 0xc2, 0x0, 0xc4, 0x1, 0x4, 0x0, 0x28, 0x0, 0x2e, 0x2, 0x9b, 0x2, 0x0, 0x0, 0xa8, 0x2, 0x8d, 0x2, 0x95, 0x2, 0x2, 0x0, 0x86, 0x0, 0x5, 0x0, 0xb7, 0x2, 0x3, 0x0, 0xa1, 0x2, 0x1, 0x0, 0x83, 0x2, 0xd7, 0x0, 0x91, 0x0, 0x9b, 0x0, 0x2, 0x44, 0x86, 0x2, 0x6, 0x0, 0x18, 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x24, 0x0, 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, 0x0, 0x41, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x50, 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, 0x0, 0x61, 0x0, 0x62, 0x0, 0x63, 0x0, 0x64, 0x0, 0x65, 0x0, 0x66, 0x0, 0x67, 0x0, 0x68, 0x0, 0x69, 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c, 0x0, 0x6d, 0x0, 0x6e, 0x0, 0x6f, 0x0, 0x70, 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, 0x0, 0x7d, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x80, 0x0, 0x81, 0x0, 0x82, 0x0, 0x83, 0x0, 0x84, 0x0, 0x85, 0x0, 0x92, 0x0, 0x93, 0x0, 0x94, 0x0, 0x95, 0x0, 0x96, 0x0, 0x97, 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a, 0x0, 0x9c, 0x0, 0x9d, 0x0, 0x9e, 0x0, 0x9f, 0x0, 0xa0, 0x0, 0xa1, 0x0, 0xa2, 0x0, 0xa3, 0x0, 0xa4, 0x0, 0xa5, 0x0, 0xb9, 0x0, 0xba, 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc0, 0x0, 0xc1, 0x0, 0xc3, 0x0, 0xcd, 0x0, 0xce, 0x0, 0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x0, 0xd8, 0x0, 0xd9, 0x0, 0xda, 0x0, 0xdb, 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0xea, 0x0, 0xeb, 0x0, 0xec, 0x0, 0xed, 0x0, 0xee, 0x0, 0xef, 0x0, 0xf0, 0x0, 0xf1, 0x0, 0xf2, 0x0, 0xfa, 0x0, 0xfb, 0x0, 0xfc, 0x0, 0xfd, 0x0, 0xfe, 0x0, 0xff, 0x0, 0x0, 0x1, 0x1, 0x1, 0x2, 0x1, 0xc, 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10, 0x1, 0x11, 0x1, 0x12, 0x1, 0x14, 0x1, 0x15, 0x1, 0x27, 0x1, 0x2a, 0x1, 0x2b, 0x1, 0x2c, 0x1, 0x2d, 0x1, 0x2e, 0x1, 0x2f, 0x1, 0x30, 0x1, 0x3a, 0x1, 0x3c, 0x1, 0x45, 0x1, 0x46, 0x1, 0x47, 0x1, 0x48, 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b, 0x1, 0x4c, 0x1, 0x4d, 0x1, 0x4e, 0x1, 0x4f, 0x1, 0x50, 0x1, 0x51, 0x1, 0x52, 0x1, 0x53, 0x1, 0x54, 0x1, 0x55, 0x1, 0x56, 0x1, 0x60, 0x1, 0x72, 0x1, 0x73, 0x1, 0x74, 0x1, 0x75, 0x1, 0x76, 0x1, 0x77, 0x1, 0x78, 0x1, 0x79, 0x1, 0x7a, 0x1, 0x7b, 0x1, 0x8d, 0x1, 0x96, 0x1, 0xf3, 0x1, 0xf4, 0x1, 0xf8, 0x1, 0xf9, 0x1, 0xfd, 0x1, 0xfe, 0x1, 0x2, 0x2, 0x3, 0x2, 0x4, 0x2, 0x7, 0x2, 0x8, 0x2, 0x2f, 0x2, 0x33, 0x2, 0x37, 0x2, 0x3b, 0x2, 0x3f, 0x2, 0x43, 0x2, 0x47, 0x2, 0x4a, 0x2, 0x54, 0x2, 0x65, 0x2, 0x66, 0x2, 0x67, 0x2, 0x68, 0x2, 0x69, 0x2, 0x6a, 0x2, 0x6b, 0x2, 0x6c, 0x2, 0x6d, 0x2, 0x6e, 0x2, 0x79, 0x2, 0x7a, 0x2, 0x7b, 0x2, 0x7c, 0x2, 0x7d, 0x2, 0x7e, 0x2, 0x7f, 0x2, 0x80, 0x2, 0x81, 0x2, 0x82, 0x2, 0x84, 0x2, 0x8e, 0x2, 0x93, 0x2, 0x94, 0x2, 0x96, 0x2, 0x9c, 0x2, 0x9d, 0x2, 0xa2, 0x2, 0xa3, 0x2, 0xa4, 0x2, 0xa9, 0x2, 0xaa, 0x2, 0xb4, 0x2, 0x3, 0x43, 0x86, 0x2, 0x0, 0x21, 0x0, 0x14, 0x0, 0xd, 0x0, 0xb, 0x43, 0x0, 0x27, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x4d, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0xb, 0x2d, 0xd, 0x49, 0x0, 0x0, 0x0, 0x6, 0x0, 0x7, 0x5, 0x1, 0x2c, 0x16, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, 0x8, 0x2, 0xc, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0x2, 0x0, 0x0, 0xb, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x2, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x1, 0x0, 0x0, 0x6, 0x1, 0x0, 0x2c, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x44, 0x1a, 0x6, 0x0, 0x3d, 0x0, 0x0, 0x0, 0x4, 0x26, 0x0, 0x1, 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x5, 0x45, 0x1a, 0x0, 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x4d, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0xc, 0x0, 0x42, 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x2, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x3, 0x0, 0x3, 0x1, 0x0, 0x3, 0x0, 0x0, 0x4, 0x42, 0x86, 0x2, 0xa0, 0x1, 0x21, 0x86, 0x18, 0x82, 0x4, 0x51, 0x0, 0x0, 0x18, 0xca, 0x8, 0xb4, 0x5c, 0x0, 0x0, 0x2a, 0x8, 0x8, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x1, 0x60, 0x0, 0x9, 0xc0, 0x3f, 0x5, 0x42, 0x86, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x97, 0x0, 0x8, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbc, 0x0, 0x0, 0x0, 0x0, 0xf3, 0x4, 0x1, 0x6, 0x0, 0xa, 0xde, 0xd3, 0x86, 0x1, 0x1, 0x44, 0x3b, 0x6, 0x0, 0x18, 0x0, 0x1f, 0x0, 0x21, 0x0, 0x29, 0x0, 0x3c, 0x0, 0x45, 0x0, 0x51, 0x0, 0x53, 0x0, 0x6e, 0x0, 0x97, 0x0, 0xa2, 0x0, 0xa5, 0x0, 0xb9, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xd3, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xf0, 0x0, 0x10, 0x1, 0x15, 0x1, 0x27, 0x1, 0x2a, 0x1, 0x2c, 0x1, 0x3a, 0x1, 0x3c, 0x1, 0x72, 0x1, 0x75, 0x1, 0x7b, 0x1, 0x96, 0x1, 0xf3, 0x1, 0xf4, 0x1, 0xf8, 0x1, 0xf9, 0x1, 0xfe, 0x1, 0x2, 0x2, 0x7, 0x2, 0x8, 0x2, 0x2f, 0x2, 0x33, 0x2, 0x3b, 0x2, 0x3f, 0x2, 0x43, 0x2, 0x54, 0x2, 0x65, 0x2, 0x66, 0x2, 0x7a, 0x2, 0x7d, 0x2, 0x8e, 0x2, 0x94, 0x2, 0x96, 0x2, 0x9c, 0x2, 0x9d, 0x2, 0xa3, 0x2, 0xa4, 0x2, 0xa9, 0x2, 0xaa, 0x2, 0xb4, 0x2, 0x2, 0x43, 0x3b, 0x0, 0x21, 0x43, 0x27, 0x4d, 0x2c, 0x8, 0x5, 0x0, 0x6, 0x2c, 0x44, 0x0, 0x3d, 0x0, 0x4, 0x0, 0x31, 0x5, 0x2c, 0x9, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x14, 0x3, 0x0, 0x0, 0x0, 0x3, 0x0, 0x1, 0x0, 0x3, 0x0, 0x0, 0x3, 0x45, 0x3b, 0x5d, 0x6d, 0x41, 0x3d, 0x28} - - /* - parser := photonparser.NewV18() - - parser.ParsePacket(payload) - - log.Println(parser.Ctx.Assembler) - - payload = []byte{0x0, 0x0, 0x0, 0x1, 0xad, 0xb8, 0x92, 0x16, 0x7c, 0x11, 0x66, 0xbd, 0x8, 0x0, 0x1, 0x0, 0x0, 0x0, 0x4, 0x13, 0x0, 0x0, 0x0, 0x43, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x4, 0xbc, 0x0, 0x0, 0x0, 0xc9, 0xeb, 0xf, 0x3e, 0x86, 0xaf, 0xfe, 0x3e, 0x52, 0xd2, 0xf9, 0x3e, 0x99, 0xcc, 0x39, 0x3f, 0x74, 0x81, 0x77, 0x3f, 0xb4, 0x31, 0x4d, 0x3f, 0x53, 0x24, 0xde, 0x3e, 0x5, 0x46, 0xd6, 0x3e, 0x3c, 0x67, 0x58, 0x3f, 0x54, 0xa, 0xd8, 0x3e, 0x5c, 0xcd, 0xdf, 0x3e, 0x75, 0x1e, 0x3, 0x3f, 0x2d, 0xe, 0xd, 0x3f, 0xa3, 0xbd, 0xea, 0x3e, 0xa8, 0x4, 0x5e, 0x3f, 0x3e, 0xb9, 0xe4, 0x3e, 0xe1, 0xd2, 0xba, 0x3e, 0xee, 0x20, 0xc6, 0x3e, 0xb8, 0x16, 0xb9, 0x3e, 0x31, 0xbf, 0xf3, 0x3d, 0x37, 0xae, 0xbf, 0x3d, 0xf4, 0x92, 0xff, 0x3d, 0x25, 0xd0, 0x76, 0x3e, 0xf4, 0x92, 0xff, 0x3d, 0xf4, 0x92, 0xff, 0x3d, 0xd9, 0xbb, 0x1f, 0x3f, 0x75, 0x22, 0x39, 0x3e, 0x37, 0xae, 0xbf, 0x3d, 0x37, 0xae, 0xbf, 0x3d, 0x0, 0x0, 0xc0, 0x3e, 0xfc, 0x2f, 0x9e, 0x3d, 0x7b, 0x14, 0xae, 0x3e, 0xfc, 0x2f, 0x9e, 0x3d, 0x61, 0x30, 0xe1, 0x3c, 0xff, 0x46, 0xa8, 0x3e, 0xa0, 0x1c, 0x71, 0x3e, 0xfc, 0x2f, 0x9e, 0x3e, 0x29, 0x39, 0x58, 0x3e, 0xf8, 0x61, 0x2a, 0x3d, 0xf4, 0x92, 0x7f, 0x3d, 0xf8, 0x61, 0x2a, 0x3d, 0x76, 0xfa, 0xd4, 0x3d, 0xf8, 0x61, 0x2a, 0x3d, 0x0, 0x0, 0x0, 0x3e, 0xa9, 0x71, 0x65, 0x3e, 0xff, 0xcb, 0x8e, 0x3e, 0xc4, 0xc3, 0xf3, 0x3e, 0x85, 0x46, 0x1f, 0x3f, 0x7f, 0x6a, 0x2c, 0x3f, 0xce, 0xcd, 0x65, 0x3f, 0x3f, 0x35, 0x5e, 0x3e, 0x66, 0x11, 0x1f, 0x3c, 0xdd, 0xb5, 0xe4, 0x3e, 0x81, 0xd9, 0xd6, 0x3e, 0xcb, 0xe0, 0xaf, 0x3c, 0x5a, 0x19, 0x6f, 0x3f, 0x86, 0x86, 0x33, 0x3f, 0xd4, 0x23, 0x42, 0x3d, 0x4, 0x47, 0x3b, 0xc, 0x5b, 0x5b, 0x31, 0x31, 0x38, 0x38, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x39, 0x32, 0x32, 0x34, 0x33, 0x31, 0x34, 0x35, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x38, 0x37, 0x36, 0x38, 0x32, 0x33, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x38, 0x37, 0x36, 0x38, 0x32, 0x33, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xe, 0x5b, 0x5b, 0x31, 0x37, 0x31, 0x30, 0x37, 0x31, 0x37, 0x39, 0x32, 0x35, 0x5d, 0x5d, 0xe, 0x5b, 0x5b, 0x32, 0x30, 0x30, 0x39, 0x30, 0x35, 0x33, 0x39, 0x33, 0x35, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x35, 0x38, 0x35, 0x31, 0x34, 0x39, 0x32, 0x39, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x32, 0x39, 0x30, 0x32, 0x39, 0x38, 0x38, 0x38, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x32, 0x34, 0x32, 0x31, 0x35, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x35, 0x38, 0x32, 0x32, 0x36, 0x36, 0x39, 0x34, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x38, 0x37, 0x36, 0x38, 0x32, 0x33, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xe, 0x5b, 0x5b, 0x31, 0x38, 0x32, 0x34, 0x33, 0x39, 0x33, 0x35, 0x38, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x31, 0x32, 0x38, 0x38, 0x35, 0x37, 0x35, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x38, 0x31, 0x35, 0x38, 0x34, 0x35, 0x34, 0x32, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x32, 0x36, 0x35, 0x32, 0x38, 0x30, 0x34, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x35, 0x36, 0x33, 0x36, 0x34, 0x35, 0x33, 0x36, 0x35, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x32, 0x35, 0x38, 0x34, 0x38, 0x33, 0x37, 0x35, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x38, 0x37, 0x36, 0x38, 0x32, 0x33, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x32, 0x35, 0x38, 0x39, 0x31, 0x34, 0x36, 0x31, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x37, 0x35, 0x31, 0x32, 0x30, 0x33, 0x39, 0x33, 0x35, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x33, 0x38, 0x38, 0x39, 0x33, 0x33, 0x35, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x31, 0x33, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x39, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x39, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x39, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x34, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x34, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x32, 0x37, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x32, 0x37, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x31, 0x33, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x31, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x34, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x31, 0x35, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x34, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x31, 0x32, 0x33, 0x37, 0x35, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x31, 0x34, 0x37, 0x39, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x31, 0x34, 0x31, 0x33, 0x37, 0x35, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x31, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x39, 0x35, 0x30, 0x32, 0x35, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x34, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x37, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xa, 0x5b, 0x5b, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xa, 0x5b, 0x5b, 0x35, 0x34, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x34, 0x39, 0x37, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x32, 0x35, 0x39, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x31, 0x33, 0x31, 0x39, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x32, 0x30, 0x32, 0x30, 0x35, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x37, 0x33, 0x32, 0x35, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x36, 0x35, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xa, 0x5b, 0x5b, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x36, 0x32, 0x35, 0x33, 0x38, 0x37, 0x35, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x33, 0x33, 0x31, 0x38, 0x37, 0x35, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x31, 0x31, 0x30, 0x32, 0x31, 0x32, 0x35, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x35, 0x37, 0x37, 0x32, 0x35, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x39, 0x38, 0x31, 0x37, 0x38, 0x37, 0x35, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x32, 0x37, 0x35, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xfc, 0x4, 0x9a, 0x0} + if len(sess.Commands) == 0 { + t.Fatalf("session must have more than 0 commands got: 0") + } - parser.ParsePacket(payload) + if sess.Commands[0].Type != types.SendReliableCommand { + t.Fatalf("command must be a send unreliable command got: %v", sess.Commands[0].Type) + } - log.Println(parser.Ctx.Assembler) - */ + if sess.Commands[1].Type != types.SendReliableFragmentCommand { + t.Fatalf("command must be a acknowledge command got: %v", sess.Commands[1].Type) + } } -func TestDisconnect(t *testing.T) { - payload := []byte{0x79, 0x9e, 0x0, 0x4, 0x0, 0x0, 0x4d, 0xb, 0x7c, 0x11, 0x66, 0xbd, 0x1, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa0, 0xad, 0xb8, 0xda, 0x99, 0x1, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa0, 0xad, 0xb8, 0xdb, 0x73, 0x1, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa0, 0xad, 0xb8, 0xdd, 0x58, 0x4, 0xff, 0x1, 0x4, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xa} +func TestAssembledSendReliableFragmentRequest(t *testing.T) { + payload := []byte{0x0, 0x0, 0x0, 0x2, 0xad, 0xb8, 0x92, 0x16, 0x7c, 0x11, 0x66, 0xbd, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3, 0xbb, 0x0, 0x0, 0x0, 0x41, 0xf3, 0x4, 0x1, 0x7, 0x0, 0xa, 0xde, 0xd3, 0x86, 0x1, 0x1, 0x44, 0x1d, 0xae, 0x2, 0x8c, 0x2, 0x53, 0x2, 0x13, 0x1, 0xa7, 0x2, 0xf2, 0x1, 0x90, 0x0, 0xb8, 0x0, 0xc2, 0x0, 0xc4, 0x1, 0x4, 0x0, 0x28, 0x0, 0x2e, 0x2, 0x9b, 0x2, 0x0, 0x0, 0xa8, 0x2, 0x8d, 0x2, 0x95, 0x2, 0x2, 0x0, 0x86, 0x0, 0x5, 0x0, 0xb7, 0x2, 0x3, 0x0, 0xa1, 0x2, 0x1, 0x0, 0x83, 0x2, 0xd7, 0x0, 0x91, 0x0, 0x9b, 0x0, 0x2, 0x44, 0x86, 0x2, 0x6, 0x0, 0x18, 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x1e, 0x0, 0x1f, 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x24, 0x0, 0x25, 0x0, 0x26, 0x0, 0x27, 0x0, 0x29, 0x0, 0x2a, 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x2f, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0x3b, 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x3e, 0x0, 0x3f, 0x0, 0x40, 0x0, 0x41, 0x0, 0x42, 0x0, 0x43, 0x0, 0x44, 0x0, 0x45, 0x0, 0x46, 0x0, 0x50, 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a, 0x0, 0x5b, 0x0, 0x5c, 0x0, 0x5d, 0x0, 0x5e, 0x0, 0x5f, 0x0, 0x60, 0x0, 0x61, 0x0, 0x62, 0x0, 0x63, 0x0, 0x64, 0x0, 0x65, 0x0, 0x66, 0x0, 0x67, 0x0, 0x68, 0x0, 0x69, 0x0, 0x6a, 0x0, 0x6b, 0x0, 0x6c, 0x0, 0x6d, 0x0, 0x6e, 0x0, 0x6f, 0x0, 0x70, 0x0, 0x71, 0x0, 0x72, 0x0, 0x73, 0x0, 0x7d, 0x0, 0x7e, 0x0, 0x7f, 0x0, 0x80, 0x0, 0x81, 0x0, 0x82, 0x0, 0x83, 0x0, 0x84, 0x0, 0x85, 0x0, 0x92, 0x0, 0x93, 0x0, 0x94, 0x0, 0x95, 0x0, 0x96, 0x0, 0x97, 0x0, 0x98, 0x0, 0x99, 0x0, 0x9a, 0x0, 0x9c, 0x0, 0x9d, 0x0, 0x9e, 0x0, 0x9f, 0x0, 0xa0, 0x0, 0xa1, 0x0, 0xa2, 0x0, 0xa3, 0x0, 0xa4, 0x0, 0xa5, 0x0, 0xb9, 0x0, 0xba, 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0, 0xbf, 0x0, 0xc0, 0x0, 0xc1, 0x0, 0xc3, 0x0, 0xcd, 0x0, 0xce, 0x0, 0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x0, 0xd8, 0x0, 0xd9, 0x0, 0xda, 0x0, 0xdb, 0x0, 0xdc, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0xea, 0x0, 0xeb, 0x0, 0xec, 0x0, 0xed, 0x0, 0xee, 0x0, 0xef, 0x0, 0xf0, 0x0, 0xf1, 0x0, 0xf2, 0x0, 0xfa, 0x0, 0xfb, 0x0, 0xfc, 0x0, 0xfd, 0x0, 0xfe, 0x0, 0xff, 0x0, 0x0, 0x1, 0x1, 0x1, 0x2, 0x1, 0xc, 0x1, 0xd, 0x1, 0xe, 0x1, 0xf, 0x1, 0x10, 0x1, 0x11, 0x1, 0x12, 0x1, 0x14, 0x1, 0x15, 0x1, 0x27, 0x1, 0x2a, 0x1, 0x2b, 0x1, 0x2c, 0x1, 0x2d, 0x1, 0x2e, 0x1, 0x2f, 0x1, 0x30, 0x1, 0x3a, 0x1, 0x3c, 0x1, 0x45, 0x1, 0x46, 0x1, 0x47, 0x1, 0x48, 0x1, 0x49, 0x1, 0x4a, 0x1, 0x4b, 0x1, 0x4c, 0x1, 0x4d, 0x1, 0x4e, 0x1, 0x4f, 0x1, 0x50, 0x1, 0x51, 0x1, 0x52, 0x1, 0x53, 0x1, 0x54, 0x1, 0x55, 0x1, 0x56, 0x1, 0x60, 0x1, 0x72, 0x1, 0x73, 0x1, 0x74, 0x1, 0x75, 0x1, 0x76, 0x1, 0x77, 0x1, 0x78, 0x1, 0x79, 0x1, 0x7a, 0x1, 0x7b, 0x1, 0x8d, 0x1, 0x96, 0x1, 0xf3, 0x1, 0xf4, 0x1, 0xf8, 0x1, 0xf9, 0x1, 0xfd, 0x1, 0xfe, 0x1, 0x2, 0x2, 0x3, 0x2, 0x4, 0x2, 0x7, 0x2, 0x8, 0x2, 0x2f, 0x2, 0x33, 0x2, 0x37, 0x2, 0x3b, 0x2, 0x3f, 0x2, 0x43, 0x2, 0x47, 0x2, 0x4a, 0x2, 0x54, 0x2, 0x65, 0x2, 0x66, 0x2, 0x67, 0x2, 0x68, 0x2, 0x69, 0x2, 0x6a, 0x2, 0x6b, 0x2, 0x6c, 0x2, 0x6d, 0x2, 0x6e, 0x2, 0x79, 0x2, 0x7a, 0x2, 0x7b, 0x2, 0x7c, 0x2, 0x7d, 0x2, 0x7e, 0x2, 0x7f, 0x2, 0x80, 0x2, 0x81, 0x2, 0x82, 0x2, 0x84, 0x2, 0x8e, 0x2, 0x93, 0x2, 0x94, 0x2, 0x96, 0x2, 0x9c, 0x2, 0x9d, 0x2, 0xa2, 0x2, 0xa3, 0x2, 0xa4, 0x2, 0xa9, 0x2, 0xaa, 0x2, 0xb4, 0x2, 0x3, 0x43, 0x86, 0x2, 0x0, 0x21, 0x0, 0x14, 0x0, 0xd, 0x0, 0xb, 0x43, 0x0, 0x27, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x4d, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0xb, 0x2d, 0xd, 0x49, 0x0, 0x0, 0x0, 0x6, 0x0, 0x7, 0x5, 0x1, 0x2c, 0x16, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, 0x8, 0x2, 0xc, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0x2, 0x0, 0x0, 0xb, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x2, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x1, 0x0, 0x0, 0x6, 0x1, 0x0, 0x2c, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x44, 0x1a, 0x6, 0x0, 0x3d, 0x0, 0x0, 0x0, 0x4, 0x26, 0x0, 0x1, 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x5, 0x45, 0x1a, 0x0, 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x4d, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0xc, 0x0, 0x42, 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x2, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x3, 0x0, 0x3, 0x1, 0x0, 0x3, 0x0, 0x0, 0x4, 0x42, 0x86, 0x2, 0xa0, 0x1, 0x21, 0x86, 0x18, 0x82, 0x4, 0x51, 0x0, 0x0, 0x18, 0xca, 0x8, 0xb4, 0x5c, 0x0, 0x0, 0x2a, 0x8, 0x8, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x1, 0x60, 0x0, 0x9, 0xc0, 0x3f, 0x5, 0x42, 0x86, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x4, 0x97, 0x0, 0x8, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbc, 0x0, 0x0, 0x0, 0x0, 0xf3, 0x4, 0x1, 0x6, 0x0, 0xa, 0xde, 0xd3, 0x86, 0x1, 0x1, 0x44, 0x3b, 0x6, 0x0, 0x18, 0x0, 0x1f, 0x0, 0x21, 0x0, 0x29, 0x0, 0x3c, 0x0, 0x45, 0x0, 0x51, 0x0, 0x53, 0x0, 0x6e, 0x0, 0x97, 0x0, 0xa2, 0x0, 0xa5, 0x0, 0xb9, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xd3, 0x0, 0xdd, 0x0, 0xde, 0x0, 0xf0, 0x0, 0x10, 0x1, 0x15, 0x1, 0x27, 0x1, 0x2a, 0x1, 0x2c, 0x1, 0x3a, 0x1, 0x3c, 0x1, 0x72, 0x1, 0x75, 0x1, 0x7b, 0x1, 0x96, 0x1, 0xf3, 0x1, 0xf4, 0x1, 0xf8, 0x1, 0xf9, 0x1, 0xfe, 0x1, 0x2, 0x2, 0x7, 0x2, 0x8, 0x2, 0x2f, 0x2, 0x33, 0x2, 0x3b, 0x2, 0x3f, 0x2, 0x43, 0x2, 0x54, 0x2, 0x65, 0x2, 0x66, 0x2, 0x7a, 0x2, 0x7d, 0x2, 0x8e, 0x2, 0x94, 0x2, 0x96, 0x2, 0x9c, 0x2, 0x9d, 0x2, 0xa3, 0x2, 0xa4, 0x2, 0xa9, 0x2, 0xaa, 0x2, 0xb4, 0x2, 0x2, 0x43, 0x3b, 0x0, 0x21, 0x43, 0x27, 0x4d, 0x2c, 0x8, 0x5, 0x0, 0x6, 0x2c, 0x44, 0x0, 0x3d, 0x0, 0x4, 0x0, 0x31, 0x5, 0x2c, 0x9, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x14, 0x3, 0x0, 0x0, 0x0, 0x3, 0x0, 0x1, 0x0, 0x3, 0x0, 0x0, 0x3, 0x45, 0x3b, 0x5d, 0x6d, 0x41, 0x3d, 0x28} parser := photon.NewV18() sess := photon.Session[v18.Parameter]{} err := parser.ParsePacketInto(payload, &sess) if err != nil { - panic(err) + t.Fatalf("can't parse due to: %v", err) } - log.Println(sess.PeerID) -} - -func TestEncrypted(t *testing.T) { - payload := []byte{0x79, 0x9e, 0x0, 0x2, 0x0, 0x0, 0x1, 0x71, 0x7c, 0x11, 0x66, 0xbd, 0x1, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xad, 0xb8, 0x91, 0xc8, 0x6, 0x0, 0x1, 0x4, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x3, 0xf3, 0x82, 0x7, 0x3d, 0x2f, 0x47, 0x39, 0x52, 0x76, 0xea, 0xb8, 0x3b, 0xb2, 0x41, 0x59, 0xa9, 0x73, 0x76, 0x21, 0x1d, 0x72, 0x11, 0x33, 0x5d, 0xac, 0xe7, 0xa2, 0x7, 0xe1, 0x83, 0x1, 0x9b, 0xe7, 0xf7, 0x92, 0x49, 0xe0, 0x51, 0x71, 0xff, 0x7f, 0xb5, 0xb4, 0xfc, 0x22, 0x47, 0x8f, 0x1c, 0xc, 0x95, 0xa6, 0x4, 0xbe, 0x9e, 0x4a, 0x6a, 0x85, 0xf8, 0x3f, 0x5e, 0x4c, 0xaa, 0x53, 0xc3, 0x27, 0x80} - - parser := photon.NewV18() + if len(sess.Commands) == 0 { + t.Fatalf("session must have more than 0 commands got: 0") + } - sess := photon.Session[v18.Parameter]{} - err := parser.ParsePacketInto(payload, &sess) - if err != nil { - panic(err) + if sess.Commands[0].Type != types.SendReliableCommand { + t.Fatalf("command must be a send unreliable command got: %v", sess.Commands[0].Type) } - log.Println(sess) -} + if sess.Commands[1].Type != types.SendReliableFragmentCommand { + t.Fatalf("command must be a send reliable fragment command got: %v", sess.Commands[1].Type) + } -func TestDefouDecalage14(t *testing.T) { - payload := []byte{0x79, 0x9e, 0x0, 0x3, 0x0, 0x0, 0x1, 0x3e, 0x7c, 0x11, 0x66, 0xbd, 0x1, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xad, 0xb8, 0x91, 0x8a, 0x6, 0x0, 0x1, 0x4, 0x0, 0x0, 0x0, 0x73, 0x0, 0x0, 0x0, 0x2, 0xf3, 0x6, 0x0, 0x1, 0x1, 0x43, 0x60, 0xe2, 0x88, 0xa8, 0xa2, 0x3b, 0x2c, 0xab, 0xb3, 0x50, 0x7d, 0xdc, 0xe4, 0x14, 0xe5, 0x59, 0xfa, 0x78, 0x42, 0x4c, 0x7d, 0x69, 0xdb, 0x5b, 0x26, 0xd1, 0x34, 0xfc, 0xe3, 0x42, 0x7a, 0x5, 0xb7, 0xb7, 0xa4, 0x9a, 0x2c, 0xf3, 0x55, 0xc1, 0xe5, 0x26, 0xf4, 0x13, 0xdf, 0x91, 0xab, 0x65, 0xe7, 0x6a, 0x3d, 0x5e, 0x13, 0x3f, 0xb, 0xb8, 0x5b, 0x19, 0xce, 0x86, 0x49, 0x2a, 0x60, 0x24, 0x72, 0x8b, 0x37, 0x51, 0xc9, 0x67, 0x45, 0xc0, 0xdc, 0x7, 0xd7, 0x8a, 0x3, 0xf8, 0x81, 0x2c, 0x2a, 0x44, 0x51, 0xf3, 0x19, 0xdf, 0x2e, 0xef, 0xbf, 0x41, 0x4e, 0xf0, 0xea, 0xbc, 0x68, 0x9e, 0xb, 0xc, 0xff, 0x1, 0x4, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x2} + if bytes.Equal(sess.Commands[1].ReliableFragmentPayload.Data, []byte{}) { + t.Fatalf("send reliable fragment must be populate") + } - parser := photon.NewV18() - sess := photon.Session[v18.Parameter]{} + payload = []byte{0x0, 0x0, 0x0, 0x1, 0xad, 0xb8, 0x92, 0x16, 0x7c, 0x11, 0x66, 0xbd, 0x8, 0x0, 0x1, 0x0, 0x0, 0x0, 0x4, 0x13, 0x0, 0x0, 0x0, 0x43, 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x4, 0xbc, 0x0, 0x0, 0x0, 0xc9, 0xeb, 0xf, 0x3e, 0x86, 0xaf, 0xfe, 0x3e, 0x52, 0xd2, 0xf9, 0x3e, 0x99, 0xcc, 0x39, 0x3f, 0x74, 0x81, 0x77, 0x3f, 0xb4, 0x31, 0x4d, 0x3f, 0x53, 0x24, 0xde, 0x3e, 0x5, 0x46, 0xd6, 0x3e, 0x3c, 0x67, 0x58, 0x3f, 0x54, 0xa, 0xd8, 0x3e, 0x5c, 0xcd, 0xdf, 0x3e, 0x75, 0x1e, 0x3, 0x3f, 0x2d, 0xe, 0xd, 0x3f, 0xa3, 0xbd, 0xea, 0x3e, 0xa8, 0x4, 0x5e, 0x3f, 0x3e, 0xb9, 0xe4, 0x3e, 0xe1, 0xd2, 0xba, 0x3e, 0xee, 0x20, 0xc6, 0x3e, 0xb8, 0x16, 0xb9, 0x3e, 0x31, 0xbf, 0xf3, 0x3d, 0x37, 0xae, 0xbf, 0x3d, 0xf4, 0x92, 0xff, 0x3d, 0x25, 0xd0, 0x76, 0x3e, 0xf4, 0x92, 0xff, 0x3d, 0xf4, 0x92, 0xff, 0x3d, 0xd9, 0xbb, 0x1f, 0x3f, 0x75, 0x22, 0x39, 0x3e, 0x37, 0xae, 0xbf, 0x3d, 0x37, 0xae, 0xbf, 0x3d, 0x0, 0x0, 0xc0, 0x3e, 0xfc, 0x2f, 0x9e, 0x3d, 0x7b, 0x14, 0xae, 0x3e, 0xfc, 0x2f, 0x9e, 0x3d, 0x61, 0x30, 0xe1, 0x3c, 0xff, 0x46, 0xa8, 0x3e, 0xa0, 0x1c, 0x71, 0x3e, 0xfc, 0x2f, 0x9e, 0x3e, 0x29, 0x39, 0x58, 0x3e, 0xf8, 0x61, 0x2a, 0x3d, 0xf4, 0x92, 0x7f, 0x3d, 0xf8, 0x61, 0x2a, 0x3d, 0x76, 0xfa, 0xd4, 0x3d, 0xf8, 0x61, 0x2a, 0x3d, 0x0, 0x0, 0x0, 0x3e, 0xa9, 0x71, 0x65, 0x3e, 0xff, 0xcb, 0x8e, 0x3e, 0xc4, 0xc3, 0xf3, 0x3e, 0x85, 0x46, 0x1f, 0x3f, 0x7f, 0x6a, 0x2c, 0x3f, 0xce, 0xcd, 0x65, 0x3f, 0x3f, 0x35, 0x5e, 0x3e, 0x66, 0x11, 0x1f, 0x3c, 0xdd, 0xb5, 0xe4, 0x3e, 0x81, 0xd9, 0xd6, 0x3e, 0xcb, 0xe0, 0xaf, 0x3c, 0x5a, 0x19, 0x6f, 0x3f, 0x86, 0x86, 0x33, 0x3f, 0xd4, 0x23, 0x42, 0x3d, 0x4, 0x47, 0x3b, 0xc, 0x5b, 0x5b, 0x31, 0x31, 0x38, 0x38, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x39, 0x32, 0x32, 0x34, 0x33, 0x31, 0x34, 0x35, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x38, 0x37, 0x36, 0x38, 0x32, 0x33, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x38, 0x37, 0x36, 0x38, 0x32, 0x33, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xe, 0x5b, 0x5b, 0x31, 0x37, 0x31, 0x30, 0x37, 0x31, 0x37, 0x39, 0x32, 0x35, 0x5d, 0x5d, 0xe, 0x5b, 0x5b, 0x32, 0x30, 0x30, 0x39, 0x30, 0x35, 0x33, 0x39, 0x33, 0x35, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x35, 0x38, 0x35, 0x31, 0x34, 0x39, 0x32, 0x39, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x32, 0x39, 0x30, 0x32, 0x39, 0x38, 0x38, 0x38, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x32, 0x34, 0x32, 0x31, 0x35, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x35, 0x38, 0x32, 0x32, 0x36, 0x36, 0x39, 0x34, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x38, 0x37, 0x36, 0x38, 0x32, 0x33, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xe, 0x5b, 0x5b, 0x31, 0x38, 0x32, 0x34, 0x33, 0x39, 0x33, 0x35, 0x38, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x31, 0x32, 0x38, 0x38, 0x35, 0x37, 0x35, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x38, 0x31, 0x35, 0x38, 0x34, 0x35, 0x34, 0x32, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x32, 0x36, 0x35, 0x32, 0x38, 0x30, 0x34, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x35, 0x36, 0x33, 0x36, 0x34, 0x35, 0x33, 0x36, 0x35, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x32, 0x35, 0x38, 0x34, 0x38, 0x33, 0x37, 0x35, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x38, 0x37, 0x36, 0x38, 0x32, 0x33, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x32, 0x35, 0x38, 0x39, 0x31, 0x34, 0x36, 0x31, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x37, 0x35, 0x31, 0x32, 0x30, 0x33, 0x39, 0x33, 0x35, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x33, 0x38, 0x38, 0x39, 0x33, 0x33, 0x35, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x31, 0x33, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x39, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x39, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x39, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x34, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x34, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x32, 0x37, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x32, 0x37, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x31, 0x33, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x31, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x34, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x31, 0x35, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x34, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x31, 0x32, 0x33, 0x37, 0x35, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x31, 0x34, 0x37, 0x39, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x31, 0x34, 0x31, 0x33, 0x37, 0x35, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x31, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x39, 0x35, 0x30, 0x32, 0x35, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x34, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x37, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xa, 0x5b, 0x5b, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xa, 0x5b, 0x5b, 0x35, 0x34, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x34, 0x39, 0x37, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x32, 0x35, 0x39, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x31, 0x33, 0x31, 0x39, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x32, 0x30, 0x32, 0x30, 0x35, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x37, 0x33, 0x32, 0x35, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x36, 0x35, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xa, 0x5b, 0x5b, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x36, 0x32, 0x35, 0x33, 0x38, 0x37, 0x35, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x33, 0x33, 0x31, 0x38, 0x37, 0x35, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x31, 0x31, 0x30, 0x32, 0x31, 0x32, 0x35, 0x30, 0x30, 0x5d, 0x5d, 0xc, 0x5b, 0x5b, 0x35, 0x37, 0x37, 0x32, 0x35, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xd, 0x5b, 0x5b, 0x39, 0x38, 0x31, 0x37, 0x38, 0x37, 0x35, 0x30, 0x30, 0x5d, 0x5d, 0xb, 0x5b, 0x5b, 0x32, 0x37, 0x35, 0x30, 0x30, 0x30, 0x30, 0x5d, 0x5d, 0xfc, 0x4, 0x9a, 0x0} - err := parser.ParsePacketInto(payload, &sess) + err = parser.ParsePacketInto(payload, &sess) if err != nil { - panic(err) + t.Fatalf("can't parse due to: %v", err) } - log.Println(sess) -} - -func TestVeryLong(t *testing.T) { - payload := []byte{0x0, 0x0, 0x0, 0xe, 0xad, 0xb8, 0x92, 0x16, 0x7c, 0x11, 0x66, 0xbd, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x71, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x4, 0x1, 0xe, 0x0, 0xa, 0xde, 0xd3, 0x86, 0x1, 0x1, 0x9, 0xae, 0xbb, 0xc7, 0x42, 0x2, 0x5, 0x0, 0x20, 0x13, 0x45, 0x3, 0x5, 0x0, 0x20, 0x13, 0x45, 0x5, 0x5, 0xf, 0x6a, 0x6b, 0x42, 0x6, 0xa, 0x92, 0x95, 0xad, 0x89, 0xa1, 0xf5, 0xce, 0xde, 0x11, 0x7, 0x5, 0x0, 0x80, 0xa2, 0x43, 0x8, 0x5, 0x0, 0x80, 0xa2, 0x43, 0xa, 0x5, 0xa0, 0xd9, 0x89, 0x40, 0xb, 0xa, 0x92, 0x95, 0xad, 0x89, 0xa1, 0xf5, 0xce, 0xde, 0x11, 0xd, 0x5, 0x0, 0xc0, 0x9c, 0x44, 0xf, 0x5, 0xd7, 0xa3, 0x48, 0x41, 0x10, 0xa, 0x92, 0x95, 0xad, 0x89, 0xa1, 0xf5, 0xce, 0xde, 0x11, 0xfc, 0x4, 0x60, 0x0, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, 0x5, 0xf3, 0x4, 0x1, 0x6, 0x0, 0xa, 0xde, 0xd3, 0x86, 0x1, 0x1, 0x9, 0xae, 0xbb, 0xc7, 0x42, 0x2, 0x44, 0xa, 0x75, 0x18, 0x0, 0x0, 0xfd, 0xf, 0xc8, 0xf, 0x7d, 0xd, 0x1b, 0xb, 0x12, 0xa, 0xda, 0xb, 0x0, 0x0, 0x0, 0x0, 0x6, 0x22, 0x7, 0x44, 0xe, 0x96, 0xb, 0xa0, 0xb, 0xa3, 0xb, 0x3c, 0xf, 0x93, 0xf, 0xdb, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x32, 0x10, 0xfc, 0x4, 0x5a, 0x0, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, 0x6, 0xf3, 0x4, 0x1, 0x6, 0x0, 0xa, 0xde, 0xd3, 0x86, 0x1, 0x1, 0x9, 0xae, 0xbb, 0xc7, 0x42, 0x2, 0x44, 0xa, 0x75, 0x18, 0x0, 0x0, 0xfd, 0xf, 0xc8, 0xf, 0x7d, 0xd, 0x1b, 0xb, 0x12, 0xa, 0xda, 0xb, 0x0, 0x0, 0x0, 0x0, 0x6, 0x22, 0x7, 0x44, 0xe, 0x96, 0xb, 0xa0, 0xb, 0xa3, 0xb, 0x3c, 0xf, 0x93, 0xf, 0xdb, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x32, 0x10, 0xfc, 0x4, 0x5a, 0x0, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, 0x7, 0xf3, 0x84, 0x1a, 0xd0, 0x93, 0x48, 0x28, 0xbf, 0xbd, 0x85, 0xd7, 0x8a, 0x75, 0x12, 0x8a, 0x33, 0xef, 0x54, 0x65, 0x56, 0xde, 0x3a, 0xd9, 0xa5, 0xef, 0x9a, 0x32, 0x74, 0x50, 0x3b, 0x9c, 0x3e, 0xe5, 0xaf, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x72, 0x0, 0x0, 0x0, 0x8, 0xf3, 0x4, 0x1, 0x12, 0x0, 0x11, 0x9b, 0xd, 0x1, 0x4, 0x31, 0x9, 0x2, 0x3, 0x3, 0x6, 0x7, 0x0, 0x7, 0x45, 0x2, 0x0, 0x0, 0x20, 0xc2, 0x0, 0x80, 0xbd, 0xc3, 0x8, 0x45, 0x2, 0x0, 0x0, 0x20, 0xc2, 0x0, 0x80, 0xbd, 0xc3, 0x9, 0x9, 0xb0, 0xbb, 0xc7, 0x42, 0xd, 0x5, 0x0, 0xf9, 0x15, 0x48, 0xe, 0x5, 0x0, 0xf9, 0x15, 0x48, 0x10, 0x5, 0x0, 0x0, 0x48, 0x43, 0x11, 0x9, 0xae, 0xbb, 0xc7, 0x42, 0x12, 0x5, 0x0, 0x0, 0x82, 0x42, 0x13, 0x5, 0x0, 0x0, 0x82, 0x42, 0x15, 0x5, 0x0, 0x0, 0x0, 0x40, 0x16, 0x9, 0xc8, 0xb9, 0xc7, 0x42, 0x1e, 0x22, 0x21, 0x22, 0xfc, 0x4, 0x7b, 0x0, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x7a, 0x0, 0x0, 0x0, 0x9, 0xf3, 0x4, 0x1, 0x13, 0x0, 0xa, 0xbc, 0xb6, 0x85, 0x1, 0x1, 0x4, 0xb5, 0x1, 0x2, 0x3, 0xff, 0x6, 0x7, 0x0, 0x7, 0x45, 0x2, 0x30, 0x2d, 0xdc, 0xc2, 0xa7, 0x9d, 0xa6, 0xc3, 0x8, 0x45, 0x2, 0x72, 0x4f, 0xda, 0xc2, 0x9f, 0xc3, 0xa4, 0xc3, 0x9, 0x9, 0xb0, 0xbb, 0xc7, 0x42, 0xa, 0x5, 0x73, 0x44, 0x62, 0x41, 0xb, 0x5, 0x33, 0x33, 0x13, 0x40, 0xd, 0x5, 0x0, 0x0, 0x56, 0x44, 0xe, 0x5, 0x0, 0x0, 0x56, 0x44, 0x11, 0x9, 0x92, 0xf6, 0xf2, 0x41, 0x12, 0x5, 0x0, 0x0, 0xb4, 0x42, 0x13, 0x5, 0x0, 0x0, 0xb4, 0x42, 0x15, 0x5, 0x0, 0x0, 0x40, 0x40, 0x16, 0x9, 0xee, 0xb7, 0xc7, 0x42, 0x1e, 0x22, 0x21, 0x22, 0xfc, 0x4, 0x7b, 0x0, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x7a, 0x0, 0x0, 0x0, 0xa, 0xf3, 0x4, 0x1, 0x13, 0x0, 0xa, 0xce, 0xbe, 0x85, 0x1, 0x1, 0x4, 0xb5, 0x1, 0x2, 0x3, 0xff, 0x6, 0x7, 0x0, 0x7, 0x45, 0x2, 0x2e, 0xef, 0xce, 0xc2, 0x46, 0x20, 0xa6, 0xc3, 0x8, 0x45, 0x2, 0xe1, 0x13, 0xce, 0xc2, 0x1c, 0x0, 0xa6, 0xc3, 0x9, 0x9, 0xb0, 0xbb, 0xc7, 0x42, 0xa, 0x5, 0x60, 0x69, 0x6e, 0x42, 0xb, 0x5, 0x33, 0x33, 0x13, 0x40, 0xd, 0x5, 0x0, 0x0, 0x56, 0x44, 0xe, 0x5, 0x0, 0x0, 0x56, 0x44, 0x11, 0x9, 0x8e, 0xb0, 0xf8, 0x41, 0x12, 0x5, 0x0, 0x0, 0xb4, 0x42, 0x13, 0x5, 0x0, 0x0, 0xb4, 0x42, 0x15, 0x5, 0x0, 0x0, 0x40, 0x40, 0x16, 0x9, 0xf4, 0xb7, 0xc7, 0x42, 0x1e, 0x22, 0x21, 0x22, 0xfc, 0x4, 0x7b, 0x0, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, 0xb, 0xf3, 0x4, 0x1, 0x2, 0x0, 0xb, 0x64, 0xfc, 0x4, 0x45, 0x1, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x5e, 0x0, 0x0, 0x0, 0xc, 0xf3, 0x84, 0x31, 0x16, 0xea, 0x2d, 0x27, 0x97, 0xe7, 0xd3, 0xea, 0x71, 0x3, 0x22, 0x35, 0x42, 0x96, 0x60, 0x6a, 0x42, 0x5e, 0x17, 0xae, 0xae, 0xaf, 0x17, 0x62, 0x2b, 0x28, 0xd4, 0x8b, 0xed, 0x7, 0x4a, 0x5c, 0x5e, 0x96, 0xb1, 0xd6, 0xde, 0xed, 0x23, 0x74, 0xcd, 0x5, 0xf7, 0x77, 0x29, 0x6b, 0xe3, 0xb3, 0xf5, 0x12, 0x2a, 0x82, 0xe6, 0x89, 0xf9, 0xbf, 0xa1, 0xed, 0xb7, 0xfe, 0xe7, 0xa6, 0x53, 0x60, 0x1f, 0x79, 0x24, 0xdd, 0x33, 0xdf, 0x3b, 0x9f, 0x69, 0xc7, 0xfa, 0x78, 0x13, 0x8f, 0x65, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x54, 0x0, 0x0, 0x0, 0xd, 0xf3, 0x4, 0x1, 0xb, 0x0, 0xa, 0xe2, 0xd3, 0x86, 0x1, 0x1, 0x4, 0x75, 0x18, 0x2, 0x4, 0x1, 0x0, 0x4, 0xa, 0xce, 0xd0, 0x9d, 0xc2, 0x16, 0x5, 0x7, 0xf, 0x47, 0x72, 0x7a, 0x65, 0x67, 0x6f, 0x72, 0x7a, 0x4e, 0x69, 0x65, 0x4d, 0x6f, 0x67, 0x65, 0x6, 0x3, 0x2, 0x7, 0xa, 0xba, 0xe6, 0xfe, 0xc9, 0x3, 0x8, 0x44, 0x3, 0x96, 0xb, 0xa0, 0xb, 0xa3, 0xb, 0x9, 0x43, 0x1, 0x12, 0xa, 0x22, 0xfc, 0x4, 0x1e, 0x0, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0xe, 0xf3, 0x4, 0x1, 0xb, 0x0, 0xa, 0xe6, 0xd3, 0x86, 0x1, 0x1, 0x4, 0xfd, 0xf, 0x2, 0x4, 0x1, 0x0, 0x4, 0xa, 0xe6, 0xad, 0xfb, 0xca, 0x9, 0x5, 0x7, 0xd, 0x53, 0x61, 0x62, 0x65, 0x72, 0x6c, 0x65, 0x61, 0x74, 0x68, 0x65, 0x72, 0x31, 0x6, 0x3, 0x2, 0x7, 0xa, 0xfc, 0xf0, 0x8a, 0xfa, 0x1, 0x8, 0x44, 0x1, 0x93, 0xf, 0x9, 0x43, 0x1, 0xac, 0xa, 0x22, 0xfc, 0x4, 0x1e, 0x0, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x47, 0x0, 0x0, 0x0, 0xf, 0xf3, 0x4, 0x1, 0xb, 0x0, 0xa, 0xee, 0xd3, 0x86, 0x1, 0x1, 0x4, 0xc8, 0xf, 0x2, 0x4, 0x1, 0x0, 0x4, 0xa, 0xfc, 0xac, 0x93, 0xa3, 0x14, 0x5, 0x7, 0x6, 0x4c, 0x75, 0x73, 0x79, 0x74, 0x61, 0x6, 0x3, 0x2, 0x7, 0xa, 0x9a, 0xe4, 0xda, 0xfe, 0x2, 0x8, 0x44, 0x1, 0x3c, 0xf, 0x9, 0x43, 0x1, 0xa1, 0xa, 0x22, 0xfc, 0x4, 0x1e, 0x0, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x10, 0xf3, 0x4, 0x1, 0xb, 0x0, 0xa, 0xea, 0xd3, 0x86, 0x1, 0x1, 0x4, 0x7d, 0xd, 0x2, 0x4, 0x1, 0x0, 0x4, 0xa, 0xe0, 0xac, 0xab, 0x7e, 0x5, 0x7, 0xb, 0x4d, 0x65, 0x74, 0x72, 0x61, 0x74, 0x65, 0x74, 0x61, 0x78, 0x64, 0x6, 0x3, 0x1, 0x7, 0xa, 0xd0, 0x8d, 0x94, 0x3f, 0x8, 0x44, 0x1, 0xdb, 0xf, 0x9, 0x43, 0x1, 0xb0, 0xa, 0x22, 0xfc, 0x4, 0x1e, 0x0, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x47, 0x0, 0x0, 0x0, 0x11, 0xf3, 0x4, 0x1, 0xb, 0x0, 0xa, 0xe0, 0xd3, 0x86, 0x1, 0x1, 0x4, 0x1b, 0xb, 0x2, 0x4, 0x1, 0x0, 0x4, 0xa, 0xdc, 0xdd, 0xe7, 0xaf, 0x6, 0x5, 0x7, 0x9, 0x4d, 0x69, 0x6e, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6c, 0x6, 0x3, 0x2, 0x7, 0xa, 0x98, 0xbe, 0xf8, 0x69, 0x8, 0x43, 0x0, 0x9, 0x43, 0x1, 0x0, 0xa, 0x22, 0xfc, 0x4, 0x1e, 0x0} - parser := photon.NewV18() - sess := photon.Session[v18.Parameter]{} + if bytes.Equal(sess.Commands[0].ReliableFragmentPayload.Data, []byte{}) { + t.Fatalf("send reliable fragment must be populate") + } - err := parser.ParsePacketInto(payload, &sess) - if err != nil { - panic(err) + if sess.Commands[0].ReliablePayload.ParameterCount == 0 { + t.Fatalf("send reliable fragment must be populate") } - log.Println(sess) } -func TestArrayType(t *testing.T) { - payload := []byte{0x0, 0x0, 0x0, 0x2, 0xad, 0xb8, 0x92, 0x16, 0x7c, 0x11, 0x66, 0xbd, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3, 0x62, 0x0, 0x0, 0x0, 0x35, 0xf3, 0x3, 0x1, 0x0, 0x0, 0x8, 0x58, 0x0, 0xa, 0xde, 0xd3, 0x86, 0x1, 0x1, 0x43, 0x10, 0xb9, 0xfe, 0xa9, 0x30, 0x62, 0x81, 0x49, 0x42, 0x92, 0x96, 0x7c, 0x29, 0x65, 0x93, 0x9a, 0xff, 0x2, 0x7, 0xd, 0x4c, 0x6f, 0x75, 0x74, 0x72, 0x65, 0x56, 0x65, 0x52, 0x74, 0x45, 0x61, 0x7a, 0x3, 0xb, 0x52, 0x4, 0xb, 0x1c, 0x6, 0x43, 0x5, 0x2, 0x0, 0x2, 0x3, 0x6, 0x7, 0x43, 0x5, 0x0, 0x2, 0xf, 0x0, 0x0, 0x8, 0x7, 0x4, 0x32, 0x32, 0x30, 0x39, 0x9, 0x45, 0x2, 0x9c, 0x87, 0xaf, 0xc2, 0x0, 0x20, 0xbb, 0xc3, 0xa, 0x5, 0xef, 0xec, 0x42, 0x43, 0xb, 0x5, 0x0, 0x20, 0x13, 0x45, 0xc, 0x5, 0x0, 0x20, 0x13, 0x45, 0xe, 0x5, 0xf, 0x6a, 0x6b, 0x42, 0xf, 0xa, 0xf4, 0xfb, 0xad, 0x89, 0xa1, 0xf5, 0xce, 0xde, 0x11, 0x10, 0x5, 0x0, 0x80, 0xa2, 0x43, 0x11, 0x5, 0x0, 0x80, 0xa2, 0x43, 0x13, 0x5, 0xa0, 0xd9, 0x89, 0x40, 0x14, 0xa, 0xf4, 0xfb, 0xad, 0x89, 0xa1, 0xf5, 0xce, 0xde, 0x11, 0x15, 0x5, 0x0, 0xc0, 0x9c, 0x44, 0x16, 0x5, 0x0, 0xc0, 0x9c, 0x44, 0x18, 0x5, 0xd7, 0xa3, 0x48, 0x41, 0x19, 0xa, 0xf4, 0xfb, 0xad, 0x89, 0xa1, 0xf5, 0xce, 0xde, 0x11, 0x1b, 0x5, 0x0, 0x86, 0x9f, 0x46, 0x1c, 0x5, 0x0, 0x60, 0xea, 0x46, 0x1f, 0xa, 0x80, 0xfa, 0xeb, 0x90, 0xb6, 0xad, 0xf7, 0xdb, 0x11, 0x21, 0xa, 0x84, 0xf1, 0xbf, 0xa7, 0x21, 0x22, 0xa, 0xa0, 0xae, 0xf5, 0x1, 0x23, 0xa, 0xc0, 0x9e, 0xbb, 0xc8, 0x90, 0x8, 0x24, 0x14, 0x9, 0x9, 0x2, 0x2, 0x82, 0xa3, 0x1, 0x4, 0xc2, 0x8, 0x25, 0xa, 0xe0, 0xc9, 0xb6, 0xc, 0x26, 0xa, 0x80, 0xc0, 0xba, 0x8d, 0xa8, 0xcc, 0xce, 0xde, 0x11, 0x27, 0xa, 0xe0, 0xf3, 0xdd, 0xc0, 0x4a, 0x29, 0x5, 0x73, 0xa8, 0x7, 0x46, 0x2a, 0xa, 0xf4, 0xfb, 0xad, 0x89, 0xa1, 0xf5, 0xce, 0xde, 0x11, 0x2b, 0x49, 0x5, 0x0, 0xc0, 0xd2, 0x9a, 0xdc, 0xc, 0x0, 0x0, 0x0, 0x2c, 0x3, 0x1, 0x2d, 0x7, 0x0, 0x2e, 0x1e, 0x2f, 0x1e, 0x30, 0x7, 0x0, 0x31, 0x22, 0x32, 0x1c, 0x33, 0x43, 0x10, 0x24, 0xea, 0x36, 0xec, 0x28, 0xe6, 0xfd, 0x48, 0x9a, 0x4a, 0x8c, 0xd8, 0x32, 0x83, 0xdb, 0x94, 0x34, 0x49, 0xa, 0xe2, 0xd3, 0x86, 0x1, 0x0, 0xe6, 0xd3, 0x86, 0x1, 0xee, 0xd3, 0x86, 0x1, 0xea, 0xd3, 0x86, 0x1, 0xe0, 0xd3, 0x86, 0x1, 0xe4, 0xd3, 0x86, 0x1, 0xe8, 0xd3, 0x86, 0x1, 0x0, 0xec, 0xd3, 0x86, 0x1, 0x36, 0x43, 0x10, 0x49, 0xa8, 0xe, 0xc7, 0xf1, 0x6f, 0x20, 0x4c, 0x93, 0x15, 0x8c, 0x7b, 0xc9, 0x8, 0x62, 0x1a, 0x37, 0x49, 0x30, 0x94, 0xd4, 0x86, 0x1, 0xf0, 0xd3, 0x86, 0x1, 0xac, 0xd4, 0x86, 0x1, 0x0, 0x0, 0xa0, 0xd4, 0x86, 0x1, 0xa4, 0xd4, 0x86, 0x1, 0x8e, 0xd4, 0x86, 0x1, 0x8a, 0xd4, 0x86, 0x1, 0xae, 0xd4, 0x86, 0x1, 0xa2, 0xd4, 0x86, 0x1, 0xfe, 0xd3, 0x86, 0x1, 0x96, 0xd4, 0x86, 0x1, 0x9e, 0xd4, 0x86, 0x1, 0x84, 0xd4, 0x86, 0x1, 0xa8, 0xd4, 0x86, 0x1, 0xf2, 0xd3, 0x86, 0x1, 0x82, 0xd4, 0x86, 0x1, 0x80, 0xd4, 0x86, 0x1, 0xaa, 0xd4, 0x86, 0x1, 0x86, 0xd4, 0x86, 0x1, 0x88, 0xd4, 0x86, 0x1, 0xfc, 0xd3, 0x86, 0x1, 0xf4, 0xd3, 0x86, 0x1, 0x92, 0xd4, 0x86, 0x1, 0x8c, 0xd4, 0x86, 0x1, 0x90, 0xd4, 0x86, 0x1, 0x9c, 0xd4, 0x86, 0x1, 0xf6, 0xd3, 0x86, 0x1, 0xa6, 0xd4, 0x86, 0x1, 0xf8, 0xd3, 0x86, 0x1, 0x98, 0xd4, 0x86, 0x1, 0xfa, 0xd3, 0x86, 0x1, 0x9a, 0xd4, 0x86, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0x22, 0x3b, 0xa, 0xc0, 0xf9, 0xb9, 0xe8, 0xb7, 0xa2, 0x8f, 0xde, 0x11, 0x3c, 0x45, 0x2, 0xaa, 0xa7, 0x4a, 0x42, 0x70, 0x2e, 0x1d, 0x43, 0x3d, 0x7, 0x30, 0x40, 0x45, 0x58, 0x50, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x40, 0x38, 0x62, 0x36, 0x39, 0x65, 0x30, 0x34, 0x38, 0x2d, 0x34, 0x63, 0x61, 0x66, 0x2d, 0x34, 0x35, 0x62, 0x38, 0x2d, 0x38, 0x66, 0x30, 0x38, 0x2d, 0x65, 0x30, 0x30, 0x61, 0x39, 0x32, 0x66, 0x30, 0x33, 0x66, 0x36, 0x65, 0x3e, 0x7, 0x4, 0x32, 0x30, 0x30, 0x30, 0x3f, 0xa, 0xb2, 0x9a, 0xdc, 0xf9, 0x9e, 0xb4, 0xf1, 0xdb, 0x11, 0x42, 0x7, 0x4, 0x32, 0x30, 0x30, 0x30, 0x43, 0x7, 0x0, 0x44, 0xa, 0xf4, 0xfb, 0xad, 0x89, 0xa1, 0xf5, 0xce, 0xde, 0x11, 0x45, 0x9, 0xd3, 0xb7, 0xbb, 0xa4, 0xa, 0x4e, 0xa, 0xec, 0xe2, 0xfd, 0x96, 0xb4, 0xb8, 0xf3, 0xdb, 0x11, 0x4f, 0x7, 0x0, 0x51, 0x7, 0x0, 0x53, 0xa, 0x80, 0xc2, 0xd7, 0x2f, 0x54, 0x11, 0x28, 0x2d, 0x55, 0x11, 0x10, 0x27, 0x56, 0x11, 0x10, 0x27, 0x57, 0x22, 0x59, 0xa, 0x80, 0xfa, 0xeb, 0x90, 0xb6, 0xad, 0xf7, 0xdb, 0x11, 0x5a, 0xb, 0x28, 0x5b, 0xa, 0x80, 0xbd, 0x87, 0xbe, 0xb6, 0xd2, 0x9f, 0xd7, 0x11, 0x5c, 0xa, 0xee, 0x94, 0xf8, 0xc7, 0xe7, 0x95, 0x8f, 0xde, 0x11, 0x5d, 0x43, 0x0, 0x5e, 0x4a, 0x0, 0x5f, 0x43, 0x0, 0x61, 0x1c, 0x64, 0xa, 0xf2, 0xe4, 0xd6, 0xc5, 0xd7, 0xdb, 0xcc, 0xde, 0x11, 0x65, 0xa, 0xf0, 0xb0, 0xae, 0x89, 0xa1, 0xf5, 0xce, 0xde, 0x11, 0x66, 0xb, 0x1, 0x67, 0x14, 0x9, 0xa, 0x3, 0x8, 0xae, 0xaa, 0xc9, 0xff, 0x1, 0xa, 0xce, 0x81, 0xba, 0x3b, 0xe, 0xd2, 0xc0, 0x85, 0xd0, 0x1, 0x68, 0x49, 0x6, 0x0, 0x0, 0xec, 0xdc, 0x86, 0xc5, 0x2, 0x0, 0x0, 0x0, 0x69, 0x3, 0x3, 0x6a, 0x14, 0x9, 0xa, 0x3, 0x0, 0xc8, 0xba, 0xd3, 0xaf, 0x6, 0x2, 0x0, 0x4, 0x0, 0x6b, 0x44, 0x7, 0x1a, 0x0, 0xff, 0xff, 0x5f, 0x0, 0xb4, 0x0, 0x2, 0x1, 0xff, 0xff, 0x58, 0x1, 0x6c, 0x1e, 0x74, 0x3, 0x1, 0x75, 0x7, 0x4, 0x32, 0x30, 0x30, 0x30, 0x76, 0x1d, 0x78, 0x1c, 0x79, 0xb, 0xc, 0x7b, 0x1c, 0xfd, 0x4, 0x2, 0x0, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x36, 0x0, 0x0, 0x0, 0x36, 0xf3, 0x4, 0x1, 0x6, 0x0, 0x47, 0x9, 0x1f, 0x40, 0x43, 0x48, 0x41, 0x54, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, 0x5f, 0x54, 0x41, 0x42, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x1c, 0x40, 0x43, 0x48, 0x41, 0x54, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, 0x5f, 0x54, 0x41, 0x42, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x48, 0x45, 0x4c, 0x50, 0x29, 0x40, 0x43, 0x48, 0x41, 0x54, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, 0x5f, 0x54, 0x41, 0x42, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x4c, 0x4f, 0x4f, 0x4b, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x1e, 0x40, 0x43, 0x48, 0x41, 0x54, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, 0x5f, 0x54, 0x41, 0x42, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x42, 0x41, 0x54, 0x1f, 0x40, 0x43, 0x48, 0x41, 0x54, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, 0x5f, 0x54, 0x41, 0x42, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x52, 0x45, 0x43, 0x52, 0x55, 0x49, 0x54, 0x1e, 0x40, 0x43, 0x48, 0x41, 0x54, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, 0x5f, 0x54, 0x41, 0x42, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x4c, 0x6, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x7, 0x46, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5, 0x50, 0x61, 0x72, 0x74, 0x79, 0x1, 0x40, 0x9, 0x49, 0x8, 0x2e, 0x36, 0x3e, 0x38, 0x4a, 0x42, 0x14, 0x0, 0x49, 0x3, 0xa, 0x38, 0x42, 0x49, 0x3, 0x6, 0x38, 0x42, 0x49, 0x9, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x49, 0x3, 0x4, 0x38, 0x42, 0x49, 0x6, 0x34, 0x30, 0x32, 0x38, 0x42, 0x4a, 0x49, 0x1, 0x30, 0x49, 0x2, 0x3a, 0x3c, 0x49, 0x1, 0x34, 0x2, 0x42, 0x9, 0x3f, 0x0, 0x3, 0x42, 0x9, 0x37, 0x0, 0x4, 0x22, 0xfc, 0x4, 0xda, 0x0} +func TestDisconnectCommand(t *testing.T) { + payload := []byte{0x79, 0x9e, 0x0, 0x4, 0x0, 0x0, 0x4d, 0xb, 0x7c, 0x11, 0x66, 0xbd, 0x1, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa0, 0xad, 0xb8, 0xda, 0x99, 0x1, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa0, 0xad, 0xb8, 0xdb, 0x73, 0x1, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa0, 0xad, 0xb8, 0xdd, 0x58, 0x4, 0xff, 0x1, 0x4, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xa} + parser := photon.NewV18() - sess := photon.Session[v18.Parameter]{} + sess := photon.Session[v18.Parameter]{} err := parser.ParsePacketInto(payload, &sess) if err != nil { - panic(err) + t.Fatalf("can't parse due to: %v", err) } - log.Println(sess) - -} - -func TestUnknow(t *testing.T) { - payload := []byte{0xe9, 0x71, 0x2d, 0xd5, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} - parser := photon.NewV18() - - sess := photon.Session[v18.Parameter]{} + if len(sess.Commands) == 0 && len(sess.Commands) < 4{ + t.Fatalf("session must have more than 0 commands got: 0") + } - err := parser.ParsePacketInto(payload, &sess) - if err != nil { - panic(err) + if sess.Commands[3].Type != types.DisconnectCommand { + t.Fatalf("command must be a disconnect command got: %v", sess.Commands[0].Type) } - log.Println(sess) } -func TestRandoom(t *testing.T) { - payload := []byte{0x0, 0x0, 0x0, 0x2, 0xc1, 0x5a, 0xb3, 0x8a, 0x67, 0x38, 0x47, 0x7a, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x1, 0xe1, 0xf3, 0x4, 0x3, 0x2, 0x0, 0xa, 0x82, 0xb0, 0x6a, 0x1, 0x43, 0x1e, 0x3, 0xbb, 0x7, 0x9b, 0xf6, 0xd3, 0xa0, 0xde, 0x8, 0x97, 0x20, 0x4e, 0x53, 0xaf, 0x1, 0x19, 0xa5, 0x8f, 0x0, 0x0, 0x30, 0x41, 0x47, 0x52, 0x9c, 0x53, 0xd1, 0xd1, 0x14, 0xa5, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x1, 0xe2, 0xf3, 0x4, 0x3, 0x2, 0x0, 0xa, 0x8a, 0x82, 0x6b, 0x1, 0x43, 0x1e, 0x3, 0x9b, 0x9b, 0x9f, 0xf6, 0xd3, 0xa0, 0xde, 0x8, 0xa9, 0x8e, 0x1a, 0x2d, 0xeb, 0x8f, 0x14, 0xa5, 0xa0, 0x34, 0x33, 0x3d, 0x41, 0xe3, 0x93, 0xfe, 0x2d, 0x84, 0x6f, 0x14, 0xa5} +func TestArrayTypeParameters(t *testing.T) { + payload := []byte{0x0, 0x0, 0x0, 0x2, 0xad, 0xb8, 0x92, 0x16, 0x7c, 0x11, 0x66, 0xbd, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3, 0x62, 0x0, 0x0, 0x0, 0x35, 0xf3, 0x3, 0x1, 0x0, 0x0, 0x8, 0x58, 0x0, 0xa, 0xde, 0xd3, 0x86, 0x1, 0x1, 0x43, 0x10, 0xb9, 0xfe, 0xa9, 0x30, 0x62, 0x81, 0x49, 0x42, 0x92, 0x96, 0x7c, 0x29, 0x65, 0x93, 0x9a, 0xff, 0x2, 0x7, 0xd, 0x4c, 0x6f, 0x75, 0x74, 0x72, 0x65, 0x56, 0x65, 0x52, 0x74, 0x45, 0x61, 0x7a, 0x3, 0xb, 0x52, 0x4, 0xb, 0x1c, 0x6, 0x43, 0x5, 0x2, 0x0, 0x2, 0x3, 0x6, 0x7, 0x43, 0x5, 0x0, 0x2, 0xf, 0x0, 0x0, 0x8, 0x7, 0x4, 0x32, 0x32, 0x30, 0x39, 0x9, 0x45, 0x2, 0x9c, 0x87, 0xaf, 0xc2, 0x0, 0x20, 0xbb, 0xc3, 0xa, 0x5, 0xef, 0xec, 0x42, 0x43, 0xb, 0x5, 0x0, 0x20, 0x13, 0x45, 0xc, 0x5, 0x0, 0x20, 0x13, 0x45, 0xe, 0x5, 0xf, 0x6a, 0x6b, 0x42, 0xf, 0xa, 0xf4, 0xfb, 0xad, 0x89, 0xa1, 0xf5, 0xce, 0xde, 0x11, 0x10, 0x5, 0x0, 0x80, 0xa2, 0x43, 0x11, 0x5, 0x0, 0x80, 0xa2, 0x43, 0x13, 0x5, 0xa0, 0xd9, 0x89, 0x40, 0x14, 0xa, 0xf4, 0xfb, 0xad, 0x89, 0xa1, 0xf5, 0xce, 0xde, 0x11, 0x15, 0x5, 0x0, 0xc0, 0x9c, 0x44, 0x16, 0x5, 0x0, 0xc0, 0x9c, 0x44, 0x18, 0x5, 0xd7, 0xa3, 0x48, 0x41, 0x19, 0xa, 0xf4, 0xfb, 0xad, 0x89, 0xa1, 0xf5, 0xce, 0xde, 0x11, 0x1b, 0x5, 0x0, 0x86, 0x9f, 0x46, 0x1c, 0x5, 0x0, 0x60, 0xea, 0x46, 0x1f, 0xa, 0x80, 0xfa, 0xeb, 0x90, 0xb6, 0xad, 0xf7, 0xdb, 0x11, 0x21, 0xa, 0x84, 0xf1, 0xbf, 0xa7, 0x21, 0x22, 0xa, 0xa0, 0xae, 0xf5, 0x1, 0x23, 0xa, 0xc0, 0x9e, 0xbb, 0xc8, 0x90, 0x8, 0x24, 0x14, 0x9, 0x9, 0x2, 0x2, 0x82, 0xa3, 0x1, 0x4, 0xc2, 0x8, 0x25, 0xa, 0xe0, 0xc9, 0xb6, 0xc, 0x26, 0xa, 0x80, 0xc0, 0xba, 0x8d, 0xa8, 0xcc, 0xce, 0xde, 0x11, 0x27, 0xa, 0xe0, 0xf3, 0xdd, 0xc0, 0x4a, 0x29, 0x5, 0x73, 0xa8, 0x7, 0x46, 0x2a, 0xa, 0xf4, 0xfb, 0xad, 0x89, 0xa1, 0xf5, 0xce, 0xde, 0x11, 0x2b, 0x49, 0x5, 0x0, 0xc0, 0xd2, 0x9a, 0xdc, 0xc, 0x0, 0x0, 0x0, 0x2c, 0x3, 0x1, 0x2d, 0x7, 0x0, 0x2e, 0x1e, 0x2f, 0x1e, 0x30, 0x7, 0x0, 0x31, 0x22, 0x32, 0x1c, 0x33, 0x43, 0x10, 0x24, 0xea, 0x36, 0xec, 0x28, 0xe6, 0xfd, 0x48, 0x9a, 0x4a, 0x8c, 0xd8, 0x32, 0x83, 0xdb, 0x94, 0x34, 0x49, 0xa, 0xe2, 0xd3, 0x86, 0x1, 0x0, 0xe6, 0xd3, 0x86, 0x1, 0xee, 0xd3, 0x86, 0x1, 0xea, 0xd3, 0x86, 0x1, 0xe0, 0xd3, 0x86, 0x1, 0xe4, 0xd3, 0x86, 0x1, 0xe8, 0xd3, 0x86, 0x1, 0x0, 0xec, 0xd3, 0x86, 0x1, 0x36, 0x43, 0x10, 0x49, 0xa8, 0xe, 0xc7, 0xf1, 0x6f, 0x20, 0x4c, 0x93, 0x15, 0x8c, 0x7b, 0xc9, 0x8, 0x62, 0x1a, 0x37, 0x49, 0x30, 0x94, 0xd4, 0x86, 0x1, 0xf0, 0xd3, 0x86, 0x1, 0xac, 0xd4, 0x86, 0x1, 0x0, 0x0, 0xa0, 0xd4, 0x86, 0x1, 0xa4, 0xd4, 0x86, 0x1, 0x8e, 0xd4, 0x86, 0x1, 0x8a, 0xd4, 0x86, 0x1, 0xae, 0xd4, 0x86, 0x1, 0xa2, 0xd4, 0x86, 0x1, 0xfe, 0xd3, 0x86, 0x1, 0x96, 0xd4, 0x86, 0x1, 0x9e, 0xd4, 0x86, 0x1, 0x84, 0xd4, 0x86, 0x1, 0xa8, 0xd4, 0x86, 0x1, 0xf2, 0xd3, 0x86, 0x1, 0x82, 0xd4, 0x86, 0x1, 0x80, 0xd4, 0x86, 0x1, 0xaa, 0xd4, 0x86, 0x1, 0x86, 0xd4, 0x86, 0x1, 0x88, 0xd4, 0x86, 0x1, 0xfc, 0xd3, 0x86, 0x1, 0xf4, 0xd3, 0x86, 0x1, 0x92, 0xd4, 0x86, 0x1, 0x8c, 0xd4, 0x86, 0x1, 0x90, 0xd4, 0x86, 0x1, 0x9c, 0xd4, 0x86, 0x1, 0xf6, 0xd3, 0x86, 0x1, 0xa6, 0xd4, 0x86, 0x1, 0xf8, 0xd3, 0x86, 0x1, 0x98, 0xd4, 0x86, 0x1, 0xfa, 0xd3, 0x86, 0x1, 0x9a, 0xd4, 0x86, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0x22, 0x3b, 0xa, 0xc0, 0xf9, 0xb9, 0xe8, 0xb7, 0xa2, 0x8f, 0xde, 0x11, 0x3c, 0x45, 0x2, 0xaa, 0xa7, 0x4a, 0x42, 0x70, 0x2e, 0x1d, 0x43, 0x3d, 0x7, 0x30, 0x40, 0x45, 0x58, 0x50, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x40, 0x38, 0x62, 0x36, 0x39, 0x65, 0x30, 0x34, 0x38, 0x2d, 0x34, 0x63, 0x61, 0x66, 0x2d, 0x34, 0x35, 0x62, 0x38, 0x2d, 0x38, 0x66, 0x30, 0x38, 0x2d, 0x65, 0x30, 0x30, 0x61, 0x39, 0x32, 0x66, 0x30, 0x33, 0x66, 0x36, 0x65, 0x3e, 0x7, 0x4, 0x32, 0x30, 0x30, 0x30, 0x3f, 0xa, 0xb2, 0x9a, 0xdc, 0xf9, 0x9e, 0xb4, 0xf1, 0xdb, 0x11, 0x42, 0x7, 0x4, 0x32, 0x30, 0x30, 0x30, 0x43, 0x7, 0x0, 0x44, 0xa, 0xf4, 0xfb, 0xad, 0x89, 0xa1, 0xf5, 0xce, 0xde, 0x11, 0x45, 0x9, 0xd3, 0xb7, 0xbb, 0xa4, 0xa, 0x4e, 0xa, 0xec, 0xe2, 0xfd, 0x96, 0xb4, 0xb8, 0xf3, 0xdb, 0x11, 0x4f, 0x7, 0x0, 0x51, 0x7, 0x0, 0x53, 0xa, 0x80, 0xc2, 0xd7, 0x2f, 0x54, 0x11, 0x28, 0x2d, 0x55, 0x11, 0x10, 0x27, 0x56, 0x11, 0x10, 0x27, 0x57, 0x22, 0x59, 0xa, 0x80, 0xfa, 0xeb, 0x90, 0xb6, 0xad, 0xf7, 0xdb, 0x11, 0x5a, 0xb, 0x28, 0x5b, 0xa, 0x80, 0xbd, 0x87, 0xbe, 0xb6, 0xd2, 0x9f, 0xd7, 0x11, 0x5c, 0xa, 0xee, 0x94, 0xf8, 0xc7, 0xe7, 0x95, 0x8f, 0xde, 0x11, 0x5d, 0x43, 0x0, 0x5e, 0x4a, 0x0, 0x5f, 0x43, 0x0, 0x61, 0x1c, 0x64, 0xa, 0xf2, 0xe4, 0xd6, 0xc5, 0xd7, 0xdb, 0xcc, 0xde, 0x11, 0x65, 0xa, 0xf0, 0xb0, 0xae, 0x89, 0xa1, 0xf5, 0xce, 0xde, 0x11, 0x66, 0xb, 0x1, 0x67, 0x14, 0x9, 0xa, 0x3, 0x8, 0xae, 0xaa, 0xc9, 0xff, 0x1, 0xa, 0xce, 0x81, 0xba, 0x3b, 0xe, 0xd2, 0xc0, 0x85, 0xd0, 0x1, 0x68, 0x49, 0x6, 0x0, 0x0, 0xec, 0xdc, 0x86, 0xc5, 0x2, 0x0, 0x0, 0x0, 0x69, 0x3, 0x3, 0x6a, 0x14, 0x9, 0xa, 0x3, 0x0, 0xc8, 0xba, 0xd3, 0xaf, 0x6, 0x2, 0x0, 0x4, 0x0, 0x6b, 0x44, 0x7, 0x1a, 0x0, 0xff, 0xff, 0x5f, 0x0, 0xb4, 0x0, 0x2, 0x1, 0xff, 0xff, 0x58, 0x1, 0x6c, 0x1e, 0x74, 0x3, 0x1, 0x75, 0x7, 0x4, 0x32, 0x30, 0x30, 0x30, 0x76, 0x1d, 0x78, 0x1c, 0x79, 0xb, 0xc, 0x7b, 0x1c, 0xfd, 0x4, 0x2, 0x0, 0x6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x36, 0x0, 0x0, 0x0, 0x36, 0xf3, 0x4, 0x1, 0x6, 0x0, 0x47, 0x9, 0x1f, 0x40, 0x43, 0x48, 0x41, 0x54, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, 0x5f, 0x54, 0x41, 0x42, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x1c, 0x40, 0x43, 0x48, 0x41, 0x54, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, 0x5f, 0x54, 0x41, 0x42, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x48, 0x45, 0x4c, 0x50, 0x29, 0x40, 0x43, 0x48, 0x41, 0x54, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, 0x5f, 0x54, 0x41, 0x42, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x4c, 0x4f, 0x4f, 0x4b, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x1e, 0x40, 0x43, 0x48, 0x41, 0x54, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, 0x5f, 0x54, 0x41, 0x42, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x42, 0x41, 0x54, 0x1f, 0x40, 0x43, 0x48, 0x41, 0x54, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, 0x5f, 0x54, 0x41, 0x42, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x52, 0x45, 0x43, 0x52, 0x55, 0x49, 0x54, 0x1e, 0x40, 0x43, 0x48, 0x41, 0x54, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, 0x5f, 0x54, 0x41, 0x42, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x4c, 0x6, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x7, 0x46, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5, 0x50, 0x61, 0x72, 0x74, 0x79, 0x1, 0x40, 0x9, 0x49, 0x8, 0x2e, 0x36, 0x3e, 0x38, 0x4a, 0x42, 0x14, 0x0, 0x49, 0x3, 0xa, 0x38, 0x42, 0x49, 0x3, 0x6, 0x38, 0x42, 0x49, 0x9, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x49, 0x3, 0x4, 0x38, 0x42, 0x49, 0x6, 0x34, 0x30, 0x32, 0x38, 0x42, 0x4a, 0x49, 0x1, 0x30, 0x49, 0x2, 0x3a, 0x3c, 0x49, 0x1, 0x34, 0x2, 0x42, 0x9, 0x3f, 0x0, 0x3, 0x42, 0x9, 0x37, 0x0, 0x4, 0x22, 0xfc, 0x4, 0xda, 0x0} parser := photon.NewV18() sess := photon.Session[v18.Parameter]{} err := parser.ParsePacketInto(payload, &sess) if err != nil { - panic(err) + t.Fatalf("can't parse due to: %v", err) } - res, err := json.MarshalIndent(sess, "", " ") + if len(sess.Commands) == 0 { + t.Fatalf("session must have more than 0 commands got: 0") + } - if err != nil { - panic(err) + for _, cmd := range sess.Commands { + if cmd.Type != types.SendReliableCommand { + t.Fatalf("command must be a send reliable command got: %v", cmd.Type) + } + if cmd.ReliablePayload.ParameterCount == 0 { + t.Fatalf("send reliable fragment must be populate") + } } - log.Println(string(res)) } diff --git a/internal/parameters/v18/scan_arrays_test.go b/internal/parameters/v18/scan_arrays_test.go index 97fbe06..abf083a 100644 --- a/internal/parameters/v18/scan_arrays_test.go +++ b/internal/parameters/v18/scan_arrays_test.go @@ -28,7 +28,7 @@ func TestParseStringArrayParameterAndAccessor(t *testing.T) { var parser v18.Parameter var got v18.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } @@ -73,7 +73,7 @@ func TestParseStringArrayRolesParameterAndAccessor(t *testing.T) { var parser v18.Parameter var got v18.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } @@ -145,7 +145,7 @@ func TestParseFloat32ArrayParametersAndAccessor(t *testing.T) { var parser v18.Parameter var got v18.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } @@ -231,7 +231,7 @@ func TestParseInt16ArrayParametersAndAccessor(t *testing.T) { var parser v18.Parameter var got v18.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } @@ -306,7 +306,7 @@ func TestParseInt32ArrayParametersAndAccessor(t *testing.T) { var parser v18.Parameter var got v18.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } @@ -398,7 +398,7 @@ func TestParseInt64ArrayParametersAndAccessor(t *testing.T) { var parser v18.Parameter var got v18.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } @@ -501,7 +501,7 @@ func TestParseBooleanArrayParametersAndAccessor(t *testing.T) { var parser v18.Parameter var got v18.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } @@ -571,7 +571,7 @@ func TestParseByteArrayParametersAndAccessor(t *testing.T) { var parser v18.Parameter var got v18.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } @@ -651,7 +651,7 @@ func TestParseArrayParametersAndAccessor(t *testing.T) { var parser v18.Parameter var got v18.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } diff --git a/internal/parameters/v18/scan_dicts_test.go b/internal/parameters/v18/scan_dicts_test.go index 46b6393..1e72bfd 100644 --- a/internal/parameters/v18/scan_dicts_test.go +++ b/internal/parameters/v18/scan_dicts_test.go @@ -38,7 +38,7 @@ func TestParseDictsParametersAndAccessor(t *testing.T) { var parser v18.Parameter var got v18.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } diff --git a/internal/parameters/v18/scan_scalars_test.go b/internal/parameters/v18/scan_scalars_test.go index 6b26ddd..c2b58c7 100644 --- a/internal/parameters/v18/scan_scalars_test.go +++ b/internal/parameters/v18/scan_scalars_test.go @@ -40,7 +40,7 @@ func TestParseStringParameterAndAccessor(t *testing.T) { r := reader.NewReader(tt.input) var parser v18.Parameter var got v18.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } if got.ID() != tt.wantID { @@ -93,7 +93,7 @@ func TestParseFloat32ParameterAndAccessor(t *testing.T) { var parser v18.Parameter var got v18.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } @@ -158,7 +158,7 @@ func TestParseInt8ParameterAndAccessor(t *testing.T) { var parser v18.Parameter var got v18.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } @@ -231,7 +231,7 @@ func TestParseInt16ParameterAndAccessor(t *testing.T) { var parser v18.Parameter var got v18.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } @@ -304,7 +304,7 @@ func TestParseLong8AndLong16ParameterAndAccessor(t *testing.T) { var parser v18.Parameter var got v18.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } @@ -377,7 +377,7 @@ func TestParseCompressedInt32AndInt64ParameterAndAccessor(t *testing.T) { var parser v18.Parameter var got v18.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } @@ -445,7 +445,7 @@ func TestParseZeroTypeParameterAndAccessor(t *testing.T) { var parser v18.Parameter var got v18.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } @@ -495,7 +495,7 @@ func TestParseBooleanParameterAndAccessor(t *testing.T) { var parser v18.Parameter var got v18.Parameter - if err := parser.Parse(r, &got, nil); err != nil { + if err := parser.ParseInto(r, nil, &got); err != nil { t.Fatalf("Parse() error = %v", err) } diff --git a/internal/reader/reader.go b/internal/reader/reader.go index cba700d..9a5375e 100644 --- a/internal/reader/reader.go +++ b/internal/reader/reader.go @@ -1,9 +1,6 @@ package reader import ( - "encoding/binary" - "math" - "github.com/AutoDruid/photon-parser/internal/errors" ) @@ -33,13 +30,16 @@ func NewReader(data []byte) *Reader { } } -// Read Remaining bytes from the reader. +// ReadRemaining reads the remaining bytes from the reader. +// This is useful when you want to read the rest of the data in the reader. func (r *Reader) ReadRemaining() []byte { tmp := r.Cursor r.Cursor = r.Max return r.Buffer[tmp:] } +// Skip n bytes from the reader. +// Doing this is faster than reading the bytes and discarding them. func (r *Reader) Skip(n int) error { if n < 0 { @@ -56,396 +56,6 @@ func (r *Reader) Skip(n int) error { return nil } -// ReadInt8 reads an 8-bit signed integer from the reader. -// Returns an error if fewer than 1 byte is available. -func (r *Reader) ReadInt8() (int8, error) { - size := r.Cursor + INT8_SIZE - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesInt8 - } - - b := r.Buffer[r.Cursor:size] - r.Cursor += INT8_SIZE - return int8(b[0]), nil -} - -// ReadUInt8 reads an 8-bit unsigned integer from the reader. -// Returns an error if fewer than 1 byte is available. -func (r *Reader) ReadUInt8() (uint8, error) { - size := r.Cursor + INT8_SIZE - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesUInt8 - } - - b := r.Buffer[r.Cursor:size] - r.Cursor += INT8_SIZE - return uint8(b[0]), nil -} - -// ReadInt16 reads a 16-bit signed integer from the reader in the given byte order. -// Returns an error if fewer than 2 bytes are available. -func (r *Reader) ReadInt16BE() (int16, error) { - - size := r.Cursor + INT16_SIZE - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesInt16 - } - - b := r.Buffer[r.Cursor:size] - r.Cursor += INT16_SIZE - - return int16(binary.BigEndian.Uint16(b)), nil -} - -func (r *Reader) ReadInt16LE() (int16, error) { - - size := r.Cursor + INT16_SIZE - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesInt16 - } - - b := r.Buffer[r.Cursor:size] - r.Cursor += INT16_SIZE - - return int16(binary.LittleEndian.Uint16(b)), nil -} - -// ReadUInt16 reads a 16-bit unsigned integer from the reader in the given byte order. -// Returns an error if fewer than 2 bytes are available. -func (r *Reader) ReadUInt16BE() (uint16, error) { - - size := r.Cursor + INT16_SIZE - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesUInt16 - } - - b := r.Buffer[r.Cursor:size] - r.Cursor += INT16_SIZE - - return binary.BigEndian.Uint16(b), nil -} - -func (r *Reader) ReadUInt16LE() (uint16, error) { - - size := r.Cursor + INT16_SIZE - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesUInt16 - } - - b := r.Buffer[r.Cursor:size] - r.Cursor += INT16_SIZE - - return binary.LittleEndian.Uint16(b), nil -} - -// ReadInt32 reads a 32-bit signed integer from the reader in the given byte order. -// Returns an error if fewer than 4 bytes are available. -func (r *Reader) ReadInt32BE() (int32, error) { - size := r.Cursor + INT32_SIZE - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesInt32 - } - - b := r.Buffer[r.Cursor:size] - r.Cursor += INT32_SIZE - - return int32(binary.BigEndian.Uint32(b)), nil -} - -func (r *Reader) ReadInt32LE() (int32, error) { - size := r.Cursor + INT32_SIZE - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesInt32 - } - - b := r.Buffer[r.Cursor:size] - r.Cursor += INT32_SIZE - - return int32(binary.LittleEndian.Uint32(b)), nil -} - -// ReadUInt32 reads a 32-bit unsigned integer from the reader in the given byte order. -// Returns an error if fewer than 4 bytes are available. -func (r *Reader) ReadUInt32BE() (uint32, error) { - size := r.Cursor + INT32_SIZE - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesUInt32 - } - - b := r.Buffer[r.Cursor:size] - r.Cursor += INT32_SIZE - - return binary.BigEndian.Uint32(b), nil -} - -func (r *Reader) ReadUInt32LE() (uint32, error) { - size := r.Cursor + INT32_SIZE - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesUInt32 - } - - b := r.Buffer[r.Cursor:size] - r.Cursor += INT32_SIZE - - return binary.LittleEndian.Uint32(b), nil -} - -// ReadInt64 reads a 64-bit signed integer from the reader in the given byte order. -// Returns an error if fewer than 8 bytes are available. -func (r *Reader) ReadInt64BE() (int64, error) { - size := r.Cursor + INT64_SIZE - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesInt64 - } - - b := r.Buffer[r.Cursor:size] - r.Cursor += INT64_SIZE - - return int64(binary.BigEndian.Uint64(b)), nil -} - -func (r *Reader) ReadInt64LE() (int64, error) { - size := r.Cursor + INT64_SIZE - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesInt64 - } - - b := r.Buffer[r.Cursor:size] - r.Cursor += INT64_SIZE - - return int64(binary.LittleEndian.Uint64(b)), nil -} - -// ReadUInt64 reads a 64-bit unsigned integer from the reader in the given byte order. -// Returns an error if fewer than 8 bytes are available. -func (r *Reader) ReadUInt64BE() (uint64, error) { - size := r.Cursor + INT64_SIZE - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesUInt64 - } - - b := r.Buffer[r.Cursor:size] - r.Cursor += INT64_SIZE - return binary.BigEndian.Uint64(b), nil -} - -func (r *Reader) ReadUInt64LE() (uint64, error) { - size := r.Cursor + INT64_SIZE - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesUInt64 - } - - b := r.Buffer[r.Cursor:size] - r.Cursor += INT64_SIZE - return binary.LittleEndian.Uint64(b), nil -} - -// ReadFloat32 reads a 32-bit floating point number from the reader in the given byte order. -// Returns an error if fewer than 4 bytes are available. -func (r *Reader) ReadFloat32BE() (float32, error) { - size := r.Cursor + FLOAT32_SIZE - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesFloat32 - } - - b := r.Buffer[r.Cursor:size] - r.Cursor += FLOAT32_SIZE - - return math.Float32frombits(binary.BigEndian.Uint32(b)), nil -} - -func (r *Reader) ReadFloat32LE() (float32, error) { - size := r.Cursor + FLOAT32_SIZE - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesFloat32 - } - - b := r.Buffer[r.Cursor:size] - r.Cursor += FLOAT32_SIZE - - return math.Float32frombits(binary.LittleEndian.Uint32(b)), nil -} - -// ReadFloat64 reads a 64-bit floating point number from the reader in the given byte order. -// Returns an error if fewer than 8 bytes are available. -func (r *Reader) ReadFloat64BE() (float64, error) { - size := r.Cursor + FLOAT64_SIZE - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesFloat64 - } - - b := r.Buffer[r.Cursor:size] - r.Cursor += INT64_SIZE - - return math.Float64frombits(binary.BigEndian.Uint64(b)), nil -} - -func (r *Reader) ReadFloat64LE() (float64, error) { - size := r.Cursor + FLOAT64_SIZE - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesFloat64 - } - - b := r.Buffer[r.Cursor:size] - r.Cursor += INT64_SIZE - - return math.Float64frombits(binary.LittleEndian.Uint64(b)), nil -} - -// ReadBoolean reads a boolean value from the reader. -// Format: single byte (0x00 = false, 0x01 = true). -// Returns an error if the value is not 0x00 or 0x01, or if no byte is available. -func (r *Reader) ReadBoolean() (bool, error) { - bit, err := r.ReadUInt8() - - if err != nil { - return false, err - } - - if bit == 0 { - return false, nil - } - - if bit == 1 { - return true, nil - } - - return false, errors.ErrInvalidBooleanValue -} - -// ReadString reads a string of n size from the reader. -// Returns an empty string if length is 0. -// Returns an error if the declared length cannot be fully read. -func (r *Reader) ReadString(n int) (string, error) { - size := r.Cursor + n - - if size > r.Max { - return "", errors.ErrNotEnoughBytesString - } - - str := string(r.Buffer[r.Cursor:size]) - r.Cursor = size - - return str, nil -} - -func (r *Reader) ReadByte() (byte, error) { - - size := r.Cursor + 1 - - if size > r.Max { - return 0, errors.ErrNotEnoughBytesByte - } - - c := r.Buffer[r.Cursor] - r.Cursor++ - return c, nil -} - -// ReadBytes reads a []bytes of n size from the reader. -// Returns an empty []bytes if length is 0. -// Returns an error if the declared length cannot be fully read. -func (r *Reader) ReadBytes(n int) ([]byte, error) { - - size := r.Cursor + n - - if size > r.Max { - return []byte{}, errors.ErrNotEnoughBytesBytes - } - - buff := r.Buffer[r.Cursor:size] - r.Cursor += n - return buff, nil -} - -// ReadVarintUInt32 reads a 32-bit unsigned integer from the reader in varint format. -func (r *Reader) ReadVarintUInt32() (uint32, error) { - - var res uint32 - var shift uint8 - for { - - buff, err := r.ReadByte() - if err != nil { - return 0, err - } - - res |= uint32(buff&VARINT_MASK) << shift - - if buff&VARINT_MSB_MASK == 0 { - break - } - shift += VARINT_SHIFT - } - - return res, nil -} - -// ReadVarintInt32 reads a 32-bit signed integer from the reader in varint format. -func (r *Reader) ReadVarintInt32() (int32, error) { - - res, err := r.ReadVarintUInt32() - if err != nil { - return 0, err - } - - //ZigZag decode - return int32((res >> 1) ^ uint32(-(int32(res & 1)))), nil -} - -// ReadVarintUInt64 reads a 64-bit unsigned integer from the reader in varint format. -func (r *Reader) ReadVarintUInt64() (uint64, error) { - - var res uint64 - var shift uint8 - for { - - buff, err := r.ReadByte() - if err != nil { - return 0, err - } - - res |= uint64(buff&VARINT_MASK) << shift - - if buff&VARINT_MSB_MASK == 0 { - break - } - shift += VARINT_SHIFT - } - - return res, nil -} - -// ReadVarintInt64 reads a 64-bit signed integer from the reader in varint format. -func (r *Reader) ReadVarintInt64() (int64, error) { - - res, err := r.ReadVarintUInt64() - if err != nil { - return 0, err - } - - //ZigZag decode - return int64((res >> 1) ^ uint64(-(int64(res & 1)))), nil -} - // Reset resets the reader to the beginning of the buffer. func (r *Reader) Reset(data []byte) { r.Buffer = data diff --git a/internal/reader/scalars.go b/internal/reader/scalars.go new file mode 100644 index 0000000..49bb9f7 --- /dev/null +++ b/internal/reader/scalars.go @@ -0,0 +1,346 @@ +package reader + +import ( + "encoding/binary" + "math" + + "github.com/AutoDruid/photon-parser/internal/errors" +) + +// ReadInt8 reads an 8-bit signed integer from the reader. +// Returns an error if fewer than 1 byte is available. +func (r *Reader) ReadInt8() (int8, error) { + size := r.Cursor + INT8_SIZE + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesInt8 + } + + b := r.Buffer[r.Cursor:size] + r.Cursor += INT8_SIZE + return int8(b[0]), nil +} + +// ReadUInt8 reads an 8-bit unsigned integer from the reader. +// Returns an error if fewer than 1 byte is available. +func (r *Reader) ReadUInt8() (uint8, error) { + size := r.Cursor + INT8_SIZE + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesUInt8 + } + + b := r.Buffer[r.Cursor:size] + r.Cursor += INT8_SIZE + return uint8(b[0]), nil +} + +// ReadInt16BE reads a 16-bit signed integer from the reader in big endian byte order. +// Returns an error if fewer than 2 bytes are available. +func (r *Reader) ReadInt16BE() (int16, error) { + + size := r.Cursor + INT16_SIZE + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesInt16 + } + + b := r.Buffer[r.Cursor:size] + r.Cursor += INT16_SIZE + + return int16(binary.BigEndian.Uint16(b)), nil +} + +// ReadInt16LE reads a 16-bit signed integer from the reader in little endian byte order. +// Returns an error if fewer than 2 bytes are available. +func (r *Reader) ReadInt16LE() (int16, error) { + + size := r.Cursor + INT16_SIZE + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesInt16 + } + + b := r.Buffer[r.Cursor:size] + r.Cursor += INT16_SIZE + + return int16(binary.LittleEndian.Uint16(b)), nil +} + +// ReadUInt16BE reads a 16-bit unsigned integer from the reader in big endian byte order. +// Returns an error if fewer than 2 bytes are available. +func (r *Reader) ReadUInt16BE() (uint16, error) { + + size := r.Cursor + INT16_SIZE + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesUInt16 + } + + b := r.Buffer[r.Cursor:size] + r.Cursor += INT16_SIZE + + return binary.BigEndian.Uint16(b), nil +} + +// ReadUInt16LE reads a 16-bit unsigned integer from the reader in little endian byte order. +// Returns an error if fewer than 2 bytes are available. +func (r *Reader) ReadUInt16LE() (uint16, error) { + + size := r.Cursor + INT16_SIZE + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesUInt16 + } + + b := r.Buffer[r.Cursor:size] + r.Cursor += INT16_SIZE + + return binary.LittleEndian.Uint16(b), nil +} + +// ReadInt32BE reads a 32-bit signed integer from the reader in big endian byte order. +// Returns an error if fewer than 4 bytes are available. +func (r *Reader) ReadInt32BE() (int32, error) { + size := r.Cursor + INT32_SIZE + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesInt32 + } + + b := r.Buffer[r.Cursor:size] + r.Cursor += INT32_SIZE + + return int32(binary.BigEndian.Uint32(b)), nil +} + +// ReadInt32LE reads a 32-bit signed integer from the reader in little endian byte order. +// Returns an error if fewer than 4 bytes are available. +func (r *Reader) ReadInt32LE() (int32, error) { + size := r.Cursor + INT32_SIZE + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesInt32 + } + + b := r.Buffer[r.Cursor:size] + r.Cursor += INT32_SIZE + + return int32(binary.LittleEndian.Uint32(b)), nil +} + +// ReadUInt32BE reads a 32-bit unsigned integer from the reader in big endian byte order. +// Returns an error if fewer than 4 bytes are available. +func (r *Reader) ReadUInt32BE() (uint32, error) { + size := r.Cursor + INT32_SIZE + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesUInt32 + } + + b := r.Buffer[r.Cursor:size] + r.Cursor += INT32_SIZE + + return binary.BigEndian.Uint32(b), nil +} + +// ReadUInt32LE reads a 32-bit unsigned integer from the reader in little endian byte order. +// Returns an error if fewer than 4 bytes are available. +func (r *Reader) ReadUInt32LE() (uint32, error) { + size := r.Cursor + INT32_SIZE + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesUInt32 + } + + b := r.Buffer[r.Cursor:size] + r.Cursor += INT32_SIZE + + return binary.LittleEndian.Uint32(b), nil +} + +// ReadInt64BE reads a 64-bit signed integer from the reader in big endian byte order. +// Returns an error if fewer than 8 bytes are available. +func (r *Reader) ReadInt64BE() (int64, error) { + size := r.Cursor + INT64_SIZE + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesInt64 + } + + b := r.Buffer[r.Cursor:size] + r.Cursor += INT64_SIZE + + return int64(binary.BigEndian.Uint64(b)), nil +} + +// ReadInt64LE reads a 64-bit signed integer from the reader in little endian byte order. +// Returns an error if fewer than 8 bytes are available. +func (r *Reader) ReadInt64LE() (int64, error) { + size := r.Cursor + INT64_SIZE + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesInt64 + } + + b := r.Buffer[r.Cursor:size] + r.Cursor += INT64_SIZE + + return int64(binary.LittleEndian.Uint64(b)), nil +} + +// ReadUInt64BE reads a 64-bit unsigned integer from the reader in big endian byte order. +// Returns an error if fewer than 8 bytes are available. +func (r *Reader) ReadUInt64BE() (uint64, error) { + size := r.Cursor + INT64_SIZE + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesUInt64 + } + + b := r.Buffer[r.Cursor:size] + r.Cursor += INT64_SIZE + return binary.BigEndian.Uint64(b), nil +} + +// ReadUInt64LE reads a 64-bit unsigned integer from the reader in little endian byte order. +// Returns an error if fewer than 8 bytes are available. +func (r *Reader) ReadUInt64LE() (uint64, error) { + size := r.Cursor + INT64_SIZE + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesUInt64 + } + + b := r.Buffer[r.Cursor:size] + r.Cursor += INT64_SIZE + return binary.LittleEndian.Uint64(b), nil +} + +// ReadFloat32BE reads a 32-bit floating point number from the reader in big endian byte order. +// Returns an error if fewer than 4 bytes are available. +func (r *Reader) ReadFloat32BE() (float32, error) { + size := r.Cursor + FLOAT32_SIZE + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesFloat32 + } + + b := r.Buffer[r.Cursor:size] + r.Cursor += FLOAT32_SIZE + + return math.Float32frombits(binary.BigEndian.Uint32(b)), nil +} + +// ReadFloat32LE reads a 32-bit floating point number from the reader in little endian byte order. +// Returns an error if fewer than 4 bytes are available. +func (r *Reader) ReadFloat32LE() (float32, error) { + size := r.Cursor + FLOAT32_SIZE + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesFloat32 + } + + b := r.Buffer[r.Cursor:size] + r.Cursor += FLOAT32_SIZE + + return math.Float32frombits(binary.LittleEndian.Uint32(b)), nil +} + +// ReadFloat64BE reads a 64-bit floating point number from the reader in big endian byte order. +// Returns an error if fewer than 8 bytes are available. +func (r *Reader) ReadFloat64BE() (float64, error) { + size := r.Cursor + FLOAT64_SIZE + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesFloat64 + } + + b := r.Buffer[r.Cursor:size] + r.Cursor += INT64_SIZE + + return math.Float64frombits(binary.BigEndian.Uint64(b)), nil +} + +// ReadFloat64LE reads a 64-bit floating point number from the reader in little endian byte order. +// Returns an error if fewer than 8 bytes are available. +func (r *Reader) ReadFloat64LE() (float64, error) { + size := r.Cursor + FLOAT64_SIZE + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesFloat64 + } + + b := r.Buffer[r.Cursor:size] + r.Cursor += INT64_SIZE + + return math.Float64frombits(binary.LittleEndian.Uint64(b)), nil +} + +// ReadBoolean reads a boolean value from the reader. +// Format: single byte (0x00 = false, 0x01 = true). +// Returns an error if the value is not 0x00 or 0x01, or if no byte is available. +func (r *Reader) ReadBoolean() (bool, error) { + bit, err := r.ReadUInt8() + + if err != nil { + return false, err + } + + if bit == 0 { + return false, nil + } + + if bit == 1 { + return true, nil + } + + return false, errors.ErrInvalidBooleanValue +} + +// ReadString reads a string of n size from the reader. +// Returns an empty string if length is 0. +// Returns an error if the declared length cannot be fully read. +func (r *Reader) ReadString(n int) (string, error) { + size := r.Cursor + n + + if size > r.Max { + return "", errors.ErrNotEnoughBytesString + } + + str := string(r.Buffer[r.Cursor:size]) + r.Cursor = size + + return str, nil +} + +// ReadByte reads a single byte from the reader. +// Returns an error if fewer than 1 byte is available. +func (r *Reader) ReadByte() (byte, error) { + + size := r.Cursor + 1 + + if size > r.Max { + return 0, errors.ErrNotEnoughBytesByte + } + + c := r.Buffer[r.Cursor] + r.Cursor++ + return c, nil +} + +// ReadBytes reads a []bytes of n size from the reader. +// Returns an empty []bytes if length is 0. +// Returns an error if the declared length cannot be fully read. +func (r *Reader) ReadBytes(n int) ([]byte, error) { + + size := r.Cursor + n + + if size > r.Max { + return []byte{}, errors.ErrNotEnoughBytesBytes + } + + buff := r.Buffer[r.Cursor:size] + r.Cursor += n + return buff, nil +} diff --git a/internal/reader/varint.go b/internal/reader/varint.go new file mode 100644 index 0000000..9902095 --- /dev/null +++ b/internal/reader/varint.go @@ -0,0 +1,71 @@ +package reader + +// ReadVarintUInt32 reads a 32-bit unsigned integer from the reader in varint format. +func (r *Reader) ReadVarintUInt32() (uint32, error) { + + var res uint32 + var shift uint8 + for { + + buff, err := r.ReadByte() + if err != nil { + return 0, err + } + + res |= uint32(buff&VARINT_MASK) << shift + + if buff&VARINT_MSB_MASK == 0 { + break + } + shift += VARINT_SHIFT + } + + return res, nil +} + +// ReadVarintInt32 reads a 32-bit signed integer from the reader in varint format. +func (r *Reader) ReadVarintInt32() (int32, error) { + + res, err := r.ReadVarintUInt32() + if err != nil { + return 0, err + } + + //ZigZag decode + return int32((res >> 1) ^ uint32(-(int32(res & 1)))), nil +} + +// ReadVarintUInt64 reads a 64-bit unsigned integer from the reader in varint format. +func (r *Reader) ReadVarintUInt64() (uint64, error) { + + var res uint64 + var shift uint8 + for { + + buff, err := r.ReadByte() + if err != nil { + return 0, err + } + + res |= uint64(buff&VARINT_MASK) << shift + + if buff&VARINT_MSB_MASK == 0 { + break + } + shift += VARINT_SHIFT + } + + return res, nil +} + +// ReadVarintInt64 reads a 64-bit signed integer from the reader in varint format. +func (r *Reader) ReadVarintInt64() (int64, error) { + + res, err := r.ReadVarintUInt64() + if err != nil { + return 0, err + } + + //ZigZag decode + return int64((res >> 1) ^ uint64(-(int64(res & 1)))), nil +} diff --git a/internal/session/session.go b/internal/session/session.go index 51ad168..27dbacb 100644 --- a/internal/session/session.go +++ b/internal/session/session.go @@ -14,27 +14,22 @@ import ( "github.com/AutoDruid/photon-parser/internal/types" ) -type Session[P types.ParameterView] struct { - types.Session[P] -} - -// Parse parses a Photon session packet from a parser.Reader. +// ParseInto parses a Photon session packet from a parser.Reader. // This function reads the session header, then iterates through and parses // each command as specified by the CommandCount field. // -// Returns a Session struct with all fields populated including the Commands slice, -// or an error if any part of parsing fails. -func Parse[P types.ParameterView](ctx *context.Context[P], out *types.Session[P]) error { - err := parseHeader(out, ctx.Reader) +// Returns an error if any part of parsing fails. +func ParseInto[P types.ParameterView](ctx *context.Context[P], dest *types.Session[P]) error { + err := readSessionHeaderInto(ctx.Reader, dest) if err != nil { return err } - items := ctx.PoolCommand.Get(int(out.CommandCount)) - out.Commands = items.Items + items := ctx.PoolCommand.Get(int(dest.CommandCount)) + dest.Commands = items.Items - for i := uint8(0); i < out.CommandCount; i++ { - err := command.Parse(ctx, &out.Commands[i]) + for i := uint8(0); i < dest.CommandCount; i++ { + err := command.ParseInto(ctx, &dest.Commands[i]) if errors.Is(err, photonErrors.ErrHeaderSize) { break @@ -43,42 +38,42 @@ func Parse[P types.ParameterView](ctx *context.Context[P], out *types.Session[P] return err } - if out.Commands[i].Type > types.SendReliableFragmentCommand { + if dest.Commands[i].Type > types.SendReliableFragmentCommand { break } } - emit(ctx.Hooks, out) + emit(ctx.Hooks, dest) ctx.PoolCommand.Put(items) return nil } -func parseHeader[P types.ParameterView](out *types.Session[P], r *reader.Reader) error { +func readSessionHeaderInto[P types.ParameterView](r *reader.Reader, dest *types.Session[P]) error { var err error - out.PeerID, err = r.ReadUInt16BE() + dest.PeerID, err = r.ReadUInt16BE() if err != nil { return err } - out.CRCEnabled, err = r.ReadUInt8() + dest.CRCEnabled, err = r.ReadUInt8() if err != nil { return err } - out.CommandCount, err = r.ReadUInt8() + dest.CommandCount, err = r.ReadUInt8() if err != nil { return err } - out.Timestamp, err = r.ReadUInt32BE() + dest.Timestamp, err = r.ReadUInt32BE() if err != nil { return err } - out.Challenge, err = r.ReadInt32BE() + dest.Challenge, err = r.ReadInt32BE() if err != nil { return err } @@ -86,13 +81,13 @@ func parseHeader[P types.ParameterView](out *types.Session[P], r *reader.Reader) return nil } -func emit[P types.ParameterView](hooks *hooks.Hooks[P], out *types.Session[P]) { +func emit[P types.ParameterView](hooks *hooks.Hooks[P], dest *types.Session[P]) { if hooks == nil { return } if hooks.SyncHooks.OnSession != nil { - hooks.SyncHooks.OnSession(*out) + hooks.SyncHooks.OnSession(*dest) } if hooks.AsyncHooks.OnSession == nil { @@ -100,7 +95,7 @@ func emit[P types.ParameterView](hooks *hooks.Hooks[P], out *types.Session[P]) { } select { - case hooks.AsyncHooks.OnSession <- *out: + case hooks.AsyncHooks.OnSession <- *dest: default: } } diff --git a/internal/session/session_test.go b/internal/session/session_test.go index 8645377..217b530 100644 --- a/internal/session/session_test.go +++ b/internal/session/session_test.go @@ -32,7 +32,7 @@ func TestParseSessionv16(t *testing.T) { ) var sess types.Session[v16.Parameter] - err := session.Parse(ctx, &sess) + err := session.ParseInto(ctx, &sess) if err != nil { t.Fatalf("error parsing session: %v", err) @@ -78,7 +78,7 @@ func TestParseSessionv18(t *testing.T) { ) var sess types.Session[v18.Parameter] - err := session.Parse(ctx, &sess) + err := session.ParseInto(ctx, &sess) if err != nil { t.Fatalf("error parsing session: %v", err) @@ -109,7 +109,7 @@ func TestParseSessionv18(t *testing.T) { } } -func TestMalFormedHeader(t *testing.T) { +func TestWrongHeader(t *testing.T) { payload := []byte{0x0, 0x0} @@ -121,10 +121,10 @@ func TestMalFormedHeader(t *testing.T) { ) var sess types.Session[v18.Parameter] - err := session.Parse(ctx, &sess) + err := session.ParseInto(ctx, &sess) if err == nil { - t.Fatalf("error parsing session should be error") + t.Fatalf("parsing session header should fail") } } diff --git a/internal/types/command.go b/internal/types/command.go index b21472c..92169ea 100644 --- a/internal/types/command.go +++ b/internal/types/command.go @@ -1,49 +1,44 @@ package types -// Type represents a Photon Protocol command type. +// CommandType represents a Photon Protocol command type. type CommandType uint8 -// Photon Protocol command types. -// These define the various operations that can be performed in a Photon session. const ( - AcknowledgeCommand CommandType = 0x01 // Acknowledges receipt of reliable commands - ConnectCommand CommandType = 0x02 // Initiates a connection - VerifyConnectCommand CommandType = 0x03 // Verifies connection establishment - DisconnectCommand CommandType = 0x04 // Gracefully closes a connection - PingCommand CommandType = 0x05 // Keep-alive ping message - SendReliableCommand CommandType = 0x06 // Sends reliable data (guaranteed delivery) - SendUnreliableCommand CommandType = 0x07 // Sends unreliable data (best effort) - SendReliableFragmentCommand CommandType = 0x08 // Sends a fragment of a large reliable message + AcknowledgeCommand CommandType = 0x01 + ConnectCommand CommandType = 0x02 + VerifyConnectCommand CommandType = 0x03 + DisconnectCommand CommandType = 0x04 + PingCommand CommandType = 0x05 + SendReliableCommand CommandType = 0x06 + SendUnreliableCommand CommandType = 0x07 + SendReliableFragmentCommand CommandType = 0x08 ) // COMMAND_HEADER_SIZE is the size in bytes of a command header (12 bytes). const COMMAND_HEADER_SIZE = 12 -// Header represents the command header containing command metadata. -// This header appears at the start of every command within a session. type CommandHeader struct { - Type CommandType `json:"type"` // Command type (see Type constants) - ChannelID uint8 `json:"channel_id"` // Channel identifier for message ordering - Flags uint8 `json:"flags"` // Command flags (implementation-specific) - ReservedByte uint8 `json:"reserved_byte"` // Reserved for future use - Length uint32 `json:"length"` // Total length of command including header - ReliableSequenceNumber uint32 `json:"reliable_sequence_number"` // Sequence number for reliable delivery + Type CommandType `json:"type"` + ChannelID uint8 `json:"channel_id"` + Flags uint8 `json:"flags"` + ReservedByte uint8 `json:"reserved_byte"` + Length uint32 `json:"length"` + ReliableSequenceNumber uint32 `json:"reliable_sequence_number"` } -// Command represents a complete Photon command with its header and payload data. -// The Data field contains the command-specific payload, which may be empty -// for some command types (e.g., Acknowledge, Ping). +// Command represents a Photon command with its header and payload data. +// To gain in performance we use a union of single struct for all command types. type Command[P ParameterView] struct { CommandHeader `json:"header"` - UnreliablePayload Reliable[P] `json:"unreliable_payload"` - ReliablePayload Reliable[P] `json:"reliable_payload"` - ReliableFragmentPayload Fragment `json:"reliable_fragment_payload"` - AcknowledgePayload Acknowledge `json:"acknowledge_payload"` - ConnectPayload Connect `json:"connect_payload"` - UnknownPayload - PingPayload struct{} `json:"ping_payload"` - DisconnectPayload struct{} `json:"disconnect_payload"` + UnreliablePayload Reliable[P] `json:"unreliable_payload"` + ReliablePayload Reliable[P] `json:"reliable_payload"` + ReliableFragmentPayload Fragment `json:"reliable_fragment_payload"` + AcknowledgePayload Acknowledge `json:"acknowledge_payload"` + ConnectPayload Connect `json:"connect_payload"` + UnknownPayload UnknownPayload `json:"unknown_payload"` + PingPayload struct{} `json:"ping_payload"` + DisconnectPayload struct{} `json:"disconnect_payload"` } type Connect struct { @@ -67,6 +62,7 @@ type UnknownPayload struct { Kind CommandType `json:"kind"` } +// Some commands data are fragmented, this struct represents the fragment metadata. type Fragment struct { ID uint32 `json:"id"` Count uint32 `json:"count"` @@ -76,26 +72,21 @@ type Fragment struct { Data []byte `json:"data"` } -// Type represents a Photon reliable message type. -type Type uint8 +type MessageType uint8 -// Photon Protocol reliable message types. -// These define the different kinds of reliable messages that can be exchanged. const ( - OperationRequest Type = 0x02 // Client requests an operation - OperationResponse Type = 0x07 // Server responds to an operation - OtherOperationResponse Type = 0x03 // Alternative response format - EventDataType Type = 0x04 // Server sends an event to client - ExchangeKeys Type = 0x06 // Key exchange for encryption + OperationRequest MessageType = 0x02 // Client requests an operation + OperationResponse MessageType = 0x07 // Server responds to an operation + OtherOperationResponse MessageType = 0x03 // Alternative response format + EventDataType MessageType = 0x04 // Server sends an event to client + ExchangeKeys MessageType = 0x06 // Key exchange for encryption ) -// ReliableHeader represents the reliable message header. -// This appears at the start of the payload in SendReliable commands. type ReliableHeader struct { - Signature uint8 `json:"signature"` // Message signature (typically 0xF3) - Type Type `json:"type"` // Message type (operation, event, etc.) - EventCode uint8 `json:"event_code"` // Operation/event code (application-specific) - ParameterCount int `json:"parameter_count"` // Number of parameters following this header + Signature uint8 `json:"signature"` // Message signature (typically 0xF3) + Type MessageType `json:"type"` // Message type (operation, event, etc.) + EventCode uint8 `json:"event_code"` // Operation/event code (application-specific) + ParameterCount int `json:"parameter_count"` // Number of parameters following this header } type Reliable[P ParameterView] struct { diff --git a/internal/types/hooks.go b/internal/types/hooks.go index f21b985..31465ae 100644 --- a/internal/types/hooks.go +++ b/internal/types/hooks.go @@ -3,7 +3,7 @@ package types type SyncHooks[P ParameterView] struct { OnSession func(Session[P]) OnCommand func(Command[P]) - OnEvents map[Type]func(Reliable[P]) + OnEvents map[MessageType]func(Reliable[P]) OnParameter func(P) } diff --git a/internal/types/session.go b/internal/types/session.go index af29d84..d923225 100644 --- a/internal/types/session.go +++ b/internal/types/session.go @@ -1,8 +1,6 @@ package types -// Header represents the Photon session header containing peer and timing information. -// This header appears at the start of every Photon packet. -type Header struct { +type SessionHeader struct { PeerID uint16 `json:"peer_id"` // Peer identifier for this connection CRCEnabled uint8 `json:"crc_enabled"` // CRC checksum flag (0 = disabled, 1 = enabled) CommandCount uint8 `json:"command_count"` // Number of commands following this header @@ -13,6 +11,6 @@ type Header struct { // Session represents a complete Photon session packet with its header and commands. // A session packet can contain multiple commands that will be processed sequentially. type Session[P ParameterView] struct { - Header `json:"header"` - Commands []Command[P] `json:"commands"` + SessionHeader `json:"header"` + Commands []Command[P] `json:"commands"` } diff --git a/parser.go b/parser.go index f2935a7..af58198 100644 --- a/parser.go +++ b/parser.go @@ -81,7 +81,7 @@ func (p *Parser[P]) ParsePacketInto(data []byte, sess *Session[P]) error { p.ctx.Reader.Reset(data) - err := session.Parse(p.ctx, sess) + err := session.ParseInto(p.ctx, sess) if err != nil { return err } diff --git a/parser_test.go b/parser_test.go index 22c35a3..4891e28 100644 --- a/parser_test.go +++ b/parser_test.go @@ -187,10 +187,6 @@ func TestParserOnASinglePacketVersion18(t *testing.T) { session := photon.Session[v18.Parameter]{} - parser.OnCommandSync(func(command photon.Command[v18.Parameter]) { - t.Log(command.Kind) - }) - err = parser.ParsePacketInto(payload, &session) if err != nil { t.Fatalf("error: %v", err)