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  }