@@ -398,6 +398,27 @@ TEST(Tracer, StartSpanWithAttributesCopy)
398398 ASSERT_EQ (" c" , strings[2 ]);
399399}
400400
401+ TEST (Tracer, StartSpanWithInvalidAttributes)
402+ {
403+ InMemorySpanExporter *exporter = new InMemorySpanExporter ();
404+ std::shared_ptr<InMemorySpanData> span_data = exporter->GetData ();
405+ auto tracer = initTracer (std::unique_ptr<SpanExporter>{exporter});
406+
407+ {
408+ tracer
409+ ->StartSpan (" span 1" ,
410+ {
411+ {" attr1" , " value1" },
412+ {" invalid_key\xff " , " valid_value" },
413+ {" valid_key" , " invalid_value\xff " },
414+ })
415+ ->End ();
416+ }
417+
418+ auto spans = span_data->GetSpans ();
419+ ASSERT_EQ (1 , spans.size ());
420+ }
421+
401422TEST (Tracer, GetSampler)
402423{
403424 auto resource = Resource::Create ({});
@@ -586,6 +607,30 @@ TEST(Tracer, StartSpanWithCustomConfig)
586607#endif
587608}
588609
610+ TEST (Tracer, SpanSetEventsWithInvalidAttributes)
611+ {
612+ InMemorySpanExporter *exporter = new InMemorySpanExporter ();
613+ std::shared_ptr<InMemorySpanData> span_data = exporter->GetData ();
614+ auto tracer = initTracer (std::unique_ptr<SpanExporter>{exporter});
615+
616+ auto span = tracer->StartSpan (" span 1" );
617+ span->AddEvent (" event 3" , std::chrono::system_clock::now (),
618+ {
619+ {" attr1" , 1 },
620+ {" invalid_key\xff " , " valid_value" },
621+ {" valid_key" , " invalid_value\xff " },
622+ });
623+ span->End ();
624+
625+ auto spans = span_data->GetSpans ();
626+ ASSERT_EQ (1 , spans.size ());
627+
628+ auto &span_data_events = spans.at (0 )->GetEvents ();
629+ ASSERT_EQ (1 , span_data_events.size ());
630+ ASSERT_EQ (" event 3" , span_data_events[0 ].GetName ());
631+ ASSERT_EQ (1 , span_data_events[0 ].GetAttributes ().size ());
632+ }
633+
589634TEST (Tracer, StartSpanWithCustomConfigDifferingConditionOrder)
590635{
591636 std::shared_ptr<opentelemetry::trace::Tracer> noop_tracer =
@@ -707,6 +752,27 @@ TEST(Tracer, SpanSetLinks)
707752 ASSERT_EQ (nostd::get<std::string>(link2.GetAttributes ().at (" attr3" )), " 3" );
708753 ASSERT_EQ (nostd::get<std::string>(link2.GetAttributes ().at (" attr4" )), " 4" );
709754 }
755+
756+ {
757+
758+ // Span link with invalid attributes
759+ tracer
760+ ->StartSpan (" efg" , {{" attr1" , 1 }},
761+ {{SpanContext (false , false ),
762+ {
763+ {" attr2" , 2 },
764+ {" invalid_key\xff " , " valid_value" },
765+ {" valid_key" , " invalid_value\xff " },
766+ }}})
767+ ->End ();
768+ auto spans = span_data->GetSpans ();
769+ ASSERT_EQ (1 , spans.size ());
770+
771+ auto &span_data_links = spans.at (0 )->GetLinks ();
772+ ASSERT_EQ (1 , span_data_links.size ());
773+ auto link = span_data_links.at (0 );
774+ ASSERT_EQ (nostd::get<int >(link.GetAttributes ().at (" attr2" )), 2 );
775+ }
710776}
711777
712778#if OPENTELEMETRY_ABI_VERSION_NO >= 2
0 commit comments