From 39ad8fb22c3c08672fc208fd6d9603075122ee33 Mon Sep 17 00:00:00 2001 From: Sergey Mashkov Date: Thu, 12 Jan 2017 00:33:00 +0300 Subject: [PATCH] Maven: tests support for multiplatform projects --- .../src/it/test-multiplatform/js/pom.xml | 13 +++++ .../kotlin/org/jetbrains/JSSpecificTest.kt | 11 ++++ .../kotlin/org/jetbrains/TestUtilsImpl.kt | 5 ++ .../src/it/test-multiplatform/jvm/pom.xml | 18 +++++++ .../kotlin/org/jetbrains/JVMSpecificTest.kt | 10 ++++ .../kotlin/org/jetbrains/TestUtilsImpl.kt | 7 +++ .../src/it/test-multiplatform/shared/pom.xml | 9 ++++ .../test/kotlin/org/jetbrains/SharedTest.kt | 10 ++++ .../test/kotlin/org/jetbrains/TestUtils.kt | 3 ++ .../shared/src/test/kotlin/org/junit/Test.kt | 4 ++ .../kotlin/maven/K2JSCompilerMojo.java | 7 +++ .../kotlin/maven/K2JVMCompileMojo.java | 6 +++ .../kotlin/maven/KotlinCompileMojoBase.java | 23 ++++++--- .../kotlin/maven/KotlinTestCompileMojo.java | 6 +++ .../maven/KotlinTestJSCompilerMojo.java | 6 +++ .../jetbrains/kotlin/maven/MetadataMojo.java | 11 ++++ .../kotlin/maven/TestMetadataMojo.java | 50 +++++++++++++++++++ 17 files changed, 193 insertions(+), 6 deletions(-) create mode 100644 libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/js/src/test/kotlin/org/jetbrains/JSSpecificTest.kt create mode 100644 libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/js/src/test/kotlin/org/jetbrains/TestUtilsImpl.kt create mode 100644 libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/jvm/src/test/kotlin/org/jetbrains/JVMSpecificTest.kt create mode 100644 libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/jvm/src/test/kotlin/org/jetbrains/TestUtilsImpl.kt create mode 100644 libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/shared/src/test/kotlin/org/jetbrains/SharedTest.kt create mode 100644 libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/shared/src/test/kotlin/org/jetbrains/TestUtils.kt create mode 100644 libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/shared/src/test/kotlin/org/junit/Test.kt create mode 100644 libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/TestMetadataMojo.java diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/js/pom.xml b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/js/pom.xml index 956c71f4427..c16b2bddd4c 100644 --- a/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/js/pom.xml +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/js/pom.xml @@ -28,6 +28,8 @@ ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + kotlin-maven-plugin @@ -41,6 +43,17 @@ js + + true + + + + compile-test + test-compile + + test-js + + true diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/js/src/test/kotlin/org/jetbrains/JSSpecificTest.kt b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/js/src/test/kotlin/org/jetbrains/JSSpecificTest.kt new file mode 100644 index 00000000000..4b80dfa7d6f --- /dev/null +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/js/src/test/kotlin/org/jetbrains/JSSpecificTest.kt @@ -0,0 +1,11 @@ +package org.jetbrains + +import org.junit.* +import kotlin.test.* + +class JSSpecificTest { + @Test + fun test1() { + assertEquals(1, 1) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/js/src/test/kotlin/org/jetbrains/TestUtilsImpl.kt b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/js/src/test/kotlin/org/jetbrains/TestUtilsImpl.kt new file mode 100644 index 00000000000..22d5c417be4 --- /dev/null +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/js/src/test/kotlin/org/jetbrains/TestUtilsImpl.kt @@ -0,0 +1,5 @@ +package org.jetbrains + +impl fun assertEquals(a: String, b: String) { + kotlin.test.assertEquals(a, b) +} diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/jvm/pom.xml b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/jvm/pom.xml index 8159beb67af..370d5848957 100644 --- a/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/jvm/pom.xml +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/jvm/pom.xml @@ -24,10 +24,18 @@ test-multimodule-shared ${project.version} + + junit + junit + 4.12 + test + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + kotlin-maven-plugin @@ -44,6 +52,16 @@ true + + compile-test + test-compile + + test-compile + + + true + + diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/jvm/src/test/kotlin/org/jetbrains/JVMSpecificTest.kt b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/jvm/src/test/kotlin/org/jetbrains/JVMSpecificTest.kt new file mode 100644 index 00000000000..3461d7a1bd6 --- /dev/null +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/jvm/src/test/kotlin/org/jetbrains/JVMSpecificTest.kt @@ -0,0 +1,10 @@ +package org.jetbrains + +import org.junit.* + +class JVMSpecificTest { + @Test + fun test1() { + Assert.assertEquals(1, 1) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/jvm/src/test/kotlin/org/jetbrains/TestUtilsImpl.kt b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/jvm/src/test/kotlin/org/jetbrains/TestUtilsImpl.kt new file mode 100644 index 00000000000..242a03df0ef --- /dev/null +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/jvm/src/test/kotlin/org/jetbrains/TestUtilsImpl.kt @@ -0,0 +1,7 @@ +package org.jetbrains + +import org.junit.* + +impl fun assertEquals(a: String, b: String) { + Assert.assertEquals(a, b) +} diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/shared/pom.xml b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/shared/pom.xml index e55c44823ca..cc6dc462c4a 100644 --- a/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/shared/pom.xml +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/shared/pom.xml @@ -23,11 +23,14 @@ ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + kotlin-maven-plugin org.jetbrains.kotlin ${kotlin.version} + metadata @@ -35,6 +38,12 @@ metadata + + test-metadata + + test-metadata + + diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/shared/src/test/kotlin/org/jetbrains/SharedTest.kt b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/shared/src/test/kotlin/org/jetbrains/SharedTest.kt new file mode 100644 index 00000000000..8b45e3dc4a3 --- /dev/null +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/shared/src/test/kotlin/org/jetbrains/SharedTest.kt @@ -0,0 +1,10 @@ +package org.jetbrains + +import org.junit.* + +open class SharedTest { + @Test + fun test0() { + assertEquals("Hello, World!", getGreeting()) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/shared/src/test/kotlin/org/jetbrains/TestUtils.kt b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/shared/src/test/kotlin/org/jetbrains/TestUtils.kt new file mode 100644 index 00000000000..a94f47a44e5 --- /dev/null +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/shared/src/test/kotlin/org/jetbrains/TestUtils.kt @@ -0,0 +1,3 @@ +package org.jetbrains + +header fun assertEquals(a: String, b: String) diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/shared/src/test/kotlin/org/junit/Test.kt b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/shared/src/test/kotlin/org/junit/Test.kt new file mode 100644 index 00000000000..492582493fa --- /dev/null +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-multiplatform/shared/src/test/kotlin/org/junit/Test.kt @@ -0,0 +1,4 @@ +package org.junit + +@Suppress("HEADER_WITHOUT_IMPLEMENTATION") +header annotation class Test \ No newline at end of file diff --git a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerMojo.java b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerMojo.java index 55b9cffc944..260d12c926d 100644 --- a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerMojo.java +++ b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JSCompilerMojo.java @@ -24,6 +24,7 @@ import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; +import org.apache.maven.project.MavenProject; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments; import org.jetbrains.kotlin.cli.js.K2JSCompiler; @@ -154,12 +155,18 @@ public class K2JSCompilerMojo extends KotlinCompileMojoBase getRelatedSourceRoots(MavenProject project) { + return project.getCompileSourceRoots(); + } + @NotNull @Override protected K2JSCompiler createCompiler() { return new K2JSCompiler(); } + @SuppressWarnings("unchecked") private Set getOutputDirectoriesCollector() { lock.lock(); try { diff --git a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JVMCompileMojo.java b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JVMCompileMojo.java index 59af6712e19..a96681fbca6 100644 --- a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JVMCompileMojo.java +++ b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JVMCompileMojo.java @@ -21,6 +21,7 @@ import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; +import org.apache.maven.project.MavenProject; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments; import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler; @@ -65,6 +66,11 @@ public class K2JVMCompileMojo extends KotlinCompileMojoBase scriptTemplates; + @Override + protected List getRelatedSourceRoots(MavenProject project) { + return project.getCompileSourceRoots(); + } + @NotNull @Override protected K2JVMCompiler createCompiler() { diff --git a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinCompileMojoBase.java b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinCompileMojoBase.java index 4058f400e4c..cf62e5d2907 100644 --- a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinCompileMojoBase.java +++ b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinCompileMojoBase.java @@ -34,6 +34,7 @@ import org.apache.maven.repository.RepositorySystem; import org.codehaus.plexus.PlexusContainer; import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.cli.common.CLICompiler; import org.jetbrains.kotlin.cli.common.ExitCode; import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments; @@ -86,7 +87,7 @@ public abstract class KotlinCompileMojoBase e return project.getCompileSourceRoots(); } - public List getSourceDirs() { + private List getSourceDirs() { List sources = getSourceFilePaths(); List result = new ArrayList(sources.size()); @@ -96,6 +97,7 @@ public abstract class KotlinCompileMojoBase e Map projectReferences = project.getProjectReferences(); if (projectReferences != null) { + iterateDependencies: for (Dependency dependency : project.getDependencies()) { MavenProject sibling = projectReferences.get(dependency.getGroupId() + ":" + dependency.getArtifactId() + ":" + dependency.getVersion()); if (sibling != null) { @@ -103,11 +105,9 @@ public abstract class KotlinCompileMojoBase e if (plugin != null) { for (PluginExecution pluginExecution : plugin.getExecutions()) { if (pluginExecution.getGoals() != null && pluginExecution.getGoals().contains("metadata")) { - List sourceRoots = sibling.getCompileSourceRoots(); - if (sourceRoots != null) { - for (String sourceRoot : sourceRoots) { - addSourceRoots(result, sourceRoot); - } + for (String sourceRoot : orEmpty(getRelatedSourceRoots(sibling))) { + addSourceRoots(result, sourceRoot); + continue iterateDependencies; } } } @@ -119,6 +119,8 @@ public abstract class KotlinCompileMojoBase e return result; } + protected abstract List getRelatedSourceRoots(MavenProject project); + private void addSourceRoots(List result, String source) { File f = new File(source); if (f.isAbsolute()) { @@ -449,4 +451,13 @@ public abstract class KotlinCompileMojoBase e super("Plugin option has an illegal format: " + option); } } + + @NotNull + private static List orEmpty(@Nullable List in) { + if (in == null) { + return Collections.emptyList(); + } + + return in; + } } diff --git a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinTestCompileMojo.java b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinTestCompileMojo.java index 3b8a4419506..1d6cab86764 100644 --- a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinTestCompileMojo.java +++ b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinTestCompileMojo.java @@ -22,6 +22,7 @@ import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; +import org.apache.maven.project.MavenProject; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments; @@ -89,4 +90,9 @@ public class KotlinTestCompileMojo extends K2JVMCompileMojo { output = testOutput; super.configureSpecificCompilerArguments(arguments); } + + @Override + protected List getRelatedSourceRoots(MavenProject project) { + return project.getTestCompileSourceRoots(); + } } diff --git a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinTestJSCompilerMojo.java b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinTestJSCompilerMojo.java index fd282a008f7..178cd17f7e9 100644 --- a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinTestJSCompilerMojo.java +++ b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/KotlinTestJSCompilerMojo.java @@ -22,6 +22,7 @@ import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; +import org.apache.maven.project.MavenProject; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments; @@ -85,6 +86,11 @@ public class KotlinTestJSCompilerMojo extends K2JSCompilerMojo { arguments.metaInfo = metaInfo; } + @Override + protected List getRelatedSourceRoots(MavenProject project) { + return project.getTestCompileSourceRoots(); + } + @Override public void execute() throws MojoExecutionException, MojoFailureException { if (skip) { diff --git a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/MetadataMojo.java b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/MetadataMojo.java index acb19578e7a..b787bfb7cba 100644 --- a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/MetadataMojo.java +++ b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/MetadataMojo.java @@ -5,12 +5,14 @@ import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; +import org.apache.maven.project.MavenProject; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.cli.common.CLICompiler; import org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments; import org.jetbrains.kotlin.cli.metadata.K2MetadataCompiler; import java.io.File; +import java.util.Collections; import java.util.List; import static com.intellij.openapi.util.text.StringUtil.join; @@ -21,6 +23,14 @@ public class MetadataMojo extends KotlinCompileMojoBase classpath; + @Parameter(defaultValue = "${project.testClasspathElements}", required = true, readonly = true) + public List testClasspath; + + @Override + protected List getRelatedSourceRoots(MavenProject project) { + return Collections.emptyList(); + } + @NotNull @Override protected CLICompiler createCompiler() { @@ -42,6 +52,7 @@ public class MetadataMojo extends KotlinCompileMojoBase classpathList = filterClassPath(project.getBasedir(), classpath); + classpathList.remove(project.getBuild().getOutputDirectory()); if (!classpathList.isEmpty()) { String classPathString = join(classpathList, File.pathSeparator); diff --git a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/TestMetadataMojo.java b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/TestMetadataMojo.java new file mode 100644 index 00000000000..cb9ee9b4f48 --- /dev/null +++ b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/TestMetadataMojo.java @@ -0,0 +1,50 @@ +package org.jetbrains.kotlin.maven; + +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.plugins.annotations.ResolutionScope; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments; + +import java.io.File; +import java.util.List; + +@Mojo(name = "test-metadata", defaultPhase = LifecyclePhase.PROCESS_TEST_SOURCES, requiresDependencyResolution = ResolutionScope.TEST) +public class TestMetadataMojo extends MetadataMojo { + @Parameter(property = "maven.test.skip", defaultValue = "false") + private boolean skip; + + @Override + protected List getSourceFilePaths() { + return project.getTestCompileSourceRoots(); + } + + @Override + protected void configureSpecificCompilerArguments(@NotNull K2MetadataCompilerArguments arguments) throws MojoExecutionException { + String productionOutput = output; + + module = testModule; + classpath = testClasspath; +// arguments.friendPaths = new String[] { productionOutput }; + output = testOutput; + super.configureSpecificCompilerArguments(arguments); + + if (arguments.classpath == null) { + arguments.classpath = productionOutput; + } else { + arguments.classpath = arguments.classpath + File.pathSeparator + productionOutput; + } + } + + @Override + public void execute() throws MojoExecutionException, MojoFailureException { + if (skip) { + getLog().info("Test compilation is skipped"); + } else { + super.execute(); + } + } +}