diff --git a/src/it/test_Scala3_multimodule/invoker.properties b/src/it/test_Scala3_multimodule/invoker.properties new file mode 100644 index 00000000..3e51a5a6 --- /dev/null +++ b/src/it/test_Scala3_multimodule/invoker.properties @@ -0,0 +1 @@ +invoker.goals=clean verify site -e -ntp \ No newline at end of file diff --git a/src/it/test_Scala3_multimodule/module01/pom.xml b/src/it/test_Scala3_multimodule/module01/pom.xml new file mode 100644 index 00000000..66016f7d --- /dev/null +++ b/src/it/test_Scala3_multimodule/module01/pom.xml @@ -0,0 +1,17 @@ + + + + + + it.scoverage-maven-plugin + test_Scala3_multimodule + 1.0-SNAPSHOT + ../pom.xml + + + 4.0.0 + module01 + Test Scala 3 Multi-Module: Module 1 + + \ No newline at end of file diff --git a/src/it/test_Scala3_multimodule/module01/src/main/scala/pkg01/HelloService1.scala b/src/it/test_Scala3_multimodule/module01/src/main/scala/pkg01/HelloService1.scala new file mode 100644 index 00000000..4260a38d --- /dev/null +++ b/src/it/test_Scala3_multimodule/module01/src/main/scala/pkg01/HelloService1.scala @@ -0,0 +1,12 @@ +package pkg01 + +class HelloService1 +{ + def hello: String = + { + "Hello from module 1" + } + +} + +object HelloService1 extends HelloService1 diff --git a/src/it/test_Scala3_multimodule/module01/src/test/scala/pkg01/HelloServiceTest.scala b/src/it/test_Scala3_multimodule/module01/src/test/scala/pkg01/HelloServiceTest.scala new file mode 100644 index 00000000..2a5409b1 --- /dev/null +++ b/src/it/test_Scala3_multimodule/module01/src/test/scala/pkg01/HelloServiceTest.scala @@ -0,0 +1,14 @@ +package pkg01 + +import org.junit.Test; +import org.junit.Assert.assertEquals + +class HelloServiceTest +{ + @Test + def test1(): Unit = + { + assertEquals("Hello from module 1", HelloService1.hello) + } + +} diff --git a/src/it/test_Scala3_multimodule/pom.xml b/src/it/test_Scala3_multimodule/pom.xml new file mode 100644 index 00000000..5b8e49c3 --- /dev/null +++ b/src/it/test_Scala3_multimodule/pom.xml @@ -0,0 +1,66 @@ + + + + 4.0.0 + + + it.scoverage-maven-plugin + integration_tests_parent + 1.0-SNAPSHOT + ../integration_tests_parent/pom.xml + + + test_Scala3_multimodule + 1.0-SNAPSHOT + pom + Test Scala 3 Multi-Module + Test Scala 3 Multi-Module + + + 3 + 3.3.1 + scala3-library_3 + UTF-8 + + + + module01 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + net.alchim31.maven + scala-maven-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + + @project.groupId@ + @project.artifactId@ + + true + + + + + + + + + @project.groupId@ + @project.artifactId@ + + true + + + + + diff --git a/src/it/test_Scala3_multimodule/validate.groovy b/src/it/test_Scala3_multimodule/validate.groovy new file mode 100644 index 00000000..5bc6787e --- /dev/null +++ b/src/it/test_Scala3_multimodule/validate.groovy @@ -0,0 +1,20 @@ +try { + + def module1ScoverageFile = new File(basedir, "module01/target/scoverage.xml") + assert module1ScoverageFile.exists() + + def module1ReportFile = new File(basedir, "module01/target/site/scoverage/index.html") + assert module1ReportFile.exists() + + def aggregatedScoverageFile = new File(basedir, "target/scoverage.xml") + assert aggregatedScoverageFile.exists() + + def aggregatedReportFile = new File(basedir, "target/site/scoverage/index.html") + assert aggregatedReportFile.exists() + + return true + +} catch (Throwable e) { + e.printStackTrace() + return false +} diff --git a/src/main/java/org/scoverage/plugin/SCoveragePreCompileMojo.java b/src/main/java/org/scoverage/plugin/SCoveragePreCompileMojo.java index 931a4d2c..b9adcf31 100644 --- a/src/main/java/org/scoverage/plugin/SCoveragePreCompileMojo.java +++ b/src/main/java/org/scoverage/plugin/SCoveragePreCompileMojo.java @@ -33,6 +33,7 @@ import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.artifact.versioning.ArtifactVersion; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; +import org.apache.maven.execution.MavenSession; import org.apache.maven.model.Dependency; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; @@ -155,6 +156,12 @@ public class SCoveragePreCompileMojo @Parameter( defaultValue = "${project}", readonly = true, required = true ) private MavenProject project; + /** + * The current Maven session. + */ + @Parameter( defaultValue = "${session}", readonly = true, required = true ) + private MavenSession session; + /** * All Maven projects in the reactor. */ @@ -283,7 +290,7 @@ public void execute() throws MojoExecutionException String _scalacOptions = quoteArgument( arg ); String addScalacArgs = arg; - arg = scala2 ? ( SOURCE_ROOT_OPTION + project.getBasedir().getAbsolutePath() ) : ""; + arg = scala2 ? ( SOURCE_ROOT_OPTION + session.getExecutionRootDirectory() ) : ""; _scalacOptions = _scalacOptions + SPACE + quoteArgument( arg ); addScalacArgs = addScalacArgs + PIPE + arg; diff --git a/src/main/java/org/scoverage/plugin/SCoverageReportMojo.java b/src/main/java/org/scoverage/plugin/SCoverageReportMojo.java index 3dae4d1b..14120cfb 100644 --- a/src/main/java/org/scoverage/plugin/SCoverageReportMojo.java +++ b/src/main/java/org/scoverage/plugin/SCoverageReportMojo.java @@ -23,17 +23,16 @@ import java.io.File; import java.io.FileInputStream; import java.util.ArrayList; -import java.util.ArrayDeque; import java.util.Arrays; import java.util.List; import java.util.Locale; -import java.util.Queue; import java.util.ResourceBundle; import java.util.concurrent.atomic.AtomicInteger; import org.apache.maven.doxia.siterenderer.RenderingContext; import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink; +import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.Execute; @@ -58,7 +57,6 @@ import scoverage.reporter.IOUtils; import scoverage.serialize.Serializer; import scoverage.reporter.CoberturaXmlWriter; -import scoverage.reporter.CoverageAggregator; import scoverage.reporter.ScoverageHtmlWriter; import scoverage.reporter.ScoverageXmlWriter; @@ -131,6 +129,12 @@ public class SCoverageReportMojo @Parameter( defaultValue = "${project}", readonly = true, required = true ) private MavenProject project; + /** + * The current Maven session. + */ + @Parameter(defaultValue = "${session}", readonly = true, required = true) + private MavenSession session; + /** * All Maven projects in the reactor. */ @@ -423,7 +427,7 @@ private void generateReports() File coverageFile = Serializer.coverageFile( dataDirectory ); getLog().info( String.format( "Reading scoverage instrumentation [%s]...", coverageFile.getAbsolutePath() ) ); - Coverage coverage = Serializer.deserialize( coverageFile, project.getBasedir() ); + Coverage coverage = Serializer.deserialize( coverageFile, executionRootDirectory() ); getLog().info( String.format( "Reading scoverage measurements [%s*]...", new File( dataDirectory, Constants.MeasurementsPrefix() ).getAbsolutePath() ) ); @@ -444,22 +448,17 @@ private void generateAggregatedReports() AtomicInteger id = new AtomicInteger(); List scoverageDataDirs = new ArrayList(); List sourceRoots = new ArrayList(); - MavenProject topLevelModule = null; for ( MavenProject module : reactorProjects ) { - if ( module.isExecutionRoot() ) - { - topLevelModule = module; - } - else if ( !module.getPackaging().equals( "pom" ) ) + if ( !module.getPackaging().equals( "pom" ) ) { - File scoverageDataDir = rebase( dataDirectory, module ); + File scoverageDataDir = rebase( dataDirectory, module.getBasedir() ); if ( scoverageDataDir.isDirectory() ) { scoverageDataDirs.add( scoverageDataDir ); File coverageFile = Serializer.coverageFile(scoverageDataDir); if (coverageFile.exists()) { - Coverage subCoverage = Serializer.deserialize(coverageFile, module.getBasedir()); + Coverage subCoverage = Serializer.deserialize(coverageFile, executionRootDirectory() ); List measurementFiles = Arrays.asList( IOUtils.findMeasurementFiles( scoverageDataDir ) ); scala.collection.Set> measurements = IOUtils.invoked( CollectionConverters.asScala( measurementFiles ).toSeq(), encoding ); @@ -537,40 +536,15 @@ else if ( !module.getPackaging().equals( "pom" ) ) scoverageDataDirs.size() ) ); } - /* traverse up the module tree until a module isExecutionRoot */ - if ( topLevelModule == null ) - { - Queue candidateForTopLevelModules = new ArrayDeque<>(reactorProjects); - while ( !candidateForTopLevelModules.isEmpty() ) - { - MavenProject module = candidateForTopLevelModules.poll(); - if ( module.isExecutionRoot() ) - { - topLevelModule = module; - break; - } - if ( module.hasParent() ) - { - candidateForTopLevelModules.add(module.getParent()); - } - } - } - if ( topLevelModule == null ) - { - // This exception should never be thrown. - throw new IllegalStateException("Cannot find the top level module to write the " + - "aggregated reports."); - } + File executionRootOutputDirectory = rebase( outputDirectory, executionRootDirectory() ); + File executionRootXmlOutputDirectory = rebase( xmlOutputDirectory, executionRootDirectory() ); - File topLevelModuleOutputDirectory = rebase( outputDirectory, topLevelModule ); - File topLevelModuleXmlOutputDirectory = rebase( xmlOutputDirectory, topLevelModule ); - - mkdirs( topLevelModuleOutputDirectory ); - mkdirs( topLevelModuleXmlOutputDirectory ); + mkdirs( executionRootOutputDirectory ); + mkdirs( executionRootXmlOutputDirectory ); getLog().info( "Generating coverage aggregated reports..." ); - writeReports( coverage, sourceRoots, topLevelModuleXmlOutputDirectory, topLevelModuleXmlOutputDirectory, - topLevelModuleOutputDirectory ); + writeReports( coverage, sourceRoots, executionRootXmlOutputDirectory, executionRootXmlOutputDirectory, + executionRootOutputDirectory ); getLog().info( "Coverage aggregated reports completed." ); } @@ -610,10 +584,15 @@ else if ( directory.exists() && !directory.isDirectory() ) } } - private File rebase( File file, MavenProject otherModule ) + private File rebase( File file, File otherProjectDir ) { return new File( file.getAbsolutePath().replace( project.getBasedir().getAbsolutePath(), - otherModule.getBasedir().getAbsolutePath() ) ); + otherProjectDir.getAbsolutePath() ) ); + } + + private File executionRootDirectory() + { + return new File(session.getExecutionRootDirectory()); } }