Skip to content
This repository was archived by the owner on Sep 8, 2022. It is now read-only.

Commit 695a30c

Browse files
committed
Integrate sbt test framework more closely without reflective calls
1 parent e9b4b5c commit 695a30c

File tree

2 files changed

+10
-27
lines changed

2 files changed

+10
-27
lines changed

src/main/scala/scala/tools/partest/nest/SBTRunner.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import _root_.sbt.testing._
1313
import java.net.URLClassLoader
1414
import TestState._
1515

16-
// called reflectively from scala-partest-test-interface
1716
class SBTRunner(partestFingerprint: Fingerprint, eventHandler: EventHandler, loggers: Array[Logger],
1817
srcDir: String, testClassLoader: URLClassLoader, javaCmd: File, javacCmd: File, scalacArgs: Array[String], args: Array[String])
1918
extends AbstractRunner(args.filter(a => !a.startsWith("-D")).mkString(" ")) {
Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package scala.tools.partest.sbt
22

3-
import scala.language.reflectiveCalls
4-
3+
import scala.tools.partest.nest.SBTRunner
54
import _root_.sbt.testing._
65
import java.net.URLClassLoader
76
import java.io.File
@@ -17,31 +16,25 @@ class Framework extends sbt.testing.Framework {
1716
def fingerprints: Array[Fingerprint] = Array(Framework.fingerprint)
1817
def name: String = "partest"
1918

20-
def runner(args: Array[String], remoteArgs: Array[String], testClassLoader: ClassLoader): sbt.testing.Runner =
21-
new Runner(args, remoteArgs, testClassLoader)
19+
def runner(args: Array[String], remoteArgs: Array[String], testClassLoader: ClassLoader): Runner =
20+
new PartestRunner(args, remoteArgs, testClassLoader)
2221
}
2322

24-
/** Represents one run of a suite of tests.
25-
*/
26-
case class Runner(args: Array[String], remoteArgs: Array[String], testClassLoader: ClassLoader) extends sbt.testing.Runner {
27-
28-
def tasks(taskDefs: Array[TaskDef]): Array[sbt.testing.Task] = taskDefs map (SbtPartestTask(_, args): sbt.testing.Task)
29-
30-
/** Indicates the client is done with this <code>Runner</code> instance.
31-
*
32-
* @return a possibly multi-line summary string, or the empty string if no summary is provided -- TODO
33-
*/
34-
def done(): String = ""
23+
// We don't use sbt's Runner or Task abstractions properly.
24+
// sbt runs a single dummy fingerprint match and partest does everything else internally.
25+
case class PartestRunner(args: Array[String], remoteArgs: Array[String], testClassLoader: ClassLoader) extends Runner {
26+
def tasks(taskDefs: Array[TaskDef]): Array[Task] = taskDefs map (PartestTask(_, args): Task)
27+
def done(): String = "" // no summary
3528
}
3629

3730
/** Run partest in this VM. Assumes we're running in a forked VM!
3831
*/
39-
case class SbtPartestTask(taskDef: TaskDef, args: Array[String]) extends Task {
32+
case class PartestTask(taskDef: TaskDef, args: Array[String]) extends Task {
4033
/** Executes this task, possibly returning to the client new tasks to execute. */
4134
def execute(eventHandler: EventHandler, loggers: Array[Logger]): Array[Task] = {
4235
val forkedCp = scala.util.Properties.javaClassPath
4336
val classLoader = new URLClassLoader(forkedCp.split(java.io.File.pathSeparator).map(new File(_).toURI.toURL))
44-
val runner = SBTRunner(Framework.fingerprint, eventHandler, loggers, "files", classLoader, null, null, Array.empty[String], args)
37+
val runner = new SBTRunner(taskDef.fingerprint(), eventHandler, loggers, "files", classLoader, null, null, Array.empty[String], args)
4538

4639
if (Runtime.getRuntime().maxMemory() / (1024*1024) < 800)
4740
loggers foreach (_.warn(s"""Low heap size detected (~ ${Runtime.getRuntime().maxMemory() / (1024*1024)}M). Please add the following to your build.sbt: javaOptions in Test += "-Xmx1G""""))
@@ -56,15 +49,6 @@ case class SbtPartestTask(taskDef: TaskDef, args: Array[String]) extends Task {
5649
Array()
5750
}
5851

59-
type SBTRunner = { def run(): Unit }
60-
61-
// use reflection to instantiate scala.tools.partest.nest.SBTRunner,
62-
// casting to the structural type SBTRunner above so that method calls on the result will be invoked reflectively as well
63-
private def SBTRunner(partestFingerprint: Fingerprint, eventHandler: EventHandler, loggers: Array[Logger], srcDir: String, testClassLoader: URLClassLoader, javaCmd: File, javacCmd: File, scalacArgs: Array[String], args: Array[String]): SBTRunner = {
64-
val runnerClass = Class.forName("scala.tools.partest.nest.SBTRunner")
65-
runnerClass.getConstructors()(0).newInstance(partestFingerprint, eventHandler, loggers, srcDir, testClassLoader, javaCmd, javacCmd, scalacArgs, args).asInstanceOf[SBTRunner]
66-
}
67-
6852
/** A possibly zero-length array of string tags associated with this task. */
6953
def tags: Array[String] = Array()
7054
}

0 commit comments

Comments
 (0)