From 33212d2331854960bb4a53ffd6a566f2ceacff27 Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Tue, 13 Jun 2017 12:34:59 +0100 Subject: [PATCH 1/2] Cleanup test logging related code --- .../main/scala/sbt/TestReportListener.scala | 8 ++- .../sbt/internal/testing/TestLogger.scala | 52 ++++++++++--------- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/testing/src/main/scala/sbt/TestReportListener.scala b/testing/src/main/scala/sbt/TestReportListener.scala index 99d036587..336b3fd2c 100644 --- a/testing/src/main/scala/sbt/TestReportListener.scala +++ b/testing/src/main/scala/sbt/TestReportListener.scala @@ -21,8 +21,9 @@ trait TestReportListener { /** called if test completed */ def endGroup(name: String, result: TestResult): Unit - /** Used by the test framework for logging test results*/ + /** Used by the test framework for logging test results */ def contentLogger(test: TestDefinition): Option[ContentLogger] = None + } final class ContentLogger(val log: TLogger, val flush: () => Unit) @@ -32,8 +33,9 @@ trait TestsListener extends TestReportListener { /** called once, at beginning. */ def doInit(): Unit - /** called once, at end. */ + /** called once, at end of the test group. */ def doComplete(finalResult: TestResult): Unit + } /** Provides the overall `result` of a group of tests (a suite) and test counts for each result type. */ @@ -84,8 +86,10 @@ object SuiteResult { count(TStatus.Pending) ) } + val Error: SuiteResult = new SuiteResult(TestResult.Error, 0, 0, 0, 0, 0, 0, 0) val Empty: SuiteResult = new SuiteResult(TestResult.Passed, 0, 0, 0, 0, 0, 0, 0) + } abstract class TestEvent { diff --git a/testing/src/main/scala/sbt/internal/testing/TestLogger.scala b/testing/src/main/scala/sbt/internal/testing/TestLogger.scala index 9eaf0a114..b5b8bdef7 100644 --- a/testing/src/main/scala/sbt/internal/testing/TestLogger.scala +++ b/testing/src/main/scala/sbt/internal/testing/TestLogger.scala @@ -16,16 +16,17 @@ object TestLogger { case a: TestStringEvent => List(a.value) }) - private def generateName: String = - "test-" + generateId.incrementAndGet + private def generateName: String = "test-" + generateId.incrementAndGet private val generateId: AtomicInteger = new AtomicInteger - private def generateBufferName: String = - "testbuffer-" + generateBufferId.incrementAndGet + + private def generateBufferName: String = "testbuffer-" + generateBufferId.incrementAndGet private val generateBufferId: AtomicInteger = new AtomicInteger - final class PerTest private[sbt] (val log: ManagedLogger, - val flush: () => Unit, - val buffered: Boolean) + final class PerTest private[sbt] ( + val log: ManagedLogger, + val flush: () => Unit, + val buffered: Boolean + ) def make(global: ManagedLogger, perTest: TestDefinition => PerTest): TestLogger = { def makePerTest(tdef: TestDefinition): ContentLogger = { @@ -34,7 +35,7 @@ object TestLogger { val config = LogExchange.loggerConfig(l0.name) val as = config.getAppenders.asScala val buffs: List[BufferedAppender] = (as map { - case (k, v) => BufferedAppender(generateBufferName, v) + case (_, v) => BufferedAppender(generateBufferName, v) }).toList val newLog = LogExchange.logger(generateName, l0.channelName, l0.execId) LogExchange.bindLoggerAppenders(newLog.name, buffs map { x => @@ -52,7 +53,9 @@ object TestLogger { } ) } + global.registerStringCodec[TestStringEvent] + val config = new TestLogging(wrap(global), global, makePerTest) new TestLogger(config) } @@ -91,25 +94,26 @@ class TestLogger(val logging: TestLogging) extends TestsListener { import logging.{ global => log, logTest, managed } import sbt.protocol.testing.codec.JsonProtocol._ - def startGroup(name: String): Unit = - managed.logEvent(Level.Info, StartTestGroupEvent(name)) - def testEvent(event: TestEvent): Unit = - managed.logEvent(Level.Info, toTestItemEvent(event)) - def endGroup(name: String, t: Throwable): Unit = { - log.trace(t) - log.error("Could not run test " + name + ": " + t.toString) - managed.logEvent(Level.Info, - EndTestGroupErrorEvent( - name, - t.getMessage + "\n" + t.getStackTrace.toList.mkString("\n") - )) - } - def endGroup(name: String, result: TestResult): Unit = - managed.logEvent(Level.Info, EndTestGroupEvent(name, result)) def doInit: Unit = managed.logEvent(Level.Info, TestInitEvent()) - /** called once, at end of test group. */ + def startGroup(name: String): Unit = managed.logEvent(Level.Info, StartTestGroupEvent(name)) + + def testEvent(event: TestEvent): Unit = managed.logEvent(Level.Info, toTestItemEvent(event)) + + def endGroup(name: String, result: TestResult): Unit = + managed.logEvent(Level.Info, EndTestGroupEvent(name, result)) + + def endGroup(name: String, t: Throwable): Unit = { + log.trace(t) + log.error(s"Could not run test $name: $t") + managed.logEvent( + Level.Info, + EndTestGroupErrorEvent(name, (t.getMessage +: t.getStackTrace).mkString("\n")) + ) + } + def doComplete(finalResult: TestResult): Unit = managed.logEvent(Level.Info, TestCompleteEvent(finalResult)) + override def contentLogger(test: TestDefinition): Option[ContentLogger] = Some(logTest(test)) } From a08a84145b1ecbf46eb822824cc3465809cf2dcc Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Tue, 13 Jun 2017 12:35:27 +0100 Subject: [PATCH 2/2] Drop test spam. Fixes #3116 --- .../main/scala/sbt/internal/testing/TestLogger.scala | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/testing/src/main/scala/sbt/internal/testing/TestLogger.scala b/testing/src/main/scala/sbt/internal/testing/TestLogger.scala index b5b8bdef7..87304fa6c 100644 --- a/testing/src/main/scala/sbt/internal/testing/TestLogger.scala +++ b/testing/src/main/scala/sbt/internal/testing/TestLogger.scala @@ -56,6 +56,18 @@ object TestLogger { global.registerStringCodec[TestStringEvent] + def showNoLines[A] = ShowLines[A](_ => Nil) + implicit val showNoLinesTestInitEvent = showNoLines[TestInitEvent] + implicit val showNoLinesStartTestGroupEvent = showNoLines[StartTestGroupEvent] + implicit val showNoLinesTestItemEvent = showNoLines[TestItemEvent] + implicit val showNoLinesEndTestGroupEvent = showNoLines[EndTestGroupEvent] + implicit val showNoLinesTestCompleteEvent = showNoLines[TestCompleteEvent] + global.registerStringCodec[TestInitEvent] + global.registerStringCodec[StartTestGroupEvent] + global.registerStringCodec[TestItemEvent] + global.registerStringCodec[EndTestGroupEvent] + global.registerStringCodec[TestCompleteEvent] + val config = new TestLogging(wrap(global), global, makePerTest) new TestLogger(config) }