/* | |
* 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); | |
} | |
} | |
} | |
} | |
} |