From 478334dc1efef9aad86f2a3c5c0bc2cad2a7ca74 Mon Sep 17 00:00:00 2001 From: "zhongyang.wu" Date: Tue, 29 Sep 2020 22:09:49 -0400 Subject: [PATCH] [propagator] Add injection integration test. --- propagators/jaeger/jaeger_data_test.go | 68 +++++++++++++++++++ propagators/jaeger/jaeger_integration_test.go | 55 +++++++++++++++ propagators/jaeger/jaeger_propagator.go | 4 +- 3 files changed, 126 insertions(+), 1 deletion(-) diff --git a/propagators/jaeger/jaeger_data_test.go b/propagators/jaeger/jaeger_data_test.go index 10f5a864f9e..fef814fe71c 100644 --- a/propagators/jaeger/jaeger_data_test.go +++ b/propagators/jaeger/jaeger_data_test.go @@ -193,3 +193,71 @@ var invalidExtractHeaders = []extractTest{ }, }, } + +type injectTest struct { + name string + sc trace.SpanContext + wantHeaders map[string]string +} + +var injectHeaders = []injectTest{ + { + name: "sampled", + sc: trace.SpanContext{ + TraceID: traceID, + SpanID: spanID, + TraceFlags: trace.FlagsSampled, + }, + wantHeaders: map[string]string{ + jaegerHeader: fmt.Sprintf("%s:%s:0:1", traceID32Str, spanIDStr), + }, + }, + { + name: "debug", + sc: trace.SpanContext{ + TraceID: traceID, + SpanID: spanID, + TraceFlags: trace.FlagsSampled | trace.FlagsDebug, + }, + wantHeaders: map[string]string{ + jaegerHeader: fmt.Sprintf("%s:%s:0:3", traceID32Str, spanIDStr), + }, + }, + { + name: "not sampled", + sc: trace.SpanContext{ + TraceID: traceID, + SpanID: spanID, + }, + wantHeaders: map[string]string{ + jaegerHeader: fmt.Sprintf("%s:%s:0:0", traceID32Str, spanIDStr), + }, + }, +} + +var invalidInjectHeaders = []injectTest{ + { + name: "empty", + sc: trace.SpanContext{}, + }, + { + name: "missing traceID", + sc: trace.SpanContext{ + SpanID: spanID, + TraceFlags: trace.FlagsSampled, + }, + }, + { + name: "missing spanID", + sc: trace.SpanContext{ + TraceID: traceID, + TraceFlags: trace.FlagsSampled, + }, + }, + { + name: "missing both traceID and spanID", + sc: trace.SpanContext{ + TraceFlags: trace.FlagsSampled, + }, + }, +} diff --git a/propagators/jaeger/jaeger_integration_test.go b/propagators/jaeger/jaeger_integration_test.go index 020dbd0011c..cb55d15a8cf 100644 --- a/propagators/jaeger/jaeger_integration_test.go +++ b/propagators/jaeger/jaeger_integration_test.go @@ -21,11 +21,17 @@ import ( "github.com/google/go-cmp/cmp" + mocktracer "go.opentelemetry.io/contrib/internal/trace" "go.opentelemetry.io/contrib/propagators/jaeger" "go.opentelemetry.io/otel/api/propagation" "go.opentelemetry.io/otel/api/trace" ) +var ( + mockTracer = mocktracer.NewTracer("") + _, mockSpan = mockTracer.Start(context.Background(), "") +) + func TestExtractJaeger(t *testing.T) { testGroup := []struct { name string @@ -62,3 +68,52 @@ func TestExtractJaeger(t *testing.T) { } } } + +type testSpan struct { + trace.Span + sc trace.SpanContext +} + +func (s testSpan) SpanContext() trace.SpanContext { + return s.sc +} + +func TestInjectJaeger(t *testing.T) { + testGroup := []struct { + name string + testcases []injectTest + }{ + { + name: "valid test case", + testcases: injectHeaders, + }, + { + name: "invalid test case", + testcases: invalidInjectHeaders, + }, + } + + for _, tg := range testGroup { + for _, tc := range tg.testcases { + propagator := jaeger.Jaeger{} + t.Run(tc.name, func(t *testing.T) { + req, _ := http.NewRequest("GET", "http://example.com", nil) + ctx := trace.ContextWithSpan( + context.Background(), + testSpan{ + Span: mockSpan, + sc: tc.sc, + }, + ) + propagator.Inject(ctx, req.Header) + + for h, v := range tc.wantHeaders { + result, want := req.Header.Get(h), v + if diff := cmp.Diff(result, want); diff != "" { + t.Errorf("%s: %s, header=%s: -got +want %s", tg.name, tc.name, h, diff) + } + } + }) + } + } +} diff --git a/propagators/jaeger/jaeger_propagator.go b/propagators/jaeger/jaeger_propagator.go index 7acf09659d1..fe9e345c88f 100644 --- a/propagators/jaeger/jaeger_propagator.go +++ b/propagators/jaeger/jaeger_propagator.go @@ -73,7 +73,9 @@ func (jaeger Jaeger) Inject(ctx context.Context, supplier propagation.HTTPSuppli headers = append(headers, fmt.Sprintf("%x", flagsNotSampled)) } - supplier.Set(jaegerHeader, strings.Join(headers, separator)) + if len(headers) == 4 { + supplier.Set(jaegerHeader, strings.Join(headers, separator)) + } } func (jaeger Jaeger) Extract(ctx context.Context, supplier propagation.HTTPSupplier) context.Context {