diff --git a/.changes/next-release/bugfix-AWSSDKforJavav2-2984eeb.json b/.changes/next-release/bugfix-AWSSDKforJavav2-2984eeb.json new file mode 100644 index 000000000000..859ddfff2d76 --- /dev/null +++ b/.changes/next-release/bugfix-AWSSDKforJavav2-2984eeb.json @@ -0,0 +1,6 @@ +{ + "type": "bugfix", + "category": "AWS SDK for Java v2", + "contributor": "faucct", + "description": "Fix `InputStreamSubscriber` to return 0 when reading a length of 0." +} diff --git a/utils/src/main/java/software/amazon/awssdk/utils/async/InputStreamSubscriber.java b/utils/src/main/java/software/amazon/awssdk/utils/async/InputStreamSubscriber.java index 3098724907c1..8b88d27ddfe2 100644 --- a/utils/src/main/java/software/amazon/awssdk/utils/async/InputStreamSubscriber.java +++ b/utils/src/main/java/software/amazon/awssdk/utils/async/InputStreamSubscriber.java @@ -102,6 +102,10 @@ public int read(byte[] b) { @Override public int read(byte[] bytes, int off, int len) { + if (len == 0) { + return 0; + } + ByteBuffer byteBuffer = ByteBuffer.wrap(bytes, off, len); TransferResult transferResult = delegate.blockingTransferTo(byteBuffer); int dataTransferred = byteBuffer.position() - off; diff --git a/utils/src/test/java/software/amazon/awssdk/utils/async/InputStreamSubscriberTest.java b/utils/src/test/java/software/amazon/awssdk/utils/async/InputStreamSubscriberTest.java index 091b1bb8a9aa..393ee5592782 100644 --- a/utils/src/test/java/software/amazon/awssdk/utils/async/InputStreamSubscriberTest.java +++ b/utils/src/test/java/software/amazon/awssdk/utils/async/InputStreamSubscriberTest.java @@ -58,8 +58,8 @@ public void onComplete_returnsEndOfStream_onRead() { publisher.subscribe(subscriber); publisher.complete(); assertThat(subscriber.read()).isEqualTo(-1); - assertThat(subscriber.read(new byte[0])).isEqualTo(-1); - assertThat(subscriber.read(new byte[0], 0, 0)).isEqualTo(-1); + assertThat(subscriber.read(new byte[1])).isEqualTo(-1); + assertThat(subscriber.read(new byte[1], 0, 1)).isEqualTo(-1); } @Test @@ -69,8 +69,8 @@ public void onError_throws_onRead() { publisher.subscribe(subscriber); publisher.error(exception); assertThatThrownBy(() -> subscriber.read()).isEqualTo(exception); - assertThatThrownBy(() -> subscriber.read(new byte[0])).isEqualTo(exception); - assertThatThrownBy(() -> subscriber.read(new byte[0], 0, 0)).isEqualTo(exception); + assertThatThrownBy(() -> subscriber.read(new byte[1])).isEqualTo(exception); + assertThatThrownBy(() -> subscriber.read(new byte[1], 0, 1)).isEqualTo(exception); } @Test @@ -128,8 +128,15 @@ public void read_afterClose_fails() { publisher.subscribe(subscriber); subscriber.close(); assertThatThrownBy(() -> subscriber.read()).isInstanceOf(CancellationException.class); - assertThatThrownBy(() -> subscriber.read(new byte[0])).isInstanceOf(CancellationException.class); - assertThatThrownBy(() -> subscriber.read(new byte[0], 0, 0)).isInstanceOf(CancellationException.class); + assertThatThrownBy(() -> subscriber.read(new byte[1])).isInstanceOf(CancellationException.class); + assertThatThrownBy(() -> subscriber.read(new byte[1], 0, 1)).isInstanceOf(CancellationException.class); + } + + @Test + public void readByteArray_0Len_returns0() { + publisher.subscribe(subscriber); + + assertThat(subscriber.read(new byte[1], 0, 0)).isEqualTo(0); } public static List stochastic_methodCallsSeemThreadSafe_parameters() {