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  }