diff options
author | Felix Mulder <felix.mulder@gmail.com> | 2017-04-04 21:23:29 +0200 |
---|---|---|
committer | Felix Mulder <felix.mulder@gmail.com> | 2017-04-12 11:21:57 +0200 |
commit | eff50df8308e3e1989dcbc509c5efbc5c0d087ac (patch) | |
tree | e2a76ff935d38ea7bd911b42ef0a028aa44a0744 /compiler/test/dotty/tools/dotc/vulpix/ChildMain.scala | |
parent | a5b9d0763583210b71220a0e2cf68a3792c5062b (diff) | |
download | dotty-eff50df8308e3e1989dcbc509c5efbc5c0d087ac.tar.gz dotty-eff50df8308e3e1989dcbc509c5efbc5c0d087ac.tar.bz2 dotty-eff50df8308e3e1989dcbc509c5efbc5c0d087ac.zip |
Add `RunnerOrchestration` to `ParallelTesting` trait
Diffstat (limited to 'compiler/test/dotty/tools/dotc/vulpix/ChildMain.scala')
-rw-r--r-- | compiler/test/dotty/tools/dotc/vulpix/ChildMain.scala | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/compiler/test/dotty/tools/dotc/vulpix/ChildMain.scala b/compiler/test/dotty/tools/dotc/vulpix/ChildMain.scala new file mode 100644 index 000000000..fdd602379 --- /dev/null +++ b/compiler/test/dotty/tools/dotc/vulpix/ChildMain.scala @@ -0,0 +1,83 @@ +package dotty.tools.dotc +package vulpix + +import java.io.{ + File => JFile, + InputStream, ObjectInputStream, + OutputStream, ObjectOutputStream, + ByteArrayOutputStream, PrintStream +} +import java.lang.reflect.InvocationTargetException + +import dotty.tools.dotc.vulpix.Statuses._ + +object ChildMain { + val realStdin = System.in + val realStderr = System.err + val realStdout = System.out + + private def runMain(dir: JFile): Status = { + def renderStackTrace(ex: Throwable): String = + ex.getStackTrace + .takeWhile(_.getMethodName != "invoke0") + .mkString(" ", "\n ", "") + + def resetOutDescriptors(): Unit = { + System.setOut(realStdout) + System.setErr(realStderr) + } + + import java.net.{ URL, URLClassLoader } + + val printStream = new ByteArrayOutputStream + + try { + // Do classloading magic and running here: + val ucl = new URLClassLoader(Array(dir.toURI.toURL)) + val cls = ucl.loadClass("Test") + val meth = cls.getMethod("main", classOf[Array[String]]) + + try { + val ps = new PrintStream(printStream) + System.setOut(ps) + System.setErr(ps) + Console.withOut(printStream) { + Console.withErr(printStream) { + // invoke main with "jvm" as arg + meth.invoke(null, Array("jvm")) + } + } + resetOutDescriptors() + } catch { + case t: Throwable => + resetOutDescriptors() + throw t + } + new Success(printStream.toString("utf-8")) + } + catch { + case ex: NoSuchMethodException => + val msg = s"test in '$dir' did not contain method: ${ex.getMessage}" + new Failure(msg, renderStackTrace(ex.getCause)) + + case ex: ClassNotFoundException => + val msg = s"test in '$dir' did not contain class: ${ex.getMessage}" + new Failure(msg, renderStackTrace(ex.getCause)) + + case ex: InvocationTargetException => + val msg = s"An exception ocurred when running main: ${ex.getCause}" + new Failure(msg, renderStackTrace(ex.getCause)) + } + } + + def main(args: Array[String]): Unit = { + val stdin = new ObjectInputStream(System.in); + val stdout = new ObjectOutputStream(System.out); + + while (true) { + val dir = stdin.readObject().asInstanceOf[JFile] + stdout.writeObject(runMain(dir)) + stdout.flush() + } + } +} |