diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml index 4b86ceac5e..c9de09c9f6 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/pom.xml @@ -46,9 +46,41 @@ + + org.apache.maven.plugins + maven-surefire-plugin + + + **/PluginUnitTest.java + + + org.apache.maven.plugins maven-failsafe-plugin + + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + + + org.junit.vintage + junit-vintage-engine + ${junit-vintage.version} + + + + plain + true + + org.junit.jupiter:junit-vintage-engine + + + **/PluginUnitTest.java + + diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/GenerateStubsMojo.java b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/GenerateStubsMojo.java index 0a009536cb..57acecf5f3 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/GenerateStubsMojo.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/main/java/org/springframework/cloud/contract/maven/verifier/GenerateStubsMojo.java @@ -120,21 +120,22 @@ public class GenerateStubsMojo extends AbstractMojo { throw new MojoExecutionException("Stubs could not be found: [" + this.outputDirectory.getAbsolutePath() + "] .\nPlease make sure that spring-cloud-contract:convert was invoked"); } + File stubsJarFile = getStubJarDestFile(); if (this.incrementalContractStubsJar && !inputFilesChangeDetected(outputDirectory, mojoExecution, session)) { getLog().info("Nothing to generate - stubs jar is up to date"); - return; } - File stubsJarFile = createStubJar(this.outputDirectory); + else { + fillStubJar(this.outputDirectory, stubsJarFile); + } this.projectHelper.attachArtifact(this.project, "jar", this.classifier, stubsJarFile); } - private File createStubJar(File stubsOutputDir) throws MojoFailureException, MojoExecutionException { - if (!stubsOutputDir.exists()) { - throw new MojoExecutionException("Stubs could not be found: [" + stubsOutputDir.getAbsolutePath() - + "] .\nPlease make sure that spring-cloud-contract:convert was invoked"); - } + private File getStubJarDestFile() { String stubArchiveName = this.projectFinalName + "-" + this.classifier + ".jar"; - File stubsJarFile = new File(this.projectBuildDirectory, stubArchiveName); + return new File(this.projectBuildDirectory, stubArchiveName); + } + + private void fillStubJar(File stubsOutputDir, File stubsJarFile) throws MojoFailureException { String[] excludes = excludes(); getLog().info( "Files matching this pattern will be excluded from " + "stubs generation " + Arrays.toString(excludes)); @@ -149,7 +150,6 @@ public class GenerateStubsMojo extends AbstractMojo { catch (Exception e) { throw new MojoFailureException("Exception while packaging " + this.classifier + " jar.", e); } - return stubsJarFile; } private boolean stubsOutputMissing(File stubsOutputDir) { diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/AbstractMojoTest.java b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/AbstractMojoTest.java index 6229e75e4b..964f2802e8 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/AbstractMojoTest.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/AbstractMojoTest.java @@ -63,10 +63,18 @@ public abstract class AbstractMojoTest { return new File(this.tmpFolder, name); } - protected void executeMojo(File baseDir, String goal, Xpp3Dom... parameters) throws Exception { + protected MavenSession prepareMavenSession(File baseDir) throws Exception { MavenProject mavenProject = rule.readMavenProject(baseDir); - MavenSession mavenSession = rule.newMavenSession(mavenProject); - rule.executeMojo(mavenSession, mavenProject, goal, parameters); + return rule.newMavenSession(mavenProject); + } + + protected void executeMojo(File baseDir, String goal, Xpp3Dom... parameters) throws Exception { + MavenSession mavenSession = prepareMavenSession(baseDir); + executeMojo(mavenSession, goal, parameters); + } + + protected void executeMojo(MavenSession mavenSession, String goal, Xpp3Dom... parameters) throws Exception { + rule.executeMojo(mavenSession, mavenSession.getCurrentProject(), goal, parameters); } protected void assertFilesPresent(File file, String name) { diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/PluginUnitTest.java b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/PluginUnitTest.java index aad8f88abf..171197af0b 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/PluginUnitTest.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/PluginUnitTest.java @@ -18,8 +18,11 @@ package org.springframework.cloud.contract.maven.verifier; import java.io.File; +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.DefaultArtifact; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.project.MavenProject; import org.codehaus.plexus.util.xml.Xpp3Dom; -import org.junit.Ignore; import org.junit.Test; import static java.nio.charset.Charset.defaultCharset; @@ -27,8 +30,6 @@ import static org.apache.commons.io.FileUtils.readFileToString; import static org.apache.maven.plugin.testing.MojoParameters.newParameter; import static org.assertj.core.api.BDDAssertions.then; -// TODO: Move this to integration tests -@Ignore("Testing harness uses an old version of maven") public class PluginUnitTest extends AbstractMojoTest { @Test @@ -329,4 +330,21 @@ public class PluginUnitTest extends AbstractMojoTest { "target/generated-test-sources/contracts/org/springframework/cloud/contract/verifier/tests/common_repo_with_inclusion/reward_rules/src/main/resources/contracts/reward_rules/rest/admin/V1Test.java"); } + @Test + public void shouldAttachUpToDateStubs() throws Exception { + File basedir = getBasedir("generatedStubs"); + + MavenSession firstSession = prepareMavenSession(basedir); + MavenProject firstProject = firstSession.getCurrentProject(); + Artifact stubArtifact = new DefaultArtifact(firstProject.getGroupId(), firstProject.getArtifactId(), + firstProject.getVersion(), "", "jar", "stubs", firstProject.getArtifact().getArtifactHandler()); + + executeMojo(firstSession, "generateStubs"); + then(firstSession.getCurrentProject().getAttachedArtifacts()).contains(stubArtifact); + + MavenSession secondSession = prepareMavenSession(basedir); + executeMojo(secondSession, "generateStubs"); + then(secondSession.getCurrentProject().getAttachedArtifacts()).contains(stubArtifact); + } + } diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/contracts/0.0.1-SNAPSHOT/contracts-0.0.1-SNAPSHOT.jar b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/contracts/0.0.1-SNAPSHOT/contracts-0.0.1-SNAPSHOT.jar index 623f11fff4..6c47639c60 100644 Binary files a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/contracts/0.0.1-SNAPSHOT/contracts-0.0.1-SNAPSHOT.jar and b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/resources/m2repo/repository/com/example/contracts/0.0.1-SNAPSHOT/contracts-0.0.1-SNAPSHOT.jar differ