Fixed invalid contract package string

without this change we were matching the package for contracts with _REPLACEME_ text in it
with this change we're checking it against the package for contracts in a proper way

fixes gh-701
This commit is contained in:
Marcin Grzejszczak
2018-08-01 12:12:37 +02:00
parent 85406875e1
commit 46963e3da5
3 changed files with 33 additions and 3 deletions

View File

@@ -20,7 +20,10 @@ import java.nio.charset.StandardCharsets
import java.nio.file.Path
import java.util.concurrent.atomic.AtomicInteger
import groovy.transform.CompileStatic
import groovy.transform.PackageScope
import org.apache.commons.logging.Log
import org.apache.commons.logging.LogFactory
import wiremock.com.google.common.collect.ListMultimap
import org.springframework.cloud.contract.spec.ContractVerifierException
@@ -37,13 +40,16 @@ import static org.springframework.cloud.contract.verifier.util.NamesUtil.beforeL
import static org.springframework.cloud.contract.verifier.util.NamesUtil.convertIllegalPackageChars
import static org.springframework.cloud.contract.verifier.util.NamesUtil.directoryToPackage
import static org.springframework.cloud.contract.verifier.util.NamesUtil.toLastDot
/**
* @author Jakub Kubrynski, codearte.io
*/
@CompileStatic
class TestGenerator {
private static final String DEFAULT_CLASS_PREFIX = "ContractVerifier"
private static final String DEFAULT_TEST_PACKAGE = "org.springframework.cloud.contract.verifier.tests"
private static final Log log = LogFactory.getLog(TestGenerator)
private final ContractVerifierConfigProperties configProperties
private AtomicInteger counter = new AtomicInteger()
@@ -101,7 +107,7 @@ class TestGenerator {
}
}
private String relativizeContractPath(Map.Entry<Path, Collection<Path>> entry) {
private String relativizeContractPath(Map.Entry<Path, Collection<ContractMetadata>> entry) {
Path relativePath = configProperties.contractsDslDir.toPath().relativize(entry.getKey())
if (StringUtils.isEmpty(relativePath.toString())) {
return DEFAULT_CLASS_PREFIX
@@ -111,8 +117,11 @@ class TestGenerator {
private void processIncludedDirectory(
final String includedDirectoryRelativePath, Collection<ContractMetadata> contracts, final String basePackageNameForClass) {
if (log.isDebugEnabled()) {
log.debug("Included directory relative path is [${includedDirectoryRelativePath}]")
}
if (contracts.size()) {
def className = afterLast(includedDirectoryRelativePath.toString(), File.separator) + resolveNameSuffix()
def className = afterLast(includedDirectoryRelativePath, File.separator) + resolveNameSuffix()
def convertedClassName = convertIllegalPackageChars(className)
def packageName = buildPackage(basePackageNameForClass, includedDirectoryRelativePath)
def classBytes = generator.buildClass(configProperties, contracts, convertedClassName, packageName, includedDirectoryRelativePath).getBytes(StandardCharsets.UTF_8)

View File

@@ -18,6 +18,9 @@ package org.springframework.cloud.contract.verifier.builder
import groovy.transform.CompileStatic
import groovy.transform.PackageScope
import org.apache.commons.logging.Log
import org.apache.commons.logging.LogFactory
import org.springframework.cloud.contract.verifier.config.TestFramework
import org.springframework.cloud.contract.verifier.util.NamesUtil
import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties
@@ -33,6 +36,8 @@ import org.springframework.cloud.contract.verifier.config.ContractVerifierConfig
@PackageScope
class ClassBuilder {
private static final Log log = LogFactory.getLog(ClassBuilder)
private static final String SEPARATOR = "_REPLACEME_"
private final String className
@@ -72,11 +77,15 @@ class ClassBuilder {
}
protected static String retrieveBaseClass(ContractVerifierConfigProperties properties, String includedDirectoryRelativePath) {
String contractPathAsPackage = includedDirectoryRelativePath.replace(File.separator, ".")
String contractPackage = includedDirectoryRelativePath.replace(File.separator, SEPARATOR)
// package mapping takes super precedence
if (properties.baseClassMappings) {
Map.Entry<String, String> mapping = properties.baseClassMappings.find { String pattern, String fqn ->
return contractPackage.matches(pattern)
return contractPathAsPackage.matches(pattern)
}
if (log.isDebugEnabled()) {
log.debug("Matching pattern for contract package [${contractPathAsPackage}] with setup ${properties.baseClassMappings} is [${mapping}]")
}
if (mapping) {
return mapping.value

View File

@@ -1,5 +1,7 @@
package org.springframework.cloud.contract.verifier.builder
import spock.lang.Issue
import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties
import spock.lang.Specification
@@ -49,6 +51,16 @@ class ClassBuilderSpec extends Specification {
ClassBuilder.retrieveBaseClass(props, contractRelativeFolder) == 'com.example.base.SuperClass'
}
@Issue("701")
def "should match base class when mapping regex has multiple folders"() {
given:
ContractVerifierConfigProperties props = new ContractVerifierConfigProperties(
baseClassMappings: ['.*bar.baz.some.*' : 'com.example.base.SuperClass'])
String contractRelativeFolder = 'foo/bar/baz/some/package'.split("/").join(File.separator)
expect:
ClassBuilder.retrieveBaseClass(props, contractRelativeFolder) == 'com.example.base.SuperClass'
}
def "should return the first matching base class when provided mapping doesn't match"() {
given:
ContractVerifierConfigProperties props = new ContractVerifierConfigProperties(