diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-03-18 10:03:12 -0700 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-03-18 10:03:12 -0700 |
commit | 350a3115afca590bee6311dbed4a657fe9cca375 (patch) | |
tree | 1a94f063491826eef5487e283e133d4e5e48ff16 | |
parent | d759fea899b1889d64bacdcee6a4fdd9dd8f1417 (diff) | |
download | mill-350a3115afca590bee6311dbed4a657fe9cca375.tar.gz mill-350a3115afca590bee6311dbed4a657fe9cca375.tar.bz2 mill-350a3115afca590bee6311dbed4a657fe9cca375.zip |
Properly close Scala.js test adapters when done, after letting the IO drain properly
4 files changed, 28 insertions, 16 deletions
diff --git a/scalajslib/jsbridges/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala b/scalajslib/jsbridges/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala index 57fbf65a..5f7bd38b 100644 --- a/scalajslib/jsbridges/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala +++ b/scalajslib/jsbridges/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala @@ -38,7 +38,7 @@ class ScalaJSBridge extends mill.scalajslib.ScalaJSBridge { def getFramework(config: NodeJSConfig, frameworkName: String, - linkedFile: File): sbt.testing.Framework = { + linkedFile: File): (() => Unit, sbt.testing.Framework) = { val env = nodeJSEnv(config).loadLibs( Seq(ResolvedJSDependency.minimal(new FileVirtualJSFile(linkedFile))) ) @@ -47,11 +47,14 @@ class ScalaJSBridge extends mill.scalajslib.ScalaJSBridge { val adapter = new TestAdapter(env, tconfig) - adapter - .loadFrameworks(List(List(frameworkName))) - .flatten - .headOption - .getOrElse(throw new RuntimeException("Failed to get framework")) + ( + () => adapter.close(), + adapter + .loadFrameworks(List(List(frameworkName))) + .flatten + .headOption + .getOrElse(throw new RuntimeException("Failed to get framework")) + ) } def nodeJSEnv(config: NodeJSConfig): NodeJSEnv = { diff --git a/scalajslib/jsbridges/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala b/scalajslib/jsbridges/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala index d7ed26eb..53986f1b 100644 --- a/scalajslib/jsbridges/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala +++ b/scalajslib/jsbridges/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala @@ -37,18 +37,21 @@ class ScalaJSBridge extends mill.scalajslib.ScalaJSBridge { def getFramework(config: NodeJSConfig, frameworkName: String, - linkedFile: File): sbt.testing.Framework = { + linkedFile: File): (() => Unit, sbt.testing.Framework) = { val env = nodeJSEnv(config) val tconfig = TestAdapter.Config().withLogger(new ScalaConsoleLogger) val adapter = new TestAdapter(env, Seq(FileVirtualJSFile(linkedFile)), tconfig) - adapter - .loadFrameworks(List(List(frameworkName))) - .flatten - .headOption - .getOrElse(throw new RuntimeException("Failed to get framework")) + ( + () => adapter.close(), + adapter + .loadFrameworks(List(List(frameworkName))) + .flatten + .headOption + .getOrElse(throw new RuntimeException("Failed to get framework")) + ) } def nodeJSEnv(config: NodeJSConfig): NodeJSEnv = { diff --git a/scalajslib/src/mill/scalajslib/ScalaJSBridge.scala b/scalajslib/src/mill/scalajslib/ScalaJSBridge.scala index e5952291..20e6542c 100644 --- a/scalajslib/src/mill/scalajslib/ScalaJSBridge.scala +++ b/scalajslib/src/mill/scalajslib/ScalaJSBridge.scala @@ -57,7 +57,7 @@ class ScalaJSWorker { def getFramework(toolsClasspath: Agg[Path], config: NodeJSConfig, frameworkName: String, - linkedFile: File): sbt.testing.Framework = { + linkedFile: File): (() => Unit, sbt.testing.Framework) = { bridge(toolsClasspath).getFramework(config, frameworkName, linkedFile) } @@ -74,7 +74,7 @@ trait ScalaJSBridge { def getFramework(config: NodeJSConfig, frameworkName: String, - linkedFile: File): sbt.testing.Framework + linkedFile: File): (() => Unit, sbt.testing.Framework) } diff --git a/scalajslib/src/mill/scalajslib/ScalaJSModule.scala b/scalajslib/src/mill/scalajslib/ScalaJSModule.scala index 4f932e1e..948b13df 100644 --- a/scalajslib/src/mill/scalajslib/ScalaJSModule.scala +++ b/scalajslib/src/mill/scalajslib/ScalaJSModule.scala @@ -184,7 +184,7 @@ trait TestScalaJSModule extends ScalaJSModule with TestModule { override def testLocal(args: String*) = T.command { test(args:_*) } override def test(args: String*) = T.command { - val framework = mill.scalajslib.ScalaJSBridge.scalaJSBridge().getFramework( + val (close, framework) = mill.scalajslib.ScalaJSBridge.scalaJSBridge().getFramework( toolsClasspath().map(_.path), nodeJSConfig(), testFrameworks().head, @@ -199,7 +199,13 @@ trait TestScalaJSModule extends ScalaJSModule with TestModule { Agg(compile().classes.path), args ) - TestModule.handleResults(doneMsg, results) + val res = TestModule.handleResults(doneMsg, results) + // Hack to try and let the Node.js subprocess finish streaming it's stdout + // to the JVM. Without this, the stdout can still be streaming when `close()` + // is called, and some of the output is dropped onto the floor. + Thread.sleep(100) + close() + res } } |