github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/engine/telemetry/start_tracker_test.go (about) 1 package telemetry 2 3 import ( 4 "context" 5 "testing" 6 "time" 7 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 sdktrace "go.opentelemetry.io/otel/sdk/trace" 11 12 "github.com/tilt-dev/tilt/internal/store" 13 "github.com/tilt-dev/tilt/pkg/model" 14 ) 15 16 func TestStart(t *testing.T) { 17 ctx := context.Background() 18 19 fp := newFakeProcessor() 20 21 tp := sdktrace.NewTracerProvider() 22 tp.RegisterSpanProcessor(fp) 23 cst := NewStartTracker(tp.Tracer("tilt.dev/test")) 24 25 st := store.NewTestingStore() 26 manifest := model.Manifest{Name: "test"} 27 mt := store.NewManifestTarget(manifest) 28 engineState := store.EngineState{ManifestTargets: map[model.ManifestName]*store.ManifestTarget{ 29 model.ManifestName("test"): mt, 30 }} 31 st.SetState(engineState) 32 _ = cst.OnChange(ctx, st, store.LegacyChangeSummary()) 33 34 // first run span should be started 35 span, exists := fp.spans["first_run"] 36 require.True(t, exists) 37 assert.Zero(t, span.EndTime()) 38 39 // first run span should still not be ended 40 _ = cst.OnChange(ctx, st, store.LegacyChangeSummary()) 41 span, exists = fp.spans["first_run"] 42 require.True(t, exists) 43 assert.Zero(t, span.EndTime()) 44 45 engineState.CompletedBuildCount = 1 46 engineState.ManifestTargets[manifest.ManifestName()].State.BuildHistory = append(engineState.ManifestTargets[manifest.ManifestName()].State.BuildHistory, model.BuildRecord{StartTime: time.Now()}) 47 st.SetState(engineState) 48 _ = cst.OnChange(ctx, st, store.LegacyChangeSummary()) 49 50 // first run span should be ended 51 span, exists = fp.spans["first_run"] 52 require.True(t, exists) 53 assert.NotZero(t, span.EndTime()) 54 55 _ = cst.OnChange(ctx, st, store.LegacyChangeSummary()) 56 57 // first run span should still be ended 58 span, exists = fp.spans["first_run"] 59 require.True(t, exists) 60 assert.NotZero(t, span.EndTime()) 61 } 62 63 type capturingProcessor struct { 64 spans map[string]sdktrace.ReadOnlySpan 65 processor sdktrace.SpanProcessor 66 } 67 68 func (f *capturingProcessor) OnStart(parent context.Context, s sdktrace.ReadWriteSpan) { 69 f.processor.OnStart(parent, s) 70 f.spans[s.Name()] = s 71 } 72 73 func (f *capturingProcessor) OnEnd(s sdktrace.ReadOnlySpan) { 74 f.processor.OnEnd(s) 75 f.spans[s.Name()] = s 76 } 77 78 func (f *capturingProcessor) Shutdown(ctx context.Context) error { 79 return f.processor.Shutdown(ctx) 80 } 81 82 func (f *capturingProcessor) ForceFlush(ctx context.Context) error { 83 return f.processor.ForceFlush(ctx) 84 } 85 86 func newFakeProcessor() *capturingProcessor { 87 return &capturingProcessor{ 88 spans: make(map[string]sdktrace.ReadOnlySpan), 89 processor: sdktrace.NewSimpleSpanProcessor(nil), 90 } 91 } 92 93 var _ sdktrace.SpanProcessor = &capturingProcessor{}