Deprecating skipSnapshotCheck and providing fake m2 for Aether
without this change Aether, when having both local and remote JARs, always picks the local one, even though we don't want it to. There seems to be no way to change it via an API. We had a check in Spring Cloud Contract to throw an exception when we wanted a remote JAR but the local one was fetched. You could have changed it by providing a system property or a plugin property called `skipSnapshotCheck` or `contractsSkipSnapshotCheck` with this change we're deprecating that flag since we're moving this logic to the internals of how we integrate with Aether. If the problem was that there was both the local and the remote JAR, what we could do is get rid of the local JAR. Obviously we don't want to remove it so what we're doing is when someone provides the REMOTE stub mode, we're creating a temporary directory and we're temporarily pointing Aether to that directory as our local m2. Since it's empty, Aether will not assume that we have any stubs stored locally. Thus, we will never have conflicts of remote vs local jars. fixes gh-643 additional links: - http://maven.40175.n5.nabble.com/Resolving-an-Artifact-from-Remote-Repository-instead-of-Local-td5875134.html - https://stackoverflow.com/questions/9123004/maven-is-it-possible-to-override-location-of-local-repository-via-the-use-of-co
This commit is contained in:
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-bin.zip
|
||||
|
||||
@@ -261,8 +261,6 @@ closure to set it up.
|
||||
separated. Otherwise, it scans contracts under the provided directory.
|
||||
* *contractsMode*: Specifies the mode of downloading contracts (whether the
|
||||
JAR is available offline, remotely etc.)
|
||||
* *contractsSnapshotCheckSkip*: If set to `true` will not assert whether the
|
||||
downloaded stubs / contract JAR was downloaded from a remote location or a local one(only applicable to Maven repos, not Git or Pact).
|
||||
* *deleteStubsAfterTest*: If set to `false` will not remove any downloaded
|
||||
contracts from temporary directories
|
||||
|
||||
@@ -610,8 +608,6 @@ the following options:
|
||||
* *contractsPath*: The path to the concrete contracts in the JAR with packaged contracts.
|
||||
Defaults to `groupid/artifactid` where `gropuid` is slash separated.
|
||||
* *contractsMode*: Picks the mode in which stubs will be found and registered
|
||||
* *contractsSnapshotCheckSkip*: If `true` then will not assert whether a stub / contract
|
||||
JAR was downloaded from local or remote location
|
||||
* *deleteStubsAfterTest*: If set to `false` will not remove any downloaded
|
||||
contracts from temporary directories
|
||||
* *contractsRepositoryUrl*: URL to a repo with the artifacts that have contracts. If it is not provided,
|
||||
@@ -945,27 +941,6 @@ For example, you might decide to have no dependencies at all.
|
||||
As a consumer, if you add the stub dependency to your classpath, you can explicitly
|
||||
exclude the unwanted dependencies.
|
||||
|
||||
=== CI Server setup
|
||||
|
||||
When fetching stubs / contracts in a CI, shared environment, what might happen is that
|
||||
both the producer and the consumer reuse the same local Maven repository. Due to this,
|
||||
the framework, responsible for downloading a stub JAR from remote location,
|
||||
can't decide which JAR should be picked, local or remote one. That caused
|
||||
the `"The artifact was found in the local repository but you have explicitly
|
||||
stated that it should be downloaded from a remote one"` exception
|
||||
and failed the build.
|
||||
|
||||
For such cases we're introducing the property and plugin setup mechanism:
|
||||
|
||||
- via `stubrunner.snapshot-check-skip` system property
|
||||
- via `STUBRUNNER_SNAPSHOT_CHECK_SKIP` environment variable
|
||||
|
||||
if either of these values is set to `true`, then the stub downloader will not
|
||||
verify the origin of the downloaded JAR.
|
||||
|
||||
For the plugins you need to set the `contractsSnapshotCheckSkip` property
|
||||
to `true`.
|
||||
|
||||
=== Scenarios
|
||||
|
||||
You can handle scenarios with Spring Cloud Contract Verifier. All you need to do is to
|
||||
|
||||
@@ -17,7 +17,12 @@
|
||||
package org.springframework.cloud.contract.stubrunner;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.util.Random;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.eclipse.aether.DefaultRepositorySystemSession;
|
||||
import org.eclipse.aether.RepositorySystem;
|
||||
import org.eclipse.aether.RepositorySystemSession;
|
||||
@@ -41,10 +46,14 @@ import shaded.org.eclipse.aether.transport.http.HttpTransporterFactory;
|
||||
|
||||
class AetherFactories {
|
||||
|
||||
private static final Log log = LogFactory.getLog(AetherFactories.class);
|
||||
|
||||
private static final String MAVEN_LOCAL_REPOSITORY_LOCATION = "maven.repo.local";
|
||||
private static final String MAVEN_USER_SETTINGS_LOCATION = "org.apache.maven.user-settings";
|
||||
private static final String MAVEN_GLOBAL_SETTINGS_LOCATION = "org.apache.maven.global-settings";
|
||||
|
||||
private static final Random RANDOM = new Random();
|
||||
|
||||
public static RepositorySystem newRepositorySystem() {
|
||||
DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator();
|
||||
locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class);
|
||||
@@ -60,14 +69,34 @@ class AetherFactories {
|
||||
session.setUpdatePolicy(RepositoryPolicy.UPDATE_POLICY_ALWAYS);
|
||||
}
|
||||
session.setChecksumPolicy(RepositoryPolicy.CHECKSUM_POLICY_WARN);
|
||||
LocalRepository localRepo = new LocalRepository(localRepositoryDirectory());
|
||||
String localRepositoryDirectory = localRepositoryDirectory(workOffline);
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Local Repository Directory set to [" + localRepositoryDirectory + "]. Work offline: [" + workOffline + "]");
|
||||
}
|
||||
LocalRepository localRepo = new LocalRepository(localRepositoryDirectory);
|
||||
session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo));
|
||||
return session;
|
||||
}
|
||||
|
||||
private static String localRepositoryDirectory() {
|
||||
protected static String localRepositoryDirectory(boolean workOffline) {
|
||||
String localRepoLocationFromSettings = settings().getLocalRepository();
|
||||
return readPropertyFromSystemProps(localRepoLocationFromSettings);
|
||||
String currentLocalRepo = readPropertyFromSystemProps(localRepoLocationFromSettings);
|
||||
if (workOffline) {
|
||||
return currentLocalRepo;
|
||||
}
|
||||
return temporaryDirectory();
|
||||
}
|
||||
|
||||
private static String temporaryDirectory() {
|
||||
try {
|
||||
return Files.createTempDirectory("aether-local").toString();
|
||||
}
|
||||
catch (IOException e) {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Failed to create a new temporary directory, will generate a new one under temp dir");
|
||||
}
|
||||
return System.getProperty("java.io.tmpdir") + File.separator + RANDOM.nextInt();
|
||||
}
|
||||
}
|
||||
|
||||
private static String readPropertyFromSystemProps(
|
||||
@@ -87,16 +116,19 @@ class AetherFactories {
|
||||
return System.getenv(prop);
|
||||
}
|
||||
|
||||
private static File userSettings() {
|
||||
String user = fromSystemPropOrEnv(MAVEN_USER_SETTINGS_LOCATION);
|
||||
if (user == null) {
|
||||
return new File(new File(System.getProperty("user.home")).getAbsoluteFile(),
|
||||
File.separator + ".m2" + File.separator + "settings.xml");
|
||||
}
|
||||
return new File(user);
|
||||
}
|
||||
|
||||
private static Settings settings() {
|
||||
SettingsBuilder builder = new DefaultSettingsBuilderFactory().newInstance();
|
||||
SettingsBuildingRequest request = new DefaultSettingsBuildingRequest();
|
||||
String user = fromSystemPropOrEnv(MAVEN_USER_SETTINGS_LOCATION);
|
||||
if (user == null) {
|
||||
request.setUserSettingsFile(new File(new File(System.getProperty("user.home")).getAbsoluteFile(),
|
||||
File.separator + ".m2" + File.separator + "settings.xml"));
|
||||
} else {
|
||||
request.setUserSettingsFile(new File(user));
|
||||
}
|
||||
request.setUserSettingsFile(userSettings());
|
||||
String global = fromSystemPropOrEnv(MAVEN_GLOBAL_SETTINGS_LOCATION);
|
||||
if (global != null) {
|
||||
request.setGlobalSettingsFile(new File(global));
|
||||
|
||||
@@ -57,7 +57,6 @@ public class AetherStubDownloader implements StubDownloader {
|
||||
private static final String ARTIFACT_EXTENSION = "jar";
|
||||
private static final String LATEST_ARTIFACT_VERSION = "(,]";
|
||||
private static final String LATEST_VERSION_IN_IVY = "+";
|
||||
private static final String STUBRUNNER_SNAPSHOT_CHECK_SKIP_SYSTEM_PROP = "stubrunner.snapshot-check-skip";
|
||||
// Preloading class for the shutdown hook not to throw ClassNotFound
|
||||
private static final Class CLAZZ = TemporaryFileStorage.class;
|
||||
|
||||
@@ -65,7 +64,6 @@ public class AetherStubDownloader implements StubDownloader {
|
||||
private final RepositorySystem repositorySystem;
|
||||
private final RepositorySystemSession session;
|
||||
private final boolean workOffline;
|
||||
private final boolean snapshotCheckSkip;
|
||||
private final boolean deleteStubsAfterTest;
|
||||
|
||||
public AetherStubDownloader(StubRunnerOptions stubRunnerOptions) {
|
||||
@@ -92,8 +90,6 @@ public class AetherStubDownloader implements StubDownloader {
|
||||
this.repositorySystem = newRepositorySystem();
|
||||
this.workOffline = stubRunnerOptions.stubsMode == StubRunnerProperties.StubsMode.LOCAL;
|
||||
this.session = newSession(this.repositorySystem, this.workOffline);
|
||||
this.snapshotCheckSkip =
|
||||
stubRunnerOptions.isSnapshotCheckSkip() || skipSnapshotCheck();
|
||||
registerShutdownHook();
|
||||
}
|
||||
|
||||
@@ -118,7 +114,6 @@ public class AetherStubDownloader implements StubDownloader {
|
||||
log.error("Remote repositories for stubs are not specified and work offline flag wasn't passed");
|
||||
}
|
||||
this.workOffline = false;
|
||||
this.snapshotCheckSkip = skipSnapshotCheck();
|
||||
registerShutdownHook();
|
||||
}
|
||||
|
||||
@@ -150,28 +145,24 @@ public class AetherStubDownloader implements StubDownloader {
|
||||
|
||||
private File unpackedJar(String resolvedVersion, String stubsGroup,
|
||||
String stubsModule, String classifier) {
|
||||
log.info("Resolved version is [" + resolvedVersion + "]");
|
||||
if (StringUtils.isEmpty(resolvedVersion)) {
|
||||
log.warn("Stub for group [" + stubsGroup + "] module [" + stubsModule
|
||||
+ "] and classifier [" + classifier + "] not found in "
|
||||
+ this.remoteRepos);
|
||||
return null;
|
||||
}
|
||||
Artifact artifact = new DefaultArtifact(stubsGroup, stubsModule, classifier,
|
||||
ARTIFACT_EXTENSION, resolvedVersion);
|
||||
ArtifactRequest request = new ArtifactRequest(artifact, this.remoteRepos, null);
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Resolving artifact [" + artifact
|
||||
+ "] using remote repositories " + this.remoteRepos);
|
||||
}
|
||||
try {
|
||||
log.info("Resolved version is [" + resolvedVersion + "]");
|
||||
if (StringUtils.isEmpty(resolvedVersion)) {
|
||||
log.warn("Stub for group [" + stubsGroup + "] module [" + stubsModule
|
||||
+ "] and classifier [" + classifier + "] not found in "
|
||||
+ this.remoteRepos);
|
||||
return null;
|
||||
}
|
||||
Artifact artifact = new DefaultArtifact(stubsGroup, stubsModule, classifier,
|
||||
ARTIFACT_EXTENSION, resolvedVersion);
|
||||
ArtifactRequest request = new ArtifactRequest(artifact, this.remoteRepos, null);
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Resolving artifact [" + artifact
|
||||
+ "] using remote repositories " + this.remoteRepos);
|
||||
}
|
||||
ArtifactResult result = this.repositorySystem.resolveArtifact(this.session, request);
|
||||
log.info("Resolved artifact [" + artifact + "] to "
|
||||
+ result.getArtifact().getFile());
|
||||
if (!this.snapshotCheckSkip && resolvedFromLocalRepo(result) && shouldDownloadFromRemote()) {
|
||||
throw new IllegalStateException("The artifact was found in the local repository "
|
||||
+ "but you have explicitly stated that it should be downloaded from a remote one");
|
||||
}
|
||||
File temporaryFile = unpackStubJarToATemporaryFolder(
|
||||
result.getArtifact().getFile().toURI());
|
||||
log.info("Unpacked file to [" + temporaryFile + "]");
|
||||
@@ -189,10 +180,6 @@ public class AetherStubDownloader implements StubDownloader {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean skipSnapshotCheck() {
|
||||
return StubRunnerPropertyUtils.isPropertySet(STUBRUNNER_SNAPSHOT_CHECK_SKIP_SYSTEM_PROP);
|
||||
}
|
||||
|
||||
private boolean resolvedFromLocalRepo(ArtifactResult result) {
|
||||
return result.getRepository() instanceof LocalRepository;
|
||||
}
|
||||
|
||||
@@ -101,12 +101,6 @@ public class StubRunnerOptions {
|
||||
|
||||
final StubRunnerProperties.StubsMode stubsMode;
|
||||
|
||||
/**
|
||||
* If set to {@code true} will not assert whether the downloaded stubs / contract
|
||||
* JAR was downloaded from a remote location or a local one(only applicable to Maven repos, not Git or Pact)
|
||||
*/
|
||||
private boolean snapshotCheckSkip;
|
||||
|
||||
/**
|
||||
* If set to {@code false} will NOT delete stubs from a temporary
|
||||
* folder after running tests
|
||||
@@ -118,13 +112,12 @@ public class StubRunnerOptions {
|
||||
*/
|
||||
private Map<String, String> properties = new HashMap<>();
|
||||
|
||||
|
||||
StubRunnerOptions(Integer minPortValue, Integer maxPortValue,
|
||||
Resource stubRepositoryRoot, StubRunnerProperties.StubsMode stubsMode, String stubsClassifier,
|
||||
Collection<StubConfiguration> dependencies,
|
||||
Map<StubConfiguration, Integer> stubIdsToPortMapping,
|
||||
String username, String password, final StubRunnerProxyOptions stubRunnerProxyOptions,
|
||||
boolean stubsPerConsumer, String consumerName, String mappingsOutputFolder, boolean snapshotCheckSkip,
|
||||
boolean stubsPerConsumer, String consumerName, String mappingsOutputFolder,
|
||||
boolean deleteStubsAfterTest, Map<String, String> properties) {
|
||||
this.minPortValue = minPortValue;
|
||||
this.maxPortValue = maxPortValue;
|
||||
@@ -139,7 +132,6 @@ public class StubRunnerOptions {
|
||||
this.stubsPerConsumer = stubsPerConsumer;
|
||||
this.consumerName = consumerName;
|
||||
this.mappingsOutputFolder = mappingsOutputFolder;
|
||||
this.snapshotCheckSkip = snapshotCheckSkip;
|
||||
this.deleteStubsAfterTest = deleteStubsAfterTest;
|
||||
this.properties = properties;
|
||||
}
|
||||
@@ -167,7 +159,6 @@ public class StubRunnerOptions {
|
||||
.withStubPerConsumer(Boolean.parseBoolean(System.getProperty("stubrunner.stubs-per-consumer", "false")))
|
||||
.withConsumerName(System.getProperty("stubrunner.consumer-name"))
|
||||
.withMappingsOutputFolder(System.getProperty("stubrunner.mappings-output-folder"))
|
||||
.withSnapshotCheckSkip(Boolean.parseBoolean(System.getProperty("stubrunner.snapshot-check-skip", "false")))
|
||||
.withDeleteStubsAfterTest(Boolean.parseBoolean(System.getProperty("stubrunner.delete-stubs-after-test", "true")))
|
||||
.withProperties(stubRunnerProps());
|
||||
String proxyHost = System.getProperty("stubrunner.proxy.host");
|
||||
@@ -277,14 +268,6 @@ public class StubRunnerOptions {
|
||||
this.mappingsOutputFolder = mappingsOutputFolder;
|
||||
}
|
||||
|
||||
public boolean isSnapshotCheckSkip() {
|
||||
return this.snapshotCheckSkip;
|
||||
}
|
||||
|
||||
public void setSnapshotCheckSkip(boolean snapshotCheckSkip) {
|
||||
this.snapshotCheckSkip = snapshotCheckSkip;
|
||||
}
|
||||
|
||||
public boolean isDeleteStubsAfterTest() {
|
||||
return this.deleteStubsAfterTest;
|
||||
}
|
||||
|
||||
@@ -48,7 +48,6 @@ public class StubRunnerOptionsBuilder {
|
||||
private String consumerName;
|
||||
private String mappingsOutputFolder;
|
||||
private StubRunnerProperties.StubsMode stubsMode;
|
||||
private boolean snapshotCheckSkip = false;
|
||||
private boolean deleteStubsAfterTest = true;
|
||||
private Map<String, String> properties = new HashMap<>();
|
||||
|
||||
@@ -133,10 +132,9 @@ public class StubRunnerOptionsBuilder {
|
||||
this.consumerName = options.getConsumerName();
|
||||
this.mappingsOutputFolder = options.getMappingsOutputFolder();
|
||||
this.stubConfigurations = options.dependencies != null ?
|
||||
options.dependencies : new ArrayList<StubConfiguration>();
|
||||
options.dependencies : new ArrayList<>();
|
||||
this.stubIdsToPortMapping = options.stubIdsToPortMapping != null ?
|
||||
options.stubIdsToPortMapping : new LinkedHashMap<StubConfiguration, Integer>();
|
||||
this.snapshotCheckSkip = options.isSnapshotCheckSkip();
|
||||
options.stubIdsToPortMapping : new LinkedHashMap<>();
|
||||
this.deleteStubsAfterTest = options.isDeleteStubsAfterTest();
|
||||
this.properties = options.getProperties();
|
||||
return this;
|
||||
@@ -147,11 +145,6 @@ public class StubRunnerOptionsBuilder {
|
||||
return this;
|
||||
}
|
||||
|
||||
public StubRunnerOptionsBuilder withSnapshotCheckSkip(boolean snapshotCheckSkip) {
|
||||
this.snapshotCheckSkip = snapshotCheckSkip;
|
||||
return this;
|
||||
}
|
||||
|
||||
public StubRunnerOptionsBuilder withDeleteStubsAfterTest(boolean deleteStubsAfterTest) {
|
||||
this.deleteStubsAfterTest = deleteStubsAfterTest;
|
||||
return this;
|
||||
@@ -166,7 +159,7 @@ public class StubRunnerOptionsBuilder {
|
||||
return new StubRunnerOptions(this.minPortValue, this.maxPortValue, this.stubRepositoryRoot,
|
||||
this.stubsMode, this.stubsClassifier, buildDependencies(), this.stubIdsToPortMapping,
|
||||
this.username, this.password, this.stubRunnerProxyOptions, this.stubsPerConsumer, this.consumerName,
|
||||
this.mappingsOutputFolder, this.snapshotCheckSkip, this.deleteStubsAfterTest, this.properties);
|
||||
this.mappingsOutputFolder, this.deleteStubsAfterTest, this.properties);
|
||||
}
|
||||
|
||||
private Collection<StubConfiguration> buildDependencies() {
|
||||
|
||||
@@ -154,11 +154,6 @@ public class StubRunnerRule implements TestRule, StubFinder, StubRunnerRuleOptio
|
||||
return this.delegate;
|
||||
}
|
||||
|
||||
@Override public StubRunnerRule withSnapshotCheckSkip(boolean snapshotCheckSkip) {
|
||||
builder().withSnapshotCheckSkip(snapshotCheckSkip);
|
||||
return this.delegate;
|
||||
}
|
||||
|
||||
@Override public StubRunnerRule withDeleteStubsAfterTest(
|
||||
boolean deleteStubsAfterTest) {
|
||||
builder().withDeleteStubsAfterTest(deleteStubsAfterTest);
|
||||
|
||||
@@ -95,12 +95,6 @@ interface StubRunnerRuleOptions {
|
||||
*/
|
||||
StubRunnerRule withMappingsOutputFolder(String mappingsOutputFolder);
|
||||
|
||||
/**
|
||||
* If set to {@code true} will not assert whether the downloaded stubs / contract
|
||||
* JAR was downloaded from a remote location or a local one(only applicable to Maven repos, not Git or Pact)
|
||||
*/
|
||||
StubRunnerRule withSnapshotCheckSkip(boolean snapshotCheckSkip);
|
||||
|
||||
/**
|
||||
* If set to {@code false} will NOT delete stubs from a temporary
|
||||
* folder after running tests
|
||||
|
||||
@@ -109,12 +109,6 @@ public @interface AutoConfigureStubRunner {
|
||||
*/
|
||||
StubRunnerProperties.StubsMode stubsMode() default StubRunnerProperties.StubsMode.CLASSPATH;
|
||||
|
||||
/**
|
||||
* If set to {@code true} will not assert whether the downloaded stubs / contract
|
||||
* JAR was downloaded from a remote location or a local one(only applicable to Maven repos, not Git or Pact)
|
||||
*/
|
||||
boolean snapshotCheckSkip() default false;
|
||||
|
||||
/**
|
||||
* Properties in form {@literal key=value}
|
||||
* @return the properties to add
|
||||
|
||||
@@ -94,7 +94,6 @@ public class StubRunnerConfiguration {
|
||||
.withStubPerConsumer(this.props.isStubsPerConsumer())
|
||||
.withConsumerName(consumerName())
|
||||
.withMappingsOutputFolder(this.props.getMappingsOutputFolder())
|
||||
.withSnapshotCheckSkip(this.props.isSnapshotCheckSkip())
|
||||
.withDeleteStubsAfterTest(this.props.isDeleteStubsAfterTest())
|
||||
.withProperties(this.props.getProperties());
|
||||
}
|
||||
|
||||
@@ -99,12 +99,6 @@ public class StubRunnerProperties {
|
||||
*/
|
||||
private StubsMode stubsMode;
|
||||
|
||||
/**
|
||||
* If set to {@code true} will not assert whether the downloaded stubs / contract
|
||||
* JAR was downloaded from a remote location or a local one(only applicable to Maven repos, not Git or Pact)
|
||||
*/
|
||||
private boolean snapshotCheckSkip;
|
||||
|
||||
/**
|
||||
* If set to {@code false} will NOT delete stubs from a temporary
|
||||
* folder after running tests
|
||||
@@ -241,14 +235,6 @@ public class StubRunnerProperties {
|
||||
this.stubsMode = stubsMode;
|
||||
}
|
||||
|
||||
public boolean isSnapshotCheckSkip() {
|
||||
return this.snapshotCheckSkip;
|
||||
}
|
||||
|
||||
public void setSnapshotCheckSkip(boolean snapshotCheckSkip) {
|
||||
this.snapshotCheckSkip = snapshotCheckSkip;
|
||||
}
|
||||
|
||||
public boolean isDeleteStubsAfterTest() {
|
||||
return this.deleteStubsAfterTest;
|
||||
}
|
||||
@@ -278,7 +264,6 @@ public class StubRunnerProperties {
|
||||
+ ", ids=" + Arrays.toString(this.ids) + ", classifier='" + this.classifier + '\''
|
||||
+ ", setStubsPerConsumer='" + this.stubsPerConsumer + "', consumerName='" + this.consumerName + '\''
|
||||
+ ", stubsMode='" + this.stubsMode + '\''
|
||||
+ ", snapshotCheckSkip='" + this.snapshotCheckSkip + '\''
|
||||
+ ", size of properties=" + this.properties.size()
|
||||
+ '}';
|
||||
}
|
||||
|
||||
@@ -3,6 +3,8 @@ package org.springframework.cloud.contract.stubrunner
|
||||
import io.specto.hoverfly.junit.HoverflyRule
|
||||
import org.eclipse.aether.RepositorySystemSession
|
||||
import org.junit.Rule
|
||||
import org.junit.rules.TemporaryFolder
|
||||
|
||||
import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties
|
||||
import org.springframework.util.ResourceUtils
|
||||
import spock.lang.Specification
|
||||
@@ -13,7 +15,10 @@ class AetherStubDownloaderSpec extends Specification {
|
||||
@Rule
|
||||
HoverflyRule hoverflyRule = HoverflyRule.inSimulationMode("simulation.json")
|
||||
|
||||
def 'Should throw an exception when artifact not found'() {
|
||||
@Rule
|
||||
TemporaryFolder folder = new TemporaryFolder()
|
||||
|
||||
def 'should throw an exception when artifact not found in local m2'() {
|
||||
given:
|
||||
StubRunnerOptions stubRunnerOptions = new StubRunnerOptionsBuilder()
|
||||
.withStubsMode(StubRunnerProperties.StubsMode.LOCAL)
|
||||
@@ -22,126 +27,33 @@ class AetherStubDownloaderSpec extends Specification {
|
||||
AetherStubDownloader aetherStubDownloader = new AetherStubDownloader(stubRunnerOptions)
|
||||
|
||||
when:
|
||||
def jar = aetherStubDownloader.downloadAndUnpackStubJar(new StubConfiguration("non.existing.group", "missing-artifact-id", "1.0-SNAPSHOT"))
|
||||
aetherStubDownloader.downloadAndUnpackStubJar(new StubConfiguration("non.existing.group", "missing-artifact-id", "1.0-SNAPSHOT"))
|
||||
|
||||
then:
|
||||
IllegalStateException e = thrown(IllegalStateException)
|
||||
e.message.contains("Exception occurred while trying to download a stub for group")
|
||||
}
|
||||
|
||||
def 'Should throw an exception when a jar is in local m2 and not in remote repo'() {
|
||||
def 'should throw an exception when local m2 gets replaced with a temp dir and a jar is not found in remote'() {
|
||||
given:
|
||||
StubRunnerOptions stubRunnerOptions = new StubRunnerOptionsBuilder()
|
||||
.withStubsMode(StubRunnerProperties.StubsMode.REMOTE)
|
||||
.withStubRepositoryRoot("https://test.jfrog.io/test/libs-snapshot-local")
|
||||
.withStubRepositoryRoot("file://" + folder.newFolder().absolutePath)
|
||||
.build()
|
||||
|
||||
AetherStubDownloader aetherStubDownloader = new AetherStubDownloader(stubRunnerOptions)
|
||||
|
||||
when:
|
||||
def jar = aetherStubDownloader.downloadAndUnpackStubJar(new StubConfiguration("org.springframework.cloud", "spring-cloud-contract-spec", "+", ""))
|
||||
|
||||
then:
|
||||
IllegalStateException e = thrown(IllegalStateException)
|
||||
e.message.contains("The artifact was found in the local repository but you have explicitly stated that it should be downloaded from a remote one")
|
||||
}
|
||||
|
||||
@RestoreSystemProperties
|
||||
def 'Should not throw an exception when a jar is in local m2 and not in remote repo and system property disabled snapshot check'() {
|
||||
given:
|
||||
StubRunnerOptions stubRunnerOptions = new StubRunnerOptionsBuilder()
|
||||
.withStubsMode(StubRunnerProperties.StubsMode.REMOTE)
|
||||
.withStubRepositoryRoot("https://test.jfrog.io/test/libs-snapshot-local")
|
||||
.build()
|
||||
System.properties.setProperty("stubrunner.snapshot-check-skip", "true")
|
||||
and:
|
||||
String localRepo = AetherFactories.localRepositoryDirectory(true)
|
||||
new File(localRepo, "org/springframework/cloud/spring-cloud-contract-spec"
|
||||
.replaceAll("/", File.separator)).list().size() > 0
|
||||
|
||||
and:
|
||||
AetherStubDownloader aetherStubDownloader = new AetherStubDownloader(stubRunnerOptions)
|
||||
|
||||
when:
|
||||
def jar = aetherStubDownloader.downloadAndUnpackStubJar(new StubConfiguration("org.springframework.cloud", "spring-cloud-contract-spec", "+", ""))
|
||||
aetherStubDownloader.downloadAndUnpackStubJar(new StubConfiguration("org.springframework.cloud", "spring-cloud-contract-spec", "+", ""))
|
||||
|
||||
then:
|
||||
jar != null
|
||||
}
|
||||
|
||||
@RestoreSystemProperties
|
||||
def 'Should throw an exception when a jar is in local m2 and not in remote repo and system property disabled takes precedence over env'() {
|
||||
given:
|
||||
StubRunnerOptions stubRunnerOptions = new StubRunnerOptionsBuilder()
|
||||
.withStubsMode(StubRunnerProperties.StubsMode.REMOTE)
|
||||
.withStubRepositoryRoot("https://test.jfrog.io/test/libs-snapshot-local")
|
||||
.build()
|
||||
System.properties.setProperty("stubrunner.snapshot-check-skip", "false")
|
||||
|
||||
and:
|
||||
StubRunnerPropertyUtils.FETCHER = new PropertyFetcher() {
|
||||
@Override
|
||||
String systemProp(String prop) {
|
||||
return super.systemProp(prop)
|
||||
}
|
||||
|
||||
@Override
|
||||
String envVar(String prop) {
|
||||
return "true"
|
||||
}
|
||||
}
|
||||
AetherStubDownloader aetherStubDownloader = new AetherStubDownloader(stubRunnerOptions)
|
||||
|
||||
when:
|
||||
def jar = aetherStubDownloader.downloadAndUnpackStubJar(new StubConfiguration("org.springframework.cloud", "spring-cloud-contract-spec", "+", ""))
|
||||
|
||||
then:
|
||||
IllegalStateException e = thrown(IllegalStateException)
|
||||
e.message.contains("The artifact was found in the local repository but you have explicitly stated that it should be downloaded from a remote one")
|
||||
}
|
||||
|
||||
def 'Should not throw an exception when a jar is in local m2 and not in remote repo and env property disabled snapshot check'() {
|
||||
given:
|
||||
StubRunnerOptions stubRunnerOptions = new StubRunnerOptionsBuilder()
|
||||
.withStubsMode(StubRunnerProperties.StubsMode.REMOTE)
|
||||
.withStubRepositoryRoot("https://test.jfrog.io/test/libs-snapshot-local")
|
||||
.build()
|
||||
|
||||
and:
|
||||
StubRunnerPropertyUtils.FETCHER = new PropertyFetcher() {
|
||||
@Override
|
||||
String systemProp(String prop) {
|
||||
return super.systemProp(prop)
|
||||
}
|
||||
|
||||
@Override
|
||||
String envVar(String prop) {
|
||||
return "true"
|
||||
}
|
||||
}
|
||||
AetherStubDownloader aetherStubDownloader = new AetherStubDownloader(stubRunnerOptions)
|
||||
|
||||
when:
|
||||
def jar = aetherStubDownloader.downloadAndUnpackStubJar(new StubConfiguration("org.springframework.cloud", "spring-cloud-contract-spec", "+", ""))
|
||||
|
||||
then:
|
||||
jar != null
|
||||
|
||||
cleanup:
|
||||
StubRunnerPropertyUtils.FETCHER = new PropertyFetcher()
|
||||
}
|
||||
|
||||
def 'Should not throw an exception when a jar is in local m2 and not in remote repo and option disabled snapshot check'() {
|
||||
given:
|
||||
StubRunnerOptions stubRunnerOptions = new StubRunnerOptionsBuilder()
|
||||
.withStubsMode(StubRunnerProperties.StubsMode.REMOTE)
|
||||
.withStubRepositoryRoot("https://test.jfrog.io/test/libs-snapshot-local")
|
||||
.withSnapshotCheckSkip(true)
|
||||
.build()
|
||||
|
||||
AetherStubDownloader aetherStubDownloader = new AetherStubDownloader(stubRunnerOptions)
|
||||
|
||||
when:
|
||||
def jar = aetherStubDownloader.downloadAndUnpackStubJar(new StubConfiguration("org.springframework.cloud", "spring-cloud-contract-spec", "+", ""))
|
||||
|
||||
then:
|
||||
jar != null
|
||||
IllegalArgumentException e = thrown(IllegalArgumentException)
|
||||
e.message.contains("Could not find metadata org.springframework.cloud:spring-cloud-contract-spec/maven-metadata.xml in remote0")
|
||||
}
|
||||
|
||||
@RestoreSystemProperties
|
||||
|
||||
@@ -231,7 +231,7 @@ class StubRunnerOptionsBuilderSpec extends Specification {
|
||||
given:
|
||||
StubRunnerOptionsBuilder builder = builder.withOptions(new StubRunnerOptions(1, 2, new FileSystemResource("root"), StubRunnerProperties.StubsMode.LOCAL,
|
||||
"classifier", [new StubConfiguration("a:b:c")], [(new StubConfiguration("a:b:c")): 3], "foo", "bar",
|
||||
new StubRunnerOptions.StubRunnerProxyOptions("host", 4), true, "consumer", "folder", true, false, [foo: "bar"]))
|
||||
new StubRunnerOptions.StubRunnerProxyOptions("host", 4), true, "consumer", "folder", false, [foo: "bar"]))
|
||||
builder.withStubs("foo:bar:baz")
|
||||
when:
|
||||
StubRunnerOptions options = builder.build()
|
||||
@@ -250,7 +250,6 @@ class StubRunnerOptionsBuilderSpec extends Specification {
|
||||
options.stubsPerConsumer == true
|
||||
options.consumerName == "consumer"
|
||||
options.mappingsOutputFolder == "folder"
|
||||
options.snapshotCheckSkip == true
|
||||
options.deleteStubsAfterTest == false
|
||||
options.properties == [foo: "bar"]
|
||||
}
|
||||
@@ -260,7 +259,7 @@ class StubRunnerOptionsBuilderSpec extends Specification {
|
||||
StubRunnerOptionsBuilder builder = builder.withOptions(new StubRunnerOptions(1, 2, new FileSystemResource("root"),
|
||||
StubRunnerProperties.StubsMode.CLASSPATH, "classifier",
|
||||
[new StubConfiguration("a:b:c")], [(new StubConfiguration("a:b:c")): 3], "username123", "password123",
|
||||
new StubRunnerOptions.StubRunnerProxyOptions("host", 4), true, "consumer", "folder", true, false, [:]))
|
||||
new StubRunnerOptions.StubRunnerProxyOptions("host", 4), true, "consumer", "folder", false, [:]))
|
||||
builder.withStubs("foo:bar:baz")
|
||||
when:
|
||||
String options = builder.build().toString()
|
||||
@@ -287,7 +286,6 @@ class StubRunnerOptionsBuilderSpec extends Specification {
|
||||
System.setProperty("stubrunner.proxy.host", "host")
|
||||
System.setProperty("stubrunner.proxy.port", "4")
|
||||
System.setProperty("stubrunner.mappings-output-folder", "folder")
|
||||
System.setProperty("stubrunner.snapshot-check-skip", "true")
|
||||
System.setProperty("stubrunner.properties.foo-bar", "bar")
|
||||
System.setProperty("stubrunner.properties.foo-baz", "baz")
|
||||
System.setProperty("stubrunner.properties.bar.bar", "foo")
|
||||
@@ -307,7 +305,6 @@ class StubRunnerOptionsBuilderSpec extends Specification {
|
||||
options.stubsPerConsumer == true
|
||||
options.consumerName == "consumer"
|
||||
options.mappingsOutputFolder == "folder"
|
||||
options.snapshotCheckSkip == true
|
||||
options.properties == ["foo-bar": "bar", "foo-baz": "baz", "bar.bar": "foo"]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -175,7 +175,10 @@ class ContractVerifierExtension {
|
||||
/**
|
||||
* If set to {@code true} will not assert whether the downloaded stubs / contract
|
||||
* JAR was downloaded from a remote location or a local one(only applicable to Maven repos, not Git or Pact)
|
||||
*
|
||||
* @deprecated - with 2.1.0 this option is redundant
|
||||
*/
|
||||
@Deprecated
|
||||
boolean contractsSnapshotCheckSkip = false
|
||||
|
||||
/**
|
||||
|
||||
@@ -86,7 +86,6 @@ class GradleContractsDownloader {
|
||||
.withStubsMode(extension.contractsMode)
|
||||
.withUsername(extension.contractRepository.username)
|
||||
.withPassword(extension.contractRepository.password)
|
||||
.withSnapshotCheckSkip(extension.contractsSnapshotCheckSkip)
|
||||
.withDeleteStubsAfterTest(extension.deleteStubsAfterTest)
|
||||
.withProperties(extension.contractsProperties)
|
||||
if (extension.contractRepository.proxyPort) {
|
||||
|
||||
@@ -145,8 +145,11 @@ public class ConvertMojo extends AbstractMojo {
|
||||
/**
|
||||
* If {@code true} then will not assert whether a stub / contract
|
||||
* JAR was downloaded from local or remote location
|
||||
*
|
||||
* @deprecated - with 2.1.0 this option is redundant
|
||||
*/
|
||||
@Parameter(property = "contractsSnapshotCheckSkip", defaultValue = "false")
|
||||
@Deprecated
|
||||
private boolean contractsSnapshotCheckSkip;
|
||||
|
||||
|
||||
@@ -230,7 +233,7 @@ public class ConvertMojo extends AbstractMojo {
|
||||
this.contractsPath, this.contractsRepositoryUrl, this.contractsMode, getLog(),
|
||||
this.contractsRepositoryUsername, this.contractsRepositoryPassword,
|
||||
this.contractsRepositoryProxyHost, this.contractsRepositoryProxyPort,
|
||||
this.contractsSnapshotCheckSkip, this.deleteStubsAfterTest, this.contractsProperties)
|
||||
this.deleteStubsAfterTest, this.contractsProperties)
|
||||
.downloadAndUnpackContractsIfRequired(config, this.contractsDirectory);
|
||||
}
|
||||
|
||||
|
||||
@@ -207,8 +207,11 @@ public class GenerateTestsMojo extends AbstractMojo {
|
||||
/**
|
||||
* If {@code true} then will not assert whether a stub / contract
|
||||
* JAR was downloaded from local or remote location
|
||||
*
|
||||
* @deprecated - with 2.1.0 this option is redundant
|
||||
*/
|
||||
@Parameter(property = "contractsSnapshotCheckSkip", defaultValue = "false")
|
||||
@Deprecated
|
||||
private boolean contractsSnapshotCheckSkip;
|
||||
|
||||
/**
|
||||
@@ -246,7 +249,7 @@ public class GenerateTestsMojo extends AbstractMojo {
|
||||
this.contractsPath, this.contractsRepositoryUrl, this.contractsMode, getLog(),
|
||||
this.contractsRepositoryUsername, this.contractsRepositoryPassword,
|
||||
this.contractsRepositoryProxyHost, this.contractsRepositoryProxyPort,
|
||||
this.contractsSnapshotCheckSkip, this.deleteStubsAfterTest, this.contractsProperties).downloadAndUnpackContractsIfRequired(config, this.contractsDirectory);
|
||||
this.deleteStubsAfterTest, this.contractsProperties).downloadAndUnpackContractsIfRequired(config, this.contractsDirectory);
|
||||
getLog().info("Directory with contract is present at [" + contractsDirectory + "]");
|
||||
setupConfig(config, contractsDirectory);
|
||||
this.project.addTestCompileSourceRoot(this.generatedTestSourcesDir.getAbsolutePath());
|
||||
|
||||
@@ -54,7 +54,6 @@ class MavenContractsDownloader {
|
||||
private final String repositoryPassword;
|
||||
private final String repositoryProxyHost;
|
||||
private final Integer repositoryProxyPort;
|
||||
private final boolean contractsSnapshotCheckSkip;
|
||||
private final boolean deleteStubsAfterTest;
|
||||
private final Map<String, String> contractsProperties;
|
||||
|
||||
@@ -62,8 +61,8 @@ class MavenContractsDownloader {
|
||||
String contractsPath, String contractsRepositoryUrl,
|
||||
StubRunnerProperties.StubsMode stubsMode, Log log, String repositoryUsername,
|
||||
String repositoryPassword, String repositoryProxyHost,
|
||||
Integer repositoryProxyPort, boolean contractsSnapshotCheckSkip,
|
||||
boolean deleteStubsAfterTest, Map<String, String> contractsProperties) {
|
||||
Integer repositoryProxyPort, boolean deleteStubsAfterTest,
|
||||
Map<String, String> contractsProperties) {
|
||||
this.project = project;
|
||||
this.contractDependency = contractDependency;
|
||||
this.contractsPath = contractsPath;
|
||||
@@ -75,7 +74,6 @@ class MavenContractsDownloader {
|
||||
this.repositoryProxyHost = repositoryProxyHost;
|
||||
this.repositoryProxyPort = repositoryProxyPort;
|
||||
this.stubDownloaderBuilderProvider = new StubDownloaderBuilderProvider();
|
||||
this.contractsSnapshotCheckSkip = contractsSnapshotCheckSkip;
|
||||
this.deleteStubsAfterTest = deleteStubsAfterTest;
|
||||
this.contractsProperties = contractsProperties;
|
||||
}
|
||||
@@ -122,7 +120,6 @@ class MavenContractsDownloader {
|
||||
.withStubsMode(this.stubsMode)
|
||||
.withUsername(this.repositoryUsername)
|
||||
.withPassword(this.repositoryPassword)
|
||||
.withSnapshotCheckSkip(this.contractsSnapshotCheckSkip)
|
||||
.withDeleteStubsAfterTest(this.deleteStubsAfterTest)
|
||||
.withProperties(this.contractsProperties);
|
||||
if (StringUtils.hasText(this.contractsRepositoryUrl)) {
|
||||
|
||||
Reference in New Issue
Block a user