@@ -2892,6 +2892,127 @@ func TestExtractBaggagePropagatorMalformedHeader(t *testing.T) {
28922892 })
28932893}
28942894
2895+ func TestExtractBaggagePropagatorMaxItems (t * testing.T ) {
2896+ tracer , err := newTracer ()
2897+ assert .NoError (t , err )
2898+ defer tracer .Stop ()
2899+
2900+ var b strings.Builder
2901+ for i := range baggageMaxItems + 5 {
2902+ if i > 0 {
2903+ b .WriteByte (',' )
2904+ }
2905+ iStr := strconv .Itoa (i )
2906+ b .WriteString ("key" + iStr + "=val" + iStr )
2907+ }
2908+
2909+ headers := TextMapCarrier {
2910+ DefaultTraceIDHeader : "4" ,
2911+ DefaultParentIDHeader : "1" ,
2912+ DefaultBaggageHeader : b .String (),
2913+ }
2914+ s , err := tracer .Extract (headers )
2915+ assert .NoError (t , err )
2916+
2917+ got := make (map [string ]string )
2918+ s .ForeachBaggageItem (func (k , v string ) bool {
2919+ got [k ] = v
2920+ return true
2921+ })
2922+ assert .Len (t , got , baggageMaxItems )
2923+ for i := range baggageMaxItems {
2924+ iStr := strconv .Itoa (i )
2925+ assert .Equal (t , "val" + iStr , got ["key" + iStr ])
2926+ }
2927+ for i := baggageMaxItems ; i < baggageMaxItems + 5 ; i ++ {
2928+ iStr := strconv .Itoa (i )
2929+ _ , present := got ["key" + iStr ]
2930+ assert .False (t , present , "key%s should not be present" , iStr )
2931+ }
2932+ }
2933+
2934+ func TestExtractBaggagePropagatorMaxBytes (t * testing.T ) {
2935+ tracer , err := newTracer ()
2936+ assert .NoError (t , err )
2937+ defer tracer .Stop ()
2938+
2939+ // 12 items, each "keyN=" + 1000 'a's = 1005 wire bytes. Including comma
2940+ // separators, the first 8 fit under baggageMaxBytes (8192); the 9th would
2941+ // push the running total to 9053 > 8192, so items 8..11 are dropped.
2942+ const itemValLen = 1000
2943+ const numItems = 12
2944+ const expectedKept = 8
2945+ val := strings .Repeat ("a" , itemValLen )
2946+
2947+ var b strings.Builder
2948+ for i := range numItems {
2949+ if i > 0 {
2950+ b .WriteByte (',' )
2951+ }
2952+ b .WriteString ("key" + strconv .Itoa (i ) + "=" + val )
2953+ }
2954+
2955+ headers := TextMapCarrier {
2956+ DefaultTraceIDHeader : "4" ,
2957+ DefaultParentIDHeader : "1" ,
2958+ DefaultBaggageHeader : b .String (),
2959+ }
2960+ s , err := tracer .Extract (headers )
2961+ assert .NoError (t , err )
2962+
2963+ got := make (map [string ]string )
2964+ s .ForeachBaggageItem (func (k , v string ) bool {
2965+ got [k ] = v
2966+ return true
2967+ })
2968+ assert .Len (t , got , expectedKept )
2969+ for i := range expectedKept {
2970+ assert .Equal (t , val , got ["key" + strconv .Itoa (i )])
2971+ }
2972+ for i := expectedKept ; i < numItems ; i ++ {
2973+ _ , present := got ["key" + strconv .Itoa (i )]
2974+ assert .False (t , present , "key%d should not be present" , i )
2975+ }
2976+ }
2977+
2978+ func TestExtractBaggagePropagatorMalformedPastLimit (t * testing.T ) {
2979+ tracer , err := newTracer ()
2980+ assert .NoError (t , err )
2981+ defer tracer .Stop ()
2982+
2983+ // baggageMaxItems valid entries followed by a malformed entry. Because
2984+ // the malformed entry sits past the items limit it is never inspected,
2985+ // so the valid prefix is kept (regression check on the single-pass design).
2986+ var b strings.Builder
2987+ for i := range baggageMaxItems {
2988+ if i > 0 {
2989+ b .WriteByte (',' )
2990+ }
2991+ iStr := strconv .Itoa (i )
2992+ b .WriteString ("key" + iStr + "=val" + iStr )
2993+ }
2994+ b .WriteString (",malformed_no_equals_sign" )
2995+
2996+ headers := TextMapCarrier {
2997+ DefaultTraceIDHeader : "4" ,
2998+ DefaultParentIDHeader : "1" ,
2999+ DefaultBaggageHeader : b .String (),
3000+ }
3001+ s , err := tracer .Extract (headers )
3002+ assert .NoError (t , err )
3003+
3004+ got := make (map [string ]string )
3005+ s .ForeachBaggageItem (func (k , v string ) bool {
3006+ got [k ] = v
3007+ return true
3008+ })
3009+ assert .Len (t , got , baggageMaxItems )
3010+ for i := range baggageMaxItems {
3011+ iStr := strconv .Itoa (i )
3012+ assert .Equal (t , "val" + iStr , got ["key" + iStr ])
3013+ }
3014+ }
3015+
28953016func TestExtractOnlyBaggage (t * testing.T ) {
28963017 t .Setenv ("DD_TRACE_PROPAGATION_STYLE" , "baggage" )
28973018 headers := TextMapCarrier (map [string ]string {
0 commit comments