Skip to content

Commit 3558c3d

Browse files
committed
Merge pull request scala#50 from szeiger/wip/intergrate-sbt-interface
Integrate scala-partest-interface into scala-partest
2 parents d813813 + 9c4c75e commit 3558c3d

File tree

2 files changed

+55
-10
lines changed

2 files changed

+55
-10
lines changed

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

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,10 @@
99
package scala.tools.partest
1010
package nest
1111

12-
import sbt.testing.EventHandler
13-
import sbt.testing.Logger
14-
import sbt.testing.Event
15-
import sbt.testing.Fingerprint
16-
import sbt.testing.Selector
17-
import sbt.testing.Status
18-
import sbt.testing.OptionalThrowable
19-
import sbt.testing.SuiteSelector
20-
import sbt.testing.TestSelector
12+
import _root_.sbt.testing._
2113
import java.net.URLClassLoader
2214
import TestState._
2315

24-
// called reflectively from scala-partest-test-interface
2516
class SBTRunner(partestFingerprint: Fingerprint, eventHandler: EventHandler, loggers: Array[Logger],
2617
srcDir: String, testClassLoader: URLClassLoader, javaCmd: File, javacCmd: File, scalacArgs: Array[String], args: Array[String])
2718
extends AbstractRunner(args.filter(a => !a.startsWith("-D")).mkString(" ")) {
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package scala.tools.partest.sbt
2+
3+
import scala.tools.partest.nest.SBTRunner
4+
import _root_.sbt.testing._
5+
import java.net.URLClassLoader
6+
import java.io.File
7+
8+
object Framework {
9+
// as partest is not driven by test classes discovered by sbt, need to add this marker fingerprint to definedTests
10+
val fingerprint = new AnnotatedFingerprint { def isModule = true; def annotationName = "partest" }
11+
12+
// TODO how can we export `fingerprint` so that a user can just add this to their build.sbt
13+
// definedTests in Test += new sbt.TestDefinition("partest", fingerprint, true, Array())
14+
}
15+
class Framework extends sbt.testing.Framework {
16+
def fingerprints: Array[Fingerprint] = Array(Framework.fingerprint)
17+
def name: String = "partest"
18+
19+
def runner(args: Array[String], remoteArgs: Array[String], testClassLoader: ClassLoader): Runner =
20+
new PartestRunner(args, remoteArgs, testClassLoader)
21+
}
22+
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
28+
}
29+
30+
/** Run partest in this VM. Assumes we're running in a forked VM!
31+
*/
32+
case class PartestTask(taskDef: TaskDef, args: Array[String]) extends Task {
33+
/** Executes this task, possibly returning to the client new tasks to execute. */
34+
def execute(eventHandler: EventHandler, loggers: Array[Logger]): Array[Task] = {
35+
val forkedCp = scala.util.Properties.javaClassPath
36+
val classLoader = new URLClassLoader(forkedCp.split(java.io.File.pathSeparator).map(new File(_).toURI.toURL))
37+
val runner = new SBTRunner(taskDef.fingerprint(), eventHandler, loggers, "files", classLoader, null, null, Array.empty[String], args)
38+
39+
if (Runtime.getRuntime().maxMemory() / (1024*1024) < 800)
40+
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""""))
41+
42+
try runner.run
43+
catch {
44+
case ex: ClassNotFoundException =>
45+
loggers foreach { l => l.error("Please make sure partest is running in a forked VM by including the following line in build.sbt:\nfork in Test := true") }
46+
throw ex
47+
}
48+
49+
Array()
50+
}
51+
52+
/** A possibly zero-length array of string tags associated with this task. */
53+
def tags: Array[String] = Array()
54+
}

0 commit comments

Comments
 (0)