@@ -39,9 +39,70 @@ describe('TraceState', () => {
3939 assert . deepStrictEqual ( state . serialize ( ) , 'a=1' ) ;
4040 assert . strictEqual ( orgState . serialize ( ) , 'c=4,b=3,a=1' ) ;
4141 } ) ;
42+
43+ it ( 'must not create a new TraceState when the entry does not exist' , ( ) => {
44+ const orgState = new TraceState ( 'c=4,b=3,a=1' ) ;
45+ const state = orgState . unset ( 'd' ) ;
46+ assert . strictEqual ( orgState , state ) ;
47+ assert . deepStrictEqual ( orgState . serialize ( ) , 'c=4,b=3,a=1' ) ;
48+ } ) ;
49+
50+ describe ( 'when adding a new list member' , ( ) => {
51+ it ( 'must not create a new TraceState if the value is to long' , ( ) => {
52+ const orgState = new TraceState ( 'a=1,b=2' ) ;
53+ const state = orgState . set ( 'c' , '3' . repeat ( 257 ) ) ;
54+ assert . strictEqual ( orgState , state ) ;
55+ assert . deepStrictEqual ( orgState . serialize ( ) , 'a=1,b=2' ) ;
56+ } ) ;
57+
58+ it ( 'must not create a new TraceState if makes exceed the total limit' , ( ) => {
59+ const tracestate = 'a=' + '1' . repeat ( 200 ) + ',b=' + '2' . repeat ( 200 ) ;
60+ const orgState = new TraceState ( tracestate ) ;
61+ const state = orgState . set ( 'c' , '3' . repeat ( 200 ) ) ; // this makes it exceed 512
62+ assert . strictEqual ( orgState , state ) ;
63+ assert . deepStrictEqual ( orgState . serialize ( ) , tracestate ) ;
64+ } ) ;
65+ } ) ;
66+
67+ describe ( 'when updating a list member' , ( ) => {
68+ it ( 'must not create a new TraceState if the value is to long' , ( ) => {
69+ const orgState = new TraceState ( 'a=1,b=2' ) ;
70+ const state = orgState . set ( 'b' , '3' . repeat ( 257 ) ) ;
71+ assert . strictEqual ( orgState , state ) ;
72+ assert . deepStrictEqual ( orgState . serialize ( ) , 'a=1,b=2' ) ;
73+ } ) ;
74+
75+ it ( 'must not create a new TraceState if makes exceed the total limit' , ( ) => {
76+ const tracestate = 'a=' + '1' . repeat ( 200 ) + ',b=' + '2' . repeat ( 200 ) ;
77+ const orgState = new TraceState ( tracestate ) ;
78+ const state = orgState . set ( 'c' , '3' . repeat ( 200 ) ) ; // this makes it exceed 512
79+ assert . strictEqual ( orgState , state ) ;
80+ assert . deepStrictEqual ( orgState . serialize ( ) , tracestate ) ;
81+ } ) ;
82+ } ) ;
4283 } ) ;
4384
4485 describe ( '.parse()' , ( ) => {
86+ it ( 'must remove invalid entries when serializing' , ( ) => {
87+ // valid
88+ let tracestate = 'a=1' ;
89+ let state = new TraceState ( tracestate ) ;
90+ assert . deepStrictEqual ( state . serialize ( ) , tracestate ) ;
91+
92+ // invalid: value exceeds 256 chars
93+ tracestate = 'a=' + 'b' . repeat ( 512 ) ;
94+ state = new TraceState ( tracestate ) ;
95+ assert . deepStrictEqual ( state . serialize ( ) , '' ) ;
96+
97+ // invalid: too many entries
98+ tracestate = new Array ( 32 )
99+ . fill ( 0 )
100+ . map ( ( _ : null , num : number ) => `a${ num } =${ num } ` )
101+ . join ( ',' ) ;
102+ state = new TraceState ( tracestate + ',a32=32' ) ;
103+ assert . deepStrictEqual ( state . serialize ( ) , tracestate ) ;
104+ } ) ;
105+
45106 it ( 'must successfully parse valid state value' , ( ) => {
46107 const state = new TraceState (
47108 'vendorname2=opaqueValue2,vendorname1=opaqueValue1'
@@ -60,17 +121,25 @@ describe('TraceState', () => {
60121 assert . deepStrictEqual ( state . serialize ( ) , '' ) ;
61122 } ) ;
62123
63- it ( 'must drop states which cannot be parsed' , ( ) => {
124+ it ( 'must skip list-members when the value is too long' , ( ) => {
125+ const state = new TraceState ( 'a=' + 'b' . repeat ( 512 ) + ',c=d' ) ;
126+ assert . deepStrictEqual ( state . get ( 'a' ) , undefined ) ;
127+ assert . deepStrictEqual ( state . get ( 'c' ) , 'd' ) ;
128+ assert . deepStrictEqual ( state . serialize ( ) , 'c=d' ) ;
129+ } ) ;
130+
131+ it ( 'must skip list-members that cannot be parsed' , ( ) => {
64132 const state = new TraceState ( 'a=1,b,c=3' ) ;
65133 assert . deepStrictEqual ( state . get ( 'a' ) , '1' ) ;
66134 assert . deepStrictEqual ( state . get ( 'b' ) , undefined ) ;
67135 assert . deepStrictEqual ( state . get ( 'c' ) , '3' ) ;
68136 assert . deepStrictEqual ( state . serialize ( ) , 'a=1,c=3' ) ;
69137 } ) ;
70138
71- it ( 'must skip states that only have a single value with an equal sign' , ( ) => {
72- const state = new TraceState ( 'a=1=' ) ;
139+ it ( 'must skip list-members that only have a single value with an equal sign' , ( ) => {
140+ const state = new TraceState ( 'a=1=,b=2 ' ) ;
73141 assert . deepStrictEqual ( state . get ( 'a' ) , undefined ) ;
142+ assert . deepStrictEqual ( state . get ( 'b' ) , '2' ) ;
74143 } ) ;
75144
76145 it ( 'must successfully parse valid state keys' , ( ) => {
@@ -88,20 +157,23 @@ describe('TraceState', () => {
88157 } ) ;
89158
90159 it ( 'must truncate states with too many items' , ( ) => {
91- const state = new TraceState (
92- new Array ( 33 )
93- . fill ( 0 )
94- . map ( ( _ : null , num : number ) => `a${ num } =${ num } ` )
95- . join ( ',' )
96- ) ;
97- assert . deepStrictEqual ( state [ '_keys' ] ( ) . length , 32 ) ;
98- assert . deepStrictEqual ( state . get ( 'a0' ) , '0' ) ;
99- assert . deepStrictEqual ( state . get ( 'a31' ) , '31' ) ;
100- assert . deepStrictEqual (
101- state . get ( 'a32' ) ,
102- undefined ,
103- 'should truncate from the tail'
104- ) ;
160+ const tracestate = new Array ( 33 )
161+ . fill ( 0 )
162+ . map ( ( _ : null , num : number ) => `a${ num } =${ num } ` ) ;
163+ const state = new TraceState ( tracestate . join ( ',' ) ) ;
164+
165+ tracestate . forEach ( ( member , index ) => {
166+ const [ key , value ] = member . split ( '=' ) ;
167+ if ( index < 32 ) {
168+ assert . deepStrictEqual ( state . get ( key ) , value ) ;
169+ } else {
170+ assert . deepStrictEqual (
171+ state . get ( key ) ,
172+ undefined ,
173+ 'should truncate from the tail'
174+ ) ;
175+ }
176+ } ) ;
105177 } ) ;
106178
107179 it ( 'should not count invalid items towards max limit' , ( ) => {
@@ -116,12 +188,13 @@ describe('TraceState', () => {
116188
117189 const state = new TraceState ( tracestate . join ( ',' ) ) ;
118190
119- assert . deepStrictEqual ( state [ '_keys' ] ( ) . length , 32 ) ;
120- assert . deepStrictEqual ( state . get ( 'a0' ) , '0' ) ;
121- assert . deepStrictEqual ( state . get ( 'a31' ) , '31' ) ;
191+ assert . deepStrictEqual ( state . get ( 'invalid.prefix.key' ) , undefined ) ;
122192 assert . deepStrictEqual ( state . get ( 'invalid.middle.key.a' ) , undefined ) ;
123193 assert . deepStrictEqual ( state . get ( 'invalid.middle.key.b' ) , undefined ) ;
124194 assert . deepStrictEqual ( state . get ( 'invalid.middle.key.c' ) , undefined ) ;
195+ for ( let i = 0 ; i < 32 ; i ++ ) {
196+ assert . deepStrictEqual ( state . get ( `a${ i } ` ) , `${ i } ` ) ;
197+ }
125198 } ) ;
126199 } ) ;
127200} ) ;
0 commit comments