174 lines
4.5 KiB
Go
174 lines
4.5 KiB
Go
package mocktracer
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
"time"
|
|
|
|
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace"
|
|
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext"
|
|
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
// basicSpan returns a span with no configuration, having the set operation name.
|
|
func basicSpan(operationName string) *mockspan {
|
|
return newSpan(&mocktracer{}, operationName, &ddtrace.StartSpanConfig{})
|
|
}
|
|
|
|
func TestNewSpan(t *testing.T) {
|
|
t.Run("basic", func(t *testing.T) {
|
|
s := basicSpan("http.request")
|
|
|
|
assert := assert.New(t)
|
|
assert.Equal("http.request", s.name)
|
|
assert.False(s.startTime.IsZero())
|
|
assert.Zero(s.parentID)
|
|
assert.NotNil(s.context)
|
|
assert.NotZero(s.context.spanID)
|
|
assert.Equal(s.context.spanID, s.context.traceID)
|
|
})
|
|
|
|
t.Run("options", func(t *testing.T) {
|
|
tr := new(mocktracer)
|
|
startTime := time.Now()
|
|
tags := map[string]interface{}{"k": "v", "k1": "v1"}
|
|
opts := &ddtrace.StartSpanConfig{
|
|
StartTime: startTime,
|
|
Tags: tags,
|
|
}
|
|
s := newSpan(tr, "http.request", opts)
|
|
|
|
assert := assert.New(t)
|
|
assert.Equal(tr, s.tracer)
|
|
assert.Equal("http.request", s.name)
|
|
assert.Equal(startTime, s.startTime)
|
|
assert.Equal(tags, s.tags)
|
|
})
|
|
|
|
t.Run("parent", func(t *testing.T) {
|
|
baggage := map[string]string{"A": "B", "C": "D"}
|
|
parentctx := &spanContext{spanID: 1, traceID: 2, baggage: baggage}
|
|
opts := &ddtrace.StartSpanConfig{Parent: parentctx}
|
|
s := newSpan(&mocktracer{}, "http.request", opts)
|
|
|
|
assert := assert.New(t)
|
|
assert.NotNil(s.context)
|
|
assert.Equal(uint64(1), s.parentID)
|
|
assert.Equal(uint64(2), s.context.traceID)
|
|
assert.Equal(baggage, s.context.baggage)
|
|
})
|
|
}
|
|
|
|
func TestSpanSetTag(t *testing.T) {
|
|
s := basicSpan("http.request")
|
|
s.SetTag("a", "b")
|
|
s.SetTag("c", "d")
|
|
|
|
assert := assert.New(t)
|
|
assert.Len(s.Tags(), 3)
|
|
assert.Equal("http.request", s.Tag(ext.ResourceName))
|
|
assert.Equal("b", s.Tag("a"))
|
|
assert.Equal("d", s.Tag("c"))
|
|
}
|
|
|
|
func TestSpanSetTagPriority(t *testing.T) {
|
|
assert := assert.New(t)
|
|
s := basicSpan("http.request")
|
|
assert.False(s.context.hasSamplingPriority())
|
|
s.SetTag(ext.SamplingPriority, -1)
|
|
assert.True(s.context.hasSamplingPriority())
|
|
assert.Equal(-1, s.context.samplingPriority())
|
|
}
|
|
|
|
func TestSpanTagImmutability(t *testing.T) {
|
|
s := basicSpan("http.request")
|
|
s.SetTag("a", "b")
|
|
tags := s.Tags()
|
|
tags["a"] = 123
|
|
tags["b"] = 456
|
|
|
|
assert := assert.New(t)
|
|
assert.Equal("b", s.tags["a"])
|
|
assert.Zero(s.tags["b"])
|
|
}
|
|
|
|
func TestSpanStartTime(t *testing.T) {
|
|
startTime := time.Now()
|
|
s := newSpan(&mocktracer{}, "http.request", &ddtrace.StartSpanConfig{StartTime: startTime})
|
|
|
|
assert := assert.New(t)
|
|
assert.Equal(startTime, s.startTime)
|
|
assert.Equal(startTime, s.StartTime())
|
|
}
|
|
|
|
func TestSpanFinishTime(t *testing.T) {
|
|
s := basicSpan("http.request")
|
|
finishTime := time.Now()
|
|
s.Finish(tracer.FinishTime(finishTime))
|
|
|
|
assert := assert.New(t)
|
|
assert.Equal(finishTime, s.finishTime)
|
|
assert.Equal(finishTime, s.FinishTime())
|
|
}
|
|
|
|
func TestSpanOperationName(t *testing.T) {
|
|
t.Run("default", func(t *testing.T) {
|
|
s := basicSpan("http.request")
|
|
assert.Equal(t, "http.request", s.name)
|
|
assert.Equal(t, "http.request", s.OperationName())
|
|
})
|
|
|
|
t.Run("default", func(t *testing.T) {
|
|
s := basicSpan("http.request")
|
|
s.SetOperationName("db.query")
|
|
assert.Equal(t, "db.query", s.name)
|
|
assert.Equal(t, "db.query", s.OperationName())
|
|
})
|
|
}
|
|
|
|
func TestSpanBaggageFunctions(t *testing.T) {
|
|
t.Run("SetBaggageItem", func(t *testing.T) {
|
|
s := basicSpan("http.request")
|
|
s.SetBaggageItem("a", "b")
|
|
assert.Equal(t, "b", s.context.baggage["a"])
|
|
})
|
|
|
|
t.Run("BaggageItem", func(t *testing.T) {
|
|
s := basicSpan("http.request")
|
|
s.SetBaggageItem("a", "b")
|
|
assert.Equal(t, "b", s.BaggageItem("a"))
|
|
})
|
|
}
|
|
|
|
func TestSpanContext(t *testing.T) {
|
|
t.Run("Context", func(t *testing.T) {
|
|
s := basicSpan("http.request")
|
|
assert.Equal(t, s.context, s.Context())
|
|
})
|
|
|
|
t.Run("IDs", func(t *testing.T) {
|
|
parent := basicSpan("http.request")
|
|
child := newSpan(&mocktracer{}, "db.query", &ddtrace.StartSpanConfig{
|
|
Parent: parent.Context(),
|
|
})
|
|
|
|
assert := assert.New(t)
|
|
assert.Equal(parent.SpanID(), child.ParentID())
|
|
assert.Equal(parent.TraceID(), child.TraceID())
|
|
assert.NotZero(child.SpanID())
|
|
})
|
|
}
|
|
|
|
func TestSpanFinish(t *testing.T) {
|
|
s := basicSpan("http.request")
|
|
want := errors.New("some error")
|
|
s.Finish(tracer.WithError(want))
|
|
|
|
assert := assert.New(t)
|
|
assert.False(s.FinishTime().IsZero())
|
|
assert.True(s.FinishTime().Before(time.Now()))
|
|
assert.Equal(want, s.Tag(ext.Error))
|
|
}
|