8
8
import static java .util .Collections .singletonMap ;
9
9
import static org .assertj .core .api .Assertions .assertThat ;
10
10
11
+ import com .google .common .collect .ImmutableList ;
11
12
import com .google .common .collect .ImmutableMap ;
12
13
import io .opentelemetry .api .baggage .Baggage ;
13
14
import io .opentelemetry .api .baggage .BaggageEntryMetadata ;
16
17
import java .util .Collections ;
17
18
import java .util .HashMap ;
18
19
import java .util .LinkedHashMap ;
20
+ import java .util .List ;
19
21
import java .util .Map ;
20
22
import javax .annotation .Nullable ;
21
23
import org .junit .jupiter .api .Test ;
@@ -36,6 +38,27 @@ public String get(Map<String, String> carrier, String key) {
36
38
}
37
39
};
38
40
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
+
39
62
@ Test
40
63
void fields () {
41
64
assertThat (W3CBaggagePropagator .getInstance ().fields ()).containsExactly ("baggage" );
@@ -421,6 +444,73 @@ void extract_nullGetter() {
421
444
.isSameAs (context );
422
445
}
423
446
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
+
424
514
@ Test
425
515
void inject_noBaggage () {
426
516
W3CBaggagePropagator propagator = W3CBaggagePropagator .getInstance ();
0 commit comments