diff --git a/sbt/src/sbt-test/tests/single-runner/build.sbt b/sbt/src/sbt-test/tests/single-runner/build.sbt new file mode 100644 index 000000000..2e8f50f5b --- /dev/null +++ b/sbt/src/sbt-test/tests/single-runner/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/single-runner/src/main/scala/custom/CustomReporter.scala b/sbt/src/sbt-test/tests/single-runner/src/main/scala/custom/CustomReporter.scala new file mode 100644 index 000000000..f9552f01e --- /dev/null +++ b/sbt/src/sbt-test/tests/single-runner/src/main/scala/custom/CustomReporter.scala @@ -0,0 +1,28 @@ +package custom + +import java.io._ +import org.scalatest._ +import events._ + +class CustomReporter extends Reporter { + + 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 runStarting: RunStarting => writeFile("target/RunStarting", "RunStarting") + case runCompleted: RunCompleted => writeFile("target/RunCompleted", "RunCompleted") + case _ => + } + } +} \ No newline at end of file diff --git a/sbt/src/sbt-test/tests/single-runner/src/test/scala/com/test/TestSpec.scala b/sbt/src/sbt-test/tests/single-runner/src/test/scala/com/test/TestSpec.scala new file mode 100644 index 000000000..57ec51bdf --- /dev/null +++ b/sbt/src/sbt-test/tests/single-runner/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/single-runner/src/test/scala/com/test/TestSpec2.scala b/sbt/src/sbt-test/tests/single-runner/src/test/scala/com/test/TestSpec2.scala new file mode 100644 index 000000000..ce747f260 --- /dev/null +++ b/sbt/src/sbt-test/tests/single-runner/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/single-runner/test b/sbt/src/sbt-test/tests/single-runner/test new file mode 100644 index 000000000..c7c5eb165 --- /dev/null +++ b/sbt/src/sbt-test/tests/single-runner/test @@ -0,0 +1,13 @@ +#This test that the framework will only use a single runner instance to execute all tests. +#Because ScalaTest's runner will report RunStarting when the run start, a CustomReporter is +#used to report expected ScalaTest's RunStarting 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. + +> clean + +> test + +$ exists target/RunStarting + +$ absent target/RunStarting-2 \ No newline at end of file diff --git a/testing/src/main/scala/sbt/TestFramework.scala b/testing/src/main/scala/sbt/TestFramework.scala index 2c28ddab6..311ba4044 100644 --- a/testing/src/main/scala/sbt/TestFramework.scala +++ b/testing/src/main/scala/sbt/TestFramework.scala @@ -184,6 +184,12 @@ object TestFramework private def createTestTasks(loader: ClassLoader, tests: Map[Framework, (Set[TestDefinition], Seq[String])], ordered: Seq[TestDefinition], log: Logger, listeners: Seq[TestReportListener]) = { val testsListeners = listeners collect { case tl: TestsListener => tl } + + val runnerMap = + tests map { case (framework, (testDefinitions, testArgs)) => + (framework, new TestRunner(framework, loader, testArgs.toArray, listeners, log)) + } + def foreachListenerSafe(f: TestsListener => Unit): () => Unit = () => safeForeach(testsListeners, log)(f) import TestResult.{Error,Passed,Failed} @@ -191,13 +197,12 @@ object TestFramework val startTask = foreachListenerSafe(_.doInit) val testTasks = tests flatMap { case (framework, (testDefinitions, testArgs)) => - - val runner = new TestRunner(framework, loader, testArgs.toArray, listeners, log) - for(testDefinition <- testDefinitions) yield - { - val runTest = () => withContextLoader(loader) { runner.run(testDefinition) } - (testDefinition.name, runTest) - } + val runner = runnerMap(framework) + for(testDefinition <- testDefinitions) yield + { + val runTest = () => withContextLoader(loader) { runner.run(testDefinition) } + (testDefinition.name, runTest) + } } val endTask = (result: TestResult.Value) => foreachListenerSafe(_.doComplete(result))