github.com/corona10/go@v0.0.0-20180224231303-7a218942be57/src/runtime/trace/annotation_test.go (about) 1 package trace_test 2 3 import ( 4 "bytes" 5 "context" 6 "internal/trace" 7 "reflect" 8 . "runtime/trace" 9 "sync" 10 "testing" 11 ) 12 13 func TestUserTaskSpan(t *testing.T) { 14 bgctx, cancel := context.WithCancel(context.Background()) 15 defer cancel() 16 17 preExistingSpanEnd := StartSpan(bgctx, "pre-existing span") 18 19 buf := new(bytes.Buffer) 20 if err := Start(buf); err != nil { 21 t.Fatalf("failed to start tracing: %v", err) 22 } 23 24 // Beginning of traced execution 25 var wg sync.WaitGroup 26 ctx, end := NewContext(bgctx, "task0") // EvUserTaskCreate("task0") 27 wg.Add(1) 28 go func() { 29 defer wg.Done() 30 defer end() // EvUserTaskEnd("task0") 31 32 WithSpan(ctx, "span0", func(ctx context.Context) { 33 // EvUserSpanCreate("span0", start) 34 WithSpan(ctx, "span1", func(ctx context.Context) { 35 Log(ctx, "key0", "0123456789abcdef") // EvUserLog("task0", "key0", "0....f") 36 }) 37 // EvUserSpan("span0", end) 38 }) 39 }() 40 41 wg.Wait() 42 43 preExistingSpanEnd() 44 postExistingSpanEnd := StartSpan(bgctx, "post-existing span") 45 46 // End of traced execution 47 Stop() 48 49 postExistingSpanEnd() 50 51 saveTrace(t, buf, "TestUserTaskSpan") 52 res, err := trace.Parse(buf, "") 53 if err != nil { 54 t.Fatalf("Parse failed: %v", err) 55 } 56 57 // Check whether we see all user annotation related records in order 58 type testData struct { 59 typ byte 60 strs []string 61 args []uint64 62 setLink bool 63 } 64 65 var got []testData 66 tasks := map[uint64]string{} 67 for _, e := range res.Events { 68 t.Logf("%s", e) 69 switch e.Type { 70 case trace.EvUserTaskCreate: 71 taskName := e.SArgs[0] 72 got = append(got, testData{trace.EvUserTaskCreate, []string{taskName}, nil, e.Link != nil}) 73 if e.Link != nil && e.Link.Type != trace.EvUserTaskEnd { 74 t.Errorf("Unexpected linked event %q->%q", e, e.Link) 75 } 76 tasks[e.Args[0]] = taskName 77 case trace.EvUserLog: 78 key, val := e.SArgs[0], e.SArgs[1] 79 taskName := tasks[e.Args[0]] 80 got = append(got, testData{trace.EvUserLog, []string{taskName, key, val}, nil, e.Link != nil}) 81 case trace.EvUserTaskEnd: 82 taskName := tasks[e.Args[0]] 83 got = append(got, testData{trace.EvUserTaskEnd, []string{taskName}, nil, e.Link != nil}) 84 if e.Link != nil && e.Link.Type != trace.EvUserTaskCreate { 85 t.Errorf("Unexpected linked event %q->%q", e, e.Link) 86 } 87 case trace.EvUserSpan: 88 taskName := tasks[e.Args[0]] 89 spanName := e.SArgs[0] 90 got = append(got, testData{trace.EvUserSpan, []string{taskName, spanName}, []uint64{e.Args[1]}, e.Link != nil}) 91 if e.Link != nil && (e.Link.Type != trace.EvUserSpan || e.Link.SArgs[0] != spanName) { 92 t.Errorf("Unexpected linked event %q->%q", e, e.Link) 93 } 94 } 95 } 96 want := []testData{ 97 {trace.EvUserTaskCreate, []string{"task0"}, nil, true}, 98 {trace.EvUserSpan, []string{"task0", "span0"}, []uint64{0}, true}, 99 {trace.EvUserSpan, []string{"task0", "span1"}, []uint64{0}, true}, 100 {trace.EvUserLog, []string{"task0", "key0", "0123456789abcdef"}, nil, false}, 101 {trace.EvUserSpan, []string{"task0", "span1"}, []uint64{1}, true}, 102 {trace.EvUserSpan, []string{"task0", "span0"}, []uint64{1}, true}, 103 {trace.EvUserTaskEnd, []string{"task0"}, nil, true}, 104 {trace.EvUserSpan, []string{"", "pre-existing span"}, []uint64{1}, false}, 105 {trace.EvUserSpan, []string{"", "post-existing span"}, []uint64{0}, false}, 106 } 107 if !reflect.DeepEqual(got, want) { 108 t.Errorf("Got user span related events %+v\nwant: %+v", got, want) 109 } 110 }