diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/execution/MavenClasspathConfigurationTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/execution/MavenClasspathConfigurationTest.java index 82075adbd818..4356fa1003c5 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/execution/MavenClasspathConfigurationTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/execution/MavenClasspathConfigurationTest.java @@ -15,7 +15,6 @@ */ package org.jetbrains.idea.maven.execution; -import com.intellij.execution.CantRunException; import com.intellij.execution.configurations.JavaParameters; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.module.Module; @@ -23,12 +22,14 @@ import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.roots.CompilerModuleExtension; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.roots.OrderEnumerator; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.util.PathsList; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.MavenImportingTestCase; @@ -38,6 +39,10 @@ import java.util.ArrayList; import java.util.List; public class MavenClasspathConfigurationTest extends MavenImportingTestCase { + private enum Type {PRODUCTION, TESTS} + + private enum Scope {COMPILE, RUNTIME} + public void testConfiguringModuleDependencies() throws Exception { VirtualFile m1 = createModulePom("m1", "test" + "m1" + @@ -85,17 +90,17 @@ public class MavenClasspathConfigurationTest extends MavenImportingTestCase { setupJdkForModules("m1", "m2", "m3", "m4"); - assertModuleClasspath("m1", - getProjectPath() + "/m1/target/test-classes", - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/classes", - getProjectPath() + "/m3/target/classes"); + assertAllTestsClasspath("m1", + getProjectPath() + "/m1/target/test-classes", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes", + getProjectPath() + "/m3/target/classes"); - assertModuleClasspath("m2", - getProjectPath() + "/m2/target/test-classes", - getProjectPath() + "/m2/target/classes", - getProjectPath() + "/m3/target/classes", - getProjectPath() + "/m4/target/classes"); + assertAllTestsClasspath("m2", + getProjectPath() + "/m2/target/test-classes", + getProjectPath() + "/m2/target/classes", + getProjectPath() + "/m3/target/classes", + getProjectPath() + "/m4/target/classes"); } public void testDoNotIncludeTestClassesWhenConfiguringModuleDependenciesForProductionCode() throws Exception { @@ -121,14 +126,12 @@ public class MavenClasspathConfigurationTest extends MavenImportingTestCase { setupJdkForModules("m1", "m2"); - assertModuleClasspath("m1", - JavaParameters.CLASSES_ONLY, - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/classes"); + assertAllProductionClasspath("m1", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes"); - assertModuleClasspath("m2", - JavaParameters.CLASSES_ONLY, - getProjectPath() + "/m2/target/classes"); + assertAllProductionClasspath("m2", + getProjectPath() + "/m2/target/classes"); } public void testConfiguringModuleDependenciesOnTestJar() throws Exception { @@ -163,17 +166,16 @@ public class MavenClasspathConfigurationTest extends MavenImportingTestCase { setupJdkForModules("m1", "m2", "m3"); - assertModuleClasspath("m1", - getProjectPath() + "/m1/target/test-classes", - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/test-classes", - getProjectPath() + "/m3/target/test-classes"); + assertAllProductionClasspath("m1", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/test-classes", + getProjectPath() + "/m3/target/test-classes"); - assertModuleClasspath("m1", - JavaParameters.CLASSES_ONLY, - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/test-classes", - getProjectPath() + "/m3/target/test-classes"); + assertAllTestsClasspath("m1", + getProjectPath() + "/m1/target/test-classes", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/test-classes", + getProjectPath() + "/m3/target/test-classes"); } public void testConfiguringModuleDependenciesOnTestJarWithTestScope() throws Exception { @@ -210,15 +212,14 @@ public class MavenClasspathConfigurationTest extends MavenImportingTestCase { setupJdkForModules("m1", "m2", "m3"); - assertModuleClasspath("m1", - getProjectPath() + "/m1/target/test-classes", - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/test-classes", - getProjectPath() + "/m3/target/test-classes"); + assertAllProductionClasspath("m1", + getProjectPath() + "/m1/target/classes"); - assertModuleClasspath("m1", - JavaParameters.CLASSES_ONLY, - getProjectPath() + "/m1/target/classes"); + assertAllTestsClasspath("m1", + getProjectPath() + "/m1/target/test-classes", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/test-classes", + getProjectPath() + "/m3/target/test-classes"); } public void testConfiguringModuleDependenciesOnTestJarWithTestScopeAndRegularDependency() throws Exception { @@ -250,16 +251,15 @@ public class MavenClasspathConfigurationTest extends MavenImportingTestCase { setupJdkForModules("m1", "m2"); - assertModuleClasspath("m1", - getProjectPath() + "/m1/target/test-classes", - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/classes", - getProjectPath() + "/m2/target/test-classes"); + assertAllProductionClasspath("m1", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes"); - assertModuleClasspath("m1", - JavaParameters.CLASSES_ONLY, - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/classes"); + assertAllTestsClasspath("m1", + getProjectPath() + "/m1/target/test-classes", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes", + getProjectPath() + "/m2/target/test-classes"); } public void testConfiguringModuleDependenciesOnBothNormalAndTestJar() throws Exception { @@ -290,17 +290,16 @@ public class MavenClasspathConfigurationTest extends MavenImportingTestCase { setupJdkForModules("m1", "m2", "m2"); - assertModuleClasspath("m1", - getProjectPath() + "/m1/target/test-classes", - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/classes", - getProjectPath() + "/m2/target/test-classes"); + assertAllProductionClasspath("m1", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes", + getProjectPath() + "/m2/target/test-classes"); - assertModuleClasspath("m1", - JavaParameters.CLASSES_ONLY, - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/classes", - getProjectPath() + "/m2/target/test-classes"); + assertAllTestsClasspath("m1", + getProjectPath() + "/m1/target/test-classes", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes", + getProjectPath() + "/m2/target/test-classes"); } public void testOptionalLibraryDependencies() throws Exception { @@ -344,17 +343,17 @@ public class MavenClasspathConfigurationTest extends MavenImportingTestCase { setupJdkForModules("m1", "m2"); - assertModuleClasspath("m1", - getProjectPath() + "/m1/target/test-classes", - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/classes", - getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar"); + assertAllTestsClasspath("m1", + getProjectPath() + "/m1/target/test-classes", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes", + getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar"); - assertModuleClasspath("m2", - getProjectPath() + "/m2/target/test-classes", - getProjectPath() + "/m2/target/classes", - getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar", - getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); + assertAllTestsClasspath("m2", + getProjectPath() + "/m2/target/test-classes", + getProjectPath() + "/m2/target/classes", + getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar", + getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); } public void testDoNotChangeClasspathForRegularModules() throws Exception { @@ -409,20 +408,20 @@ public class MavenClasspathConfigurationTest extends MavenImportingTestCase { setupJdkForModules("m1", "m2", "user"); - assertModuleClasspath("user", - getProjectPath() + "/user/test-output", - getProjectPath() + "/user/output", - getProjectPath() + "/m1/target/test-classes", - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/test-classes", - getProjectPath() + "/m2/target/classes", - getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); + assertAllTestsClasspath("user", + getProjectPath() + "/user/test-output", + getProjectPath() + "/user/output", + getProjectPath() + "/m1/target/test-classes", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/test-classes", + getProjectPath() + "/m2/target/classes", + getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); - assertModuleClasspath("m1", - getProjectPath() + "/m1/target/test-classes", - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/classes", - getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); + assertAllTestsClasspath("m1", + getProjectPath() + "/m1/target/test-classes", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes", + getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); } public void testDoNotIncludeProvidedAndTestDependenciesInProductionClasspath() throws Exception { @@ -472,20 +471,24 @@ public class MavenClasspathConfigurationTest extends MavenImportingTestCase { setupJdkForModules("m1", "m2", "m3"); - assertModuleClasspath("m1", - JavaParameters.CLASSES_ONLY, - getProjectPath() + "/m1/target/classes"); + assertCompileProductionClasspath("m1", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes", + getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); + assertRuntimeProductionClasspath("m1", + getProjectPath() + "/m1/target/classes"); - assertModuleClasspath("m1", - JavaParameters.CLASSES_AND_TESTS, - getProjectPath() + "/m1/target/test-classes", - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/classes", - getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar", - getProjectPath() + "/m3/target/classes", - getRepositoryPath() + "/jmock/jmock/4.0/jmock-4.0.jar"); + assertAllTestsClasspath("m1", + getProjectPath() + "/m1/target/test-classes", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes", + getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar", + getProjectPath() + "/m3/target/classes", + getRepositoryPath() + "/jmock/jmock/4.0/jmock-4.0.jar"); } + // todo next + public void testDoNotIncludeProvidedAndTestTransitiveDependencies() throws Exception { createRepositoryFile("jmock/jmock/1.0/jmock-1.0.jar"); VirtualFile m1 = createModulePom("m1", "test" + @@ -528,27 +531,27 @@ public class MavenClasspathConfigurationTest extends MavenImportingTestCase { setupJdkForModules("m1", "m2"); - assertModuleClasspath("m1", - JavaParameters.CLASSES_ONLY, - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/classes"); + assertAllProductionClasspath("m1", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes"); - assertModuleClasspath("m2", - JavaParameters.CLASSES_ONLY, - getProjectPath() + "/m2/target/classes"); + assertAllTestsClasspath("m1", + getProjectPath() + "/m1/target/test-classes", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes"); - assertModuleClasspath("m1", - JavaParameters.CLASSES_AND_TESTS, - getProjectPath() + "/m1/target/test-classes", - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/classes"); - assertModuleClasspath("m2", - JavaParameters.CLASSES_AND_TESTS, - getProjectPath() + "/m2/target/test-classes", - getProjectPath() + "/m2/target/classes", - getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar", - getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); + assertCompileProductionClasspath("m2", + getProjectPath() + "/m2/target/classes", + getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar"); + assertRuntimeProductionClasspath("m2", + getProjectPath() + "/m2/target/classes"); + + assertRuntimeTestsClasspath("m2", + getProjectPath() + "/m2/target/test-classes", + getProjectPath() + "/m2/target/classes", + getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar", + getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); } public void testDoNotIncludeConflictingTransitiveDependenciesInTheClasspath() throws Exception { @@ -580,6 +583,7 @@ public class MavenClasspathConfigurationTest extends MavenImportingTestCase { " 4.0" + " " + ""); + VirtualFile m3 = createModulePom("m3", "test" + "m3" + "1" + @@ -600,12 +604,12 @@ public class MavenClasspathConfigurationTest extends MavenImportingTestCase { setupJdkForModules("m1", "m2", "m3"); - assertModuleClasspath("m1", - getProjectPath() + "/m1/target/test-classes", - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/classes", - getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar", - getProjectPath() + "/m3/target/classes"); + assertAllTestsClasspath("m1", + getProjectPath() + "/m1/target/test-classes", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes", + getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar", + getProjectPath() + "/m3/target/classes"); } public void testAdditionalClasspathElementsInTests() throws Exception { @@ -652,33 +656,63 @@ public class MavenClasspathConfigurationTest extends MavenImportingTestCase { setupJdkForModules("m1"); - assertModuleClasspath("m1", - JavaParameters.CLASSES_ONLY, - getProjectPath() + "/m1/target/classes", - getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); + assertAllProductionClasspath("m1", + getProjectPath() + "/m1/target/classes", + getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); - assertModuleClasspath("m1", - JavaParameters.CLASSES_AND_TESTS, - getProjectPath() + "/m1/target/test-classes", - getProjectPath() + "/m1/target/classes", - getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar", - f1.getPath(), - f2.getPath()); + assertAllTestsClasspath("m1", + getProjectPath() + "/m1/target/test-classes", + getProjectPath() + "/m1/target/classes", + getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar", + f1.getPath(), + f2.getPath()); } - private void assertModuleClasspath(String moduleName, String... paths) throws CantRunException { - assertModuleClasspath(moduleName, JavaParameters.CLASSES_AND_TESTS, paths); + private void assertAllProductionClasspath(String moduleName, String... paths) throws Exception { + assertClasspath(moduleName, Scope.COMPILE, Type.PRODUCTION, paths); + assertClasspath(moduleName, Scope.RUNTIME, Type.PRODUCTION, paths); } - private void assertModuleClasspath(String moduleName, int classpathType, String... paths) throws CantRunException { + private void assertAllTestsClasspath(String moduleName, String... paths) throws Exception { + assertClasspath(moduleName, Scope.COMPILE, Type.TESTS, paths); + assertClasspath(moduleName, Scope.RUNTIME, Type.TESTS, paths); + } + + private void assertCompileProductionClasspath(String moduleName, String... paths) throws Exception { + assertClasspath(moduleName, Scope.COMPILE, Type.PRODUCTION, paths); + } + + private void assertCompileTestsClasspath(String moduleName, String... paths) throws Exception { + assertClasspath(moduleName, Scope.COMPILE, Type.TESTS, paths); + } + + private void assertRuntimeProductionClasspath(String moduleName, String... paths) throws Exception { + assertClasspath(moduleName, Scope.RUNTIME, Type.PRODUCTION, paths); + } + + private void assertRuntimeTestsClasspath(String moduleName, String... paths) throws Exception { + assertClasspath(moduleName, Scope.RUNTIME, Type.TESTS, paths); + } + + private void assertClasspath(String moduleName, Scope scope, Type type, String... paths) throws Exception { createOutputDirectories(); - JavaParameters params = new JavaParameters(); - params.configureByModule(getModule(moduleName), classpathType); + PathsList actualPaths; + if (scope == Scope.RUNTIME) { + JavaParameters params = new JavaParameters(); + params.configureByModule(getModule(moduleName), type == Type.TESTS ? JavaParameters.CLASSES_AND_TESTS : JavaParameters.CLASSES_ONLY); + actualPaths = params.getClassPath(); + } + else { + OrderEnumerator en = OrderEnumerator.orderEntries(getModule(moduleName)).recursively().withoutSdk().compileOnly(); + if (type == Type.PRODUCTION) en.productionOnly(); + actualPaths = en.classes().getPathsList(); + } + List systemPaths = new ArrayList(); for (String each : paths) { systemPaths.add(FileUtil.toSystemDependentName(each)); } - assertOrderedElementsAreEqual(params.getClassPath().getPathList(), systemPaths); + assertOrderedElementsAreEqual(actualPaths.getPathList(), systemPaths); } private void createRepositoryFile(String filePath) throws IOException {