@@ -19,6 +19,7 @@ using opentelemetry::common::KeyValueIterableView;
1919using opentelemetry::exporter::memory::InMemorySpanData;
2020using opentelemetry::exporter::memory::InMemorySpanExporter;
2121using opentelemetry::trace::SpanContext;
22+ using opentelemetry::trace::TraceFlags;
2223
2324/* *
2425 * A mock sampler that returns non-empty sampling results attributes.
@@ -563,3 +564,51 @@ TEST(Tracer, ExpectParent)
563564 EXPECT_EQ (spandata_first->GetSpanId (), spandata_second->GetParentSpanId ());
564565 EXPECT_EQ (spandata_second->GetSpanId (), spandata_third->GetParentSpanId ());
565566}
567+
568+ TEST (Tracer, ExpectParentWithValidSpanContext)
569+ {
570+ std::unique_ptr<InMemorySpanExporter> exporter (new InMemorySpanExporter ());
571+ std::shared_ptr<InMemorySpanData> span_data = exporter->GetData ();
572+ auto tracer = initTracer (std::move (exporter));
573+ auto spans = span_data.get ()->GetSpans ();
574+
575+ ASSERT_EQ (0 , spans.size ());
576+
577+ // produce valid SpanContext with pseudo span and trace Id.
578+ uint8_t span_id_buf[trace_api::SpanId::kSize ] = {
579+ 1 ,
580+ };
581+ trace_api::SpanId span_id{span_id_buf};
582+ uint8_t trace_id_buf[trace_api::TraceId::kSize ] = {
583+ 2 ,
584+ };
585+ trace_api::TraceId trace_id{trace_id_buf};
586+
587+ trace_api::StartSpanOptions options;
588+ options.parent = SpanContext (trace_id, span_id, TraceFlags{TraceFlags::kIsSampled }, true );
589+
590+ auto span_first = tracer->StartSpan (" span 1" , options);
591+
592+ EXPECT_EQ (span_first->GetContext ().trace_flags ().IsSampled (), true );
593+
594+ options.parent = span_first->GetContext ();
595+ auto span_second = tracer->StartSpan (" span 2" , options);
596+ EXPECT_EQ (span_second->GetContext ().trace_flags ().IsSampled (), true );
597+
598+ options.parent = span_second->GetContext ();
599+ auto span_third = tracer->StartSpan (" span 3" , options);
600+ EXPECT_EQ (span_third->GetContext ().trace_flags ().IsSampled (), true );
601+
602+ span_third->End ();
603+ span_second->End ();
604+ span_first->End ();
605+
606+ spans = span_data->GetSpans ();
607+ ASSERT_EQ (3 , spans.size ());
608+ auto spandata_first = std::move (spans.at (2 ));
609+ auto spandata_second = std::move (spans.at (1 ));
610+ auto spandata_third = std::move (spans.at (0 ));
611+
612+ EXPECT_EQ (spandata_first->GetSpanId (), spandata_second->GetParentSpanId ());
613+ EXPECT_EQ (spandata_second->GetSpanId (), spandata_third->GetParentSpanId ());
614+ }
0 commit comments