diff --git a/akka-actor-tests/src/test/scala/akka/util/ByteStringSpec.scala b/akka-actor-tests/src/test/scala/akka/util/ByteStringSpec.scala index b87de033f2..1e2fce7b4c 100644 --- a/akka-actor-tests/src/test/scala/akka/util/ByteStringSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/util/ByteStringSpec.scala @@ -63,14 +63,21 @@ class ByteStringSpec extends WordSpec with Matchers with Checkers { } yield (xs, from, until) } - def testSer(obj: AnyRef) = { + def serialize(obj: AnyRef): Array[Byte] = { val os = new ByteArrayOutputStream val bos = new ObjectOutputStream(os) bos.writeObject(obj) - val arr = os.toByteArray - val is = new ObjectInputStream(new ByteArrayInputStream(arr)) + os.toByteArray + } - is.readObject == obj + def deserialize(bytes: Array[Byte]): AnyRef = { + val is = new ObjectInputStream(new ByteArrayInputStream(bytes)) + + is.readObject + } + + def testSer(obj: AnyRef) = { + deserialize(serialize(obj)) == obj } def hexFromSer(obj: AnyRef) = { @@ -529,6 +536,13 @@ class ByteStringSpec extends WordSpec with Matchers with Checkers { testSer(bs) } } + + "with a large concatenated bytestring" in { + // coverage for #20901 + val original = ByteString(Array.fill[Byte](1000)(1)) ++ ByteString(Array.fill[Byte](1000)(2)) + + deserialize(serialize(original)) shouldEqual original + } } } diff --git a/akka-actor/src/main/scala/akka/util/ByteString.scala b/akka-actor/src/main/scala/akka/util/ByteString.scala index cb1dd3aef2..6438d95c48 100644 --- a/akka-actor/src/main/scala/akka/util/ByteString.scala +++ b/akka-actor/src/main/scala/akka/util/ByteString.scala @@ -111,7 +111,7 @@ object ByteString { def readFromInputStream(is: ObjectInputStream): ByteString1C = { val length = is.readInt() val arr = new Array[Byte](length) - is.read(arr, 0, length) + is.readFully(arr, 0, length) ByteString1C(arr) } }