package tracing import ( "context" "net" "testing" "go.opentelemetry.io/otel/trace" "google.golang.org/grpc/peer" "google.golang.org/grpc/stats" ) type ctxKey string const testKey ctxKey = "MY_TEST_KEY" func TestClient_HandleConn(_ *testing.T) { (&ClientHandler{}).HandleConn(context.Background(), nil) } func Test_Client_TagConn(t *testing.T) { client := &ClientHandler{} ctx := context.WithValue(context.Background(), testKey, 123) if client.TagConn(ctx, nil).Value(testKey) != 123 { t.Errorf(`The context value must be 123 for the "MY_KEY_TEST" key, %v given.`, client.TagConn(ctx, nil).Value(testKey)) } } func Test_Client_TagRPC(t *testing.T) { client := &ClientHandler{} ctx := context.WithValue(context.Background(), testKey, 123) if client.TagRPC(ctx, nil).Value(testKey) != 123 { t.Errorf(`The context value must be 123 for the "MY_KEY_TEST" key, %v given.`, client.TagConn(ctx, nil).Value(testKey)) } } type ( mockSpan struct { trace.Span mockSpanCtx *trace.SpanContext } ) func (m *mockSpan) SpanContext() trace.SpanContext { return *m.mockSpanCtx } func TestClient_HandleRPC(_ *testing.T) { client := &ClientHandler{} ctx := context.Background() rs := stats.OutHeader{} // Handle stats.RPCStats is not type of stats.OutHeader case client.HandleRPC(context.TODO(), nil) // Handle context doesn't have the peerkey filled with a Peer instance client.HandleRPC(ctx, &rs) // Handle context with the peerkey filled with a Peer instance ip, _ := net.ResolveIPAddr("ip", "1.1.1.1") ctx = peer.NewContext(ctx, &peer.Peer{ Addr: ip, }) client.HandleRPC(ctx, &rs) // Handle context with Span _, span := trace.NewNoopTracerProvider().Tracer("Tracer").Start(ctx, "Spanname") spanCtx := trace.SpanContext{} spanID := [8]byte{12, 12, 12, 12, 12, 12, 12, 12} traceID := [16]byte{12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12} spanCtx = spanCtx.WithTraceID(traceID) spanCtx = spanCtx.WithSpanID(spanID) mSpan := mockSpan{ Span: span, mockSpanCtx: &spanCtx, } ctx = trace.ContextWithSpan(ctx, &mSpan) client.HandleRPC(ctx, &rs) }