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 b193176b952233e9346aed695da32f5f50267e0e Author: Gary Gregory <gardgreg...@gmail.com> AuthorDate: Mon Feb 1 10:29:09 2021 -0500 More precise testing. --- .../io/input/ObservableInputStreamTest.java | 256 +++++++++++++++------ 1 file changed, 184 insertions(+), 72 deletions(-) diff --git a/src/test/java/org/apache/commons/io/input/ObservableInputStreamTest.java b/src/test/java/org/apache/commons/io/input/ObservableInputStreamTest.java index 152c866..c619163 100644 --- a/src/test/java/org/apache/commons/io/input/ObservableInputStreamTest.java +++ b/src/test/java/org/apache/commons/io/input/ObservableInputStreamTest.java @@ -17,7 +17,6 @@ package org.apache.commons.io.input; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -26,42 +25,104 @@ import java.io.IOException; import org.apache.commons.io.IOUtils; import org.apache.commons.io.input.ObservableInputStream.Observer; +import org.apache.commons.io.output.NullOutputStream; import org.junit.jupiter.api.Test; +/** + * Tests {@link ObservableInputStream}. + */ public class ObservableInputStreamTest { - private static class LastByteKeepingObserver extends Observer { - private int lastByteSeen = -1; - private boolean finished; - private boolean closed; + private static class DataViewObserver extends MethodCountObserver { + private byte[] buffer; + private int lastValue = -1; + private int length = -1; + private int offset = -1; @Override - public void closed() throws IOException { - closed = true; + public void data(final byte[] buffer, final int offset, final int length) throws IOException { + this.buffer = buffer; + this.offset = offset; + this.length = length; } @Override public void data(final int value) throws IOException { - lastByteSeen = value; + super.data(value); + lastValue = value; } + } + + private static class LengthObserver extends Observer { + private long total; @Override - public void finished() throws IOException { - finished = true; + public void data(final byte[] buffer, final int offset, final int length) throws IOException { + this.total += length; + } + + @Override + public void data(int value) throws IOException { + total++; + } + + public long getTotal() { + return total; } } - private static class LastBytesKeepingObserver extends Observer { - private byte[] buffer; - private int offset = -1; - private int length = -1; + private static class MethodCountObserver extends Observer { + private long closedCount; + private long dataBufferCount; + private long dataCount; + private long errorCount; + private long finishedCount; + + @Override + public void closed() throws IOException { + closedCount++; + } @Override public void data(final byte[] buffer, final int offset, final int length) throws IOException { - this.buffer = buffer; - this.offset = offset; - this.length = length; + dataBufferCount++; } + + @Override + public void data(int value) throws IOException { + dataCount++; + } + + @Override + public void error(IOException exception) throws IOException { + errorCount++; + } + + @Override + public void finished() throws IOException { + finishedCount++; + } + + public long getClosedCount() { + return closedCount; + } + + public long getDataBufferCount() { + return dataBufferCount; + } + + public long getDataCount() { + return dataCount; + } + + public long getErrorCount() { + return errorCount; + } + + public long getFinishedCount() { + return finishedCount; + } + } /** @@ -71,28 +132,28 @@ public class ObservableInputStreamTest { public void testDataByteCalled_add() throws Exception { final byte[] buffer = MessageDigestCalculatingInputStreamTest .generateRandomByteStream(IOUtils.DEFAULT_BUFFER_SIZE); - final LastByteKeepingObserver lko = new LastByteKeepingObserver(); + final DataViewObserver lko = new DataViewObserver(); try (final ObservableInputStream ois = new ObservableInputStream(new ByteArrayInputStream(buffer))) { - assertEquals(-1, lko.lastByteSeen); + assertEquals(-1, lko.lastValue); ois.read(); - assertEquals(-1, lko.lastByteSeen); - assertFalse(lko.finished); - assertFalse(lko.closed); + assertEquals(-1, lko.lastValue); + assertEquals(0, lko.getFinishedCount()); + assertEquals(0, lko.getClosedCount()); ois.add(lko); for (int i = 1; i < buffer.length; i++) { final int result = ois.read(); assertEquals((byte) result, buffer[i]); - assertEquals(result, lko.lastByteSeen); - assertFalse(lko.finished); - assertFalse(lko.closed); + assertEquals(result, lko.lastValue); + assertEquals(0, lko.getFinishedCount()); + assertEquals(0, lko.getClosedCount()); } final int result = ois.read(); assertEquals(-1, result); - assertTrue(lko.finished); - assertFalse(lko.closed); + assertEquals(1, lko.getFinishedCount()); + assertEquals(0, lko.getClosedCount()); ois.close(); - assertTrue(lko.finished); - assertTrue(lko.closed); + assertEquals(1, lko.getFinishedCount()); + assertEquals(1, lko.getClosedCount()); } } @@ -103,27 +164,27 @@ public class ObservableInputStreamTest { public void testDataByteCalled_ctor() throws Exception { final byte[] buffer = MessageDigestCalculatingInputStreamTest .generateRandomByteStream(IOUtils.DEFAULT_BUFFER_SIZE); - final LastByteKeepingObserver lko = new LastByteKeepingObserver(); + final DataViewObserver lko = new DataViewObserver(); try (final ObservableInputStream ois = new ObservableInputStream(new ByteArrayInputStream(buffer), lko)) { - assertEquals(-1, lko.lastByteSeen); + assertEquals(-1, lko.lastValue); ois.read(); - assertNotEquals(-1, lko.lastByteSeen); - assertFalse(lko.finished); - assertFalse(lko.closed); + assertNotEquals(-1, lko.lastValue); + assertEquals(0, lko.getFinishedCount()); + assertEquals(0, lko.getClosedCount()); for (int i = 1; i < buffer.length; i++) { final int result = ois.read(); assertEquals((byte) result, buffer[i]); - assertEquals(result, lko.lastByteSeen); - assertFalse(lko.finished); - assertFalse(lko.closed); + assertEquals(result, lko.lastValue); + assertEquals(0, lko.getFinishedCount()); + assertEquals(0, lko.getClosedCount()); } final int result = ois.read(); assertEquals(-1, result); - assertTrue(lko.finished); - assertFalse(lko.closed); + assertEquals(1, lko.getFinishedCount()); + assertEquals(0, lko.getClosedCount()); ois.close(); - assertTrue(lko.finished); - assertTrue(lko.closed); + assertEquals(1, lko.getFinishedCount()); + assertEquals(1, lko.getClosedCount()); } } @@ -134,42 +195,93 @@ public class ObservableInputStreamTest { public void testDataBytesCalled() throws Exception { final byte[] buffer = MessageDigestCalculatingInputStreamTest .generateRandomByteStream(IOUtils.DEFAULT_BUFFER_SIZE); - final ByteArrayInputStream bais = new ByteArrayInputStream(buffer); - final ObservableInputStream ois = new ObservableInputStream(bais); - final LastBytesKeepingObserver lko = new LastBytesKeepingObserver(); - final byte[] readBuffer = new byte[23]; - assertEquals(null, lko.buffer); - ois.read(readBuffer); - assertEquals(null, lko.buffer); - ois.add(lko); - for (;;) { - if (bais.available() >= 2048) { - final int result = ois.read(readBuffer); - if (result == -1) { - ois.close(); - break; - } - assertEquals(readBuffer, lko.buffer); - assertEquals(0, lko.offset); - assertEquals(readBuffer.length, lko.length); - } else { - final int res = Math.min(11, bais.available()); - final int result = ois.read(readBuffer, 1, 11); - if (result == -1) { - ois.close(); - break; + try (final ByteArrayInputStream bais = new ByteArrayInputStream(buffer); + final ObservableInputStream ois = new ObservableInputStream(bais)) { + final DataViewObserver observer = new DataViewObserver(); + final byte[] readBuffer = new byte[23]; + assertEquals(null, observer.buffer); + ois.read(readBuffer); + assertEquals(null, observer.buffer); + ois.add(observer); + for (;;) { + if (bais.available() >= 2048) { + final int result = ois.read(readBuffer); + if (result == -1) { + ois.close(); + break; + } + assertEquals(readBuffer, observer.buffer); + assertEquals(0, observer.offset); + assertEquals(readBuffer.length, observer.length); + } else { + final int res = Math.min(11, bais.available()); + final int result = ois.read(readBuffer, 1, 11); + if (result == -1) { + ois.close(); + break; + } + assertEquals(readBuffer, observer.buffer); + assertEquals(1, observer.offset); + assertEquals(res, observer.length); } - assertEquals(readBuffer, lko.buffer); - assertEquals(1, lko.offset); - assertEquals(res, lko.length); } } } @Test - public void testGetObservers() { - final LastBytesKeepingObserver observer = new LastBytesKeepingObserver(); - final ObservableInputStream ois = new ObservableInputStream(new NullInputStream(), observer); - assertEquals(observer, ois.getObservers().get(0)); + public void testGetObservers0() throws IOException { + try (final ObservableInputStream ois = new ObservableInputStream(new NullInputStream())) { + assertTrue(ois.getObservers().isEmpty()); + } + } + + @Test + public void testGetObservers1() throws IOException { + final DataViewObserver observer0 = new DataViewObserver(); + try (final ObservableInputStream ois = new ObservableInputStream(new NullInputStream(), observer0)) { + assertEquals(observer0, ois.getObservers().get(0)); + } + } + + @Test + public void testGetObserversOrder() throws IOException { + final DataViewObserver observer0 = new DataViewObserver(); + final DataViewObserver observer1 = new DataViewObserver(); + try (final ObservableInputStream ois = new ObservableInputStream(new NullInputStream(), observer0, observer1)) { + assertEquals(observer0, ois.getObservers().get(0)); + assertEquals(observer1, ois.getObservers().get(1)); + } + } + + private void testNotificationCallbacks(final int bufferSize) throws IOException { + final byte[] buffer = new byte[IOUtils.DEFAULT_BUFFER_SIZE]; + final LengthObserver lengthObserver = new LengthObserver(); + final MethodCountObserver methodCountObserver = new MethodCountObserver(); + try (final ObservableInputStream ois = new ObservableInputStream(new ByteArrayInputStream(buffer), + lengthObserver, methodCountObserver)) { + assertEquals(IOUtils.DEFAULT_BUFFER_SIZE, + IOUtils.copy(ois, NullOutputStream.NULL_OUTPUT_STREAM, bufferSize)); + } + assertEquals(IOUtils.DEFAULT_BUFFER_SIZE, lengthObserver.getTotal()); + assertEquals(1, methodCountObserver.getClosedCount()); + assertEquals(1, methodCountObserver.getFinishedCount()); + assertEquals(0, methodCountObserver.getErrorCount()); + assertEquals(0, methodCountObserver.getDataCount()); + assertEquals(buffer.length / bufferSize, methodCountObserver.getDataBufferCount()); + } + + @Test + public void testNotificationCallbacksBufferSize1() throws Exception { + testNotificationCallbacks(1); + } + + @Test + public void testNotificationCallbacksBufferSize2() throws Exception { + testNotificationCallbacks(2); + } + + @Test + public void testNotificationCallbacksBufferSizeDefault() throws Exception { + testNotificationCallbacks(IOUtils.DEFAULT_BUFFER_SIZE); } }