1935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson/*
2935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  Licensed to the Apache Software Foundation (ASF) under one or more
3935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  contributor license agreements.  See the NOTICE file distributed with
4935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  this work for additional information regarding copyright ownership.
5935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  The ASF licenses this file to You under the Apache License, Version 2.0
6935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  (the "License"); you may not use this file except in compliance with
7935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  the License.  You may obtain a copy of the License at
8935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *
9935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
10935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *
11935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  Unless required by applicable law or agreed to in writing, software
12935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  distributed under the License is distributed on an "AS IS" BASIS,
13935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  See the License for the specific language governing permissions and
15935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson *  limitations under the License.
16935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson */
17935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
18935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonpackage libcore.java.io;
19935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
20935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport java.io.ByteArrayInputStream;
21935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport java.io.ByteArrayOutputStream;
22935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport java.io.FileInputStream;
23935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport java.io.FileOutputStream;
24935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport java.io.IOException;
25935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport java.io.NotActiveException;
26935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport java.io.ObjectInputStream;
27935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport java.io.ObjectOutputStream;
28935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport java.io.OutputStream;
29935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport java.io.Serializable;
30935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport junit.framework.TestCase;
31935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport tests.support.Support_ASimpleOutputStream;
32935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonimport tests.support.Support_OutputStream;
33935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
34935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilsonpublic class OldObjectOutputStreamTest extends TestCase implements Serializable {
35935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
36935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    static final long serialVersionUID = 1L;
37935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
38935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    java.io.File f;
39935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
40935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    public class SerializableTestHelper implements Serializable {
41935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        public String aField1;
42935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
43935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        public String aField2;
44935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
45935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        SerializableTestHelper(String s, String t) {
46935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            aField1 = s;
47935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            aField2 = t;
48935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
49935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
50935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        private void readObject(ObjectInputStream ois) throws IOException {
51935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // note aField2 is not read
52935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            try {
53935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                ObjectInputStream.GetField fields = ois.readFields();
54935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                aField1 = (String) fields.get("aField1", "Zap");
55935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            } catch (Exception e) {
56935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            }
57935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
58935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
59935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        private void writeObject(ObjectOutputStream oos) throws IOException {
60935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // note aField2 is not written
61935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            ObjectOutputStream.PutField fields = oos.putFields();
62935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fields.put("aField1", aField1);
63935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            oos.writeFields();
64935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
65935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
66935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        public String getText1() {
67935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            return aField1;
68935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
69935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
70935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        public String getText2() {
71935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            return aField2;
72935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
73935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
74935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
75935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    private static class BasicObjectOutputStream extends ObjectOutputStream {
76935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        public boolean writeStreamHeaderCalled;
77935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
78935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        public BasicObjectOutputStream() throws IOException, SecurityException {
79935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            super();
80935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            writeStreamHeaderCalled = false;
81935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
82935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
83935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        public BasicObjectOutputStream(OutputStream output) throws IOException {
84935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            super(output);
85935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
86935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
87935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        public void drain() throws IOException {
88935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            super.drain();
89935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
90935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
91935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        public boolean enableReplaceObject(boolean enable)
92935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                throws SecurityException {
93935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            return super.enableReplaceObject(enable);
94935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
95935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
96935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        public void writeObjectOverride(Object object) throws IOException {
97935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            super.writeObjectOverride(object);
98935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
99935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
100935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        public void writeStreamHeader() throws IOException {
101935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            super.writeStreamHeader();
102935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            writeStreamHeaderCalled = true;
103935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
104935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson}
105935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
106935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    private static class NoFlushTestOutputStream extends ByteArrayOutputStream {
107935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        public boolean flushCalled;
108935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
109935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        public NoFlushTestOutputStream() {
110935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            super();
111935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            flushCalled = false;
112935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
113935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
114935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        public void flush() throws IOException {
115935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            super.flush();
116935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            flushCalled = true;
117935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
118935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
119935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
120935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    protected static final String MODE_XLOAD = "xload";
121935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
122935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    protected static final String MODE_XDUMP = "xdump";
123935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
124935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    static final String FOO = "foo";
125935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
126935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    static final String MSG_WITE_FAILED = "Failed to write: ";
127935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
128935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    private static final boolean DEBUG = false;
129935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
130935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    protected static boolean xload = false;
131935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
132935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    protected static boolean xdump = false;
133935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
134935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    protected static String xFileName = null;
135935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
136935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    protected ObjectInputStream ois;
137935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
138935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    protected ObjectOutputStream oos;
139935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
140935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    protected ObjectOutputStream oos_ioe;
141935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
142935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    protected Support_OutputStream sos;
143935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
144935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    protected ByteArrayOutputStream bao;
145935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
146935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    static final int INIT_INT_VALUE = 7;
147935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
148935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    static final String INIT_STR_VALUE = "a string that is blortz";
149935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
150935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    /**
151229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectOutputStream#ObjectOutputStream(java.io.OutputStream)
152935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson     */
153935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    public void test_ConstructorLjava_io_OutputStream() throws IOException {
154935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        oos.close();
155935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        oos = new ObjectOutputStream(new ByteArrayOutputStream());
156935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        oos.close();
157935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
158935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
159935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            oos = new ObjectOutputStream(null);
160935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fail("Test 1: NullPointerException expected.");
161935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } catch (NullPointerException e) {
162935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // Expected.
163935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
164935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
165935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        Support_ASimpleOutputStream sos = new Support_ASimpleOutputStream(true);
166935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
167935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            oos = new ObjectOutputStream(sos);
168935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fail("Test 2: IOException expected.");
169935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } catch (IOException e) {
170935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // Expected.
171935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
172935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
173935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
174935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    public void test_close() throws IOException {
175935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        int outputSize = bao.size();
176935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        // Writing of a primitive type should be buffered.
177935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        oos.writeInt(42);
178935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        assertTrue("Test 1: Primitive data unexpectedly written to the target stream.",
179935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                bao.size() == outputSize);
180935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        // Closing should write the buffered data to the target stream.
181935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        oos.close();
182935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        assertTrue("Test 2: Primitive data has not been written to the the target stream.",
183935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                bao.size() > outputSize);
184935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
185935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
186935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            oos_ioe.close();
187935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fail("Test 3: IOException expected.");
188935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } catch (IOException e) {
189935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // Expected.
190935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
191935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
192935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
193935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    public void test_drain() throws IOException {
194935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        NoFlushTestOutputStream target = new NoFlushTestOutputStream();
195935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        BasicObjectOutputStream boos = new BasicObjectOutputStream(target);
196935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        int initialSize = target.size();
197935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        boolean written = false;
198935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
199935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        boos.writeBytes("Lorem ipsum");
200935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        // If there is no buffer then the bytes have already been written.
201935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        written = (target.size() > initialSize);
202935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
203935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        boos.drain();
204935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        assertTrue("Content has not been written to the target.",
205935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                written || (target.size() > initialSize));
206935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        assertFalse("flush() has been called on the target.",
207935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                target.flushCalled);
208935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
209935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
210935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    public void test_enableReplaceObjectB() throws IOException {
211935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        // Start testing without a SecurityManager.
212935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        BasicObjectOutputStream boos = new BasicObjectOutputStream();
213935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        assertFalse("Test 1: Object resolving must be disabled by default.",
214935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                boos.enableReplaceObject(true));
215935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
216935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        assertTrue("Test 2: enableReplaceObject did not return the previous value.",
217935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                boos.enableReplaceObject(false));
218935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
219935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
220935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    public void test_flush() throws Exception {
221935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        // Test for method void java.io.ObjectOutputStream.flush()
222935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        int size = bao.size();
223935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        oos.writeByte(127);
224935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        assertTrue("Test 1: Data already flushed.", bao.size() == size);
225935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        oos.flush();
226935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        assertTrue("Test 2: Failed to flush data.", bao.size() > size);
227935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
228935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
229935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            oos_ioe.flush();
230935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fail("Test 3: IOException expected.");
231935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } catch (IOException e) {
232935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // Expected.
233935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
234935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
235935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
236935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    public void test_putFields() throws Exception {
237935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        /*
238935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson         * "SerializableTestHelper" is an object created for these tests with
239935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson         * two fields (Strings) and simple implementations of readObject and
240935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson         * writeObject which simply read and write the first field but not the
241935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson         * second one.
242935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson         */
243935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        SerializableTestHelper sth;
244935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
245935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
246935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            oos.putFields();
247935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fail("Test 1: NotActiveException expected.");
248935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } catch (NotActiveException e) {
249935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // Expected.
250935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
251935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
252935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        oos.writeObject(new SerializableTestHelper("Gabba", "Jabba"));
253935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        oos.flush();
254935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
255935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        sth = (SerializableTestHelper) (ois.readObject());
256935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        assertEquals("Test 2: readFields or writeFields failed; first field not set.",
257935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                "Gabba", sth.getText1());
258935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        assertNull("Test 3: readFields or writeFields failed; second field should not have been set.",
259935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                sth.getText2());
260935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
261935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
262935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    public void test_reset() throws Exception {
263935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        String o = "HelloWorld";
264935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        sos = new Support_OutputStream(200);
265935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        oos.close();
266935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        oos = new ObjectOutputStream(sos);
267935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        oos.writeObject(o);
268935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        oos.writeObject(o);
269935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        oos.reset();
270935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        oos.writeObject(o);
271935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
272935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        sos.setThrowsException(true);
273935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
274935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            oos.reset();
275935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fail("Test 1: IOException expected.");
276935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } catch (IOException e) {
277935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // Expected.
278935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
279935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        sos.setThrowsException(false);
280935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
281935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        ois = new ObjectInputStream(new ByteArrayInputStream(sos.toByteArray()));
282935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        assertEquals("Test 2: Incorrect object read.", o, ois.readObject());
283935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        assertEquals("Test 3: Incorrect object read.", o, ois.readObject());
284935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        assertEquals("Test 4: Incorrect object read.", o, ois.readObject());
285935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        ois.close();
286935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
287935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
288935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    public void test_write$BII() throws Exception {
289935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        byte[] buf = new byte[10];
290935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
291935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
292935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            ois.read(buf, 0, -1);
293935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fail("IndexOutOfBoundsException not thrown");
294935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } catch (IndexOutOfBoundsException e) {
295935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // Expected
296935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
297935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
298935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            ois.read(buf, -1, 1);
299935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fail("IndexOutOfBoundsException not thrown");
300935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } catch (IndexOutOfBoundsException e) {
301935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // Expected
302935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
303935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
304935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            ois.read(buf, 10, 1);
305935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fail("IndexOutOfBoundsException not thrown");
306935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } catch (IndexOutOfBoundsException e) {
307935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // Expected
308935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
309935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        ois.close();
310935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
311935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
312935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
313935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    public void test_writeObjectOverrideLjava_lang_Object() throws IOException {
314935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        BasicObjectOutputStream boos =
315935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                new BasicObjectOutputStream(new ByteArrayOutputStream());
316935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
317935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
318935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            boos.writeObjectOverride(new Object());
319935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            fail("IOException expected.");
320935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
321935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        catch (IOException e) {
322935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
323935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        finally {
324935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            boos.close();
325935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
326935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
327935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
328935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    public void test_writeStreamHeader() throws IOException {
329935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        BasicObjectOutputStream boos;
330935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        ByteArrayOutputStream baos = new ByteArrayOutputStream();
331935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        short s;
332935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        byte[] buffer;
333935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
334935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        // Test 1: Make sure that writeStreamHeader() has been called.
335935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        boos = new BasicObjectOutputStream(baos);
336935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
337935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            assertTrue("Test 1: writeStreamHeader() has not been called.",
338935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                         boos.writeStreamHeaderCalled);
339935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
340935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // Test 2: Check that at least four bytes have been written.
341935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            buffer = baos.toByteArray();
342935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            assertTrue("Test 2: At least four bytes should have been written",
343935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                        buffer.length >= 4);
344935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
345935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // Test 3: Check the magic number.
346935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            s = buffer[0];
347935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            s <<= 8;
348935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            s += ((short) buffer[1] & 0x00ff);
349935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            assertEquals("Test 3: Invalid magic number written.",
350935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                        java.io.ObjectStreamConstants.STREAM_MAGIC, s);
351935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
352935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // Test 4: Check the stream version number.
353935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            s = buffer[2];
354935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            s <<= 8;
355935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            s += ((short) buffer[3] & 0x00ff);
356935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            assertEquals("Invalid stream version number written.",
357935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                        java.io.ObjectStreamConstants.STREAM_VERSION, s);
358935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
359935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        finally {
360935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            boos.close();
361935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
362935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
363935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
364935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    /**
365935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson     * Sets up the fixture, for example, open a network connection. This method
366935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson     * is called before a test is executed.
367935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson     */
368935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    protected void setUp() throws Exception {
369935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        super.setUp();
370935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        oos = new ObjectOutputStream(bao = new ByteArrayOutputStream());
371935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        oos_ioe = new ObjectOutputStream(sos = new Support_OutputStream());
372935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        sos.setThrowsException(true);
373935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
374935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
375935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    /**
376935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson     * Tears down the fixture, for example, close a network connection. This
377935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson     * method is called after a test is executed.
378935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson     */
379935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    protected void tearDown() throws Exception {
380935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        super.tearDown();
381935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        if (oos != null) {
382935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            try {
383935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                oos.close();
384935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            } catch (Exception e) {}
385935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
386935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        if (oos_ioe != null) {
387935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            try {
388935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                oos_ioe.close();
389935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            } catch (Exception e) {}
390935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
391935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        if (f != null && f.exists()) {
392935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            if (!f.delete()) {
393935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                fail("Error cleaning up files during teardown");
394935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            }
395935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
396935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
397935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
398935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    protected Object reload() throws IOException, ClassNotFoundException {
399935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
400935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        // Choose the load stream
401935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        if (xload || xdump) {
402935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // Load from pre-existing file
403935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            ois = new ObjectInputStream(new FileInputStream(xFileName + "-"
404935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                    + getName() + ".ser"));
405935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } else {
406935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            // Just load from memory, we dumped to memory
407935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            ois = new ObjectInputStream(new ByteArrayInputStream(bao
408935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                    .toByteArray()));
409935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
410935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
411935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
412935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            return ois.readObject();
413935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } finally {
414935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            ois.close();
415935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
416935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
417935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
418935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    protected void dump(Object o) throws IOException, ClassNotFoundException {
419935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
420935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        // Choose the dump stream
421935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        if (xdump) {
422935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            oos = new ObjectOutputStream(new FileOutputStream(
423935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson                    f = new java.io.File(xFileName + "-" + getName() + ".ser")));
424935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } else {
425935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            oos = new ObjectOutputStream(bao = new ByteArrayOutputStream());
426935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
427935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson
428935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        // Dump the object
429935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        try {
430935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            oos.writeObject(o);
431935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        } finally {
432935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson            oos.close();
433935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson        }
434935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson    }
435935ede9c3846d11df39435c2f2e4517d90cd61e8Jesse Wilson}
436