diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/CaseInsensitiveMap.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/CaseInsensitiveMap.java index def4b6f8b5..64a3335050 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/CaseInsensitiveMap.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/propagation/CaseInsensitiveMap.java @@ -14,18 +14,31 @@ class CaseInsensitiveMap extends HashMap { private static final long serialVersionUID = -4202518750189126871L; + CaseInsensitiveMap() {} + CaseInsensitiveMap(Map carrier) { - super(carrier); + if (carrier != null) { + this.putAll(carrier); + } } @Override public String put(String key, String value) { - return super.put(key.toLowerCase(Locale.ROOT), value); + return super.put(getKeyLowerCase(key), value); + } + + @Override + public void putAll(Map m) { + m.forEach(this::put); + } + + private static String getKeyLowerCase(String key) { + return key.toLowerCase(Locale.ROOT); } @Override @Nullable public String get(Object key) { - return super.get(((String) key).toLowerCase(Locale.ROOT)); + return super.get(getKeyLowerCase((String) key)); } } diff --git a/api/incubator/src/test/java/io/opentelemetry/api/incubator/propagation/CaseInsensitiveMapTest.java b/api/incubator/src/test/java/io/opentelemetry/api/incubator/propagation/CaseInsensitiveMapTest.java new file mode 100644 index 0000000000..ac9feee91b --- /dev/null +++ b/api/incubator/src/test/java/io/opentelemetry/api/incubator/propagation/CaseInsensitiveMapTest.java @@ -0,0 +1,69 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.incubator.propagation; + +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; + +import java.util.HashMap; +import java.util.Map; +import org.junit.jupiter.api.Test; + +class CaseInsensitiveMapTest { + + @Test + void createByConstructor() { + Map map = new HashMap<>(); + map.put("Key1", "test"); + map.put("Key2", "test2"); + + CaseInsensitiveMap caseInsensitiveMap = new CaseInsensitiveMap(map); + + Map standardMap = new HashMap<>(); + standardMap.put("key1", "test"); + standardMap.put("key2", "test2"); + + assertThat(caseInsensitiveMap).isEqualTo(standardMap); + } + + @Test + void putAll() { + CaseInsensitiveMap caseInsensitiveMap = new CaseInsensitiveMap(); + Map standardMap = new HashMap<>(); + standardMap.put("key1", "test"); + standardMap.put("key2", "test2"); + caseInsensitiveMap.putAll(standardMap); + assertThat(caseInsensitiveMap).isEqualTo(standardMap); + } + + @Test + void putIfAbsent() { + CaseInsensitiveMap caseInsensitiveMap = new CaseInsensitiveMap(); + caseInsensitiveMap.putIfAbsent("key1", "test"); + assertThat(caseInsensitiveMap.get("KEY1")).isEqualTo("test"); + caseInsensitiveMap.putIfAbsent("key1", "nope"); + assertThat(caseInsensitiveMap.get("KEY1")).isEqualTo("test"); + } + + @Test + void createByConstructorWithNullMap() { + CaseInsensitiveMap caseInsensitiveMap = new CaseInsensitiveMap(null); + assertThat(caseInsensitiveMap).isEmpty(); + } + + @Test + void caseInsensitivity() { + CaseInsensitiveMap caseInsensitiveMap = new CaseInsensitiveMap(null); + + assertThat(caseInsensitiveMap).isEmpty(); + + caseInsensitiveMap.put("KEY1", "test1"); + caseInsensitiveMap.put("KEY2", "test2"); + assertThat(caseInsensitiveMap.get("key1")).isEqualTo("test1"); + assertThat(caseInsensitiveMap.get("key2")).isEqualTo("test2"); + assertThat(caseInsensitiveMap.get("kEy2")).isEqualTo("test2"); + assertThat(caseInsensitiveMap.get("KEY2")).isEqualTo("test2"); + } +}