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 should serve as the
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * underlying stream for classes to be tested.
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * In particular this implementation allows to have IOExecptions thrown on demand.
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * For simplicity of use and understanding all fields are public.
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Support_ASimpleOutputStream extends OutputStream {
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int DEFAULT_BUFFER_SIZE = 32;
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public byte[] buf;
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int pos;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int size;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Set to true when exception is wanted:
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean throwExceptionOnNextUse = false;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Support_ASimpleOutputStream() {
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_ASimpleOutputStream(boolean throwException) {
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(DEFAULT_BUFFER_SIZE);
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throwExceptionOnNextUse = throwException;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Support_ASimpleOutputStream(int bufferSize) {
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buf = new byte[bufferSize];
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        pos = 0;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        size = bufferSize;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void close() throws IOException {
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (throwExceptionOnNextUse) {
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IOException("Exception thrown for testing purpose.");
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
46f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void flush() throws IOException {
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (throwExceptionOnNextUse) {
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IOException("Exception thrown for testing purpose.");
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//    @Override
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//    public void write(byte buffer[]) throws IOException {
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//        if (throwExceptionOnNextUse) {
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//            throw new IOException("Exception thrown for testing purposes.");
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//        }
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//        for (int i = 0; i < buffer.length; i++) {
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//            write(buffer[i]);
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//        }
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//    }
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//    @Override
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//    public void write(byte buffer[], int offset, int count) throws IOException {
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//        if (throwExceptionOnNextUse) {
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//            throw new IOException("Exception thrown for testing purposes.");
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//        }
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//        if (offset < 0 || count < 0 || (offset + count) > buffer.length) {
70f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes//            throw new IndexOutOfBoundsException();
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//        }
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//        for (int i = offset; i < offset + count; i++) {
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//            write(buffer[i]);
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//        }
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//    }
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void write(int oneByte) throws IOException {
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (throwExceptionOnNextUse) {
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IOException("Exception thrown for testing purpose.");
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (pos < size) {
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            buf[pos] = (byte)(oneByte & 255);
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            pos++;
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IOException("Internal buffer overflow.");
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public byte[] toByteArray() {
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] toReturn = new byte[pos];
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        System.arraycopy(buf, 0, toReturn, 0, pos);
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return toReturn;
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new String(buf, 0, pos);
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
100