Continuation of previous commit's workaround for #937: close test streams early

This commit is contained in:
Mark Harrah 2013-11-04 13:10:06 -05:00
parent ca7e78d03d
commit c5120636e4
2 changed files with 30 additions and 2 deletions

View File

@ -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 =
{

View File

@ -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)