From ca72481d107e8e7e79a4813bc043f749ee8edf30 Mon Sep 17 00:00:00 2001 From: anatoliy-balakirev Date: Tue, 13 Aug 2019 15:28:02 +0200 Subject: [PATCH] fix NPEs (#1170) --- .../spec/internal/OptionalProperty.java | 11 ++- .../verifier/builder/QueryParamsResolver.java | 4 +- .../builder/QueryParamsResolverSpec.groovy | 84 +++++++++++++++++++ 3 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/QueryParamsResolverSpec.groovy diff --git a/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/OptionalProperty.java b/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/OptionalProperty.java index 6e19b1482c..bafd2ad923 100644 --- a/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/OptionalProperty.java +++ b/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/OptionalProperty.java @@ -44,8 +44,15 @@ public class OptionalProperty implements Serializable, CanBeDynamic { } public String value() { - return this.value instanceof RegexProperty - ? ((RegexProperty) this.value).pattern() : this.value.toString(); + if (this.value == null) { + return ""; + } + else if (this.value instanceof RegexProperty) { + return ((RegexProperty) this.value).pattern(); + } + else { + return this.value.toString(); + } } protected Pattern optionalPatternValue() { diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/QueryParamsResolver.java b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/QueryParamsResolver.java index 4a58847066..461f8a45a9 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/QueryParamsResolver.java +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/QueryParamsResolver.java @@ -34,12 +34,12 @@ interface QueryParamsResolver { return resolveParamValue(((OptionalProperty) value).optionalPattern()); } else if (value instanceof MatchingStrategy) { - return ((MatchingStrategy) value).getServerValue().toString(); + return resolveParamValue(((MatchingStrategy) value).getServerValue()); } else if (value instanceof DslProperty) { return resolveParamValue(((DslProperty) value).getServerValue()); } - return value.toString(); + return value == null ? "null" : value.toString(); } } diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/QueryParamsResolverSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/QueryParamsResolverSpec.groovy new file mode 100644 index 0000000000..4a0fd0dba6 --- /dev/null +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/QueryParamsResolverSpec.groovy @@ -0,0 +1,84 @@ +package org.springframework.cloud.contract.verifier.builder + +import org.springframework.cloud.contract.spec.internal.DslProperty +import org.springframework.cloud.contract.spec.internal.MatchingStrategy +import org.springframework.cloud.contract.spec.internal.OptionalProperty +import org.springframework.cloud.contract.spec.internal.QueryParameter +import org.springframework.cloud.contract.spec.internal.RegexProperty +import spock.lang.Specification + +import java.util.regex.Pattern + +class QueryParamsResolverSpec extends Specification { + + def 'should return serverValue for QueryParameter'() { + given: + Object parameter = new QueryParameter("some_param", dslProperty) + when: + String resolved = new QueryParamsResolver() {}.resolveParamValue(parameter) + then: + resolved == expected + where: + dslProperty | expected + new DslProperty("client", "server") | "server" + new DslProperty(null, "server") | "server" + new DslProperty("client", null) | "null" + new DslProperty(null, null) | "null" + } + + def 'should return optionalPattern for OptionalProperty'() { + given: + Object parameter = new OptionalProperty(value) + when: + String resolved = new QueryParamsResolver() {}.resolveParamValue(parameter) + then: + resolved == expected + where: + value | expected + "server" | "(server)?" + null | "()?" + new RegexProperty(Pattern.compile(".*")) | "(.*)?" + new RegexProperty(null, Pattern.compile(".*")) | "(.*)?" + new RegexProperty(Pattern.compile(".*"), null) | "(.*)?" + new RegexProperty("", Pattern.compile(".*")) | "(.*)?" + new RegexProperty(Pattern.compile(".*"), "") | "(.*)?" + } + + def 'should return serverValue for MatchingStrategy'() { + given: + Object parameter = new MatchingStrategy(value, MatchingStrategy.Type.EQUAL_TO) + when: + String resolved = new QueryParamsResolver() {}.resolveParamValue(parameter) + then: + resolved == expected + where: + value | expected + "server" | "server" + null | "null" + new DslProperty("client", "server") | "server" + new DslProperty(null, "server") | "server" + new DslProperty("client", null) | "null" + new DslProperty(null, null) | "null" + } + + def 'should return serverValue for DslProperty'() { + when: + String resolved = new QueryParamsResolver() {}.resolveParamValue(parameter) + then: + resolved == expected + where: + parameter | expected + new DslProperty("client", "server") | "server" + new DslProperty(null, "server") | "server" + new DslProperty("client", null) | "null" + new DslProperty(null, null) | "null" + } + + def 'should return \"null\" for null'() { + when: + String resolved = new QueryParamsResolver() {}.resolveParamValue(null) + then: + resolved == "null" + } + +}