From 9b52cfd7d587eb3ce51c072e03aa5b202243746c Mon Sep 17 00:00:00 2001 From: Fawzi Essam Date: Sat, 5 Apr 2025 13:58:12 +0200 Subject: [PATCH] Test escape character support in PropertySourcesPropertyResolver See gh-34326 See gh-34720 See gh-34861 Signed-off-by: Fawzi Essam --- .../PropertySourcesPropertyResolverTests.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/spring-core/src/test/java/org/springframework/core/env/PropertySourcesPropertyResolverTests.java b/spring-core/src/test/java/org/springframework/core/env/PropertySourcesPropertyResolverTests.java index 42faac60483..a4db31d36c1 100644 --- a/spring-core/src/test/java/org/springframework/core/env/PropertySourcesPropertyResolverTests.java +++ b/spring-core/src/test/java/org/springframework/core/env/PropertySourcesPropertyResolverTests.java @@ -366,4 +366,56 @@ class PropertySourcesPropertyResolverTests { .withMessageContaining("Could not resolve placeholder 'bogus' in value \"${p1}:${p2}:${bogus}\""); } + @Test + void escapedPlaceholders_areNotEvaluated() { + testProperties.put("prop1", "value1"); + testProperties.put("prop2", "value2\\${prop1}"); + + assertThat(propertyResolver.getProperty("prop2")).isEqualTo("value2${prop1}"); + } + + @Test + void multipleEscapedPlaceholders_arePreserved() { + testProperties.put("prop1", "value1"); + testProperties.put("prop2", "value2"); + testProperties.put("complex", "start\\${prop1}middle\\${prop2}end"); + + assertThat(propertyResolver.getProperty("complex")).isEqualTo("start${prop1}middle${prop2}end"); + } + + @Test + void doubleBackslashes_areProcessedCorrectly() { + testProperties.put("prop1", "value1"); + testProperties.put("doubleEscaped", "value2\\\\${prop1}"); + + assertThat(propertyResolver.getProperty("doubleEscaped")).isEqualTo("value2\\${prop1}"); + } + + @Test + void escapedPlaceholdersInNestedProperties() { + MutablePropertySources ps = new MutablePropertySources(); + ps.addFirst(new MockPropertySource() + .withProperty("p1", "v1") + .withProperty("p2", "v2") + .withProperty("escaped", "prefix-\\${p1}") + .withProperty("nested", "${escaped}-${p2}") + ); + ConfigurablePropertyResolver pr = new PropertySourcesPropertyResolver(ps); + + assertThat(pr.getProperty("nested")).isEqualTo("prefix-${p1}-v2"); + } + + + @Test + void escapedPlaceholders_withCharSequenceValues() { + MutablePropertySources ps = new MutablePropertySources(); + ps.addFirst(new MockPropertySource() + .withProperty("p1", "v1") + .withProperty("charseq", new StringBuilder("prefix-\\${p1}")) + ); + PropertyResolver resolver = new PropertySourcesPropertyResolver(ps); + + assertThat(resolver.getProperty("charseq")).isEqualTo("prefix-${p1}"); + } + }