1e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes/*
2e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
3e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
4e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  this work for additional information regarding copyright ownership.
5e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
6e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  (the "License"); you may not use this file except in compliance with
7e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  the License.  You may obtain a copy of the License at
8e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *
9e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *
11e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  Unless required by applicable law or agreed to in writing, software
12e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
13e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  See the License for the specific language governing permissions and
15e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes *  limitations under the License.
16e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes */
17e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
18e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughespackage org.apache.harmony.testframework;
19e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
20e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport junit.framework.Assert;
21e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport junit.framework.TestCase;
22e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport junit.framework.TestSuite;
23e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
24e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.IOException;
25e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.io.OutputStream;
26e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.util.Arrays;
27e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughesimport java.util.Random;
28e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
29e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes/**
30e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * Tests behaviour common to all implementations of {@link OutputStream}. This
31e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * adapts streams that collects untransformed bytes so that they may be tested.
32e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes */
33e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughespublic abstract class SinkTester {
34e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
35e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    private boolean throwsExceptions = true;
36e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
37e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
38e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Creates a new output stream ready to receive an arbitrary number of
39e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * bytes. Each time this method is invoked, any previously returned output
40e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * streams may be discarded.
41e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
42e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public abstract OutputStream create() throws Exception;
43e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
44e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
45e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Returns the current set of bytes written to the output stream last
46e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * returned by {@link #create}, and releases any resources held by that
47e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * stream.
48e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
49e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public abstract byte[] getBytes() throws Exception;
50e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
51e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    /**
52e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * Configures whether the stream is expected to throw exceptions when an
53e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * error is encountered. Classes like {@code PrintStream} report errors via
54e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * an API method instead.
55e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     */
56e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public SinkTester setThrowsExceptions(boolean throwsExceptions) {
57e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        this.throwsExceptions = throwsExceptions;
58e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        return this;
59e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
60e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
61e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public final TestSuite createTests() {
62e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        TestSuite result = new TestSuite();
63e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        result.addTest(new SinkTestCase("sinkTestNoWriting"));
64e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        result.addTest(new SinkTestCase("sinkTestWriteZeroBytes"));
65e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        result.addTest(new SinkTestCase("sinkTestWriteByteByByte"));
66e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        result.addTest(new SinkTestCase("sinkTestWriteArray"));
67e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        result.addTest(new SinkTestCase("sinkTestWriteOffset"));
68e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        result.addTest(new SinkTestCase("sinkTestWriteLargeArray"));
69e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
70e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        if (throwsExceptions) {
71e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            result.addTest(new SinkTestCase("sinkTestWriteAfterClose"));
72e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        } else {
73e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            result.addTest(new SinkTestCase("sinkTestWriteAfterCloseSuppressed"));
74e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
75e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
76e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        return result;
77e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
78e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    @Override
808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public String toString() {
81e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        return getClass().getName();
82e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
83e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
84e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    private static void assertArrayEquals(byte[] expected, byte[] actual) {
85e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        Assert.assertEquals(Arrays.toString(expected), Arrays.toString(actual));
86e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
87e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
88e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    public class SinkTestCase extends TestCase {
89e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
90e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        private SinkTestCase(String name) {
91e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            super(name);
92e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
93e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
94e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        public void sinkTestNoWriting() throws Exception {
958d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            byte[] expected = new byte[] { };
96e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
97e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            OutputStream out = create();
98e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.close();
99e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            assertArrayEquals(expected, getBytes());
100e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
101e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
102e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        public void sinkTestWriteZeroBytes() throws Exception {
1038d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            byte[] expected = new byte[] { };
104e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
105e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            OutputStream out = create();
106e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            byte[] a = new byte[1024];
107e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.write(a, 1000, 0);
108e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.write(a, 0, 0);
1098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            out.write(new byte[] { });
110e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
111e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.close();
112e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            assertArrayEquals(expected, getBytes());
113e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
114e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
115e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        public void sinkTestWriteByteByByte() throws Exception {
116e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            byte[] expected = new byte[] { 5, 6, 7, 3, 4, 5, 3, 2, 1 };
117e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
118e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            OutputStream out = create();
119e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            for (byte b : expected) {
120e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                out.write(b);
121e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            }
122e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
123e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.close();
124e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            assertArrayEquals(expected, getBytes());
125e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
126e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
127e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        public void sinkTestWriteArray() throws Exception {
128e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            byte[] expected = new byte[] {
129e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                    5, 6,
130e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                    7, 3, 4, 5,
131e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                    3, 2, 1
132e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            };
133e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
134e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            OutputStream out = create();
135e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
136e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            byte[] a = new byte[] { 5, 6 };
137e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.write(a);
138e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
139e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            byte[] b = new byte[] { 7, 3, 4, 5 };
140e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.write(b);
141e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
142e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            byte[] c = new byte[] { 3, 2, 1 };
143e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.write(c);
144e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
145e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.close();
146e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            assertArrayEquals(expected, getBytes());
147e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
148e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
149e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        public void sinkTestWriteOffset() throws Exception {
150e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            byte[] expected = new byte[] {
151e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                    5, 6,
152e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                    7, 3, 4, 5,
153e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                    3, 2, 1
154e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            };
155e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
156e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            OutputStream out = create();
157e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
158e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            byte[] a = new byte[1024];
159e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            a[1000] = 5;
160e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            a[1001] = 6;
161e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.write(a, 1000, 2);
162e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
163e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            byte[] b = new byte[1024];
164e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            b[1020] = 7;
165e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            b[1021] = 3;
166e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            b[1022] = 4;
167e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            b[1023] = 5;
168e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.write(b, 1020, 4);
169e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
170e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            byte[] c = new byte[1024];
171e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            c[0] = 3;
172e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            c[1] = 2;
173e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            c[2] = 1;
174e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.write(c, 0, 3);
175e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
176e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.close();
177e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            assertArrayEquals(expected, getBytes());
178e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
179e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
180e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        public void sinkTestWriteLargeArray() throws Exception {
181e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            byte[] expected = new byte[(1024 * 1024) + 1]; // 1 MB + 1 byte
182e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            new Random().nextBytes(expected);
183e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
184e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            OutputStream out = create();
185e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.write(expected);
186e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.close();
187e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
188e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            assertArrayEquals(expected, getBytes());
189e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
190e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
191e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        public void sinkTestWriteAfterClose() throws Exception {
192e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            byte[] expectedBytes = { 5, 6 };
193e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            OutputStream out = create();
194e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
195e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.write(expectedBytes);
196e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.close();
197e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
198e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            try {
199e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                out.write(new byte[] { 7, 3, 4, 5 });
200e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes                fail("expected already closed exception");
201e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            } catch (IOException expected) {
202e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            }
203e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
204e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            assertArrayEquals(expectedBytes, getBytes());
205e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
206e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
207e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        public void sinkTestWriteAfterCloseSuppressed() throws Exception {
208e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            OutputStream out = create();
209e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.write(new byte[] { 5, 6 });
210e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.close();
211e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            out.write(new byte[] { 7, 3, 4, 5 }); // no exception expected!
212e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
213e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
214e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        // adding a new test? Don't forget to update createTests().
215e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes
2168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        @Override
2178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        public String getName() {
218e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes            return SinkTester.this.toString() + ":" + super.getName();
219e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes        }
220e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes    }
221e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes}
222