Skip to content

Commit 0ae7baa

Browse files
authored
Merge pull request #241 from scoverage/aggregate-raw-data-not-xml-reports
Aggregate raw coverage data, not XML reports
2 parents 3954241 + fe8e794 commit 0ae7baa

File tree

6 files changed

+60
-182
lines changed

6 files changed

+60
-182
lines changed

scalac-scoverage-plugin/src/main/scala/scoverage/IOUtils.scala

+6-3
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,13 @@ object IOUtils {
5454
override def accept(pathname: File): Boolean = pathname.getName.startsWith(Constants.MeasurementsPrefix)
5555
})
5656

57-
def reportFileSearch(baseDir: File, condition: File => Boolean): Seq[File] = {
57+
def scoverageDataDirsSearch(baseDir: File): Seq[File] = {
58+
def directoryFilter = new FileFilter {
59+
override def accept(pathname: File): Boolean = pathname.isDirectory
60+
}
5861
def search(file: File): Seq[File] = file match {
59-
case dir if dir.isDirectory => dir.listFiles().toSeq.map(search).flatten
60-
case f if isReportFile(f) => Seq(f)
62+
case dir if dir.isDirectory && dir.getName == Constants.DataDir => Seq(dir)
63+
case dir if dir.isDirectory => dir.listFiles(directoryFilter).toSeq.flatMap(search)
6164
case _ => Nil
6265
}
6366
search(baseDir)

scalac-scoverage-plugin/src/main/scala/scoverage/report/CoverageAggregator.scala

+20-16
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,39 @@ package scoverage.report
22

33
import java.io.File
44

5-
import scoverage.{Coverage, IOUtils}
5+
import scoverage.{Coverage, IOUtils, Serializer}
66

77
object CoverageAggregator {
88

9+
@deprecated("1.4.0", "Used only by gradle-scoverage plugin")
910
def aggregate(baseDir: File, clean: Boolean): Option[Coverage] = {
10-
val files = IOUtils.reportFileSearch(baseDir, IOUtils.isReportFile)
11-
aggregate(files, clean)
11+
aggregate(IOUtils.scoverageDataDirsSearch(baseDir))
1212
}
1313

14-
def aggregate(files: Seq[File], clean: Boolean): Option[Coverage] = {
15-
println(s"[info] Found ${files.size} subproject report files [${files.mkString(",")}]")
16-
if (files.size > 0) {
17-
val coverage = aggregatedCoverage(files)
18-
if (clean) files foreach (_.delete)
19-
Some(coverage)
14+
def aggregate(dataDirs: Seq[File]): Option[Coverage] = {
15+
println(s"[info] Found ${dataDirs.size} subproject scoverage data directories [${dataDirs.mkString(",")}]")
16+
if (dataDirs.size > 0) {
17+
Some(aggregatedCoverage(dataDirs))
2018
} else {
2119
None
2220
}
2321
}
2422

25-
def aggregatedCoverage(files: Seq[File]): Coverage = {
23+
def aggregatedCoverage(dataDirs: Seq[File]): Coverage = {
2624
var id = 0
2725
val coverage = Coverage()
28-
files foreach { file =>
29-
val subcoverage = ScoverageXmlReader.read(file)
30-
subcoverage.statements foreach { stmt =>
31-
// need to ensure all the ids are unique otherwise the coverage object will have stmt collisions
32-
id = id + 1
33-
coverage add stmt.copy(id = id)
26+
dataDirs foreach { dataDir =>
27+
val coverageFile: File = Serializer.coverageFile(dataDir)
28+
if (coverageFile.exists) {
29+
val subcoverage: Coverage = Serializer.deserialize(coverageFile)
30+
val measurementFiles: Array[File] = IOUtils.findMeasurementFiles(dataDir)
31+
val measurements = IOUtils.invoked(measurementFiles)
32+
subcoverage.apply(measurements)
33+
subcoverage.statements foreach { stmt =>
34+
// need to ensure all the ids are unique otherwise the coverage object will have stmt collisions
35+
id = id + 1
36+
coverage add stmt.copy(id = id)
37+
}
3438
}
3539
}
3640
coverage

scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageXmlReader.scala

-61
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package scoverage
22

3-
import java.io.File
3+
import java.io.{File, FileWriter}
44
import java.util.UUID
55

66
import org.scalatest.{FreeSpec, Matchers}
7-
import scoverage.report.{CoverageAggregator, ScoverageXmlWriter}
7+
import scoverage.report.CoverageAggregator
88

99
class CoverageAggregatorTest extends FreeSpec with Matchers {
1010

@@ -23,33 +23,41 @@ class CoverageAggregatorTest extends FreeSpec with Matchers {
2323
"methlab",
2424
source)
2525

26+
val cov1Stmt1 = Statement(location, 1, 155, 176, 4, "", "", "", true, 1)
27+
val cov1Stmt2 = Statement(location, 2, 200, 300, 5, "", "", "", false, 1)
2628
val coverage1 = Coverage()
27-
coverage1.add(Statement(location, 1, 155, 176, 4, "", "", "", true, 1))
28-
coverage1.add(Statement(location, 2, 200, 300, 5, "", "", "", false, 2))
29+
coverage1.add(cov1Stmt1.copy(count = 0))
30+
coverage1.add(cov1Stmt2.copy(count = 0))
2931
val dir1 = new File(IOUtils.getTempPath, UUID.randomUUID.toString)
3032
dir1.mkdir()
31-
new ScoverageXmlWriter(sourceRoot, dir1, false).write(coverage1)
33+
Serializer.serialize(coverage1, Serializer.coverageFile(dir1))
34+
val measurementsFile1 = new File(dir1, s"${Constants.MeasurementsPrefix}1")
35+
val measurementsFile1Writer = new FileWriter(measurementsFile1)
36+
measurementsFile1Writer.write("1\n2\n")
37+
measurementsFile1Writer.close()
3238

39+
val cov2Stmt1 = Statement(location, 1, 95, 105, 19, "", "", "", false, 0)
3340
val coverage2 = Coverage()
34-
coverage2.add(Statement(location, 1, 95, 105, 19, "", "", "", false, 0))
41+
coverage2.add(cov2Stmt1)
3542
val dir2 = new File(IOUtils.getTempPath, UUID.randomUUID.toString)
3643
dir2.mkdir()
37-
new ScoverageXmlWriter(sourceRoot, dir2, false).write(coverage2)
44+
Serializer.serialize(coverage2, Serializer.coverageFile(dir2))
3845

46+
val cov3Stmt1 = Statement(location, 2, 14, 1515, 544, "", "", "", false, 1)
3947
val coverage3 = Coverage()
40-
coverage3.add(Statement(location, 2, 14, 1515, 544, "", "", "", false, 1))
48+
coverage3.add(cov3Stmt1.copy(count = 0))
4149
val dir3 = new File(IOUtils.getTempPath, UUID.randomUUID.toString)
4250
dir3.mkdir()
43-
new ScoverageXmlWriter(sourceRoot, dir3, false).write(coverage3)
51+
Serializer.serialize(coverage3, Serializer.coverageFile(dir3))
52+
val measurementsFile3 = new File(dir3, s"${Constants.MeasurementsPrefix}1")
53+
val measurementsFile3Writer = new FileWriter(measurementsFile3)
54+
measurementsFile3Writer.write("2\n")
55+
measurementsFile3Writer.close()
4456

45-
val aggregated = CoverageAggregator.aggregatedCoverage(
46-
Seq(IOUtils.reportFile(dir1, debug = false),
47-
IOUtils.reportFile(dir2, debug = false),
48-
IOUtils.reportFile(dir3, debug = false))
49-
)
57+
val aggregated = CoverageAggregator.aggregatedCoverage(Seq(dir1, dir2, dir3))
5058
aggregated.statements.toSet.size shouldBe 4
5159
aggregated.statements.map(_.copy(id = 0)).toSet shouldBe
52-
(coverage1.statements ++ coverage2.statements ++ coverage3.statements).map(_.copy(id = 0)).toSet
60+
Set(cov1Stmt1, cov1Stmt2, cov2Stmt1, cov3Stmt1).map(_.copy(id = 0))
5361
}
5462
}
5563
}

scalac-scoverage-plugin/src/test/scala/scoverage/IOUtilsTest.scala

+11-22
Original file line numberDiff line numberDiff line change
@@ -42,34 +42,23 @@ class IOUtilsTest extends FreeSpec with MockitoSugar with OneInstancePerTest wit
4242
file1.delete()
4343
file2.delete()
4444
}
45-
"should deep search for report files" in {
45+
"should deep search for scoverage-data directories" in {
4646
// create new folder to hold all our data
4747
val base = new File(IOUtils.getTempDirectory, UUID.randomUUID.toString)
48-
base.mkdir() shouldBe true
4948

50-
val file1 = new File(base, Constants.XMLReportFilename)
51-
val writer1 = new FileWriter(file1)
52-
writer1.write("1\n3\n5\n\n\n7\n")
53-
writer1.close()
49+
val dataDir1 = new File(base, Constants.DataDir)
50+
dataDir1.mkdirs() shouldBe true
5451

55-
val file2 = new File(base, UUID.randomUUID.toString + "/" + Constants.XMLReportFilename)
56-
file2.getParentFile.mkdir()
57-
val writer2 = new FileWriter(file2)
58-
writer2.write("2\n4\n6\n\n8\n")
59-
writer2.close()
52+
val subDir = new File(base, UUID.randomUUID.toString)
53+
val dataDir2 = new File(subDir, Constants.DataDir)
54+
dataDir2.mkdirs() shouldBe true
6055

61-
val file3 = new File(file2.getParentFile, UUID.randomUUID.toString + "/" + Constants.XMLReportFilename)
62-
file3.getParentFile.mkdir()
63-
val writer3 = new FileWriter(file3)
64-
writer3.write("11\n20\n30\n\n44\n")
65-
writer3.close()
56+
val subSubDir = new File(subDir, UUID.randomUUID.toString)
57+
val dataDir3 = new File(subSubDir, Constants.DataDir)
58+
dataDir3.mkdirs() shouldBe true
6659

67-
val files = IOUtils.reportFileSearch(base, IOUtils.isReportFile)
68-
val invoked = IOUtils.invoked(files)
69-
assert(invoked === Set(1, 2, 3, 4, 5, 6, 7, 8, 11, 20, 30, 44))
70-
71-
file1.delete()
72-
file2.delete()
60+
val dataDirs = IOUtils.scoverageDataDirsSearch(base)
61+
dataDirs should contain only (dataDir1, dataDir2, dataDir3)
7362
}
7463
}
7564
}

scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageXmlReaderTest.scala

-65
This file was deleted.

0 commit comments

Comments
 (0)