package io.takari.maven.plugins.compile.jdt; import static io.takari.maven.testing.TestResources.cp; import java.io.File; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.project.MavenProject; import org.junit.Assert; import org.junit.Test; public class CompileJdtClasspathTest extends AbstractCompileJdtTest { @Test public void testReactor() throws Exception { File parent = resources.getBasedir("compile-jdt-classpath/reactor-basic"); compileReactor(parent); mojos.assertBuildOutputs(parent, "module-a/target/classes/reactor/modulea/ModuleA.class"); // no change rebuild compileReactor(parent); mojos.assertCarriedOverOutputs(parent, "module-a/target/classes/reactor/modulea/ModuleA.class"); // comment changes do NOT propagate cp(new File(parent, "module-b/src/main/java/reactor/moduleb"), "ModuleB.java-comment", "ModuleB.java"); compileReactor(parent); mojos.assertCarriedOverOutputs(parent, "module-a/target/classes/reactor/modulea/ModuleA.class"); // API changes DO propagate cp(new File(parent, "module-b/src/main/java/reactor/moduleb"), "ModuleB.java-method", "ModuleB.java"); compileReactor(parent); mojos.assertBuildOutputs(parent, "module-a/target/classes/reactor/modulea/ModuleA.class"); } @Test public void testReactor_missingType() throws Exception { File parent = resources.getBasedir("compile-jdt-classpath/reactor-missing"); try { compileReactor(parent); Assert.fail(); } catch (MojoExecutionException e) { // expected } mojos.assertBuildOutputs(parent, new String[0]); mojos.assertMessages(parent, "module-a/src/main/java/modulea/Error.java", "ERROR Error.java [3:8] The import moduleb cannot be resolved", "ERROR Error.java [8:12] Missing cannot be resolved to a type", "ERROR Error.java [10:20] Missing cannot be resolved to a type"); // fix the problem and rebuild cp(parent, "module-b/src/main/java/moduleb/Missing.java-missing", "module-b/src/main/java/moduleb/Missing.java"); compileReactor(parent); mojos.assertBuildOutputs(parent, "module-a/target/classes/modulea/Error.class"); } @Test public void testReactor_missingOnDemandImport() throws Exception { File parent = resources.getBasedir("compile-jdt-classpath/reactor-missing-ondemand-import"); try { compileReactor(parent); Assert.fail(); } catch (MojoExecutionException e) { // expected } mojos.assertBuildOutputs(parent, new String[0]); mojos.assertMessages(parent, "module-a/src/main/java/modulea/Error.java", "ERROR Error.java [3:8] The import moduleb cannot be resolved"); // fix the problem and rebuild cp(parent, "module-b/src/main/java/moduleb/Missing.java-missing", "module-b/src/main/java/moduleb/Missing.java"); compileReactor(parent); mojos.assertBuildOutputs(parent, "module-a/target/classes/modulea/Error.class"); } @Test public void testReactor_missingType_splitpackage() throws Exception { File parent = resources.getBasedir("compile-jdt-classpath/reactor-missing-splitpackage"); try { compileReactor(parent); Assert.fail(); } catch (MojoExecutionException e) { // expected } mojos.assertBuildOutputs(parent, new String[0]); mojos.assertMessages(parent, "module-a/src/main/java/missing/Error.java", "ERROR Error.java [6:12] Missing cannot be resolved to a type", "ERROR Error.java [8:20] Missing cannot be resolved to a type"); // fix the problem and rebuild cp(parent, "module-b/src/main/java/missing/Missing.java-missing", "module-b/src/main/java/missing/Missing.java"); compileReactor(parent); mojos.assertBuildOutputs(parent, "module-a/target/classes/missing/Error.class"); } @Test public void testRepository() throws Exception { File parent = resources.getBasedir("compile-jdt-classpath/repo-basic"); MavenProject moduleA = mojos.readMavenProject(new File(parent, "module-a")); addDependency(moduleA, "module-b", new File(parent, "module-b/module-b.jar")); mojos.compile(moduleA); mojos.assertBuildOutputs(parent, "module-a/target/classes/reactor/modulea/ModuleA.class"); // dependency changed non-structurally moduleA = mojos.readMavenProject(new File(parent, "module-a")); addDependency(moduleA, "module-b-2", new File(parent, "module-b/module-b-comment.jar")); mojos.compile(moduleA); mojos.assertBuildOutputs(parent, new String[0]); // dependency changed structurally moduleA = mojos.readMavenProject(new File(parent, "module-a")); addDependency(moduleA, "module-b-2", new File(parent, "module-b/module-b-method.jar")); mojos.compile(moduleA); mojos.assertBuildOutputs(parent, "module-a/target/classes/reactor/modulea/ModuleA.class"); } @Test public void testRepository_classpathOrder() throws Exception { File parent = resources.getBasedir("compile-jdt-classpath/repo-basic"); MavenProject moduleA = mojos.readMavenProject(new File(parent, "module-a")); addDependency(moduleA, "module-b", new File(parent, "module-b/module-b.jar")); addDependency(moduleA, "module-b-comment", new File(parent, "module-b/module-b-comment.jar")); addDependency(moduleA, "module-b-method", new File(parent, "module-b/module-b-method.jar")); mojos.compile(moduleA); mojos.assertBuildOutputs(parent, "module-a/target/classes/reactor/modulea/ModuleA.class"); // classpath order change did not result in structural type definition change moduleA = mojos.readMavenProject(new File(parent, "module-a")); addDependency(moduleA, "module-b-comment", new File(parent, "module-b/module-b-comment.jar")); addDependency(moduleA, "module-b", new File(parent, "module-b/module-b.jar")); addDependency(moduleA, "module-b-method", new File(parent, "module-b/module-b-method.jar")); mojos.compile(moduleA); mojos.assertBuildOutputs(parent, new String[0]); // classpath order change DID result in structural type definition change moduleA = mojos.readMavenProject(new File(parent, "module-a")); addDependency(moduleA, "module-b-method", new File(parent, "module-b/module-b-method.jar")); addDependency(moduleA, "module-b", new File(parent, "module-b/module-b.jar")); addDependency(moduleA, "module-b-comment", new File(parent, "module-b/module-b-comment.jar")); mojos.compile(moduleA); mojos.assertBuildOutputs(parent, "module-a/target/classes/reactor/modulea/ModuleA.class"); } private void compileReactor(File parent) throws Exception { mojos.flushClasspathCaches(); File moduleB = new File(parent, "module-b"); mojos.compile(moduleB); MavenProject moduleA = mojos.readMavenProject(new File(parent, "module-a")); addDependency(moduleA, "module-b", new File(moduleB, "target/classes")); mojos.compile(moduleA); } }