github.com/xmidt-org/webpa-common@v1.11.9/tracing/spanner_test.go (about) 1 package tracing 2 3 import ( 4 "errors" 5 "fmt" 6 "sync" 7 "testing" 8 "time" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 ) 13 14 func ExampleSpanner() { 15 var ( 16 now time.Time 17 duration = 100 * time.Millisecond 18 19 // production code can ignore now and since 20 // we do this just to get consistent output 21 spanner = NewSpanner( 22 Now(func() time.Time { return now }), 23 Since(func(time.Time) time.Duration { return duration }), 24 ) 25 26 spans = make(chan Span, 2) 27 firstDone = new(sync.WaitGroup) 28 ) 29 30 firstDone.Add(1) 31 go func() { 32 defer firstDone.Done() 33 finisher := spanner.Start("success") 34 // a successful operation happens here ... 35 spans <- finisher(nil) 36 }() 37 38 go func() { 39 defer close(spans) 40 firstDone.Wait() 41 finisher := spanner.Start("failure") 42 // an operation that fails happens here ... 43 spans <- finisher(errors.New("this operation failed")) 44 }() 45 46 for s := range spans { 47 fmt.Println(s.Name(), s.Start(), s.Duration(), s.Error()) 48 } 49 50 // Output: 51 // success 0001-01-01 00:00:00 +0000 UTC 100ms <nil> 52 // failure 0001-01-01 00:00:00 +0000 UTC 100ms this operation failed 53 } 54 55 func TestSpanner(t *testing.T) { 56 var ( 57 require = require.New(t) 58 assert = assert.New(t) 59 60 expectedStart = time.Now() 61 expectedDuration = time.Duration(23458729347) 62 expectedError = errors.New("expected") 63 64 now = func() time.Time { 65 return expectedStart 66 } 67 68 since = func(actualStart time.Time) time.Duration { 69 assert.Equal(expectedStart, actualStart) 70 return expectedDuration 71 } 72 73 sp = NewSpanner(Now(now), Since(since)) 74 ) 75 76 require.NotNil(sp) 77 78 finisher := sp.Start("test") 79 require.NotNil(finisher) 80 81 span := finisher(expectedError) 82 require.NotNil(span) 83 assert.Equal("test", span.Name()) 84 assert.Equal(expectedStart, span.Start()) 85 assert.Equal(expectedDuration, span.Duration()) 86 assert.Equal(expectedError, span.Error()) 87 88 // idempotent 89 assert.Equal(span, finisher(errors.New("this should not get set"))) 90 assert.Equal("test", span.Name()) 91 assert.Equal(expectedStart, span.Start()) 92 assert.Equal(expectedDuration, span.Duration()) 93 assert.Equal(expectedError, span.Error()) 94 }