1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage tests.support; 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.OutputStream; 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * An implementation of {@code OutputStream} that stores the written data in a 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * byte array of fixed size. As a special feature, instances of this class can 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be instructed to throw an {@code IOException} whenever a method is called. 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This is used to test the {@code IOException} handling of classes that write 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to an {@code OutputStream}. 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Support_OutputStream extends OutputStream { 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final int DEFAULT_BUFFER_SIZE = 32; 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private byte[] buffer; 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int position; 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int size; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean throwsException; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Support_OutputStream() { 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(DEFAULT_BUFFER_SIZE); 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Support_OutputStream(boolean throwException) { 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(DEFAULT_BUFFER_SIZE); 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwsException = throwException; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Support_OutputStream(int bufferSize) { 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer = new byte[bufferSize]; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = 0; 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project size = bufferSize; 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwsException = false; 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void close() throws IOException { 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (throwsException) { 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IOException("Exception thrown for testing purposes."); 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super.close(); 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 48f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void flush() throws IOException { 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (throwsException) { 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IOException("Exception thrown for testing purposes."); 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super.flush(); 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void write(byte buffer[]) throws IOException { 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (throwsException) { 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IOException("Exception thrown for testing purposes."); 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < buffer.length; i++) { 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project write(buffer[i]); 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void write(byte buffer[], int offset, int count) throws IOException { 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (throwsException) { 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IOException("Exception thrown for testing purposes."); 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (offset < 0 || count < 0 || (offset + count) > buffer.length) { 73f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes throw new IndexOutOfBoundsException(); 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = offset; i < offset + count; i++) { 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project write(buffer[i]); 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void write(int oneByte) throws IOException { 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (throwsException) { 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IOException("Exception thrown for testing purposes."); 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (position < size) { 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buffer[position] = (byte)(oneByte & 255); 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position++; 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IOException("Internal buffer overflow."); 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte[] toByteArray() { 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] toReturn = new byte[position]; 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(buffer, 0, toReturn, 0, position); 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return toReturn; 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString() { 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new String(buffer, 0, position); 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 102f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int size() { 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return position; 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setThrowsException(boolean newValue) { 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwsException = newValue; 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 111