Skip to content

Commit 010ca4f

Browse files
authored
use subtests in the trace package (#2594)
1 parent 9f42a81 commit 010ca4f

1 file changed

Lines changed: 124 additions & 83 deletions

File tree

trace/tracestate_test.go

Lines changed: 124 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -26,74 +26,91 @@ import (
2626
// Taken from the W3C tests:
2727
// https://github.com/w3c/trace-context/blob/dcd3ad9b7d6ac36f70ff3739874b73c11b0302a1/test/test_data.json
2828
var testcases = []struct {
29+
name string
2930
in string
3031
tracestate TraceState
3132
out string
3233
err error
3334
}{
3435
{
35-
in: "foo=1,foo=1",
36-
err: errDuplicate,
36+
name: "duplicate with the same value",
37+
in: "foo=1,foo=1",
38+
err: errDuplicate,
3739
},
3840
{
39-
in: "foo=1,foo=2",
40-
err: errDuplicate,
41+
name: "duplicate with different values",
42+
in: "foo=1,foo=2",
43+
err: errDuplicate,
4144
},
4245
{
43-
in: "foo =1",
44-
err: errInvalidMember,
46+
name: "improperly formatted key/value pair",
47+
in: "foo =1",
48+
err: errInvalidMember,
4549
},
4650
{
47-
in: "FOO=1",
48-
err: errInvalidMember,
51+
name: "upper case key",
52+
in: "FOO=1",
53+
err: errInvalidMember,
4954
},
5055
{
51-
in: "foo.bar=1",
52-
err: errInvalidMember,
56+
name: "key with invalid character",
57+
in: "foo.bar=1",
58+
err: errInvalidMember,
5359
},
5460
{
55-
in: "foo@=1,bar=2",
56-
err: errInvalidMember,
61+
name: "multiple keys, one with empty tenant key",
62+
in: "foo@=1,bar=2",
63+
err: errInvalidMember,
5764
},
5865
{
59-
in: "@foo=1,bar=2",
60-
err: errInvalidMember,
66+
name: "multiple keys, one with only tenant",
67+
in: "@foo=1,bar=2",
68+
err: errInvalidMember,
6169
},
6270
{
63-
in: "foo@@bar=1,bar=2",
64-
err: errInvalidMember,
71+
name: "multiple keys, one with double tenant separator",
72+
in: "foo@@bar=1,bar=2",
73+
err: errInvalidMember,
6574
},
6675
{
67-
in: "foo@bar@baz=1,bar=2",
68-
err: errInvalidMember,
76+
name: "multiple keys, one with multiple tenants",
77+
in: "foo@bar@baz=1,bar=2",
78+
err: errInvalidMember,
6979
},
7080
{
71-
in: "foo=1,zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=1",
72-
err: errInvalidMember,
81+
name: "key too long",
82+
in: "foo=1,zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=1",
83+
err: errInvalidMember,
7384
},
7485
{
75-
in: "foo=1,tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt@v=1",
76-
err: errInvalidMember,
86+
name: "key too long, with tenant",
87+
in: "foo=1,tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt@v=1",
88+
err: errInvalidMember,
7789
},
7890
{
79-
in: "foo=1,t@vvvvvvvvvvvvvvv=1",
80-
err: errInvalidMember,
91+
name: "tenant too long",
92+
in: "foo=1,t@vvvvvvvvvvvvvvv=1",
93+
err: errInvalidMember,
8194
},
8295
{
83-
in: "foo=bar=baz",
84-
err: errInvalidMember,
96+
name: "multiple values for a single key",
97+
in: "foo=bar=baz",
98+
err: errInvalidMember,
8599
},
86100
{
87-
in: "foo=,bar=3",
88-
err: errInvalidMember,
101+
name: "no value",
102+
in: "foo=,bar=3",
103+
err: errInvalidMember,
89104
},
90105
{
91-
in: "bar01=01,bar02=02,bar03=03,bar04=04,bar05=05,bar06=06,bar07=07,bar08=08,bar09=09,bar10=10,bar11=11,bar12=12,bar13=13,bar14=14,bar15=15,bar16=16,bar17=17,bar18=18,bar19=19,bar20=20,bar21=21,bar22=22,bar23=23,bar24=24,bar25=25,bar26=26,bar27=27,bar28=28,bar29=29,bar30=30,bar31=31,bar32=32,bar33=33",
92-
err: errMemberNumber,
106+
name: "too many members",
107+
in: "bar01=01,bar02=02,bar03=03,bar04=04,bar05=05,bar06=06,bar07=07,bar08=08,bar09=09,bar10=10,bar11=11,bar12=12,bar13=13,bar14=14,bar15=15,bar16=16,bar17=17,bar18=18,bar19=19,bar20=20,bar21=21,bar22=22,bar23=23,bar24=24,bar25=25,bar26=26,bar27=27,bar28=28,bar29=29,bar30=30,bar31=31,bar32=32,bar33=33",
108+
err: errMemberNumber,
93109
},
94110
{
95-
in: "abcdefghijklmnopqrstuvwxyz0123456789_-*/= !\"#$%&'()*+-./0123456789:;<>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",
96-
out: "abcdefghijklmnopqrstuvwxyz0123456789_-*/= !\"#$%&'()*+-./0123456789:;<>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",
111+
name: "valid key/value list",
112+
in: "abcdefghijklmnopqrstuvwxyz0123456789_-*/= !\"#$%&'()*+-./0123456789:;<>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",
113+
out: "abcdefghijklmnopqrstuvwxyz0123456789_-*/= !\"#$%&'()*+-./0123456789:;<>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",
97114
tracestate: TraceState{list: []member{
98115
{
99116
Key: "abcdefghijklmnopqrstuvwxyz0123456789_-*/",
@@ -102,8 +119,9 @@ var testcases = []struct {
102119
}},
103120
},
104121
{
105-
in: "abcdefghijklmnopqrstuvwxyz0123456789_-*/@a-z0-9_-*/= !\"#$%&'()*+-./0123456789:;<>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",
106-
out: "abcdefghijklmnopqrstuvwxyz0123456789_-*/@a-z0-9_-*/= !\"#$%&'()*+-./0123456789:;<>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",
122+
name: "valid key/value list with tenant",
123+
in: "abcdefghijklmnopqrstuvwxyz0123456789_-*/@a-z0-9_-*/= !\"#$%&'()*+-./0123456789:;<>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",
124+
out: "abcdefghijklmnopqrstuvwxyz0123456789_-*/@a-z0-9_-*/= !\"#$%&'()*+-./0123456789:;<>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",
107125
tracestate: TraceState{list: []member{
108126
{
109127
Key: "abcdefghijklmnopqrstuvwxyz0123456789_-*/@a-z0-9_-*/",
@@ -112,35 +130,40 @@ var testcases = []struct {
112130
}},
113131
},
114132
{
133+
name: "empty input",
115134
// Empty input should result in no error and a zero value
116135
// TraceState being returned, that TraceState should be encoded as an
117136
// empty string.
118137
},
119138
{
120-
in: "foo=1",
121-
out: "foo=1",
139+
name: "single key and value",
140+
in: "foo=1",
141+
out: "foo=1",
122142
tracestate: TraceState{list: []member{
123143
{Key: "foo", Value: "1"},
124144
}},
125145
},
126146
{
127-
in: "foo=1,",
128-
out: "foo=1",
147+
name: "single key and value with empty separator",
148+
in: "foo=1,",
149+
out: "foo=1",
129150
tracestate: TraceState{list: []member{
130151
{Key: "foo", Value: "1"},
131152
}},
132153
},
133154
{
134-
in: "foo=1,bar=2",
135-
out: "foo=1,bar=2",
155+
name: "multiple keys and values",
156+
in: "foo=1,bar=2",
157+
out: "foo=1,bar=2",
136158
tracestate: TraceState{list: []member{
137159
{Key: "foo", Value: "1"},
138160
{Key: "bar", Value: "2"},
139161
}},
140162
},
141163
{
142-
in: "foo=1,zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=1",
143-
out: "foo=1,zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=1",
164+
name: "with a key at maximum length",
165+
in: "foo=1,zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=1",
166+
out: "foo=1,zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=1",
144167
tracestate: TraceState{list: []member{
145168
{
146169
Key: "foo",
@@ -153,8 +176,9 @@ var testcases = []struct {
153176
}},
154177
},
155178
{
156-
in: "foo=1,ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt@vvvvvvvvvvvvvv=1",
157-
out: "foo=1,ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt@vvvvvvvvvvvvvv=1",
179+
name: "with a key and tenant at maximum length",
180+
in: "foo=1,ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt@vvvvvvvvvvvvvv=1",
181+
out: "foo=1,ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt@vvvvvvvvvvvvvv=1",
158182
tracestate: TraceState{list: []member{
159183
{
160184
Key: "foo",
@@ -167,8 +191,9 @@ var testcases = []struct {
167191
}},
168192
},
169193
{
170-
in: "bar01=01,bar02=02,bar03=03,bar04=04,bar05=05,bar06=06,bar07=07,bar08=08,bar09=09,bar10=10,bar11=11,bar12=12,bar13=13,bar14=14,bar15=15,bar16=16,bar17=17,bar18=18,bar19=19,bar20=20,bar21=21,bar22=22,bar23=23,bar24=24,bar25=25,bar26=26,bar27=27,bar28=28,bar29=29,bar30=30,bar31=31,bar32=32",
171-
out: "bar01=01,bar02=02,bar03=03,bar04=04,bar05=05,bar06=06,bar07=07,bar08=08,bar09=09,bar10=10,bar11=11,bar12=12,bar13=13,bar14=14,bar15=15,bar16=16,bar17=17,bar18=18,bar19=19,bar20=20,bar21=21,bar22=22,bar23=23,bar24=24,bar25=25,bar26=26,bar27=27,bar28=28,bar29=29,bar30=30,bar31=31,bar32=32",
194+
name: "with maximum members",
195+
in: "bar01=01,bar02=02,bar03=03,bar04=04,bar05=05,bar06=06,bar07=07,bar08=08,bar09=09,bar10=10,bar11=11,bar12=12,bar13=13,bar14=14,bar15=15,bar16=16,bar17=17,bar18=18,bar19=19,bar20=20,bar21=21,bar22=22,bar23=23,bar24=24,bar25=25,bar26=26,bar27=27,bar28=28,bar29=29,bar30=30,bar31=31,bar32=32",
196+
out: "bar01=01,bar02=02,bar03=03,bar04=04,bar05=05,bar06=06,bar07=07,bar08=08,bar09=09,bar10=10,bar11=11,bar12=12,bar13=13,bar14=14,bar15=15,bar16=16,bar17=17,bar18=18,bar19=19,bar20=20,bar21=21,bar22=22,bar23=23,bar24=24,bar25=25,bar26=26,bar27=27,bar28=28,bar29=29,bar30=30,bar31=31,bar32=32",
172197
tracestate: TraceState{list: []member{
173198
{Key: "bar01", Value: "01"},
174199
{Key: "bar02", Value: "02"},
@@ -205,8 +230,9 @@ var testcases = []struct {
205230
}},
206231
},
207232
{
208-
in: "foo=1,bar=2,rojo=1,congo=2,baz=3",
209-
out: "foo=1,bar=2,rojo=1,congo=2,baz=3",
233+
name: "with several members",
234+
in: "foo=1,bar=2,rojo=1,congo=2,baz=3",
235+
out: "foo=1,bar=2,rojo=1,congo=2,baz=3",
210236
tracestate: TraceState{list: []member{
211237
{Key: "foo", Value: "1"},
212238
{Key: "bar", Value: "2"},
@@ -216,40 +242,45 @@ var testcases = []struct {
216242
}},
217243
},
218244
{
219-
in: "foo=1 \t , \t bar=2, \t baz=3",
220-
out: "foo=1,bar=2,baz=3",
245+
name: "with tabs between members",
246+
in: "foo=1 \t , \t bar=2, \t baz=3",
247+
out: "foo=1,bar=2,baz=3",
221248
tracestate: TraceState{list: []member{
222249
{Key: "foo", Value: "1"},
223250
{Key: "bar", Value: "2"},
224251
{Key: "baz", Value: "3"},
225252
}},
226253
},
227254
{
228-
in: "foo=1\t \t,\t \tbar=2,\t \tbaz=3",
229-
out: "foo=1,bar=2,baz=3",
255+
name: "with multiple tabs between members",
256+
in: "foo=1\t \t,\t \tbar=2,\t \tbaz=3",
257+
out: "foo=1,bar=2,baz=3",
230258
tracestate: TraceState{list: []member{
231259
{Key: "foo", Value: "1"},
232260
{Key: "bar", Value: "2"},
233261
{Key: "baz", Value: "3"},
234262
}},
235263
},
236264
{
237-
in: "foo=1 ",
238-
out: "foo=1",
265+
name: "with space at the end of the member",
266+
in: "foo=1 ",
267+
out: "foo=1",
239268
tracestate: TraceState{list: []member{
240269
{Key: "foo", Value: "1"},
241270
}},
242271
},
243272
{
244-
in: "foo=1\t",
245-
out: "foo=1",
273+
name: "with tab at the end of the member",
274+
in: "foo=1\t",
275+
out: "foo=1",
246276
tracestate: TraceState{list: []member{
247277
{Key: "foo", Value: "1"},
248278
}},
249279
},
250280
{
251-
in: "foo=1 \t",
252-
out: "foo=1",
281+
name: "with tab and space at the end of the member",
282+
in: "foo=1 \t",
283+
out: "foo=1",
253284
tracestate: TraceState{list: []member{
254285
{Key: "foo", Value: "1"},
255286
}},
@@ -269,13 +300,15 @@ var maxMembers = func() TraceState {
269300

270301
func TestParseTraceState(t *testing.T) {
271302
for _, tc := range testcases {
272-
got, err := ParseTraceState(tc.in)
273-
assert.Equal(t, tc.tracestate, got)
274-
if tc.err != nil {
275-
assert.ErrorIs(t, err, tc.err, tc.in)
276-
} else {
277-
assert.NoError(t, err, tc.in)
278-
}
303+
t.Run(tc.name, func(t *testing.T) {
304+
got, err := ParseTraceState(tc.in)
305+
assert.Equal(t, tc.tracestate, got)
306+
if tc.err != nil {
307+
assert.ErrorIs(t, err, tc.err, tc.in)
308+
} else {
309+
assert.NoError(t, err, tc.in)
310+
}
311+
})
279312
}
280313
}
281314

@@ -285,8 +318,9 @@ func TestTraceStateString(t *testing.T) {
285318
// Only test non-zero value TraceState.
286319
continue
287320
}
288-
289-
assert.Equal(t, tc.out, tc.tracestate.String())
321+
t.Run(tc.name, func(t *testing.T) {
322+
assert.Equal(t, tc.out, tc.tracestate.String())
323+
})
290324
}
291325
}
292326

@@ -296,15 +330,16 @@ func TestTraceStateMarshalJSON(t *testing.T) {
296330
// Only test non-zero value TraceState.
297331
continue
298332
}
333+
t.Run(tc.name, func(t *testing.T) {
334+
// Encode UTF-8.
335+
expected, err := json.Marshal(tc.out)
336+
require.NoError(t, err)
299337

300-
// Encode UTF-8.
301-
expected, err := json.Marshal(tc.out)
302-
require.NoError(t, err)
338+
actual, err := json.Marshal(tc.tracestate)
339+
require.NoError(t, err)
303340

304-
actual, err := json.Marshal(tc.tracestate)
305-
require.NoError(t, err)
306-
307-
assert.Equal(t, expected, actual)
341+
assert.Equal(t, expected, actual)
342+
})
308343
}
309344
}
310345

@@ -332,7 +367,9 @@ func TestTraceStateGet(t *testing.T) {
332367
}
333368

334369
for _, tc := range testCases {
335-
assert.Equal(t, tc.expected, maxMembers.Get(tc.key), tc.name)
370+
t.Run(tc.name, func(t *testing.T) {
371+
assert.Equal(t, tc.expected, maxMembers.Get(tc.key))
372+
})
336373
}
337374
}
338375

@@ -377,7 +414,9 @@ func TestTraceStateDelete(t *testing.T) {
377414
}
378415

379416
for _, tc := range testCases {
380-
assert.Equal(t, tc.expected, ts.Delete(tc.key), tc.name)
417+
t.Run(tc.name, func(t *testing.T) {
418+
assert.Equal(t, tc.expected, ts.Delete(tc.key))
419+
})
381420
}
382421
}
383422

@@ -453,13 +492,15 @@ func TestTraceStateInsert(t *testing.T) {
453492
}
454493

455494
for _, tc := range testCases {
456-
actual, err := tc.tracestate.Insert(tc.key, tc.value)
457-
assert.ErrorIs(t, err, tc.err, tc.name)
458-
if tc.err != nil {
459-
assert.Equal(t, tc.tracestate, actual, tc.name)
460-
} else {
461-
assert.Equal(t, tc.expected, actual, tc.name)
462-
}
495+
t.Run(tc.name, func(t *testing.T) {
496+
actual, err := tc.tracestate.Insert(tc.key, tc.value)
497+
assert.ErrorIs(t, err, tc.err, tc.name)
498+
if tc.err != nil {
499+
assert.Equal(t, tc.tracestate, actual)
500+
} else {
501+
assert.Equal(t, tc.expected, actual)
502+
}
503+
})
463504
}
464505
}
465506

0 commit comments

Comments
 (0)