diff --git a/streams-tests/shared/src/test/scala/zio/stream/ZStreamSpec.scala b/streams-tests/shared/src/test/scala/zio/stream/ZStreamSpec.scala index e9eac1bca563..66b44435fd79 100644 --- a/streams-tests/shared/src/test/scala/zio/stream/ZStreamSpec.scala +++ b/streams-tests/shared/src/test/scala/zio/stream/ZStreamSpec.scala @@ -2545,6 +2545,49 @@ object ZStreamSpec extends ZIOBaseSpec { ).reduce(_ && _) } ) + }, + testM("Preserves errors") { + assertM( + ZStream + .fail(new Exception("boom")) + .toInputStream + .use(is => + Task { + is.read + } + ) + .run + )( + fails(hasMessage(equalTo("boom"))) + ) + }, + testM("Preserves errors in the middle") { + val bytes: Seq[Byte] = (1 to 5).map(_.toByte) + val str: ZStream[Any, Throwable, Byte] = ZStream.fromIterable(bytes) ++ ZStream.fail(new Exception("boom")) + assertM( + str.toInputStream + .use(is => + Task { + val buf = new Array[Byte](50) + is.read(buf) + "ok" + } + ) + .run + )(fails(hasMessage(equalTo("boom")))) + }, + testM("Allows reading something even in case of error") { + val bytes: Seq[Byte] = (1 to 5).map(_.toByte) + val str: ZStream[Any, Throwable, Byte] = ZStream.fromIterable(bytes) ++ ZStream.fail(new Exception("boom")) + assertM( + str.toInputStream.use(is => + Task { + val buf = new Array[Byte](5) + is.read(buf) + buf.toList + } + ) + )(equalTo(bytes)) } ), testM("toIterator") { diff --git a/streams/shared/src/main/scala/zio/stream/ZStream.scala b/streams/shared/src/main/scala/zio/stream/ZStream.scala index 27e4741fb15d..a2058dc8fc11 100644 --- a/streams/shared/src/main/scala/zio/stream/ZStream.scala +++ b/streams/shared/src/main/scala/zio/stream/ZStream.scala @@ -2781,7 +2781,8 @@ abstract class ZStream[-R, +E, +O](val process: ZManaged[R, Nothing, ZIO[R, Opti for { runtime <- ZIO.runtime[R].toManaged_ pull <- process.asInstanceOf[ZManaged[R, Nothing, ZIO[R, Option[Throwable], Chunk[Byte]]]] - } yield ZInputStream.fromPull(runtime, pull) + is <- Task(ZInputStream.fromPull(runtime, pull)).asInstanceOf[ZIO[R, E, java.io.InputStream]].toManaged_ + } yield is /** * Converts this stream into a `scala.collection.Iterator` wrapped in a [[ZManaged]].