diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 3d1daaaa3..ef3867384 100755 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -373,7 +373,7 @@ object Defaults extends BuildCommon lazy val ConfigGlobal: Scope = ThisScope.copy(config = Global) def testTaskOptions(key: Scoped): Seq[Setting[_]] = inTask(key)( Seq( testListeners := { - TestLogger(streams.value.log, testLogger(streamsManager.value, test in resolvedScoped.value.scope), logBuffered.value) +: + TestLogger.make(streams.value.log, closeableTestLogger(streamsManager.value, test in resolvedScoped.value.scope, logBuffered.value)) +: new TestStatusReporter(succeededFile( streams.in(test).value.cacheDirectory )) +: testListeners.in(TaskGlobal).value }, @@ -382,6 +382,7 @@ object Defaults extends BuildCommon ) ) ++ Seq( derive(testGrouping <<= singleTestGroupDefault) ) + @deprecated("Doesn't provide for closing the underlying resources.", "0.13.1") def testLogger(manager: Streams, baseKey: Scoped)(tdef: TestDefinition): Logger = { val scope = baseKey.scope @@ -389,6 +390,14 @@ object Defaults extends BuildCommon val key = ScopedKey(scope.copy(extra = Select(testExtra(extra, tdef))), baseKey.key) manager(key).log } + private[this] def closeableTestLogger(manager: Streams, baseKey: Scoped, buffered: Boolean)(tdef: TestDefinition): TestLogger.PerTest = + { + val scope = baseKey.scope + val extra = scope.extra match { case Select(x) => x; case _ => AttributeMap.empty } + val key = ScopedKey(scope.copy(extra = Select(testExtra(extra, tdef))), baseKey.key) + val s = manager(key) + new TestLogger.PerTest(s.log, () => s.close(), buffered) + } def buffered(log: Logger): Logger = new BufferedLogger(FullLogger(log)) def testExtra(extra: AttributeMap, tdef: TestDefinition): AttributeMap = { diff --git a/testing/src/main/scala/sbt/TestReportListener.scala b/testing/src/main/scala/sbt/TestReportListener.scala index a2c70065d..7484a6d37 100644 --- a/testing/src/main/scala/sbt/TestReportListener.scala +++ b/testing/src/main/scala/sbt/TestReportListener.scala @@ -71,15 +71,34 @@ object TestEvent object TestLogger { + @deprecated("Doesn't provide for underlying resources to be released.", "0.13.1") def apply(logger: sbt.Logger, logTest: TestDefinition => sbt.Logger, buffered: Boolean): TestLogger = new TestLogger(new TestLogging(wrap(logger), tdef => contentLogger(logTest(tdef), buffered)) ) + @deprecated("Doesn't provide for underlying resources to be released.", "0.13.1") def contentLogger(log: sbt.Logger, buffered: Boolean): ContentLogger = { val blog = new BufferedLogger(FullLogger(log)) if(buffered) blog.record() new ContentLogger(wrap(blog), () => blog.stopQuietly()) } + + final class PerTest private[sbt](val log: sbt.Logger, val flush: () => Unit, val buffered: Boolean) + + def make(global: sbt.Logger, perTest: TestDefinition => PerTest): TestLogger = + { + def makePerTest(tdef: TestDefinition): ContentLogger = + { + val per = perTest(tdef) + val blog = new BufferedLogger(FullLogger(per.log)) + if(per.buffered) blog.record() + new ContentLogger(wrap(blog), () => { blog.stopQuietly(); per.flush() }) + } + val config = new TestLogging(wrap(global), makePerTest) + new TestLogger(config) + } + + def wrap(logger: sbt.Logger): TLogger = new TLogger { @@ -97,7 +116,7 @@ final class ContentLogger(val log: TLogger, val flush: () => Unit) class TestLogger(val logging: TestLogging) extends TestsListener { import logging.{global => log, logTest} - + def startGroup(name: String) {} def testEvent(event: TestEvent): Unit = {} def endGroup(name: String, t: Throwable)