Skip to content

Commit 0c14694

Browse files
committed
Merge branch 'alisiikh-coverage-multiple-test-tasks'
2 parents e29ed3f + f7b0549 commit 0c14694

File tree

12 files changed

+427
-86
lines changed

12 files changed

+427
-86
lines changed

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ pluginBundle {
4141
apply plugin: 'maven'
4242
apply plugin: 'groovy'
4343

44-
sourceCompatibility = '1.6'
45-
targetCompatibility = '1.6'
44+
sourceCompatibility = '1.8'
45+
targetCompatibility = '1.8'
4646

4747
dependencies {
4848
compileOnly "org.scoverage:scalac-scoverage-plugin_2.12:1.3.1"
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
package org.scoverage;
2+
3+
import org.junit.Assert;
4+
import org.junit.Test;
5+
6+
public class ScalaSingleModuleWithMultipleTestTasksTest extends ScoverageFunctionalTest {
7+
public ScalaSingleModuleWithMultipleTestTasksTest() {
8+
super("scala-single-module-multiple-test-tasks");
9+
}
10+
11+
@Test
12+
public void test() {
13+
14+
AssertableBuildResult result = dryRun("clean", "test");
15+
16+
result.assertTaskDoesntExist(ScoveragePlugin.getCOMPILE_NAME());
17+
result.assertTaskDoesntExist(ScoveragePlugin.getREPORT_NAME());
18+
result.assertTaskDoesntExist(ScoveragePlugin.getAGGREGATE_NAME());
19+
result.assertTaskDoesntExist(ScoveragePlugin.getCHECK_NAME());
20+
}
21+
22+
@Test
23+
public void build() {
24+
25+
AssertableBuildResult result = dryRun("clean", "build");
26+
27+
result.assertTaskDoesntExist(ScoveragePlugin.getCOMPILE_NAME());
28+
result.assertTaskDoesntExist(ScoveragePlugin.getREPORT_NAME());
29+
result.assertTaskDoesntExist(ScoveragePlugin.getAGGREGATE_NAME());
30+
result.assertTaskDoesntExist(ScoveragePlugin.getCHECK_NAME());
31+
}
32+
33+
@Test
34+
public void reportScoverage() {
35+
36+
AssertableBuildResult result = dryRun("clean", ScoveragePlugin.getREPORT_NAME());
37+
38+
result.assertTaskExists(ScoveragePlugin.getCOMPILE_NAME());
39+
result.assertTaskExists(ScoveragePlugin.getREPORT_NAME());
40+
result.assertTaskDoesntExist(ScoveragePlugin.getAGGREGATE_NAME());
41+
result.assertTaskDoesntExist(ScoveragePlugin.getCHECK_NAME());
42+
}
43+
44+
@Test
45+
public void aggregateScoverage() {
46+
47+
AssertableBuildResult result = runAndFail("clean", ScoveragePlugin.getAGGREGATE_NAME());
48+
49+
result.assertNoTasks();
50+
}
51+
52+
53+
@Test
54+
public void checkScoverage() throws Exception {
55+
56+
AssertableBuildResult result = run("clean", ScoveragePlugin.getCHECK_NAME());
57+
58+
result.assertTaskSucceeded(ScoveragePlugin.getCOMPILE_NAME());
59+
result.assertTaskSucceeded("reportTestScoverage");
60+
result.assertTaskSucceeded("reportIntTestScoverage");
61+
result.assertTaskSucceeded(ScoveragePlugin.getREPORT_NAME());
62+
result.assertTaskSucceeded(ScoveragePlugin.getCHECK_NAME());
63+
result.assertTaskDoesntExist(ScoveragePlugin.getAGGREGATE_NAME());
64+
65+
assertReportFilesExist();
66+
assertCoverage(100.0);
67+
}
68+
69+
@Test
70+
public void checkScoverageIntTest() throws Exception {
71+
AssertableBuildResult result = runAndFail("clean", "-x", "reportTestScoverage", ScoveragePlugin.getCHECK_NAME());
72+
73+
result.assertTaskSucceeded(ScoveragePlugin.getCOMPILE_NAME());
74+
result.assertTaskDoesntExist("reportTestScoverage");
75+
result.assertTaskSucceeded("reportIntTestScoverage");
76+
result.assertTaskSucceeded(ScoveragePlugin.getREPORT_NAME());
77+
result.assertTaskFailed(ScoveragePlugin.getCHECK_NAME());
78+
result.assertTaskDoesntExist(ScoveragePlugin.getAGGREGATE_NAME());
79+
80+
assertReportFilesExist();
81+
assertCoverage(50.0);
82+
}
83+
84+
85+
@Test
86+
public void checkScoverageFails() throws Exception {
87+
88+
AssertableBuildResult result = runAndFail("clean", ScoveragePlugin.getCHECK_NAME(),
89+
"intTest", "--tests", "org.hello.TestNothingSuite",
90+
"-x", "test");
91+
92+
result.assertTaskSucceeded(ScoveragePlugin.getCOMPILE_NAME());
93+
result.assertTaskSucceeded(ScoveragePlugin.getREPORT_NAME());
94+
result.assertTaskFailed(ScoveragePlugin.getCHECK_NAME());
95+
result.assertTaskDoesntExist(ScoveragePlugin.getAGGREGATE_NAME());
96+
97+
assertReportFilesExist();
98+
assertCoverage(0.0);
99+
}
100+
101+
@Test
102+
public void reportScoverageWithExcludedClasses() throws Exception {
103+
104+
AssertableBuildResult result = run("clean", "-PexcludedFile=.*", ScoveragePlugin.getREPORT_NAME());
105+
106+
result.assertTaskSucceeded(ScoveragePlugin.getCOMPILE_NAME());
107+
result.assertTaskSucceeded(ScoveragePlugin.getREPORT_NAME());
108+
result.assertTaskDoesntExist(ScoveragePlugin.getCHECK_NAME());
109+
result.assertTaskDoesntExist(ScoveragePlugin.getAGGREGATE_NAME());
110+
111+
Assert.assertTrue(resolve(reportDir(), "index.html").exists());
112+
Assert.assertFalse(resolve(reportDir(), "src/main/scala/org/hello/World.scala.html").exists());
113+
assertCoverage(100.0); // coverage is 100 since no classes are covered
114+
115+
// compiled class should exist in the default classes directory, but not in scoverage
116+
Assert.assertTrue(resolve(buildDir(), "classes/scala/main/org/hello/World.class").exists());
117+
Assert.assertFalse(resolve(buildDir(), "classes/scala/scoverage/org/hello/World.class").exists());
118+
}
119+
120+
@Test
121+
public void reportScoverageWithoutNormalCompilation() throws Exception {
122+
123+
AssertableBuildResult result = run("clean", ScoveragePlugin.getREPORT_NAME(),
124+
"-x", "compileScala");
125+
126+
result.assertTaskSkipped("compileScala");
127+
result.assertTaskSucceeded(ScoveragePlugin.getCOMPILE_NAME());
128+
result.assertTaskSucceeded(ScoveragePlugin.getREPORT_NAME());
129+
result.assertTaskDoesntExist(ScoveragePlugin.getCHECK_NAME());
130+
result.assertTaskDoesntExist(ScoveragePlugin.getAGGREGATE_NAME());
131+
132+
assertReportFilesExist();
133+
assertCoverage(100.0);
134+
135+
Assert.assertTrue(resolve(buildDir(), "classes/scala/main/org/hello/World.class").exists());
136+
Assert.assertFalse(resolve(buildDir(), "classes/scala/scoverage/org/hello/World.class").exists());
137+
}
138+
139+
@Test
140+
public void reportScoverageWithoutNormalCompilationAndWithExcludedClasses() throws Exception {
141+
142+
AssertableBuildResult result = run("clean", ScoveragePlugin.getREPORT_NAME(),
143+
"-PexcludedFile=.*", "-x", "compileScala");
144+
145+
Assert.assertTrue(resolve(reportDir(), "index.html").exists());
146+
Assert.assertFalse(resolve(reportDir(), "src/main/scala/org/hello/World.scala.html").exists());
147+
assertCoverage(100.0); // coverage is 100 since no classes are covered
148+
149+
// compiled class should exist in the default classes directory, but not in scoverage
150+
Assert.assertTrue(resolve(buildDir(), "classes/scala/main/org/hello/World.class").exists());
151+
Assert.assertFalse(resolve(buildDir(), "classes/scala/scoverage/org/hello/World.class").exists());
152+
}
153+
154+
155+
private void assertReportFilesExist() {
156+
157+
Assert.assertTrue(resolve(reportDir(), "index.html").exists());
158+
Assert.assertTrue(resolve(reportDir(), "src/main/scala/org/hello/World.scala.html").exists());
159+
}
160+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
plugins {
2+
id 'io.spring.dependency-management' version "1.0.4.RELEASE"
3+
id 'org.scoverage'
4+
}
5+
6+
repositories {
7+
jcenter()
8+
}
9+
10+
description = 'a single-module Scala project with dependency manager that builds successfully with 100% coverage'
11+
12+
apply plugin: 'scala'
13+
14+
15+
dependencyManagement {
16+
dependencies {
17+
dependency group: 'org.scala-lang', name: 'scala-library', version: "${scalaVersionMajor}.${scalaVersionMinor}.${scalaVersionBuild}"
18+
}
19+
}
20+
21+
dependencies {
22+
compile group: 'org.scala-lang', name: 'scala-library'
23+
24+
// scala compilation with the dependency management plugin needs this (otherwise compilation will fail)
25+
zinc group: 'com.typesafe.zinc', name: 'zinc', version: '0.3.15'
26+
zinc group: 'org.scala-lang', name: 'scala-library', version: '2.10.5'
27+
28+
testRuntime group: 'org.junit.vintage', name: 'junit-vintage-engine', version: junitVersion
29+
testCompile group: 'org.junit.platform', name: 'junit-platform-runner', version: junitPlatformVersion
30+
31+
testCompile group: 'org.scalatest', name: "scalatest_${scalaVersionMajor}.${scalaVersionMinor}", version: scalatestVersion
32+
}
33+
34+
test {
35+
useJUnitPlatform()
36+
}
37+
38+
39+
configurations {
40+
intTestCompile.extendsFrom testCompile
41+
intTestRuntime.extendsFrom testRuntime
42+
}
43+
sourceSets {
44+
intTest {
45+
resources.srcDir file('src/intTest/resources')
46+
scala {
47+
compileClasspath += main.output + test.output
48+
runtimeClasspath += main.output + test.output
49+
srcDir file("${projectDir}/src/intTest/scala")
50+
}
51+
}
52+
}
53+
54+
test {
55+
maxParallelForks = 1
56+
}
57+
58+
task intTest(type: Test) {
59+
testClassesDirs = sourceSets.intTest.output.classesDirs
60+
classpath = sourceSets.intTest.runtimeClasspath
61+
outputs.upToDateWhen { false }
62+
63+
maxParallelForks = 1
64+
}
65+
check.dependsOn(intTest)
66+
intTest.mustRunAfter(test)
67+
68+
scoverage {
69+
minimumRate = 0.6
70+
}
71+
72+
if (hasProperty("excludedFile")) {
73+
scoverage.excludedFiles = [excludedFile]
74+
}

src/functionalTest/resources/projects/scala-single-module-multiple-test-tasks/settings.gradle

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.hello
2+
3+
import org.junit.runner.RunWith
4+
import org.scalatest.FunSuite
5+
import org.scalatest.junit.JUnitRunner
6+
7+
@RunWith(classOf[JUnitRunner])
8+
class TestNothingSuite extends FunSuite {
9+
10+
test("nothing") {
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.hello
2+
3+
import org.junit.runner.RunWith
4+
import org.scalatest.FunSuite
5+
import org.scalatest.junit.JUnitRunner
6+
7+
@RunWith(classOf[JUnitRunner])
8+
class WorldIntSuite extends FunSuite {
9+
10+
test("bar") {
11+
new World().bar()
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.hello
2+
3+
class World {
4+
5+
def foo(): String = {
6+
val s = "a" + "b"
7+
s
8+
}
9+
10+
def bar(): String = "bar"
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.hello
2+
3+
import org.junit.runner.RunWith
4+
import org.scalatest.FunSuite
5+
import org.scalatest.junit.JUnitRunner
6+
7+
@RunWith(classOf[JUnitRunner])
8+
class WorldSuite extends FunSuite {
9+
10+
test("foo") {
11+
new World().foo()
12+
}
13+
}

src/main/groovy/org/scoverage/OverallCheckTask.groovy

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.scoverage
22

3-
import org.apache.tools.ant.taskdefs.Local
43
import org.gradle.api.DefaultTask
54
import org.gradle.api.GradleException
65
import org.gradle.api.provider.Property
@@ -69,12 +68,12 @@ class OverallCheckTask extends DefaultTask {
6968

7069
@VisibleForTesting
7170
protected static String errorMsg(String actual, String expected, CoverageType type) {
72-
return "Only $actual% of project is covered by tests instead of $expected% (coverageType: $type)"
71+
"Only $actual% of project is covered by tests instead of $expected% (coverageType: $type)"
7372
}
7473

7574
@VisibleForTesting
7675
protected static String fileNotFoundErrorMsg(CoverageType coverageType) {
77-
return "Coverage file (type: $coverageType) not found, check your configuration."
76+
"Coverage file (type: $coverageType) not found, check your configuration."
7877
}
7978

8079
@VisibleForTesting
@@ -100,6 +99,6 @@ class OverallCheckTask extends DefaultTask {
10099
} catch (FileNotFoundException fnfe) {
101100
return new GradleException(fileNotFoundErrorMsg(coverageType), fnfe)
102101
}
103-
return null
102+
null
104103
}
105104
}

src/main/groovy/org/scoverage/ScoverageAggregate.groovy

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package org.scoverage
22

33
import org.gradle.api.DefaultTask
4+
import org.gradle.api.provider.ListProperty
45
import org.gradle.api.provider.Property
56
import org.gradle.api.tasks.Input
67
import org.gradle.api.tasks.OutputDirectory
78
import org.gradle.api.tasks.TaskAction
9+
import scala.collection.JavaConverters
10+
import scoverage.IOUtils
811
import scoverage.report.CoverageAggregator
912

1013
class ScoverageAggregate extends DefaultTask {
@@ -14,6 +17,9 @@ class ScoverageAggregate extends DefaultTask {
1417
@OutputDirectory
1518
final Property<File> reportDir = project.objects.property(File)
1619

20+
@Input
21+
final ListProperty<File> dirsToAggregateFrom = project.objects.listProperty(File)
22+
1723
@Input
1824
final Property<Boolean> deleteReportsOnAggregation = project.objects.property(Boolean)
1925

@@ -27,12 +33,24 @@ class ScoverageAggregate extends DefaultTask {
2733
@Input
2834
final Property<Boolean> coverageDebug = project.objects.property(Boolean)
2935

36+
ScoverageAggregate() {
37+
dirsToAggregateFrom.set([])
38+
}
39+
3040
@TaskAction
3141
def aggregate() {
3242
runner.run {
3343
def rootDir = project.projectDir
3444

35-
def coverage = CoverageAggregator.aggregate(rootDir, deleteReportsOnAggregation.get())
45+
def coverage
46+
if (dirsToAggregateFrom.get().isEmpty()) {
47+
coverage = CoverageAggregator.aggregate(rootDir, deleteReportsOnAggregation.get())
48+
} else {
49+
def reportFiles = dirsToAggregateFrom.get().collectMany {
50+
JavaConverters.seqAsJavaList(IOUtils.reportFileSearch(it, IOUtils.isReportFile()))
51+
}
52+
coverage = CoverageAggregator.aggregate(JavaConverters.asScalaBuffer(reportFiles), deleteReportsOnAggregation.get())
53+
}
3654

3755
reportDir.get().deleteDir()
3856

0 commit comments

Comments
 (0)