From add6bde3961d3443ea90138b1be68588d4df7109 Mon Sep 17 00:00:00 2001 From: Tim Harper Date: Mon, 14 May 2018 12:39:44 -0600 Subject: [PATCH 1/4] Add timestamp field to JUnitXML report --- testing/src/main/scala/sbt/JUnitXmlTestsListener.scala | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala b/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala index 2f92523e8..0ac2a6997 100644 --- a/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala +++ b/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala @@ -9,6 +9,7 @@ package sbt import java.io.{ File, IOException, PrintWriter, StringWriter } import java.net.InetAddress +import java.time.LocalDateTime import java.util.Hashtable import scala.collection.mutable.ListBuffer @@ -59,7 +60,7 @@ class JUnitXmlTestsListener(val outputDir: String) extends TestsListener { * Gathers data for one Test Suite. We map test groups to TestSuites. * Each TestSuite gets its own output file. */ - class TestSuite(val name: String) { + class TestSuite(val name: String, timestamp: LocalDateTime) { val events: ListBuffer[TEvent] = new ListBuffer() /**Adds one test result to this suite.*/ @@ -83,7 +84,7 @@ class JUnitXmlTestsListener(val outputDir: String) extends TestsListener { ) val result = - + { properties } { for (e <- events) yield Date: Mon, 14 May 2018 17:29:20 -0600 Subject: [PATCH 2/4] Remove milliseconds from format in order to comply with JUnit spec --- .../src/main/scala/sbt/JUnitXmlTestsListener.scala | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala b/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala index 0ac2a6997..33057b6e7 100644 --- a/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala +++ b/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala @@ -10,6 +10,8 @@ package sbt import java.io.{ File, IOException, PrintWriter, StringWriter } import java.net.InetAddress import java.time.LocalDateTime +import java.time.format.DateTimeFormatter +import java.time.temporal.ChronoUnit import java.util.Hashtable import scala.collection.mutable.ListBuffer @@ -84,7 +86,7 @@ class JUnitXmlTestsListener(val outputDir: String) extends TestsListener { ) val result = - + { properties } { for (e <- events) yield * * @@ -201,6 +205,12 @@ class JUnitXmlTestsListener(val outputDir: String) extends TestsListener { // contort the user into not using spaces. private[this] def normalizeName(s: String) = s.replaceAll("""\s+""", "-") + /** + * Format the date, without milliseconds or the timezone, per the JUnit spec. + */ + private[this] def formatISO8601DateTime(d: LocalDateTime): String = + d.truncatedTo(ChronoUnit.SECONDS).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + private def writeSuite() = { val file = new File(targetDir, s"${normalizeName(withTestSuite(_.name))}.xml").getAbsolutePath // TODO would be nice to have a logger and log this with level debug From 3702132019e41f409256c0ab4cb55c9b42eb8d98 Mon Sep 17 00:00:00 2001 From: Tim Harper Date: Mon, 14 May 2018 17:31:05 -0600 Subject: [PATCH 3/4] Keep single parameter constructor for backwards bin compat. --- testing/src/main/scala/sbt/JUnitXmlTestsListener.scala | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala b/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala index 33057b6e7..fc4c47118 100644 --- a/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala +++ b/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala @@ -63,6 +63,8 @@ class JUnitXmlTestsListener(val outputDir: String) extends TestsListener { * Each TestSuite gets its own output file. */ class TestSuite(val name: String, timestamp: LocalDateTime) { + def this(name: String) = this(name, LocalDateTime.now()) + val events: ListBuffer[TEvent] = new ListBuffer() /**Adds one test result to this suite.*/ @@ -142,10 +144,7 @@ class JUnitXmlTestsListener(val outputDir: String) extends TestsListener { /** * Starts a new, initially empty Suite with the given name. */ - override def startGroup(name: String): Unit = { - val timestamp = LocalDateTime.now() - testSuite.set(Some(new TestSuite(name, timestamp))) - } + override def startGroup(name: String): Unit = testSuite.set(Some(new TestSuite(name))) /** * Adds all details for the given even to the current suite. From 5cc0038a65a12c93cd9dcd7345128cf4ab99beee Mon Sep 17 00:00:00 2001 From: Tim Harper Date: Mon, 14 May 2018 20:57:04 -0600 Subject: [PATCH 4/4] Little better comment. Add timestamp to example. --- testing/src/main/scala/sbt/JUnitXmlTestsListener.scala | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala b/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala index fc4c47118..9344305f5 100644 --- a/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala +++ b/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala @@ -156,11 +156,10 @@ class JUnitXmlTestsListener(val outputDir: String) extends TestsListener { /** * called for each class or equivalent grouping * We map one group to one Testsuite, so for each Group - * we create an XML which implements the [[https://github.com/windyroad/JUnit-Schema/blob/master/JUnit.xsd JUnit xml - * spec]], and looks like this: + * we create [[https://github.com/windyroad/JUnit-Schema/blob/master/JUnit.xsd JUnit XML file]], and looks like this: * * - * + * * * * ...