From 84cb5e3a868d80053d28015bcd405b22b84bdf5b Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Fri, 2 Sep 2016 11:31:27 +0100 Subject: [PATCH 1/4] Add another fork-uncaught scripted test Originally from https://github.com/retronym/sbt-test-fork-swallows-error --- sbt/src/sbt-test/tests/fork-uncaught2/build.sbt | 17 +++++++++++++++++ sbt/src/sbt-test/tests/fork-uncaught2/pending | 1 + .../src/test/scala/build/MyFramework.scala | 17 +++++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 sbt/src/sbt-test/tests/fork-uncaught2/build.sbt create mode 100644 sbt/src/sbt-test/tests/fork-uncaught2/pending create mode 100644 sbt/src/sbt-test/tests/fork-uncaught2/src/test/scala/build/MyFramework.scala diff --git a/sbt/src/sbt-test/tests/fork-uncaught2/build.sbt b/sbt/src/sbt-test/tests/fork-uncaught2/build.sbt new file mode 100644 index 000000000..b1fcc9ee4 --- /dev/null +++ b/sbt/src/sbt-test/tests/fork-uncaught2/build.sbt @@ -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() + ) diff --git a/sbt/src/sbt-test/tests/fork-uncaught2/pending b/sbt/src/sbt-test/tests/fork-uncaught2/pending new file mode 100644 index 000000000..5a9f22365 --- /dev/null +++ b/sbt/src/sbt-test/tests/fork-uncaught2/pending @@ -0,0 +1 @@ +-> test diff --git a/sbt/src/sbt-test/tests/fork-uncaught2/src/test/scala/build/MyFramework.scala b/sbt/src/sbt-test/tests/fork-uncaught2/src/test/scala/build/MyFramework.scala new file mode 100644 index 000000000..a7c62be93 --- /dev/null +++ b/sbt/src/sbt-test/tests/fork-uncaught2/src/test/scala/build/MyFramework.scala @@ -0,0 +1,17 @@ +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] = throw new Throwable() + def done(): String = "" +} + From 254c615f365e470a7952cb437d4947949d553ac6 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Wed, 31 Aug 2016 04:16:43 -0400 Subject: [PATCH 2/4] Fail when the forked test harness fails Fixes #2442/#2722 --- main/actions/src/main/scala/sbt/ForkTests.scala | 3 +++ notes/0.13.13/fork_test.md | 8 ++++++++ sbt/src/sbt-test/tests/fork-uncaught2/{pending => test} | 0 3 files changed, 11 insertions(+) create mode 100644 notes/0.13.13/fork_test.md rename sbt/src/sbt-test/tests/fork-uncaught2/{pending => test} (100%) diff --git a/main/actions/src/main/scala/sbt/ForkTests.scala b/main/actions/src/main/scala/sbt/ForkTests.scala index 47510fca0..5bb371def 100755 --- a/main/actions/src/main/scala/sbt/ForkTests.scala +++ b/main/actions/src/main/scala/sbt/ForkTests.scala @@ -4,6 +4,7 @@ package sbt import scala.collection.mutable +import scala.util.control.NonFatal import testing._ import java.net.ServerSocket import java.io._ @@ -73,6 +74,8 @@ private[sbt] object ForkTests { os.flush() new React(is, os, log, opts.testListeners, resultsAcc).react() + } catch { + case NonFatal(e) => resultsAcc("Forked test harness failed: " + e.getMessage) = SuiteResult.Error } finally { is.close(); os.close(); socket.close() } diff --git a/notes/0.13.13/fork_test.md b/notes/0.13.13/fork_test.md new file mode 100644 index 000000000..4029c6b3c --- /dev/null +++ b/notes/0.13.13/fork_test.md @@ -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 diff --git a/sbt/src/sbt-test/tests/fork-uncaught2/pending b/sbt/src/sbt-test/tests/fork-uncaught2/test similarity index 100% rename from sbt/src/sbt-test/tests/fork-uncaught2/pending rename to sbt/src/sbt-test/tests/fork-uncaught2/test From 6a26bb2fb64b71fde4887db08a2b5fba4afcc8ef Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Fri, 2 Sep 2016 14:19:42 +0100 Subject: [PATCH 3/4] Return a better forked test harness failure message --- main/actions/src/main/scala/sbt/ForkTests.scala | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/main/actions/src/main/scala/sbt/ForkTests.scala b/main/actions/src/main/scala/sbt/ForkTests.scala index 5bb371def..4791a081b 100755 --- a/main/actions/src/main/scala/sbt/ForkTests.scala +++ b/main/actions/src/main/scala/sbt/ForkTests.scala @@ -75,7 +75,11 @@ private[sbt] object ForkTests { new React(is, os, log, opts.testListeners, resultsAcc).react() } catch { - case NonFatal(e) => resultsAcc("Forked test harness failed: " + e.getMessage) = SuiteResult.Error + 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() } From c6527b06652dfa8e4f22cc26eff375ecd79265ab Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Fri, 2 Sep 2016 15:39:09 +0100 Subject: [PATCH 4/4] Test throwing in Test#execute too --- .../src/test/scala/build/MyFramework.scala | 9 ++++++++- sbt/src/sbt-test/tests/fork-uncaught2/test | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/sbt/src/sbt-test/tests/fork-uncaught2/src/test/scala/build/MyFramework.scala b/sbt/src/sbt-test/tests/fork-uncaught2/src/test/scala/build/MyFramework.scala index a7c62be93..058630a68 100644 --- a/sbt/src/sbt-test/tests/fork-uncaught2/src/test/scala/build/MyFramework.scala +++ b/sbt/src/sbt-test/tests/fork-uncaught2/src/test/scala/build/MyFramework.scala @@ -11,7 +11,14 @@ class MyFramework extends sbt.testing.Framework { class MyRunner(val args: Array[String], val remoteArgs: Array[String], val testClassLoader: ClassLoader) extends sbt.testing.Runner { - def tasks(taskDefs: Array[TaskDef]): Array[Task] = throw new Throwable() + + 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() + } } diff --git a/sbt/src/sbt-test/tests/fork-uncaught2/test b/sbt/src/sbt-test/tests/fork-uncaught2/test index 5a9f22365..38c301498 100644 --- a/sbt/src/sbt-test/tests/fork-uncaught2/test +++ b/sbt/src/sbt-test/tests/fork-uncaught2/test @@ -1 +1,2 @@ -> test +-> testOnly -- task-boom