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