mirror of https://github.com/sbt/sbt.git
commit
7909052513
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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,21 @@ 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)
|
||||
}
|
||||
|
|
@ -91,25 +106,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))
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue