diff --git a/zio-process/js/src/test/scala/zio/process/ZIOProcessBaseSpec.scala b/zio-process/js/src/test/scala/zio/process/ZIOProcessBaseSpec.scala new file mode 100644 index 00000000..4540fcc6 --- /dev/null +++ b/zio-process/js/src/test/scala/zio/process/ZIOProcessBaseSpec.scala @@ -0,0 +1,8 @@ +package zio.process + +import zio.test._ +import zio.{ durationInt, Chunk } + +trait ZIOProcessBaseSpec extends ZIOSpecDefault { + override def aspects = Chunk(TestAspect.timeout(30.seconds), TestAspect.nonFlaky) +} diff --git a/zio-process/jvm/src/test/scala/zio/process/CommandPlatformSpecificSpec.scala b/zio-process/jvm/src/test/scala/zio/process/CommandPlatformSpecificSpec.scala index e71ca6c8..c19e7805 100644 --- a/zio-process/jvm/src/test/scala/zio/process/CommandPlatformSpecificSpec.scala +++ b/zio-process/jvm/src/test/scala/zio/process/CommandPlatformSpecificSpec.scala @@ -2,13 +2,15 @@ package zio.process import zio.stream.ZPipeline import zio.test._ -import zio.Chunk +import zio.{ durationInt, Chunk } import FilePlatformSpecific._ import java.util.Optional // TODO: Add aspects for different OSes? scala.util.Properties.isWin, etc. Also try to make this as OS agnostic as possible in the first place -object CommandPlatformSpecificSpec extends ZIOProcessBaseSpec { +object CommandPlatformSpecificSpec extends ZIOSpecDefault { + + override def aspects = Chunk(TestAspect.timeout(30.seconds)) def spec = suite("CommandSpec")( test("killTree also kills child processes") { diff --git a/zio-process/jvm/src/test/scala/zio/process/ZIOProcessBaseSpec.scala b/zio-process/jvm/src/test/scala/zio/process/ZIOProcessBaseSpec.scala new file mode 100644 index 00000000..4540fcc6 --- /dev/null +++ b/zio-process/jvm/src/test/scala/zio/process/ZIOProcessBaseSpec.scala @@ -0,0 +1,8 @@ +package zio.process + +import zio.test._ +import zio.{ durationInt, Chunk } + +trait ZIOProcessBaseSpec extends ZIOSpecDefault { + override def aspects = Chunk(TestAspect.timeout(30.seconds), TestAspect.nonFlaky) +} diff --git a/zio-process/shared/src/test/scala/zio/process/ZIOProcessBaseSpec.scala b/zio-process/native/src/test/scala/zio/process/ZIOProcessBaseSpec.scala similarity index 100% rename from zio-process/shared/src/test/scala/zio/process/ZIOProcessBaseSpec.scala rename to zio-process/native/src/test/scala/zio/process/ZIOProcessBaseSpec.scala diff --git a/zio-process/shared/src/main/scala/zio/process/ProcessStream.scala b/zio-process/shared/src/main/scala/zio/process/ProcessStream.scala index 0edc7095..344367c3 100644 --- a/zio-process/shared/src/main/scala/zio/process/ProcessStream.scala +++ b/zio-process/shared/src/main/scala/zio/process/ProcessStream.scala @@ -28,10 +28,13 @@ final case class ProcessStream( private[process] val outputStream: Option[OutputStream] = None ) { - private def close: ZIO[Any, Nothing, Unit] = + private def close: ZIO[Any, CommandError, Unit] = outputStream match { case None => ZIO.unit - case Some(out) => ZIO.succeed(out.close()) + case Some(out) => + ZIO.attemptBlocking(out.close()).mapError { case e: Throwable => + CommandError.Error(e) + } } /** @@ -94,9 +97,12 @@ final case class ProcessStream( * Note: Needs Java 9 or greater. */ def string(charset: Charset): ZIO[Any, CommandError, String] = - ZIO.attemptBlockingCancelable { - new String(inputStream.readAllBytes(), charset) - }(ZIO.succeed(inputStream.close())).refineOrDie { case CommandThrowable.IOError(e) => + ZIO.scoped { + close *> ProcessPlatformSpecific.wait(inputStream) *> ZIO.attemptBlockingCancelable { + new String(inputStream.readAllBytes(), charset) + }(ZIO.succeed(inputStream.close())) + }.refineOrDie { case CommandThrowable.IOError(e) => e } + } diff --git a/zio-process/shared/src/test/scala/zio/process/PipedCommandSpec.scala b/zio-process/shared/src/test/scala/zio/process/PipedCommandSpec.scala index d54bbb84..091f7580 100644 --- a/zio-process/shared/src/test/scala/zio/process/PipedCommandSpec.scala +++ b/zio-process/shared/src/test/scala/zio/process/PipedCommandSpec.scala @@ -62,5 +62,5 @@ object PipedCommandSpec extends ZIOProcessBaseSpec { equalTo(NonEmptyChunk(false, false, true)) ) } - ) + ) @@ TestAspect.nonFlaky }