1 // Copyright 2018 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
19 func BenchmarkStartRegion(b *testing.B) {
21 ctx, task := NewTask(context.Background(), "benchmark")
24 b.RunParallel(func(pb *testing.PB) {
26 StartRegion(ctx, "region").End()
31 func BenchmarkNewTask(b *testing.B) {
33 pctx, task := NewTask(context.Background(), "benchmark")
36 b.RunParallel(func(pb *testing.PB) {
38 _, task := NewTask(pctx, "task")
44 func TestUserTaskRegion(t *testing.T) {
46 t.Skip("skipping because -test.trace is set")
48 bgctx, cancel := context.WithCancel(context.Background())
51 preExistingRegion := StartRegion(bgctx, "pre-existing region")
53 buf := new(bytes.Buffer)
54 if err := Start(buf); err != nil {
55 t.Fatalf("failed to start tracing: %v", err)
58 // Beginning of traced execution
60 ctx, task := NewTask(bgctx, "task0") // EvUserTaskCreate("task0")
64 defer task.End() // EvUserTaskEnd("task0")
66 WithRegion(ctx, "region0", func() {
67 // EvUserRegionCreate("region0", start)
68 WithRegion(ctx, "region1", func() {
69 Log(ctx, "key0", "0123456789abcdef") // EvUserLog("task0", "key0", "0....f")
71 // EvUserRegion("region0", end)
77 preExistingRegion.End()
78 postExistingRegion := StartRegion(bgctx, "post-existing region")
80 // End of traced execution
83 postExistingRegion.End()
85 saveTrace(t, buf, "TestUserTaskRegion")
86 res, err := trace.Parse(buf, "")
87 if err == trace.ErrTimeOrder {
88 // golang.org/issues/16755
89 t.Skipf("skipping trace: %v", err)
92 t.Fatalf("Parse failed: %v", err)
95 // Check whether we see all user annotation related records in order
96 type testData struct {
104 tasks := map[uint64]string{}
105 for _, e := range res.Events {
108 case trace.EvUserTaskCreate:
109 taskName := e.SArgs[0]
110 got = append(got, testData{trace.EvUserTaskCreate, []string{taskName}, nil, e.Link != nil})
111 if e.Link != nil && e.Link.Type != trace.EvUserTaskEnd {
112 t.Errorf("Unexpected linked event %q->%q", e, e.Link)
114 tasks[e.Args[0]] = taskName
115 case trace.EvUserLog:
116 key, val := e.SArgs[0], e.SArgs[1]
117 taskName := tasks[e.Args[0]]
118 got = append(got, testData{trace.EvUserLog, []string{taskName, key, val}, nil, e.Link != nil})
119 case trace.EvUserTaskEnd:
120 taskName := tasks[e.Args[0]]
121 got = append(got, testData{trace.EvUserTaskEnd, []string{taskName}, nil, e.Link != nil})
122 if e.Link != nil && e.Link.Type != trace.EvUserTaskCreate {
123 t.Errorf("Unexpected linked event %q->%q", e, e.Link)
125 case trace.EvUserRegion:
126 taskName := tasks[e.Args[0]]
127 regionName := e.SArgs[0]
128 got = append(got, testData{trace.EvUserRegion, []string{taskName, regionName}, []uint64{e.Args[1]}, e.Link != nil})
129 if e.Link != nil && (e.Link.Type != trace.EvUserRegion || e.Link.SArgs[0] != regionName) {
130 t.Errorf("Unexpected linked event %q->%q", e, e.Link)
135 {trace.EvUserTaskCreate, []string{"task0"}, nil, true},
136 {trace.EvUserRegion, []string{"task0", "region0"}, []uint64{0}, true},
137 {trace.EvUserRegion, []string{"task0", "region1"}, []uint64{0}, true},
138 {trace.EvUserLog, []string{"task0", "key0", "0123456789abcdef"}, nil, false},
139 {trace.EvUserRegion, []string{"task0", "region1"}, []uint64{1}, false},
140 {trace.EvUserRegion, []string{"task0", "region0"}, []uint64{1}, false},
141 {trace.EvUserTaskEnd, []string{"task0"}, nil, false},
142 // Currently, pre-existing region is not recorded to avoid allocations.
143 // {trace.EvUserRegion, []string{"", "pre-existing region"}, []uint64{1}, false},
144 {trace.EvUserRegion, []string{"", "post-existing region"}, []uint64{0}, false},
146 if !reflect.DeepEqual(got, want) {
147 pretty := func(data []testData) string {
148 var s strings.Builder
149 for _, d := range data {
150 fmt.Fprintf(&s, "\t%+v\n", d)
154 t.Errorf("Got user region related events\n%+v\nwant:\n%+v", pretty(got), pretty(want))