From d4967d8607eccde90e83250ad97eaed8f259b9bc Mon Sep 17 00:00:00 2001 From: _NewAge Date: Mon, 20 Feb 2023 13:57:24 +0100 Subject: [PATCH] Attach up-to-date stubs to maven (#1871) * Move PluginUnitTest into integration-test phase * Fix test resources Contracts that used messageFrom, messageBody, messageHeaders were modified to use triggeredBy input as seen in 1999066c5af7af2692b2897fc9ca70215534e3cc * Attach stubs to maven project even when they are up-to-date; fixes gh-1860 --- .../pom.xml | 32 ++++++++++++++++++ .../maven/verifier/GenerateStubsMojo.java | 18 +++++----- .../maven/verifier/AbstractMojoTest.java | 14 ++++++-- .../maven/verifier/PluginUnitTest.java | 24 +++++++++++-- .../contracts-0.0.1-SNAPSHOT.jar | Bin 4038 -> 3880 bytes 5 files changed, 73 insertions(+), 15 deletions(-) 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 623f11fff4d76bceb2e0b65b27548734a652bb89..6c47639c606361a8cbe9f40d39454e58ae6fdbff 100644 GIT binary patch delta 841 zcmX>mzd~*UC(~pVW>1;Y3T_5QmhX%V3@joH3=E+moD9qi(;kO|@Z?VBqmvt1gYhcb z{DE~UBUTj!`%EK1c=AGaEkX*UCNpw~;8$eG;e%HJ&>_W)k|0lTFr-Zj3KM8KCb$*I zdk@5x3=ESeu&PatWagRN&%#k}+Go#w$Ux-C^Dn_u^g0(v%G?c^bEK?Lc%n(=vZcB6 z_AK$3SXVCmKd1ao|8D0^m+V)Re)G#}P!Ccs?O!}mDpp~sbC2WczxR1pHUF8qG4ASx z=W`T#p5&P(l}CT>+4|0~ZOUecwObt$$|h?_J)LbUCD5HTaie9jMH|Pw1J$YawZUha zxzk1d%>K}^QR=LUUZ6^6tR#P4QJs5_^P5>6Y*QFN&2O47SQ8$4Janh6?2k|0>P3E= zKT8LAGlL_EgCPd!zm4a0SnGj)n-0Y0Q2*I63DujPapXFzAi#Q|)W-FM+vbk~zWo6& zHu;pST6D6d&`DFZe7$DL&&vPxj}l%V%jETMV~sy@bC=WZ?R{a11(zh|&i$9!*z?!D zlr>Ff@3)A64~D|2YjAw7vt}xbp$+ikvnVAb9O;k%1&2-#pfT&zWQ4J z`0R@4hXKdMxdOZynM9bmfUcS>#AU|FFwszKb3E5)#>wY-q$cO^=uVDh7Mi@0M{V+1 zUMXf(W>CbqO*Y_j;1*XB&8h5dyM7=J^c`%(=f)S>Xp`q~@2Sg_@P{jhgS=m5R O{6JU%bmuHi5Dx(Cm=Fm7 delta 740 zcmZ1>cT9c*Cll|I{w%3g3=9k(f!KVq1GB~?exbqIcC|ir`>wzbwuMjUz_Bw z(7rThOX|$%^yGQx;=N8vJ+4-fnwcofy!dUze4|CbOxiqRN^VEK=WacALTI{=R^x}Z zgU@XjKbj^pN9<7f_CDLrhmJl^%#M82-r*FfFxxc7d^9^Jp~^4UX^Yk&3D+AvO5WljY7WV1J0G2>)WRwd5R z5Kac>f_v^)0KD3|u|P z(9#NS21b_ez_4Ty0R}42+CoMSMkWzvE(QjU$xArRCK`xu{>b^65iK2koAOi!?XoiMH2bM`Z#*9Xj_wuL$)pJcw=8N zJ~@L~4rq!KQ#|`*4qhLoh3u2VcmtT8vrk^Z8^UbJ!7zzUf3hB*ln5&u$TWT+T)_%- J8_<0W3;?8i6^H-;