diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 1dcbe9b3b..14f3cb5cf 100755 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -15,7 +15,7 @@ package sbt import complete._ import std.TaskExtra._ import inc.{FileValueCache, Locate} - import testing.{Framework, AnnotatedFingerprint, SubclassFingerprint} + import testing.{Framework, Runner, AnnotatedFingerprint, SubclassFingerprint} import sys.error import scala.xml.NodeSeq @@ -478,7 +478,11 @@ object Defaults extends BuildCommon Tests(frameworks, loader, runners, tests, config, s.log) } } - Tests.foldTasks(groupTasks, config.parallel) + val output = Tests.foldTasks(groupTasks, config.parallel) + runners foreach { case (tf, r) => + r.done() + } + output } def selectedFilter(args: Seq[String]): Seq[String => Boolean] = diff --git a/sbt/src/sbt-test/tests/done/build.sbt b/sbt/src/sbt-test/tests/done/build.sbt new file mode 100644 index 000000000..2e8f50f5b --- /dev/null +++ b/sbt/src/sbt-test/tests/done/build.sbt @@ -0,0 +1,5 @@ +scalaVersion := "2.10.1" + +libraryDependencies += "org.scalatest" %% "scalatest" % "2.0.M6-SNAP15" + +testOptions in Test += Tests.Argument("-r", "custom.CustomReporter") \ No newline at end of file diff --git a/sbt/src/sbt-test/tests/done/src/main/scala/custom/CustomReporter.scala b/sbt/src/sbt-test/tests/done/src/main/scala/custom/CustomReporter.scala new file mode 100644 index 000000000..a4d4b7eb9 --- /dev/null +++ b/sbt/src/sbt-test/tests/done/src/main/scala/custom/CustomReporter.scala @@ -0,0 +1,37 @@ +package custom + +import java.io._ +import org.scalatest._ +import events._ + +class CustomReporter extends ResourcefulReporter { + + private def writeFile(filePath: String, content: String) { + val file = new File(filePath) + val writer = + if (!file.exists) + new FileWriter(new File(filePath)) + else + new FileWriter(new File(filePath + "-2")) + writer.write(content) + writer.flush() + writer.close() + } + + def apply(event: Event) { + event match { + case runCompleted: RunCompleted => writeFile("target/RunCompleted", "RunCompleted") + case _ => + } + } + + def dispose() { + val file = new File("target/dispose") + val filePath = + if (file.exists) + "target/dispose2" + else + "target/dispose" + writeFile(filePath, "dispose") + } +} \ No newline at end of file diff --git a/sbt/src/sbt-test/tests/done/src/test/scala/com/test/TestSpec.scala b/sbt/src/sbt-test/tests/done/src/test/scala/com/test/TestSpec.scala new file mode 100644 index 000000000..57ec51bdf --- /dev/null +++ b/sbt/src/sbt-test/tests/done/src/test/scala/com/test/TestSpec.scala @@ -0,0 +1,12 @@ +package com.test + +import org.scalatest.Spec + +class TestSpec extends Spec { + + def `TestSpec-test-1 ` {} + + def `TestSpec-test-2 ` {} + + def `TestSpec-test-3 ` {} +} \ No newline at end of file diff --git a/sbt/src/sbt-test/tests/done/src/test/scala/com/test/TestSpec2.scala b/sbt/src/sbt-test/tests/done/src/test/scala/com/test/TestSpec2.scala new file mode 100644 index 000000000..ce747f260 --- /dev/null +++ b/sbt/src/sbt-test/tests/done/src/test/scala/com/test/TestSpec2.scala @@ -0,0 +1,12 @@ +package com.test + +import org.scalatest.Spec + +class TestSpec2 extends Spec { + + def `TestSpec2-test-1 ` {} + + def `TestSpec2-test-2 ` {} + + def `TestSpec2-test-3 ` {} +} \ No newline at end of file diff --git a/sbt/src/sbt-test/tests/done/test b/sbt/src/sbt-test/tests/done/test new file mode 100644 index 000000000..2307aed49 --- /dev/null +++ b/sbt/src/sbt-test/tests/done/test @@ -0,0 +1,19 @@ +#Test the framework will call Runner.done once. +#Because ScalaTest's runner will report RunCompleted when the run completed, a CustomReporter is +#used to report expected ScalaTest's RunCompleted event by writing out to target/, it is then +#used to check for their existence, and if the expected event is fired > 1 (which is unexpected), +#a xxxx-2 file will be written, thus here we also check for 'absent' of such file. +#ResourcefulReporter's dispose method will be called in Runner.done also, and it should be called +#once only. + +> clean + +> test + +$ exists target/RunCompleted + +$ absent target/RunCompleted-2 + +$ exists target/dispose + +$ absent target/dispose2 \ No newline at end of file diff --git a/testing/agent/src/main/java/sbt/ForkMain.java b/testing/agent/src/main/java/sbt/ForkMain.java index 4e3931ffc..9cdf1e744 100755 --- a/testing/agent/src/main/java/sbt/ForkMain.java +++ b/testing/agent/src/main/java/sbt/ForkMain.java @@ -212,6 +212,7 @@ public class ForkMain { final Runner runner = framework.runner(frameworkArgs, remoteFrameworkArgs, getClass().getClassLoader()); for (ForkTestDefinition test : filteredTests) runTestSafe(test, runner, loggers, os); + runner.done(); } write(os, ForkTags.Done); is.readObject();