|
| 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