From 93d1e52f54b1b1689688cfee8c944b22184e44b5 Mon Sep 17 00:00:00 2001 From: Jerome Van Der Linden Date: Thu, 17 Feb 2022 22:15:40 +0100 Subject: [PATCH] fix #758 remove trailing slash for multiple params --- .../powertools/parameters/BaseProvider.java | 10 ++++---- .../parameters/SSMProviderTest.java | 23 +++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/powertools-parameters/src/main/java/software/amazon/lambda/powertools/parameters/BaseProvider.java b/powertools-parameters/src/main/java/software/amazon/lambda/powertools/parameters/BaseProvider.java index 706b555c1..fb539f850 100644 --- a/powertools-parameters/src/main/java/software/amazon/lambda/powertools/parameters/BaseProvider.java +++ b/powertools-parameters/src/main/java/software/amazon/lambda/powertools/parameters/BaseProvider.java @@ -123,13 +123,15 @@ public BaseProvider withTransformation(Class transformerC */ @Override public Map getMultiple(String path) { + // remove trailing whitespace + String pathWithoutTrailingSlash = path.replaceAll("\\/+$", ""); try { - return (Map) cacheManager.getIfNotExpired(path, now()).orElseGet(() -> { - Map params = getMultipleValues(path); + return (Map) cacheManager.getIfNotExpired(pathWithoutTrailingSlash, now()).orElseGet(() -> { + Map params = getMultipleValues(pathWithoutTrailingSlash); - cacheManager.putInCache(path, params); + cacheManager.putInCache(pathWithoutTrailingSlash, params); - params.forEach((k, v) -> cacheManager.putInCache(path + "/" + k, v)); + params.forEach((k, v) -> cacheManager.putInCache(pathWithoutTrailingSlash + "/" + k, v)); return params; }); diff --git a/powertools-parameters/src/test/java/software/amazon/lambda/powertools/parameters/SSMProviderTest.java b/powertools-parameters/src/test/java/software/amazon/lambda/powertools/parameters/SSMProviderTest.java index 761979e00..da299c38d 100644 --- a/powertools-parameters/src/test/java/software/amazon/lambda/powertools/parameters/SSMProviderTest.java +++ b/powertools-parameters/src/test/java/software/amazon/lambda/powertools/parameters/SSMProviderTest.java @@ -103,6 +103,29 @@ public void getMultiple() { assertThat(paramByPathCaptor.getValue().recursive()).isFalse(); } + @Test + public void getMultipleWithTrailingSlash() { + List parameters = new ArrayList<>(); + parameters.add(Parameter.builder().name("/prod/app1/key1").value("foo1").build()); + parameters.add(Parameter.builder().name("/prod/app1/key2").value("foo2").build()); + parameters.add(Parameter.builder().name("/prod/app1/key3").value("foo3").build()); + GetParametersByPathResponse response = GetParametersByPathResponse.builder().parameters(parameters).build(); + when(client.getParametersByPath(paramByPathCaptor.capture())).thenReturn(response); + + Map params = provider.getMultiple("/prod/app1/"); + assertThat(params).contains( + MapEntry.entry("key1", "foo1"), + MapEntry.entry("key2", "foo2"), + MapEntry.entry("key3", "foo3")); + assertThat(provider.get("/prod/app1/key1")).isEqualTo("foo1"); + assertThat(provider.get("/prod/app1/key2")).isEqualTo("foo2"); + assertThat(provider.get("/prod/app1/key3")).isEqualTo("foo3"); + + assertThat(paramByPathCaptor.getValue().path()).isEqualTo("/prod/app1"); + assertThat(paramByPathCaptor.getValue().withDecryption()).isFalse(); + assertThat(paramByPathCaptor.getValue().recursive()).isFalse(); + } + @Test public void getMultiple_cached_shouldNotCallSSM() { List parameters = new ArrayList<>();