More precise testing.
MODIFY
src/test/java/org/apache/commons/io/input/ObservableInputStreamTest.java
src/test/java/org/apache/commons/io/input/ObservableInputStreamTest.java
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;
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++;
}
- private static class LastBytesKeepingObserver extends Observer {
- private byte[] buffer;
- private int offset = -1;
- private int length = -1;
+ public long getTotal() {
+ return total;
+ }
+ }
+
+ 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 void data(final byte[] buffer, final int offset, final int length) throws
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 void testDataByteCalled_add() throws Exception {
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,14 +195,14 @@ public void testDataByteCalled_ctor() throws Exception {
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();
+ 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, lko.buffer);
+ assertEquals(null, observer.buffer);
ois.read(readBuffer);
- assertEquals(null, lko.buffer);
- ois.add(lko);
+ assertEquals(null, observer.buffer);
+ ois.add(observer);
for (;;) {
if (bais.available() >= 2048) {
final int result = ois.read(readBuffer);
@@ -149,9 +210,9 @@ public void testDataBytesCalled() throws Exception {
ois.close();
break;
}
- assertEquals(readBuffer, lko.buffer);
- assertEquals(0, lko.offset);
- assertEquals(readBuffer.length, lko.length);
+ 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);
@@ -159,17 +220,68 @@ public void testDataBytesCalled() throws Exception {
ois.close();
break;
}
- assertEquals(readBuffer, lko.buffer);
- assertEquals(1, lko.offset);
- assertEquals(res, lko.length);
+ assertEquals(readBuffer, observer.buffer);
+ assertEquals(1, observer.offset);
+ assertEquals(res, observer.length);
+ }
+ }
+ }
+ }
+
+ @Test
+ 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 testGetObservers() {
- final LastBytesKeepingObserver observer = new LastBytesKeepingObserver();
- final ObservableInputStream ois = new ObservableInputStream(new NullInputStream(), observer);
- assertEquals(observer, ois.getObservers().get(0));
+ public void testNotificationCallbacksBufferSizeDefault() throws Exception {
+ testNotificationCallbacks(IOUtils.DEFAULT_BUFFER_SIZE);
}
}

More precise testing.