diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 32d179893e..d9c6b85518 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -28,4 +28,4 @@ jobs: restore-keys: | ${{ runner.os }}-maven- - name: Build with Maven - run: ./mvnw clean install -B -U \ No newline at end of file + run: ./mvnw clean install -B -U diff --git a/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/RegexProperty.java b/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/RegexProperty.java index 385d33e37f..69f3490e1a 100644 --- a/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/RegexProperty.java +++ b/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/RegexProperty.java @@ -16,6 +16,9 @@ package org.springframework.cloud.contract.spec.internal; +import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -32,6 +35,8 @@ public class RegexProperty extends DslProperty implements CanBeDynamic { final Pattern pattern; + String charset = StandardCharsets.UTF_8.name(); + private final Class clazz; public RegexProperty(Object value) { @@ -101,6 +106,18 @@ public class RegexProperty extends DslProperty implements CanBeDynamic { return new RegexProperty(this.getClientValue(), this.getServerValue(), String.class); } + public RegexProperty asString(Charset charset) { + RegexProperty regexProperty = asString(); + regexProperty.charset = charset.name(); + return regexProperty; + } + + public RegexProperty asString(String charset) { + RegexProperty regexProperty = asString(); + regexProperty.charset = charset; + return regexProperty; + } + public RegexProperty asBooleanType() { return new RegexProperty(this.getClientValue(), this.getServerValue(), Boolean.class); } @@ -130,7 +147,7 @@ public class RegexProperty extends DslProperty implements CanBeDynamic { else if (Boolean.class.equals(this.clazz)) { return Boolean.parseBoolean(generatedValue); } - return generatedValue; + return new String(generatedValue.getBytes(Charset.forName(this.charset)), this.charset); } catch (NumberFormatException ex) { if (retries > 0) { @@ -139,6 +156,9 @@ public class RegexProperty extends DslProperty implements CanBeDynamic { } throw ex; } + catch (UnsupportedEncodingException e) { + throw new IllegalStateException(e); + } } public Object generateAndEscapeJavaStringIfNeeded() { diff --git a/specs/spring-cloud-contract-spec-java/src/test/groovy/org/springframework/cloud/contract/spec/internal/RegexPropertyTests.java b/specs/spring-cloud-contract-spec-java/src/test/groovy/org/springframework/cloud/contract/spec/internal/RegexPropertyTests.java new file mode 100644 index 0000000000..47cd5d7f43 --- /dev/null +++ b/specs/spring-cloud-contract-spec-java/src/test/groovy/org/springframework/cloud/contract/spec/internal/RegexPropertyTests.java @@ -0,0 +1,47 @@ +/* + * Copyright 2013-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.contract.spec.internal; + +import java.nio.charset.StandardCharsets; +import java.util.regex.Pattern; + +import org.assertj.core.api.BDDAssertions; +import org.junit.jupiter.api.Test; + +class RegexPropertyTests { + + @Test + void should_generate_utf8_compliant_text_from_regex() { + RegexProperty regexProperty = new RegexProperty(Pattern.compile("......................")); + + String object = (String) regexProperty.generate(); + + String utf8EncodedString = new String(object.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); + BDDAssertions.then(object).isEqualTo(utf8EncodedString); + } + + @Test + void should_generate_custom_charset_compliant_text_from_regex() { + RegexProperty regexProperty = new RegexProperty(Pattern.compile("......................")); + + String object = (String) regexProperty.asString(StandardCharsets.US_ASCII).generate(); + + String utf8EncodedString = new String(object.getBytes(StandardCharsets.US_ASCII), StandardCharsets.US_ASCII); + BDDAssertions.then(object).isEqualTo(utf8EncodedString); + } + +}