blob: d74af27ebfbe120bd879276888b2dbab94d4c0d9 [file] [log] [blame]
/*
* 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);
}
}
}
}
}