From 6da8e89a398cd7afb4574551943c351d740d360f Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 23 Nov 2021 09:35:29 +0100 Subject: [PATCH] Escapes any special chars; fixes gh-1635 --- .../internal/PatternValueDslProperty.java | 2 +- .../contract/spec/internal/RegexPatterns.java | 4 +- .../builder/MethodBodyBuilderSpec.groovy | 45 +++++++++++++++++++ 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/PatternValueDslProperty.java b/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/PatternValueDslProperty.java index 7f102ad6c7..6fe1cf561d 100644 --- a/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/PatternValueDslProperty.java +++ b/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/PatternValueDslProperty.java @@ -36,7 +36,7 @@ abstract class PatternValueDslProperty implements RegexCr boolean matches = pattern.matcher(generatedValue).matches(); if (!matches) { throw new IllegalStateException("The generated value [" + generatedValue - + "] doesn\'t match the pattern [" + pattern.pattern() + "]"); + + "] doesn't match the pattern [" + pattern.pattern() + "]"); } return createProperty(pattern, object); diff --git a/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/RegexPatterns.java b/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/RegexPatterns.java index 7205b8d00f..c61a4cde78 100644 --- a/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/RegexPatterns.java +++ b/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/RegexPatterns.java @@ -23,6 +23,8 @@ import java.util.stream.Collectors; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.cloud.contract.spec.util.RegexpUtils; + /** * Contains most common regular expression patterns. * @@ -87,7 +89,7 @@ public final class RegexPatterns { "([0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\\.\\d+)?(Z|[+-][01]\\d:[0-5]\\d)"); protected static Pattern anyOf(String... values) { - return Pattern.compile(Arrays.stream(values).map(it -> '^' + it + '$').collect(Collectors.joining("|"))); + return Pattern.compile(Arrays.stream(values).map(it -> '^' + RegexpUtils.escapeSpecialRegexWithSingleEscape(it) + '$').collect(Collectors.joining("|"))); } public static String multipartParam(Object name, Object value) { diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy index cac1447771..2210e3576d 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy @@ -21,6 +21,7 @@ import org.junit.Rule import org.spockframework.runtime.extension.builtin.PreconditionContext import spock.lang.IgnoreIf import spock.lang.Issue +import spock.lang.Retry import spock.lang.Shared import spock.lang.Specification @@ -2127,4 +2128,48 @@ response: } } + @Issue("1635") + def 'should work with anyOf that contains special chars'() { + given: + Contract contractDsl = Contract.make { + name 'anyOf test' + request { + method 'POST' + url ("hello") + body( + type: anyOf("VAL", "VAL+VAL") + ) + } + response { + status OK() + } + } + methodBuilder() + when: + String test = singleTestGenerator(contractDsl) + then: + SyntaxChecker.tryToCompileWithoutCompileStatic(methodBuilderName, test) + and: + !test.contains('singleValue') + and: + stubMappingIsValidWireMockStub(contractDsl) + where: + methodBuilderName | methodBuilder + "spock" | { + properties.testFramework = TestFramework.SPOCK + } + "mockmvc" | { + properties.testMode = TestMode.MOCKMVC + } + "jaxrs-spock" | { + properties.testFramework = TestFramework.SPOCK; properties.testMode = TestMode.JAXRSCLIENT + } + "jaxrs" | { + properties.testFramework = TestFramework.JUNIT; properties.testMode = TestMode.JAXRSCLIENT + } + "testNG" | { + properties.testFramework = TestFramework.TESTNG + } + } + }