This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-io.git
commit c958b3182ff2c57b44fb34069e4c519b68e81707 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Sun Jul 7 18:13:43 2024 -0400 ChecksumInputStream(InputStream, Checksum, long, long) should fail-fast on null Checksum input More available() and read() tests --- src/changes/changes.xml | 1 + .../commons/io/input/ChecksumInputStream.java | 3 +- .../commons/io/input/ChecksumInputStreamTest.java | 29 +++++++++++++++++-- .../commons/io/input/CircularInputStreamTest.java | 33 ++++++++++++++-------- 4 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index b735c6121..fa5d8307d 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -68,6 +68,7 @@ The <action> type attribute can be add,update,fix,remove. <action dev="ggregory" type="add" due-to="Gary Gregory">BoundedInputStream.available() should return 0 when the stream is closed.</action> <action dev="ggregory" type="add" due-to="Gary Gregory">CircularInputStream.available() should return 0 when the stream is closed.</action> <action dev="ggregory" type="add" due-to="Gary Gregory">InfiniteCircularInputStream.available() should return 0 when the stream is closed.</action> + <action dev="ggregory" type="add" due-to="Gary Gregory">ChecksumInputStream(InputStream, Checksum, long, long) should fail-fast on null Checksum input.</action> <!-- UPDATE --> <action dev="ggregory" type="update" due-to="Dependabot">Bump tests commons.bytebuddy.version from 1.14.13 to 1.14.17 #615, #621, #631, #635.</action> <action dev="ggregory" type="update" due-to="Dependabot">Bump tests commons-codec:commons-codec from 1.16.1 to 1.17.0.</action> diff --git a/src/main/java/org/apache/commons/io/input/ChecksumInputStream.java b/src/main/java/org/apache/commons/io/input/ChecksumInputStream.java index d530edb96..8af6c80ac 100644 --- a/src/main/java/org/apache/commons/io/input/ChecksumInputStream.java +++ b/src/main/java/org/apache/commons/io/input/ChecksumInputStream.java @@ -20,6 +20,7 @@ import static org.apache.commons.io.IOUtils.EOF; import java.io.IOException; import java.io.InputStream; +import java.util.Objects; import java.util.zip.CheckedInputStream; import java.util.zip.Checksum; @@ -218,7 +219,7 @@ public final class ChecksumInputStream extends CountingInputStream { */ private ChecksumInputStream(final InputStream in, final Checksum checksum, final long expectedChecksumValue, final long countThreshold) { - super(new CheckedInputStream(in, checksum)); + super(new CheckedInputStream(in, Objects.requireNonNull(checksum, "checksum"))); this.countThreshold = countThreshold; this.expectedChecksumValue = expectedChecksumValue; } diff --git a/src/test/java/org/apache/commons/io/input/ChecksumInputStreamTest.java b/src/test/java/org/apache/commons/io/input/ChecksumInputStreamTest.java index f01eb0cb6..ec1dcfeb8 100644 --- a/src/test/java/org/apache/commons/io/input/ChecksumInputStreamTest.java +++ b/src/test/java/org/apache/commons/io/input/ChecksumInputStreamTest.java @@ -27,6 +27,7 @@ import java.io.InputStream; import java.util.zip.Adler32; import java.util.zip.CRC32; +import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.Test; /** @@ -34,17 +35,30 @@ import org.junit.jupiter.api.Test; */ public class ChecksumInputStreamTest { + private ChecksumInputStream createInputStream() throws IOException { + return ChecksumInputStream.builder().setCharSequence("Hi").setChecksum(new CRC32()).get(); + } + @SuppressWarnings("resource") @Test - public void testAvailable() throws Exception { + public void testAvailableAfterClose() throws Exception { final InputStream shadow; - try (InputStream in = ChecksumInputStream.builder().setCharSequence("Hi").get()) { + try (InputStream in = createInputStream()) { assertTrue(in.available() > 0); shadow = in; } assertEquals(0, shadow.available()); } + @Test + public void testAvailableAfterOpen() throws Exception { + try (InputStream in = createInputStream()) { + assertTrue(in.available() > 0); + assertEquals('H', in.read()); + assertTrue(in.available() > 0); + } + } + @Test public void testDefaultThresholdFailure() throws IOException { final byte[] byteArray = new byte[3]; @@ -94,6 +108,17 @@ public class ChecksumInputStreamTest { } } + @SuppressWarnings("resource") + @Test + public void testReadAfterClose() throws Exception { + final InputStream shadow; + try (InputStream in = createInputStream()) { + assertTrue(in.available() > 0); + shadow = in; + } + assertEquals(IOUtils.EOF, shadow.read()); + } + @Test public void testReadTakingByteArrayThrowsException() throws IOException { final Adler32 adler32 = new Adler32(); diff --git a/src/test/java/org/apache/commons/io/input/CircularInputStreamTest.java b/src/test/java/org/apache/commons/io/input/CircularInputStreamTest.java index 282ad06ea..c3a98f95d 100644 --- a/src/test/java/org/apache/commons/io/input/CircularInputStreamTest.java +++ b/src/test/java/org/apache/commons/io/input/CircularInputStreamTest.java @@ -49,28 +49,25 @@ public class CircularInputStreamTest { @SuppressWarnings("resource") @Test - public void testAvailable() throws Exception { + public void testAvailableAfterClose() throws Exception { final InputStream shadow; - try (InputStream in = createInputStream(new byte[] { 1, 2 }, 1)) { + try (InputStream in = createInputStream(new byte[] { 1, 2 }, 4)) { assertTrue(in.available() > 0); + assertEquals(1, in.read()); + assertEquals(2, in.read()); + assertEquals(1, in.read()); shadow = in; } assertEquals(0, shadow.available()); } - @SuppressWarnings("resource") @Test - public void testAvailableAfterClose() throws Exception { - final InputStream shadow; - try (InputStream in = createInputStream(new byte[] { 1, 2 }, 4)) { + public void testAvailableAfterOpen() throws Exception { + try (InputStream in = createInputStream(new byte[] { 1, 2 }, 1)) { assertTrue(in.available() > 0); assertEquals(1, in.read()); - assertEquals(2, in.read()); - assertEquals(1, in.read()); - shadow = in; + assertTrue(in.available() > 0); } - assertEquals(0, shadow.available()); - assertEquals(IOUtils.EOF, shadow.read()); } @Test @@ -117,6 +114,20 @@ public class CircularInputStreamTest { assertThrows(NullPointerException.class, () -> createInputStream(null, 0)); } + @SuppressWarnings("resource") + @Test + public void testReaderAfterClose() throws Exception { + final InputStream shadow; + try (InputStream in = createInputStream(new byte[] { 1, 2 }, 4)) { + assertTrue(in.available() > 0); + assertEquals(1, in.read()); + assertEquals(2, in.read()); + assertEquals(1, in.read()); + shadow = in; + } + assertEquals(IOUtils.EOF, shadow.read()); + } + @Test public void testWholeRangeOfBytes() throws IOException { final int size = Byte.MAX_VALUE - Byte.MIN_VALUE + 1;