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 ;
14
15
import io .opentelemetry .context .Context ;
15
16
import io .opentelemetry .context .propagation .TextMapGetter ;
17
+ import io .opentelemetry .context .propagation .internal .ExtendedTextMapGetter ;
16
18
import java .util .Collections ;
17
19
import java .util .HashMap ;
20
+ import java .util .Iterator ;
18
21
import java .util .LinkedHashMap ;
22
+ import java .util .List ;
19
23
import java .util .Map ;
20
24
import javax .annotation .Nullable ;
21
25
import org .junit .jupiter .api .Test ;
@@ -36,6 +40,28 @@ public String get(Map<String, String> carrier, String key) {
36
40
}
37
41
};
38
42
43
+ private static final ExtendedTextMapGetter <Map <String , List <String >>> multiGetter =
44
+ new ExtendedTextMapGetter <Map <String , List <String >>>() {
45
+ @ Override
46
+ public Iterable <String > keys (Map <String , List <String >> carrier ) {
47
+ return carrier .keySet ();
48
+ }
49
+
50
+ @ Nullable
51
+ @ Override
52
+ public String get (Map <String , List <String >> carrier , String key ) {
53
+ return carrier .getOrDefault (key , Collections .emptyList ()).stream ()
54
+ .findFirst ()
55
+ .orElse (null );
56
+ }
57
+
58
+ @ Override
59
+ public Iterator <String > getAll (Map <String , List <String >> carrier , String key ) {
60
+ List <String > values = carrier .get (key );
61
+ return values == null ? Collections .emptyIterator () : values .iterator ();
62
+ }
63
+ };
64
+
39
65
@ Test
40
66
void fields () {
41
67
assertThat (W3CBaggagePropagator .getInstance ().fields ()).containsExactly ("baggage" );
@@ -421,6 +447,101 @@ void extract_nullGetter() {
421
447
.isSameAs (context );
422
448
}
423
449
450
+ @ Test
451
+ void extract_multiple_headers () {
452
+ W3CBaggagePropagator propagator = W3CBaggagePropagator .getInstance ();
453
+
454
+ Context result =
455
+ propagator .extract (
456
+ Context .root (),
457
+ ImmutableMap .of ("baggage" , ImmutableList .of ("k1=v1" , "k2=v2" )),
458
+ multiGetter );
459
+
460
+ Baggage expectedBaggage = Baggage .builder ().put ("k1" , "v1" ).put ("k2" , "v2" ).build ();
461
+ assertThat (Baggage .fromContext (result )).isEqualTo (expectedBaggage );
462
+ }
463
+
464
+ @ Test
465
+ void extract_multiple_headers_duplicate_key () {
466
+ W3CBaggagePropagator propagator = W3CBaggagePropagator .getInstance ();
467
+
468
+ Context result =
469
+ propagator .extract (
470
+ Context .root (),
471
+ ImmutableMap .of ("baggage" , ImmutableList .of ("k1=v1" , "k1=v2" )),
472
+ multiGetter );
473
+
474
+ Baggage expectedBaggage = Baggage .builder ().put ("k1" , "v2" ).build ();
475
+ assertThat (Baggage .fromContext (result )).isEqualTo (expectedBaggage );
476
+ }
477
+
478
+ @ Test
479
+ void extract_multiple_headers_mixed_duplicates_non_duplicates () {
480
+ W3CBaggagePropagator propagator = W3CBaggagePropagator .getInstance ();
481
+
482
+ Context result =
483
+ propagator .extract (
484
+ Context .root (),
485
+ ImmutableMap .of ("baggage" , ImmutableList .of ("k1=v1,k2=v0" , "k2=v2,k3=v3" )),
486
+ multiGetter );
487
+
488
+ Baggage expectedBaggage =
489
+ Baggage .builder ().put ("k1" , "v1" ).put ("k2" , "v2" ).put ("k3" , "v3" ).build ();
490
+ assertThat (Baggage .fromContext (result )).isEqualTo (expectedBaggage );
491
+ }
492
+
493
+ @ Test
494
+ void extract_multiple_headers_all_empty () {
495
+ W3CBaggagePropagator propagator = W3CBaggagePropagator .getInstance ();
496
+
497
+ Context result =
498
+ propagator .extract (
499
+ Context .root (), ImmutableMap .of ("baggage" , ImmutableList .of ("" , "" )), multiGetter );
500
+
501
+ Baggage expectedBaggage = Baggage .builder ().build ();
502
+ assertThat (Baggage .fromContext (result )).isEqualTo (expectedBaggage );
503
+ }
504
+
505
+ @ Test
506
+ void extract_multiple_headers_some_empty () {
507
+ W3CBaggagePropagator propagator = W3CBaggagePropagator .getInstance ();
508
+
509
+ Context result =
510
+ propagator .extract (
511
+ Context .root (), ImmutableMap .of ("baggage" , ImmutableList .of ("" , "k=v" )), multiGetter );
512
+
513
+ Baggage expectedBaggage = Baggage .builder ().put ("k" , "v" ).build ();
514
+ assertThat (Baggage .fromContext (result )).isEqualTo (expectedBaggage );
515
+ }
516
+
517
+ @ Test
518
+ void extract_multiple_headers_all_invalid () {
519
+ W3CBaggagePropagator propagator = W3CBaggagePropagator .getInstance ();
520
+
521
+ Context result =
522
+ propagator .extract (
523
+ Context .root (),
524
+ ImmutableMap .of ("baggage" , ImmutableList .of ("!@#$%^" , "key=va%lue" )),
525
+ multiGetter );
526
+
527
+ Baggage expectedBaggage = Baggage .builder ().build ();
528
+ assertThat (Baggage .fromContext (result )).isEqualTo (expectedBaggage );
529
+ }
530
+
531
+ @ Test
532
+ void extract_multiple_headers_some_invalid () {
533
+ W3CBaggagePropagator propagator = W3CBaggagePropagator .getInstance ();
534
+
535
+ Context result =
536
+ propagator .extract (
537
+ Context .root (),
538
+ ImmutableMap .of ("baggage" , ImmutableList .of ("k1=v1" , "key=va%lue" , "k2=v2" )),
539
+ multiGetter );
540
+
541
+ Baggage expectedBaggage = Baggage .builder ().put ("k1" , "v1" ).put ("k2" , "v2" ).build ();
542
+ assertThat (Baggage .fromContext (result )).isEqualTo (expectedBaggage );
543
+ }
544
+
424
545
@ Test
425
546
void inject_noBaggage () {
426
547
W3CBaggagePropagator propagator = W3CBaggagePropagator .getInstance ();
0 commit comments