Fail when the forked test harness fails

Fail when the forked test harness fails using NonFatal
Fixes #2442/#2722

Add another fork-uncaught scripted test
Originally from https://github.com/retronym/sbt-test-fork-swallows-error
This commit is contained in:
Eugene Yokota 2017-01-15 05:49:07 -05:00
parent 69385029ed
commit beb1fe3c5a
5 changed files with 58 additions and 0 deletions

View File

@ -5,6 +5,7 @@ package sbt
import scala.collection.mutable
import testing.{ Logger => _, _ }
import scala.util.control.NonFatal
import java.net.ServerSocket
import java.io._
import Tests.{ Output => TestOutput, _ }
@ -74,6 +75,12 @@ private[sbt] object ForkTests {
os.flush()
new React(is, os, log, opts.testListeners, resultsAcc).react()
} catch {
case NonFatal(e) =>
def throwableToString(t: Throwable) = {
import java.io._; val sw = new StringWriter; t.printStackTrace(new PrintWriter(sw)); sw.toString
}
resultsAcc("Forked test harness failed: " + throwableToString(e)) = SuiteResult.Error
} finally {
is.close(); os.close(); socket.close()
}

View File

@ -0,0 +1,8 @@
### Bug fixes
- Fixes forked test succeeding when the test harness fails. [#2442][2442]/[#2730][2730] by [@eed3si9n][@eed3si9n]/[@dwijnand][@dwijnand}
[2442]: https://github.com/sbt/sbt/issues/2442
[2730]: https://github.com/sbt/sbt/pull/2730
[@eed3si9n]: https://github.com/eed3si9n
[@dwijnand]: https://github.com/dwijnand

View File

@ -0,0 +1,17 @@
scalaVersion := "2.11.8"
libraryDependencies += "org.scala-sbt" % "test-interface" % "1.0"
testFrameworks := new TestFramework("build.MyFramework") :: Nil
fork := true
definedTests in Test += new sbt.TestDefinition(
"my",
// marker fingerprint since there are no test classes
// to be discovered by sbt:
new sbt.testing.AnnotatedFingerprint {
def isModule = true
def annotationName = "my"
}, true, Array()
)

View File

@ -0,0 +1,24 @@
package build
import _root_.sbt.testing._
class MyFramework extends sbt.testing.Framework {
def fingerprints = Array(new AnnotatedFingerprint { def isModule = true; def annotationName = "my" })
def name = "my"
def runner(args: Array[String], remoteArgs: Array[String], testClassLoader: ClassLoader): Runner =
new MyRunner(args, remoteArgs, testClassLoader)
}
class MyRunner(val args: Array[String], val remoteArgs: Array[String],
val testClassLoader: ClassLoader) extends sbt.testing.Runner {
def tasks(taskDefs: Array[TaskDef]): Array[Task] =
if (args contains "task-boom") taskDefs map BoomTask else throw new Throwable()
def done(): String = ""
private case class BoomTask(taskDef: TaskDef) extends Task {
def tags = Array.empty[String]
def execute(handler: EventHandler, loggers: Array[Logger]) = throw new Throwable()
}
}

View File

@ -0,0 +1,2 @@
-> test
-> testOnly -- task-boom