-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconcurrency_test.go
134 lines (126 loc) · 2.8 KB
/
concurrency_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package zipkintracer
import (
"strings"
"sync"
"testing"
opentracing "github.com/opentracing/opentracing-go"
)
const op = "test"
func TestDebugAssertSingleGoroutine(t *testing.T) {
tracer, err := NewTracer(
NewInMemoryRecorder(),
EnableSpanPool(true),
DebugAssertSingleGoroutine(true),
TraceID128Bit(true),
)
if err != nil {
t.Fatalf("Unable to create Tracer: %+v", err)
}
sp := tracer.StartSpan(op)
sp.LogEvent("something on my goroutine")
wait := make(chan struct{})
var panicked bool
go func() {
defer func() {
if r := recover(); r != nil {
_, panicked = r.(*errAssertionFailed)
}
close(wait)
}()
sp.LogEvent("something on your goroutine")
}()
<-wait
if !panicked {
t.Fatal("expected a panic")
}
}
func TestDebugAssertUseAfterFinish(t *testing.T) {
tracer, err := NewTracer(
NewInMemoryRecorder(),
EnableSpanPool(true),
DebugAssertUseAfterFinish(true),
TraceID128Bit(true),
)
if err != nil {
t.Fatalf("Unable to create Tracer: %+v", err)
}
const msg = "I shall be finished"
for _, double := range []bool{false, true} {
sp := tracer.StartSpan(op)
sp.Log(opentracing.LogData{Event: msg})
if double {
sp.Finish()
}
var panicked bool
func() {
defer func() {
r := recover()
var assertionErr error
assertionErr, panicked = r.(*errAssertionFailed)
if !panicked && r != nil {
panic(r)
}
if panicked && !strings.Contains(assertionErr.Error(), msg) {
t.Fatalf("debug output did not contain log message '%s': %+v", msg, assertionErr)
}
spImpl := sp.(*spanImpl)
// The panic should leave the Mutex unlocked.
spImpl.Mutex.Lock()
spImpl.Mutex.Unlock()
}()
sp.Finish()
}()
if panicked != double {
t.Errorf("finished double = %t, but panicked = %t", double, panicked)
}
}
}
func TestConcurrentUsage(t *testing.T) {
var cr CountingRecorder
tracer, err := NewTracer(
&cr,
EnableSpanPool(true),
DebugAssertSingleGoroutine(true),
TraceID128Bit(true),
)
if err != nil {
t.Fatalf("Unable to create Tracer: %+v", err)
}
var wg sync.WaitGroup
const num = 100
wg.Add(num)
for i := 0; i < num; i++ {
go func() {
defer wg.Done()
for j := 0; j < num; j++ {
sp := tracer.StartSpan(op)
sp.LogEvent("test event")
sp.SetTag("foo", "bar")
sp.SetBaggageItem("boo", "far")
sp.SetOperationName("x")
csp := tracer.StartSpan(
"csp",
opentracing.ChildOf(sp.Context()))
csp.Finish()
defer sp.Finish()
}
}()
}
wg.Wait()
}
func TestDisableSpanPool(t *testing.T) {
var cr CountingRecorder
tracer, err := NewTracer(
&cr,
)
if err != nil {
t.Fatalf("Unable to create Tracer: %+v", err)
}
parent := tracer.StartSpan("parent")
parent.Finish()
// This shouldn't panic.
child := tracer.StartSpan(
"child",
opentracing.ChildOf(parent.Context()))
child.Finish()
}