package tests.support; import java.io.IOException; import java.io.OutputStream; /** * An implementation of {@code OutputStream} that should serve as the * underlying stream for classes to be tested. * In particular this implementation allows to have IOExecptions thrown on demand. * For simplicity of use and understanding all fields are public. */ public class Support_ASimpleOutputStream extends OutputStream { public static final int DEFAULT_BUFFER_SIZE = 32; public byte[] buf; public int pos; public int size; // Set to true when exception is wanted: public boolean throwExceptionOnNextUse = false; public Support_ASimpleOutputStream() { this(DEFAULT_BUFFER_SIZE); } public Support_ASimpleOutputStream(boolean throwException) { this(DEFAULT_BUFFER_SIZE); throwExceptionOnNextUse = throwException; } public Support_ASimpleOutputStream(int bufferSize) { buf = new byte[bufferSize]; pos = 0; size = bufferSize; } @Override public void close() throws IOException { if (throwExceptionOnNextUse) { throw new IOException("Exception thrown for testing purpose."); } } @Override public void flush() throws IOException { if (throwExceptionOnNextUse) { throw new IOException("Exception thrown for testing purpose."); } } // @Override // public void write(byte buffer[]) throws IOException { // if (throwExceptionOnNextUse) { // 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 (throwExceptionOnNextUse) { // 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 (throwExceptionOnNextUse) { throw new IOException("Exception thrown for testing purpose."); } if (pos < size) { buf[pos] = (byte)(oneByte & 255); pos++; } else { throw new IOException("Internal buffer overflow."); } } public byte[] toByteArray() { byte[] toReturn = new byte[pos]; System.arraycopy(buf, 0, toReturn, 0, pos); return toReturn; } public String toString() { return new String(buf, 0, pos); } }