From fbb5ebb01e5152e54a4c77bd43ba18f347798db5 Mon Sep 17 00:00:00 2001 From: John Watson Date: Fri, 12 Jul 2024 20:09:03 -0700 Subject: [PATCH] PR 6524 with amendments (#6569) Co-authored-by: junwense <970597653@qq.com> Co-authored-by: SeanJ <44492651+junwense@users.noreply.github.com> --- .../propagation/CaseInsensitiveMap.java | 19 ++++- .../propagation/CaseInsensitiveMapTest.java | 69 +++++++++++++++++++ 2 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 api/incubator/src/test/java/io/opentelemetry/api/incubator/propagation/CaseInsensitiveMapTest.java 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"); + } +}