88import static java .util .Collections .singletonMap ;
99import static org .assertj .core .api .Assertions .assertThat ;
1010
11+ import com .google .common .collect .ImmutableList ;
1112import com .google .common .collect .ImmutableMap ;
1213import io .opentelemetry .api .baggage .Baggage ;
1314import io .opentelemetry .api .baggage .BaggageEntryMetadata ;
1617import java .util .Collections ;
1718import java .util .HashMap ;
1819import java .util .LinkedHashMap ;
20+ import java .util .List ;
1921import java .util .Map ;
2022import javax .annotation .Nullable ;
2123import org .junit .jupiter .api .Test ;
@@ -36,6 +38,27 @@ public String get(Map<String, String> carrier, String key) {
3638 }
3739 };
3840
41+ private static final TextMapGetter <Map <String , List <String >>> multiGetter =
42+ new TextMapGetter <Map <String , List <String >>>() {
43+ @ Override
44+ public Iterable <String > keys (Map <String , List <String >> carrier ) {
45+ return carrier .keySet ();
46+ }
47+
48+ @ Nullable
49+ @ Override
50+ public String get (Map <String , List <String >> carrier , String key ) {
51+ return carrier .getOrDefault (key , Collections .emptyList ()).stream ()
52+ .findFirst ()
53+ .orElse (null );
54+ }
55+
56+ @ Override
57+ public List <String > getList (Map <String , List <String >> carrier , String key ) {
58+ return carrier .getOrDefault (key , Collections .emptyList ());
59+ }
60+ };
61+
3962 @ Test
4063 void fields () {
4164 assertThat (W3CBaggagePropagator .getInstance ().fields ()).containsExactly ("baggage" );
@@ -421,6 +444,73 @@ void extract_nullGetter() {
421444 .isSameAs (context );
422445 }
423446
447+ @ Test
448+ void extract_multiple_headers () {
449+ W3CBaggagePropagator propagator = W3CBaggagePropagator .getInstance ();
450+
451+ Context result =
452+ propagator .extract (
453+ Context .root (),
454+ ImmutableMap .of ("baggage" , ImmutableList .of ("k1=v1" , "k2=v2" )),
455+ multiGetter );
456+
457+ Baggage expectedBaggage = Baggage .builder ().put ("k1" , "v1" ).put ("k2" , "v2" ).build ();
458+ assertThat (Baggage .fromContext (result )).isEqualTo (expectedBaggage );
459+ }
460+
461+ @ Test
462+ void extract_multiple_headers_duplicate_key () {
463+ W3CBaggagePropagator propagator = W3CBaggagePropagator .getInstance ();
464+
465+ Context result =
466+ propagator .extract (
467+ Context .root (),
468+ ImmutableMap .of ("baggage" , ImmutableList .of ("k1=v1" , "k1=v2" )),
469+ multiGetter );
470+
471+ Baggage expectedBaggage = Baggage .builder ().put ("k1" , "v2" ).build ();
472+ assertThat (Baggage .fromContext (result )).isEqualTo (expectedBaggage );
473+ }
474+
475+ @ Test
476+ void extract_multiple_headers_mixed_duplicates_non_duplicates () {
477+ W3CBaggagePropagator propagator = W3CBaggagePropagator .getInstance ();
478+
479+ Context result =
480+ propagator .extract (
481+ Context .root (),
482+ ImmutableMap .of ("baggage" , ImmutableList .of ("k1=v1,k2=v0" , "k2=v2,k3=v3" )),
483+ multiGetter );
484+
485+ Baggage expectedBaggage =
486+ Baggage .builder ().put ("k1" , "v1" ).put ("k2" , "v2" ).put ("k3" , "v3" ).build ();
487+ assertThat (Baggage .fromContext (result )).isEqualTo (expectedBaggage );
488+ }
489+
490+ @ Test
491+ void extract_multiple_headers_all_empty () {
492+ W3CBaggagePropagator propagator = W3CBaggagePropagator .getInstance ();
493+
494+ Context result =
495+ propagator .extract (
496+ Context .root (), ImmutableMap .of ("baggage" , ImmutableList .of ("" , "" )), multiGetter );
497+
498+ Baggage expectedBaggage = Baggage .builder ().build ();
499+ assertThat (Baggage .fromContext (result )).isEqualTo (expectedBaggage );
500+ }
501+
502+ @ Test
503+ void extract_multiple_headers_some_empty () {
504+ W3CBaggagePropagator propagator = W3CBaggagePropagator .getInstance ();
505+
506+ Context result =
507+ propagator .extract (
508+ Context .root (), ImmutableMap .of ("baggage" , ImmutableList .of ("" , "k=v" )), multiGetter );
509+
510+ Baggage expectedBaggage = Baggage .builder ().put ("k" , "v" ).build ();
511+ assertThat (Baggage .fromContext (result )).isEqualTo (expectedBaggage );
512+ }
513+
424514 @ Test
425515 void inject_noBaggage () {
426516 W3CBaggagePropagator propagator = W3CBaggagePropagator .getInstance ();
0 commit comments