blob: ce4fa0fe7bdd67b14ecd773ec7e58f233d2608bb [file] [log] [blame]
package tests.support;
import java.io.IOException;
import java.io.OutputStream;
/**
* An implementation of {@code OutputStream} that stores the written data in a
* byte array of fixed size. As a special feature, instances of this class can
* be instructed to throw an {@code IOException} whenever a method is called.
* This is used to test the {@code IOException} handling of classes that write
* to an {@code OutputStream}.
*/
public class Support_OutputStream extends OutputStream {
private static final int DEFAULT_BUFFER_SIZE = 32;
private byte[] buffer;
private int position;
private int size;
private boolean throwsException;
public Support_OutputStream() {
this(DEFAULT_BUFFER_SIZE);
}
public Support_OutputStream(boolean throwException) {
this(DEFAULT_BUFFER_SIZE);
throwsException = throwException;
}
public Support_OutputStream(int bufferSize) {
buffer = new byte[bufferSize];
position = 0;
size = bufferSize;
throwsException = false;
}
@Override
public void close() throws IOException {
if (throwsException) {
throw new IOException("Exception thrown for testing purposes.");
}
super.close();
}
@Override
public void flush() throws IOException {
if (throwsException) {
throw new IOException("Exception thrown for testing purposes.");
}
super.flush();
}
@Override
public void write(byte buffer[]) throws IOException {
if (throwsException) {
throw new IOException("Exception thrown for testing purposes.");
}
for (int i = 0; i < buffer.length; i++) {
write(buffer[i]);
}
}
@Override
public void write(byte buffer[], int offset, int count) throws IOException {
if (throwsException) {
throw new IOException("Exception thrown for testing purposes.");
}
if (offset < 0 || count < 0 || (offset + count) > buffer.length) {
throw new IndexOutOfBoundsException();
}
for (int i = offset; i < offset + count; i++) {
write(buffer[i]);
}
}
@Override
public void write(int oneByte) throws IOException {
if (throwsException) {
throw new IOException("Exception thrown for testing purposes.");
}
if (position < size) {
buffer[position] = (byte)(oneByte & 255);
position++;
} else {
throw new IOException("Internal buffer overflow.");
}
}
public byte[] toByteArray() {
byte[] toReturn = new byte[position];
System.arraycopy(buffer, 0, toReturn, 0, position);
return toReturn;
}
public String toString() {
return new String(buffer, 0, position);
}
public int size() {
return position;
}
public void setThrowsException(boolean newValue) {
throwsException = newValue;
}
}