@@ -44,8 +44,9 @@ func FuzzDecoder(f *testing.F) {
4444 EntryOrLine : output .Event (item ),
4545 ServiceName : "foo" ,
4646 }, & noopSymbolicator {}, []byte {})
47- require .Empty (t , decoder .entry .dataItems )
48- require .Empty (t , decoder .entry .currentlyEncoding )
47+ require .Empty (t , decoder .entryOrLine .dataItems )
48+ require .Empty (t , decoder .entryOrLine .currentlyEncoding )
49+ require .Empty (t , decoder ._return .dataItems )
4950 })
5051}
5152
@@ -58,7 +59,10 @@ type (
5859 Message string `json:"message"`
5960 } `json:"evaluationErrors,omitempty"`
6061 }
61- eventCaptures struct { Debugger debugger }
62+ eventCaptures struct {
63+ Debugger debugger
64+ Message string `json:"message,omitempty"`
65+ }
6266)
6367
6468// TestDecoderManually is a test that manually constructs an event and decodes
@@ -81,11 +85,14 @@ func TestDecoderManually(t *testing.T) {
8185 var e eventCaptures
8286 require .NoError (t , json .Unmarshal (buf , & e ))
8387 require .Equal (t , c .expected , e .Debugger .Snapshot .Captures .Entry .Arguments )
84- require .Empty (t , decoder .entry .dataItems )
85- require .Empty (t , decoder .entry .currentlyEncoding )
86- require .Nil (t , decoder .entry .rootType )
87- require .Nil (t , decoder .entry .rootData )
88- require .Zero (t , decoder .entry .evaluationErrors )
88+ if c .expectedMessage != "" {
89+ require .Equal (t , c .expectedMessage , e .Message )
90+ }
91+ require .Empty (t , decoder .entryOrLine .dataItems )
92+ require .Empty (t , decoder .entryOrLine .currentlyEncoding )
93+ require .Nil (t , decoder .entryOrLine .rootType )
94+ require .Nil (t , decoder .entryOrLine .rootData )
95+ require .Zero (t , decoder .entryOrLine .evaluationErrors )
8996 require .Zero (t , decoder .snapshotMessage )
9097 })
9198 }
@@ -115,28 +122,33 @@ type testCase struct {
115122 probeName string
116123 eventConstructor func (testing.TB , * ir.Program ) []byte
117124 expected any
125+ expectedMessage string
118126}
119127
120128var cases = []testCase {
121129 {
122130 probeName : "stringArg" ,
123131 eventConstructor : simpleStringArgEvent ,
124132 expected : simpleStringArgExpected ,
133+ expectedMessage : "s: abcdefghijklmnop" ,
125134 },
126135 {
127136 probeName : "mapArg" ,
128137 eventConstructor : simpleMapArgEvent ,
129138 expected : simpleMapArgExpected ,
139+ expectedMessage : "m: map[a: 1]" ,
130140 },
131141 {
132142 probeName : "bigMapArg" ,
133143 eventConstructor : simpleBigMapArgEvent ,
134144 expected : simpleBigMapArgExpected ,
145+ expectedMessage : "m: map[b: {Field1: 1, Field2: 0, Field3: 0, Field4: 0, Field5: 0, ...}}]" ,
135146 },
136147 {
137148 probeName : "PointerChainArg" ,
138149 eventConstructor : simplePointerChainArgEvent ,
139150 expected : simplePointerChainArgExpected ,
151+ expectedMessage : "ptr: 17" ,
140152 },
141153}
142154
@@ -181,14 +193,14 @@ func simpleStringArgEvent(t testing.TB, irProg *ir.Program) []byte {
181193 }
182194 require .NotNil (t , stringType )
183195 require .NotNil (t , eventType )
184- require .Equal (t , uint32 (17 ), eventType .GetByteSize ())
196+ require .Equal (t , uint32 (33 ), eventType .GetByteSize ())
185197
186198 var item []byte
187199 eventHeader := output.EventHeader {
188200 Data_byte_len : uint32 (
189201 unsafe .Sizeof (output.EventHeader {}) +
190202 1 /* bitset */ + unsafe .Sizeof (output.DataItemHeader {}) +
191- 16 + 7 /* padding */ +
203+ 32 + 7 /* padding */ +
192204 unsafe .Sizeof (output.DataItemHeader {}) +
193205 16 ,
194206 ),
@@ -199,7 +211,7 @@ func simpleStringArgEvent(t testing.TB, irProg *ir.Program) []byte {
199211 }
200212 dataItem0 := output.DataItemHeader {
201213 Type : uint32 (eventType .GetID ()),
202- Length : 17 ,
214+ Length : 33 ,
203215 Address : 0 ,
204216 }
205217 dataItem1 := output.DataItemHeader {
@@ -213,7 +225,11 @@ func simpleStringArgEvent(t testing.TB, irProg *ir.Program) []byte {
213225 item = append (item , unsafe .Slice (
214226 (* byte )(unsafe .Pointer (& dataItem0 )), unsafe .Sizeof (dataItem0 ))... ,
215227 )
216- item = append (item , 1 ) // bitset
228+ item = append (item , 3 ) // bitset: bit 0 (argument) and bit 1 (template_segment) set
229+ // First expression (argument) at offset 1
230+ item = binary .NativeEndian .AppendUint64 (item , 0xdeadbeef )
231+ item = binary .NativeEndian .AppendUint64 (item , 16 )
232+ // Second expression (template_segment) at offset 17
217233 item = binary .NativeEndian .AppendUint64 (item , 0xdeadbeef )
218234 item = binary .NativeEndian .AppendUint64 (item , 16 )
219235 item = append (item , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) // padding
@@ -254,8 +270,8 @@ func simpleMapArgEvent(t testing.TB, irProg *ir.Program) []byte {
254270 )
255271
256272 require .NotNil (t , eventType )
257- // Expect exactly one expression for parameter 'm'
258- require .NotEmpty (t , eventType .Expressions )
273+ // Expect two expressions: argument and template_segment
274+ require .GreaterOrEqual (t , len ( eventType .Expressions ), 2 )
259275 paramType := eventType .Expressions [0 ].Expression .Type
260276 var ok bool
261277 mapParamType , ok = paramType .(* ir.GoMapType )
@@ -299,14 +315,18 @@ func simpleMapArgEvent(t testing.TB, irProg *ir.Program) []byte {
299315 strAddr = uint64 (0x300000003 )
300316 )
301317
302- // Build root data item (presence bitset + pointer to header)
318+ // Build root data item (presence bitset + pointers to header)
303319 rootData := make ([]byte , rootLen )
304- // Set presence bit for first expression
320+ // Set presence bits for both expressions ( bit 0 for argument, bit 1 for template_segment)
305321 if eventType .PresenceBitsetSize > 0 {
306- rootData [0 ] = 1
322+ rootData [0 ] = 3 // bits 0 and 1 set
307323 }
324+ // First expression (argument) at offset 1
308325 ptrOff := int (eventType .Expressions [0 ].Offset )
309326 binary .NativeEndian .PutUint64 (rootData [ptrOff :ptrOff + 8 ], headerAddr )
327+ // Second expression (template_segment) at offset 9
328+ templatePtrOff := int (eventType .Expressions [1 ].Offset )
329+ binary .NativeEndian .PutUint64 (rootData [templatePtrOff :templatePtrOff + 8 ], headerAddr )
310330
311331 // Build header bytes
312332 headerData := make ([]byte , headerLen )
@@ -503,11 +523,16 @@ func simpleBigMapArgEvent(t testing.TB, irProg *ir.Program) []byte {
503523 )
504524
505525 rootData := make ([]byte , rootLen )
526+ // Set presence bits for both expressions (bit 0 for argument, bit 1 for template_segment)
506527 if eventType .PresenceBitsetSize > 0 {
507- rootData [0 ] = 1
528+ rootData [0 ] = 3 // bits 0 and 1 set
508529 }
530+ // First expression (argument) at offset 1
509531 ptrOff := int (eventType .Expressions [0 ].Offset )
510532 binary .NativeEndian .PutUint64 (rootData [ptrOff :ptrOff + 8 ], headerAddr )
533+ // Second expression (template_segment) at offset 9
534+ templatePtrOff := int (eventType .Expressions [1 ].Offset )
535+ binary .NativeEndian .PutUint64 (rootData [templatePtrOff :templatePtrOff + 8 ], headerAddr )
511536
512537 headerData := make ([]byte , headerLen )
513538 binary .NativeEndian .PutUint64 (headerData [countOff :countOff + 8 ], 1 )
@@ -620,8 +645,9 @@ func simplePointerChainArgEvent(t testing.TB, irProg *ir.Program) []byte {
620645 eventType := events [0 ].Type
621646 rootLen := int (eventType .GetByteSize ())
622647 rootData := make ([]byte , rootLen )
648+ // Set presence bits for both expressions (bit 0 for argument, bit 1 for template_segment)
623649 if eventType .PresenceBitsetSize > 0 {
624- rootData [0 ] = 1
650+ rootData [0 ] = 3 // bits 0 and 1 set
625651 }
626652 // Build a fully captured pointer chain *****int → int(17)
627653 argType := eventType .Expressions [0 ].Expression .Type
@@ -645,9 +671,12 @@ func simplePointerChainArgEvent(t testing.TB, irProg *ir.Program) []byte {
645671 addr4 = uint64 (0xa0000004 )
646672 addr5 = uint64 (0xa0000005 )
647673 )
648- // Root data contains address of first pointer
674+ // First expression (argument) at offset 1: address of first pointer
649675 off := int (eventType .Expressions [0 ].Offset )
650676 binary .NativeEndian .PutUint64 (rootData [off :off + 8 ], addr1 )
677+ // Second expression (template_segment) at offset 9: same address
678+ templateOff := int (eventType .Expressions [1 ].Offset )
679+ binary .NativeEndian .PutUint64 (rootData [templateOff :templateOff + 8 ], addr1 )
651680
652681 // Helper to build a pointer data item (8-byte address payload)
653682 makePtrItem := func (tid ir.TypeID , addr uint64 , pointsTo uint64 ) (hdr output.DataItemHeader , data []byte ) {
0 commit comments