From 51b1f72daa86a36b2d8138dc4788dc3cf64bc6d6 Mon Sep 17 00:00:00 2001 From: Chris Kipp Date: Mon, 27 Sep 2021 11:19:34 +0200 Subject: [PATCH 1/2] Ensure utf8 encoding is defaulted everywhere. Closes #122 Closes #326 Relates to #368 --- .../src/main/scala/scoverage/IOUtils.scala | 15 ++++++++++----- .../scala/scoverage/report/BaseReportWriter.scala | 10 +++++++++- .../scoverage/report/CoberturaXmlWriter.scala | 11 +++++++---- .../main/scala/scoverage/report/CodeGrid.scala | 3 ++- .../scoverage/report/CoverageAggregator.scala | 4 ++++ .../scoverage/report/ScoverageHtmlWriter.scala | 2 +- .../scoverage/report/ScoverageXmlWriter.scala | 14 ++++++++++---- .../scala/scoverage/CoberturaXmlWriterTest.scala | 4 ++-- .../src/test/scala/scoverage/IOUtilsTest.scala | 4 ++++ .../test/scala/scoverage/LocationCompiler.scala | 3 ++- .../test/scala/scoverage/ScoverageCompiler.scala | 3 ++- 11 files changed, 53 insertions(+), 20 deletions(-) diff --git a/scalac-scoverage-plugin/src/main/scala/scoverage/IOUtils.scala b/scalac-scoverage-plugin/src/main/scala/scoverage/IOUtils.scala index 0877fdca..6c78ab39 100644 --- a/scalac-scoverage-plugin/src/main/scala/scoverage/IOUtils.scala +++ b/scalac-scoverage-plugin/src/main/scala/scoverage/IOUtils.scala @@ -17,7 +17,6 @@ object IOUtils { private val UnixSeperator: Char = '/' private val WindowsSeperator: Char = '\\' - private val UTF8Encoding: String = "UTF-8" def getName(path: String): Any = { val index = { @@ -37,9 +36,12 @@ object IOUtils { findMeasurementFiles(dataDir).foreach(_.delete) def clean(dataDir: String): Unit = clean(new File(dataDir)) - def writeToFile(file: File, str: String) = { + def writeToFile(file: File, str: String)(implicit encoding: String) = { val writer = new BufferedWriter( - new OutputStreamWriter(new FileOutputStream(file), UTF8Encoding) + new OutputStreamWriter( + new FileOutputStream(file), + encoding + ) ) try { writer.write(str) @@ -86,10 +88,13 @@ object IOUtils { file.getName == Constants.XMLReportFilenameWithDebug // loads all the invoked statement ids from the given files - def invoked(files: Seq[File]): Set[(Int, String)] = { + def invoked( + files: Seq[File] + )(implicit encoding: String): Set[(Int, String)] = { val acc = mutable.Set[(Int, String)]() files.foreach { file => - val reader = Source.fromFile(file) + val reader = + Source.fromFile(file, encoding) for (line <- reader.getLines()) { if (!line.isEmpty) { acc += (line.split(" ").toList match { diff --git a/scalac-scoverage-plugin/src/main/scala/scoverage/report/BaseReportWriter.scala b/scalac-scoverage-plugin/src/main/scala/scoverage/report/BaseReportWriter.scala index 158c3e51..9185042e 100644 --- a/scalac-scoverage-plugin/src/main/scala/scoverage/report/BaseReportWriter.scala +++ b/scalac-scoverage-plugin/src/main/scala/scoverage/report/BaseReportWriter.scala @@ -2,7 +2,15 @@ package scoverage.report import java.io.File -class BaseReportWriter(sourceDirectories: Seq[File], outputDir: File) { +import scala.io.Codec + +class BaseReportWriter( + sourceDirectories: Seq[File], + outputDir: File, + sourceEncoding: Option[String] +) { + + implicit val encoding = sourceEncoding.fold(Codec.UTF8.name)(identity) // Source paths in canonical form WITH trailing file separator private val formattedSourcePaths: Seq[String] = diff --git a/scalac-scoverage-plugin/src/main/scala/scoverage/report/CoberturaXmlWriter.scala b/scalac-scoverage-plugin/src/main/scala/scoverage/report/CoberturaXmlWriter.scala index 4a6a5286..d2f3155f 100644 --- a/scalac-scoverage-plugin/src/main/scala/scoverage/report/CoberturaXmlWriter.scala +++ b/scalac-scoverage-plugin/src/main/scala/scoverage/report/CoberturaXmlWriter.scala @@ -9,11 +9,14 @@ import scoverage.DoubleFormat.twoFractionDigits import scoverage._ /** @author Stephen Samuel */ -class CoberturaXmlWriter(sourceDirectories: Seq[File], outputDir: File) - extends BaseReportWriter(sourceDirectories, outputDir) { +class CoberturaXmlWriter( + sourceDirectories: Seq[File], + outputDir: File, + sourceEncoding: Option[String] +) extends BaseReportWriter(sourceDirectories, outputDir, sourceEncoding) { - def this(baseDir: File, outputDir: File) = { - this(Seq(baseDir), outputDir) + def this(baseDir: File, outputDir: File, sourceEncoding: Option[String]) = { + this(Seq(baseDir), outputDir, sourceEncoding) } def write(coverage: Coverage): Unit = { diff --git a/scalac-scoverage-plugin/src/main/scala/scoverage/report/CodeGrid.scala b/scalac-scoverage-plugin/src/main/scala/scoverage/report/CodeGrid.scala index 4a07f611..60300245 100644 --- a/scalac-scoverage-plugin/src/main/scala/scoverage/report/CodeGrid.scala +++ b/scalac-scoverage-plugin/src/main/scala/scoverage/report/CodeGrid.scala @@ -1,5 +1,6 @@ package scoverage.report +import scala.io.Codec import scala.io.Source import _root_.scoverage.MeasuredFile @@ -77,7 +78,7 @@ class CodeGrid(mFile: MeasuredFile, sourceEncoding: Option[String]) { private def source(mfile: MeasuredFile): String = { val src = sourceEncoding match { case Some(enc) => Source.fromFile(mfile.source, enc) - case None => Source.fromFile(mfile.source) + case None => Source.fromFile(mfile.source, Codec.UTF8.name) } try src.mkString finally src.close() diff --git a/scalac-scoverage-plugin/src/main/scala/scoverage/report/CoverageAggregator.scala b/scalac-scoverage-plugin/src/main/scala/scoverage/report/CoverageAggregator.scala index 27f9c564..03cb1a96 100644 --- a/scalac-scoverage-plugin/src/main/scala/scoverage/report/CoverageAggregator.scala +++ b/scalac-scoverage-plugin/src/main/scala/scoverage/report/CoverageAggregator.scala @@ -2,12 +2,16 @@ package scoverage.report import java.io.File +import scala.io.Codec + import scoverage.Coverage import scoverage.IOUtils import scoverage.Serializer object CoverageAggregator { + implicit val encoding: String = Codec.UTF8.name + // to be used by gradle-scoverage plugin def aggregate(dataDirs: Array[File], sourceRoot: File): Option[Coverage] = aggregate( diff --git a/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageHtmlWriter.scala b/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageHtmlWriter.scala index c2fd3721..b1960433 100644 --- a/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageHtmlWriter.scala +++ b/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageHtmlWriter.scala @@ -12,7 +12,7 @@ class ScoverageHtmlWriter( sourceDirectories: Seq[File], outputDir: File, sourceEncoding: Option[String] -) extends BaseReportWriter(sourceDirectories, outputDir) { +) extends BaseReportWriter(sourceDirectories, outputDir, sourceEncoding) { // to be used by gradle-scoverage plugin def this( diff --git a/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageXmlWriter.scala b/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageXmlWriter.scala index 7f1f8208..da2adc26 100644 --- a/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageXmlWriter.scala +++ b/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageXmlWriter.scala @@ -11,11 +11,17 @@ import scoverage._ class ScoverageXmlWriter( sourceDirectories: Seq[File], outputDir: File, - debug: Boolean -) extends BaseReportWriter(sourceDirectories, outputDir) { + debug: Boolean, + sourceEncoding: Option[String] +) extends BaseReportWriter(sourceDirectories, outputDir, sourceEncoding) { - def this(sourceDir: File, outputDir: File, debug: Boolean) = { - this(Seq(sourceDir), outputDir, debug) + def this( + sourceDir: File, + outputDir: File, + debug: Boolean, + sourceEncoding: Option[String] + ) = { + this(Seq(sourceDir), outputDir, debug, sourceEncoding) } def write(coverage: Coverage): Unit = { diff --git a/scalac-scoverage-plugin/src/test/scala/scoverage/CoberturaXmlWriterTest.scala b/scalac-scoverage-plugin/src/test/scala/scoverage/CoberturaXmlWriterTest.scala index 56f6b99e..0f6cc460 100644 --- a/scalac-scoverage-plugin/src/test/scala/scoverage/CoberturaXmlWriterTest.scala +++ b/scalac-scoverage-plugin/src/test/scala/scoverage/CoberturaXmlWriterTest.scala @@ -213,7 +213,7 @@ class CoberturaXmlWriterTest extends FunSuite { ) ) - val writer = new CoberturaXmlWriter(sourceRoot, dir) + val writer = new CoberturaXmlWriter(sourceRoot, dir, None) writer.write(coverage) val domFactory = DocumentBuilderFactory.newInstance() @@ -309,7 +309,7 @@ class CoberturaXmlWriterTest extends FunSuite { ) ) - val writer = new CoberturaXmlWriter(sourceRoot, dir) + val writer = new CoberturaXmlWriter(sourceRoot, dir, None) writer.write(coverage) // Needed to acount for https://github.com/scala/scala-xml/pull/177 diff --git a/scalac-scoverage-plugin/src/test/scala/scoverage/IOUtilsTest.scala b/scalac-scoverage-plugin/src/test/scala/scoverage/IOUtilsTest.scala index 538d6d63..b0a660e6 100644 --- a/scalac-scoverage-plugin/src/test/scala/scoverage/IOUtilsTest.scala +++ b/scalac-scoverage-plugin/src/test/scala/scoverage/IOUtilsTest.scala @@ -4,11 +4,15 @@ import java.io.File import java.io.FileWriter import java.util.UUID +import scala.io.Codec + import munit.FunSuite /** @author Stephen Samuel */ class IOUtilsTest extends FunSuite { + implicit val encoding: String = Codec.UTF8.name + test("should parse measurement files") { val file = File.createTempFile("scoveragemeasurementtest", "txt") val writer = new FileWriter(file) diff --git a/scalac-scoverage-plugin/src/test/scala/scoverage/LocationCompiler.scala b/scalac-scoverage-plugin/src/test/scala/scoverage/LocationCompiler.scala index 45803a4f..f7eab86f 100644 --- a/scalac-scoverage-plugin/src/test/scala/scoverage/LocationCompiler.scala +++ b/scalac-scoverage-plugin/src/test/scala/scoverage/LocationCompiler.scala @@ -2,6 +2,7 @@ package scoverage import java.io.File +import scala.io.Codec import scala.tools.nsc.Global import scala.tools.nsc.plugins.PluginComponent import scala.tools.nsc.transform.Transform @@ -24,7 +25,7 @@ class LocationCompiler( def writeCodeSnippetToTempFile(code: String): File = { val file = File.createTempFile("code_snippet", ".scala") - IOUtils.writeToFile(file, code) + IOUtils.writeToFile(file, code)(Codec.UTF8.name) file.deleteOnExit() file } diff --git a/scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageCompiler.scala b/scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageCompiler.scala index a6d808fd..d461ce5c 100644 --- a/scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageCompiler.scala +++ b/scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageCompiler.scala @@ -5,6 +5,7 @@ import java.io.FileNotFoundException import java.net.URL import scala.collection.mutable.ListBuffer +import scala.io.Codec import scala.tools.nsc.Global import scala.tools.nsc.Settings import scala.tools.nsc.plugins.PluginComponent @@ -135,7 +136,7 @@ class ScoverageCompiler( def writeCodeSnippetToTempFile(code: String): File = { val file = File.createTempFile("scoverage_snippet", ".scala") - IOUtils.writeToFile(file, code) + IOUtils.writeToFile(file, code)(Codec.UTF8.name) file.deleteOnExit() file } From af3d82b36c8deee886377ec1745c3b1e74776dfd Mon Sep 17 00:00:00 2001 From: Chris Kipp Date: Mon, 27 Sep 2021 16:00:44 +0200 Subject: [PATCH 2/2] Bump timeout in test for concurrency tests on windows --- .../jvm/src/test/scala/scoverage/InvokerConcurrencyTest.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scalac-scoverage-runtime/jvm/src/test/scala/scoverage/InvokerConcurrencyTest.scala b/scalac-scoverage-runtime/jvm/src/test/scala/scoverage/InvokerConcurrencyTest.scala index c56c8c42..d2f3df2a 100644 --- a/scalac-scoverage-runtime/jvm/src/test/scala/scoverage/InvokerConcurrencyTest.scala +++ b/scalac-scoverage-runtime/jvm/src/test/scala/scoverage/InvokerConcurrencyTest.scala @@ -36,7 +36,7 @@ class InvokerConcurrencyTest extends FunSuite { } } - futures.foreach(Await.result(_, 1.second)) + futures.foreach(Await.result(_, 3.second)) // Now verify that the measurement file is not corrupted by loading it val measurementFiles = Invoker.findMeasurementFiles(measurementDir)