1
2
3
4
5 package pprof
6
7 import (
8 "context"
9 "fmt"
10 "reflect"
11 "testing"
12 )
13
14 func TestSetGoroutineLabels(t *testing.T) {
15 sync := make(chan struct{})
16
17 wantLabels := map[string]string{}
18 if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
19 t.Errorf("Expected parent goroutine's profile labels to be empty before test, got %v", gotLabels)
20 }
21 go func() {
22 if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
23 t.Errorf("Expected child goroutine's profile labels to be empty before test, got %v", gotLabels)
24 }
25 sync <- struct{}{}
26 }()
27 <-sync
28
29 wantLabels = map[string]string{"key": "value"}
30 ctx := WithLabels(context.Background(), Labels("key", "value"))
31 SetGoroutineLabels(ctx)
32 if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
33 t.Errorf("parent goroutine's profile labels: got %v, want %v", gotLabels, wantLabels)
34 }
35 go func() {
36 if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
37 t.Errorf("child goroutine's profile labels: got %v, want %v", gotLabels, wantLabels)
38 }
39 sync <- struct{}{}
40 }()
41 <-sync
42
43 wantLabels = map[string]string{}
44 ctx = context.Background()
45 SetGoroutineLabels(ctx)
46 if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
47 t.Errorf("Expected parent goroutine's profile labels to be empty, got %v", gotLabels)
48 }
49 go func() {
50 if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
51 t.Errorf("Expected child goroutine's profile labels to be empty, got %v", gotLabels)
52 }
53 sync <- struct{}{}
54 }()
55 <-sync
56 }
57
58 func TestDo(t *testing.T) {
59 wantLabels := map[string]string{}
60 if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
61 t.Errorf("Expected parent goroutine's profile labels to be empty before Do, got %v", gotLabels)
62 }
63
64 Do(context.Background(), Labels("key1", "value1", "key2", "value2"), func(ctx context.Context) {
65 wantLabels := map[string]string{"key1": "value1", "key2": "value2"}
66 if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
67 t.Errorf("parent goroutine's profile labels: got %v, want %v", gotLabels, wantLabels)
68 }
69
70 sync := make(chan struct{})
71 go func() {
72 wantLabels := map[string]string{"key1": "value1", "key2": "value2"}
73 if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
74 t.Errorf("child goroutine's profile labels: got %v, want %v", gotLabels, wantLabels)
75 }
76 sync <- struct{}{}
77 }()
78 <-sync
79
80 })
81
82 wantLabels = map[string]string{}
83 if gotLabels := getProfLabel(); !reflect.DeepEqual(gotLabels, wantLabels) {
84 fmt.Printf("%#v", gotLabels)
85 fmt.Printf("%#v", wantLabels)
86 t.Errorf("Expected parent goroutine's profile labels to be empty after Do, got %v", gotLabels)
87 }
88 }
89
90 func getProfLabel() map[string]string {
91 l := (*labelMap)(runtime_getProfLabel())
92 if l == nil {
93 return map[string]string{}
94 }
95 return *l
96 }
97
View as plain text