10 func labelsSorted(ctx context
.Context
) []label
{
12 ForLabels(ctx
, func(key
, value
string) bool {
13 ls
= append(ls
, label
{key
, value
})
16 sort
.Sort(labelSorter(ls
))
20 type labelSorter
[]label
22 func (s labelSorter
) Len() int { return len(s
) }
23 func (s labelSorter
) Swap(i
, j
int) { s
[i
], s
[j
] = s
[j
], s
[i
] }
24 func (s labelSorter
) Less(i
, j
int) bool { return s
[i
].key
< s
[j
].key
}
26 func TestContextLabels(t
*testing
.T
) {
27 // Background context starts with no labels.
28 ctx
:= context
.Background()
29 labels
:= labelsSorted(ctx
)
31 t
.Errorf("labels on background context: want [], got %v ", labels
)
34 // Add a single label.
35 ctx
= WithLabels(ctx
, Labels("key", "value"))
36 // Retrieve it with Label.
37 v
, ok
:= Label(ctx
, "key")
38 if !ok || v
!= "value" {
39 t
.Errorf(`Label(ctx, "key"): got %v, %v; want "value", ok`, v
, ok
)
41 gotLabels
:= labelsSorted(ctx
)
42 wantLabels
:= []label
{{"key", "value"}}
43 if !reflect
.DeepEqual(gotLabels
, wantLabels
) {
44 t
.Errorf("(sorted) labels on context: got %v, want %v", gotLabels
, wantLabels
)
47 // Add a label with a different key.
48 ctx
= WithLabels(ctx
, Labels("key2", "value2"))
49 v
, ok
= Label(ctx
, "key2")
50 if !ok || v
!= "value2" {
51 t
.Errorf(`Label(ctx, "key2"): got %v, %v; want "value2", ok`, v
, ok
)
53 gotLabels
= labelsSorted(ctx
)
54 wantLabels
= []label
{{"key", "value"}, {"key2", "value2"}}
55 if !reflect
.DeepEqual(gotLabels
, wantLabels
) {
56 t
.Errorf("(sorted) labels on context: got %v, want %v", gotLabels
, wantLabels
)
59 // Add label with first key to test label replacement.
60 ctx
= WithLabels(ctx
, Labels("key", "value3"))
61 v
, ok
= Label(ctx
, "key")
62 if !ok || v
!= "value3" {
63 t
.Errorf(`Label(ctx, "key3"): got %v, %v; want "value3", ok`, v
, ok
)
65 gotLabels
= labelsSorted(ctx
)
66 wantLabels
= []label
{{"key", "value3"}, {"key2", "value2"}}
67 if !reflect
.DeepEqual(gotLabels
, wantLabels
) {
68 t
.Errorf("(sorted) labels on context: got %v, want %v", gotLabels
, wantLabels
)
71 // Labels called with two labels with the same key should pick the second.
72 ctx
= WithLabels(ctx
, Labels("key4", "value4a", "key4", "value4b"))
73 v
, ok
= Label(ctx
, "key4")
74 if !ok || v
!= "value4b" {
75 t
.Errorf(`Label(ctx, "key4"): got %v, %v; want "value4b", ok`, v
, ok
)
77 gotLabels
= labelsSorted(ctx
)
78 wantLabels
= []label
{{"key", "value3"}, {"key2", "value2"}, {"key4", "value4b"}}
79 if !reflect
.DeepEqual(gotLabels
, wantLabels
) {
80 t
.Errorf("(sorted) labels on context: got %v, want %v", gotLabels
, wantLabels
)
84 func TestLabelMapStringer(t
*testing
.T
) {
85 for _
, tbl
:= range []struct {
98 expected
: `{"foo":"bar"}`,
105 "key4WithNewline": "\nvalue4",
107 expected
: `{"foo":"bar", "key1":"value1", "key2":"value2", "key3":"value3", "key4WithNewline":"\nvalue4"}`,
110 if got
:= tbl
.m
.String(); tbl
.expected
!= got
{
111 t
.Errorf("%#v.String() = %q; want %q", tbl
.m
, got
, tbl
.expected
)