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