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
18ab762bb740405d0fefcccf4a0899a234f995be13Narayan Kamathpackage org.apache.harmony.tests.java.io;
19cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
20cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport junit.framework.TestSuite;
21cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport org.apache.harmony.testframework.SinkTester;
22cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport org.apache.harmony.testframework.WrapperTester;
23cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport tests.support.Streams;
24cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
25cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.BufferedOutputStream;
26cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ByteArrayInputStream;
27cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ByteArrayOutputStream;
28cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.DataOutputStream;
29cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.File;
30cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.FileInputStream;
31cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.FileOutputStream;
32cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.FilterOutputStream;
33cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.IOException;
34cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ObjectInputStream;
35cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ObjectOutputStream;
36cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.OutputStream;
37cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.PipedInputStream;
38cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.PipedOutputStream;
39cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.PrintStream;
40cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.concurrent.Callable;
41cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.concurrent.ExecutorService;
42cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.concurrent.Executors;
43cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.concurrent.Future;
44cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
45cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath/**
46cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath * Tests basic {@link OutputStream} behaviors for the luni implementations of
47cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath * the type.
48cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath */
49cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathpublic class OutputStreamTesterTest {
50cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
51ab762bb740405d0fefcccf4a0899a234f995be13Narayan Kamath    // TODO: Rewrite this test so that id doesn't need a suite().
52ab762bb740405d0fefcccf4a0899a234f995be13Narayan Kamath    private static junit.framework.Test suite() {
53cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        TestSuite suite = new TestSuite();
54cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
55cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // sink tests
56cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new FileOutputStreamSinkTester(true).createTests());
57cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new FileOutputStreamSinkTester(false).createTests());
58cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new ByteArrayOutputStreamSinkTester(0).setThrowsExceptions(false).createTests());
59cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new ByteArrayOutputStreamSinkTester(4).setThrowsExceptions(false).createTests());
60cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new PipedOutputStreamSinkTester().createTests());
61cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
62cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // wrapper tests
63cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new BufferedOutputStreamTester(1).createTests());
64cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new BufferedOutputStreamTester(5).createTests());
65cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new BufferedOutputStreamTester(1024).createTests());
66cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new FilterOutputStreamTester().createTests());
67cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new DataOutputStreamTester().createTests());
68cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // fails wrapperTestFlushThrowsViaClose() and sinkTestWriteAfterClose():
69cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // suite.addTest(new ObjectOutputStreamTester().createTests());
70cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        suite.addTest(new PrintStreamTester().setThrowsExceptions(false).createTests());
71cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
72cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        return suite;
73cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
74cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
75cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static class FileOutputStreamSinkTester extends SinkTester {
76cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
77cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private final boolean append;
78cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private File file;
79cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
80cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private FileOutputStreamSinkTester(boolean append) {
81cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            this.append = append;
82cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
83cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
84cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public OutputStream create() throws IOException {
85cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            file = File.createTempFile("FileOutputStreamSinkTester", "tmp");
86cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            file.deleteOnExit();
87cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return new FileOutputStream(file, append);
88cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
89cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
90cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public byte[] getBytes() throws IOException {
91cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return Streams.streamToBytes(new FileInputStream(file));
92cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
93cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
94cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
95cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static class ByteArrayOutputStreamSinkTester extends SinkTester {
96cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
97cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private final int size;
98cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private ByteArrayOutputStream stream;
99cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
100cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private ByteArrayOutputStreamSinkTester(int size) {
101cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            this.size = size;
102cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
103cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
104cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public OutputStream create() throws IOException {
105cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            stream = new ByteArrayOutputStream(size);
106cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return stream;
107cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
108cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
109cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public byte[] getBytes() throws IOException {
110cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return stream.toByteArray();
111cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
112cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
113cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
114cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static class PipedOutputStreamSinkTester extends SinkTester {
115cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
116cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private ExecutorService executor;
117cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private Future<byte[]> future;
118cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
119cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public OutputStream create() throws IOException {
120cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            final PipedInputStream in = new PipedInputStream();
121cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            PipedOutputStream out = new PipedOutputStream(in);
122cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
123cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            executor = Executors.newSingleThreadExecutor();
124cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            future = executor.submit(new Callable<byte[]>() {
125cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                final ByteArrayOutputStream bytes = new ByteArrayOutputStream();
126cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
127cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                public byte[] call() throws Exception {
128cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    byte[] buffer = new byte[256];
129cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    int count;
130cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    while ((count = in.read(buffer)) != -1) {
131cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                        bytes.write(buffer, 0, count);
132cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    }
133cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    return bytes.toByteArray();
134cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                }
135cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            });
136cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
137cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return out;
138cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
139cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
140cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public byte[] getBytes() throws Exception {
141cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            executor.shutdown();
142cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return future.get();
143cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
144cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
145cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
146cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static class FilterOutputStreamTester extends WrapperTester {
147cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
148cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public OutputStream create(OutputStream delegate) throws Exception {
149cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return new FilterOutputStream(delegate);
150cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
151cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
152cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public byte[] decode(byte[] delegateBytes) throws Exception {
153cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return delegateBytes;
154cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
155cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
156cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
157cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static class BufferedOutputStreamTester extends WrapperTester {
158cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private final int bufferSize;
159cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
160cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private BufferedOutputStreamTester(int bufferSize) {
161cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            this.bufferSize = bufferSize;
162cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
163cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
164cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public OutputStream create(OutputStream delegate) throws Exception {
165cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return new BufferedOutputStream(delegate, bufferSize);
166cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
167cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
168cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public byte[] decode(byte[] delegateBytes) throws Exception {
169cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return delegateBytes;
170cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
171cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
172cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
173cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static class DataOutputStreamTester extends WrapperTester {
174cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
175cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public OutputStream create(OutputStream delegate) throws Exception {
176cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return new DataOutputStream(delegate);
177cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
178cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
179cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public byte[] decode(byte[] delegateBytes) throws Exception {
180cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return delegateBytes;
181cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
182cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
183cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
184cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static class ObjectOutputStreamTester extends WrapperTester {
185cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
186cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public OutputStream create(OutputStream delegate) throws Exception {
187cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return new ObjectOutputStream(delegate);
188cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
189cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
190cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public byte[] decode(byte[] delegateBytes) throws Exception {
191cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return Streams.streamToBytes(new ObjectInputStream(
192cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                    new ByteArrayInputStream(delegateBytes)));
193cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
194cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
195cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
196cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static class PrintStreamTester extends WrapperTester {
197cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
198cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public OutputStream create(OutputStream delegate) throws Exception {
199cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return new PrintStream(delegate);
200cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
201cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
202cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public byte[] decode(byte[] delegateBytes) throws Exception {
203cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return delegateBytes;
204cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
205cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
206cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath}
207