Skip to content

Commit

Permalink
Fixed handling of stderr when SubProcess.wrap
Browse files Browse the repository at this point in the history
  • Loading branch information
viktor-podzigun committed Jun 7, 2022
1 parent dba9493 commit b39c67c
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 3 deletions.
2 changes: 1 addition & 1 deletion core/src/main/scala/scommons/nodejs/util/SubProcess.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@ object SubProcess {

def wrap(childProcess: raw.ChildProcess): Future[SubProcess] = {
val stdout = new StreamReader(childProcess.stdout)
val stderr = new StreamReader(childProcess.stderr)

val exitPromise = Promise[Unit]()
childProcess.once("exit", { code: Int =>
if (code == 0) exitPromise.success(())
else {
val stderr = new StreamReader(childProcess.stderr)
stderr.readNextBytes(8096).recover {
case NonFatal(_) => None
}.foreach { content =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package scommons.nodejs

import org.scalatest.Succeeded
import scommons.nodejs.ChildProcess._
import scommons.nodejs.stream.Readable
import scommons.nodejs.test.AsyncTestSpec
import scommons.nodejs.util.StreamReader

Expand Down Expand Up @@ -133,6 +134,7 @@ class ChildProcessSpec extends AsyncTestSpec {
val onceMock = mockFunction[String, js.Function, raw.EventEmitter]
val rawProcess = literal(
"stdout" -> stdoutStream,
"stderr" -> Readable.from(Buffer.from("")),
"once" -> onceMock
).asInstanceOf[raw.ChildProcess]

Expand Down Expand Up @@ -201,6 +203,7 @@ class ChildProcessSpec extends AsyncTestSpec {
val onceMock = mockFunction[String, js.Function, raw.EventEmitter]
val rawProcess = literal(
"stdout" -> stdoutStream,
"stderr" -> Readable.from(Buffer.from("")),
"once" -> onceMock
).asInstanceOf[raw.ChildProcess]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class SubProcessSpec extends AsyncTestSpec {
val onceMock = mockFunction[String, js.Function, raw.EventEmitter]
val childProcess = literal(
"stdout" -> stdoutStream,
"stderr" -> Readable.from(Buffer.from("")),
"once" -> onceMock
).asInstanceOf[raw.ChildProcess]

Expand Down Expand Up @@ -49,6 +50,7 @@ class SubProcessSpec extends AsyncTestSpec {
val onceMock = mockFunction[String, js.Function, raw.EventEmitter]
val childProcess = literal(
"stdout" -> stdoutStream,
"stderr" -> Readable.from(Buffer.from("")),
"once" -> onceMock
).asInstanceOf[raw.ChildProcess]

Expand Down Expand Up @@ -166,7 +168,8 @@ class SubProcessSpec extends AsyncTestSpec {
//given
val expectedOutput = "test content"
val stdoutStream = Readable.from(Buffer.from(expectedOutput))
val stderrStream = Readable.from(Buffer.from("test error"))
val stderrStream = Readable.from(Buffer.from(""))
stderrStream.destroy(js.Error("test stream error"))
val onceMock = mockFunction[String, js.Function, raw.EventEmitter]
val childProcess = literal(
"spawnargs" -> js.Array("app", "arg1", "arg2"),
Expand All @@ -189,7 +192,6 @@ class SubProcessSpec extends AsyncTestSpec {
(for {
result <- resultF
output <- loop(result.stdout, "")
_ = stderrStream.destroy(js.Error("test stream error"))
_ = exitCallback(1)
exitError <- result.exitF.failed
} yield {
Expand Down

0 comments on commit b39c67c

Please sign in to comment.