/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.io.input; import static org.junit.Assert.*; import java.io.ByteArrayInputStream; import java.io.IOException; import org.apache.commons.io.input.ObservableInputStream; import org.apache.commons.io.input.ObservableInputStream.Observer; import org.junit.Test; public class ObservableInputStreamTest { private static class LastByteKeepingObserver extends Observer { private int lastByteSeen = -1; private boolean finished; private boolean closed; @Override void data(int pByte) throws IOException { super.data(pByte); lastByteSeen = pByte; } @Override void finished() throws IOException { super.finished(); finished = true; } @Override void closed() throws IOException { super.closed(); closed = true; } } private static class LastBytesKeepingObserver extends Observer { private byte[] buffer = null; private int offset = -1; private int length = -1; @Override void data(byte[] pBuffer, int pOffset, int pLength) throws IOException { super.data(pBuffer, pOffset, pLength); buffer = pBuffer; offset = pOffset; length = pLength; } } /** Tests, that {@link Observer#data(int)} is called. */ @Test public void testDataByteCalled() throws Exception { final byte[] buffer = MessageDigestCalculatingInputStreamTest.generateRandomByteStream(4096); final ObservableInputStream ois = new ObservableInputStream(new ByteArrayInputStream(buffer)); final LastByteKeepingObserver lko = new LastByteKeepingObserver(); assertEquals(-1, lko.lastByteSeen); ois.read(); assertEquals(-1, lko.lastByteSeen); assertFalse(lko.finished); assertFalse(lko.closed); 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); } final int result = ois.read(); assertEquals(-1, result); assertTrue(lko.finished); assertFalse(lko.closed); ois.close(); assertTrue(lko.finished); assertTrue(lko.closed); } /** Tests, that {@link Observer#data(byte[],int,int)} is called. */ @Test public void testDataBytesCalled() throws Exception { final byte[] buffer = MessageDigestCalculatingInputStreamTest.generateRandomByteStream(4096); 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; } else { 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; } else { assertEquals(readBuffer, lko.buffer); assertEquals(1, lko.offset); assertEquals(res, lko.length); } } } } }