1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/*
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  this work for additional information regarding copyright ownership.
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  (the "License"); you may not use this file except in compliance with
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  the License.  You may obtain a copy of the License at
8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Unless required by applicable law or agreed to in writing, software
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  See the License for the specific language governing permissions and
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  limitations under the License.
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.luni.tests.java.io;
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.BufferedInputStream;
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ByteArrayInputStream;
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ByteArrayOutputStream;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.Externalizable;
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.File;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.FileInputStream;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.FileNotFoundException;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.FileOutputStream;
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.IOException;
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.InputStream;
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.InvalidObjectException;
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.NotActiveException;
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ObjectInput;
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ObjectInputStream;
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ObjectInputValidation;
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ObjectOutput;
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ObjectOutputStream;
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ObjectStreamClass;
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ObjectStreamException;
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.OutputStream;
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.PipedInputStream;
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.PipedOutputStream;
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.Serializable;
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.SerializablePermission;
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.StreamCorruptedException;
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.lang.reflect.Proxy;
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.Permission;
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Arrays;
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.HashMap;
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Hashtable;
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Vector;
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.testframework.serialization.SerializationTest;
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.testframework.serialization.SerializationTest.SerializableAssert;
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes@SuppressWarnings("serial")
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class ObjectInputStreamTest extends TestCase implements
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Serializable {
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    ObjectInputStream ois;
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    ObjectOutputStream oos;
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    ByteArrayOutputStream bao;
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public class SerializableTestHelper implements Serializable {
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public String aField1;
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public String aField2;
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SerializableTestHelper() {
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            aField1 = null;
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            aField2 = null;
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SerializableTestHelper(String s, String t) {
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            aField1 = s;
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            aField2 = t;
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private void readObject(ObjectInputStream ois) throws Exception {
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // note aField2 is not read
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ObjectInputStream.GetField fields = ois.readFields();
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            aField1 = (String) fields.get("aField1", "Zap");
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private void writeObject(ObjectOutputStream oos) throws IOException {
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // note aField2 is not written
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ObjectOutputStream.PutField fields = oos.putFields();
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fields.put("aField1", aField1);
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            oos.writeFields();
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public String getText1() {
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return aField1;
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void setText1(String s) {
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            aField1 = s;
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public String getText2() {
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return aField2;
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void setText2(String s) {
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            aField2 = s;
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class A1 implements Serializable {
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private static final long serialVersionUID = 5942584913446079661L;
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        B1 b1 = new B1();
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        B1 b2 = b1;
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Vector v = new Vector();
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class B1 implements Serializable {
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int i = 5;
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Hashtable h = new Hashtable();
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readObject()
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readObjectMissingClasses() throws Exception {
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SerializationTest.verifySelf(new A1(), new SerializableAssert() {
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public void assertDeserialized(Serializable initial,
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    Serializable deserialized) {
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertEquals(5, ((A1) deserialized).b1.i);
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        });
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#ObjectInputStream(java.io.InputStream)
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_ConstructorLjava_io_InputStream() throws IOException {
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeDouble(Double.MAX_VALUE);
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ois = new ObjectInputStream(new ByteArrayInputStream(new byte[90]));
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("StreamCorruptedException expected");
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (StreamCorruptedException e) {
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests {@link java.io.ObjectInputStream#resolveProxyClass(String[])}
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_resolveProxyClass() throws IOException,
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ClassNotFoundException {
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeBytes("HelloWorld");
167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MockObjectInputStream mockIn = new MockObjectInputStream(
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                new ByteArrayInputStream(bao.toByteArray()));
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Class[] clazzs = { java.io.ObjectInputStream.class,
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                java.io.Reader.class };
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i = 0; i < clazzs.length; i++) {
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Class clazz = clazzs[i];
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Class[] interfaceNames = clazz.getInterfaces();
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            String[] interfaces = new String[interfaceNames.length];
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int index = 0;
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (Class c : interfaceNames) {
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                interfaces[index] = c.getName();
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                index++;
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Class<?> s = mockIn.resolveProxyClass(interfaces);
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (Proxy.isProxyClass(s)) {
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Class[] implementedInterfaces = s.getInterfaces();
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                for (index = 0; index < implementedInterfaces.length; index++) {
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    assertEquals(interfaceNames[index],
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            implementedInterfaces[index]);
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } else {
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Should return a proxy class that implements the interfaces named in a proxy class descriptor");
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        mockIn.close();
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    class MockObjectInputStream extends ObjectInputStream {
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public MockObjectInputStream(InputStream input)
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throws StreamCorruptedException, IOException {
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super(input);
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        @Override
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Class<?> resolveProxyClass(String[] interfaceNames) throws IOException, ClassNotFoundException {
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return super.resolveProxyClass(interfaceNames);
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#available()
213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_available() throws IOException {
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeBytes("HelloWorld");
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Read incorrect bytes", 10, ois.available());
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#close()
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_close() throws IOException {
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeBytes("HelloWorld");
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#defaultReadObject()
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_defaultReadObject() throws Exception {
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // SM. This method may as well be private, as if called directly it
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // throws an exception.
238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String s = "HelloWorld";
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeObject(s);
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ois.defaultReadObject();
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("NotActiveException expected");
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NotActiveException e) {
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Desired behavior
247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ois.close();
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#read()
254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_read() throws IOException {
256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.write('T');
257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Read incorrect byte value", 'T', ois.read());
260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#read(byte[], int, int)
265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_read$BII() throws IOException {
267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] buf = new byte[10];
268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeBytes("HelloWorld");
269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.read(buf, 0, 10);
272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Read incorrect bytes", "HelloWorld", new String(buf, 0,
274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                10, "UTF-8"));
275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readBoolean()
279561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readBoolean() throws IOException {
281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeBoolean(true);
282561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
283561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Read incorrect boolean value", ois.readBoolean());
285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
287561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readByte()
290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readByte() throws IOException {
292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeByte(127);
293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
294561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
295561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Read incorrect byte value", 127, ois.readByte());
296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readChar()
301561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readChar() throws IOException {
303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeChar('T');
304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
305561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
306561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Read incorrect char value", 'T', ois.readChar());
307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
311561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readDouble()
312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readDouble() throws IOException {
314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeDouble(Double.MAX_VALUE);
315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
316561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
317561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Read incorrect double value",
318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ois.readDouble() == Double.MAX_VALUE);
319561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
322561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readFields()
324561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
325561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readFields() throws Exception {
326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SerializableTestHelper sth;
328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
329561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /*
330561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * "SerializableTestHelper" is an object created for these tests with
331561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * two fields (Strings) and simple implementations of readObject and
332561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * writeObject which simply read and write the first field but not the
333561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * second
334561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
335561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
336561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeObject(new SerializableTestHelper("Gabba", "Jabba"));
337561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.flush();
338561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
339561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        sth = (SerializableTestHelper) (ois.readObject());
340561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("readFields / writeFields failed--first field not set",
341561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "Gabba", sth.getText1());
342561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull(
343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "readFields / writeFields failed--second field should not have been set",
344561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                sth.getText2());
345561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
346561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readFloat()
349561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
350561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readFloat() throws IOException {
351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeFloat(Float.MAX_VALUE);
352561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
354561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Read incorrect float value",
355561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ois.readFloat() == Float.MAX_VALUE);
356561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
357561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
358561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
359561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
360561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readFully(byte[])
361561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
362561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readFully$B() throws IOException {
363561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] buf = new byte[10];
364561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeBytes("HelloWorld");
365561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
366561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
367561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.readFully(buf);
368561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
369561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Read incorrect bytes", "HelloWorld", new String(buf, 0,
370561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                10, "UTF-8"));
371561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
372561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
373561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
374561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readFully(byte[], int, int)
375561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
376561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readFully$BII() throws IOException {
377561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] buf = new byte[10];
378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeBytes("HelloWorld");
379561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
380561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
381561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.readFully(buf, 0, 10);
382561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
383561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Read incorrect bytes", "HelloWorld", new String(buf, 0,
384561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                10, "UTF-8"));
385561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
386561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
387561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
388561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readInt()
389561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
390561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readInt() throws IOException {
391561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeInt(Integer.MAX_VALUE);
392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
393561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
394561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Read incorrect int value",
395561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ois.readInt() == Integer.MAX_VALUE);
396561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
397561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
398561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
399561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
400561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readLine()
401561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
402561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @SuppressWarnings("deprecation")
403561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readLine() throws IOException {
404561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeBytes("HelloWorld\nSecondLine");
405561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
407561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.readLine();
408561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Read incorrect string value", "SecondLine", ois
409561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .readLine());
410561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
411561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
412561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
413561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
414561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readLong()
415561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
416561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readLong() throws IOException {
417561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeLong(Long.MAX_VALUE);
418561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
419561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
420561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Read incorrect long value",
421561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ois.readLong() == Long.MAX_VALUE);
422561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
423561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
424561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
425561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
426561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readObject()
427561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
428561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readObject() throws Exception {
429561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String s = "HelloWorld";
430561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeObject(s);
431561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
432561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
433561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Read incorrect Object value", s, ois.readObject());
434561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
435561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
436561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Regression for HARMONY-91
437561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // dynamically create serialization byte array for the next hierarchy:
438561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // - class A implements Serializable
439561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // - class C extends A
440561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
441561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] cName = C.class.getName().getBytes("UTF-8");
442561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] aName = A.class.getName().getBytes("UTF-8");
443561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
444561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteArrayOutputStream out = new ByteArrayOutputStream();
445561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
446561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] begStream = new byte[] { (byte) 0xac, (byte) 0xed, // STREAM_MAGIC
447561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x00, (byte) 0x05, // STREAM_VERSION
448561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x73, // TC_OBJECT
449561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x72, // TC_CLASSDESC
450561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x00, // only first byte for C class name length
451561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        };
452561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
453561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.write(begStream, 0, begStream.length);
454561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.write(cName.length); // second byte for C class name length
455561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.write(cName, 0, cName.length); // C class name
456561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
457561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] midStream = new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00,
458561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
459561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x21, // serialVersionUID = 33L
460561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x02, // flags
461561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x00, (byte) 0x00, // fields : none
462561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x78, // TC_ENDBLOCKDATA
463561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x72, // Super class for C: TC_CLASSDESC for A class
464561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x00, // only first byte for A class name length
465561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        };
466561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
467561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.write(midStream, 0, midStream.length);
468561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.write(aName.length); // second byte for A class name length
469561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.write(aName, 0, aName.length); // A class name
470561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
471561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] endStream = new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00,
472561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
473561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x0b, // serialVersionUID = 11L
474561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x02, // flags
475561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x00, (byte) 0x01, // fields
476561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
477561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x4c, // field description: type L (object)
478561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x00, (byte) 0x04, // length
479561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // field = 'name'
480561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x6e, (byte) 0x61, (byte) 0x6d, (byte) 0x65,
481561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
482561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x74, // className1: TC_STRING
483561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x00, (byte) 0x12, // length
484561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                //
485561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x4c, (byte) 0x6a, (byte) 0x61, (byte) 0x76,
486561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x61, (byte) 0x2f, (byte) 0x6c, (byte) 0x61,
487561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x6e, (byte) 0x67, (byte) 0x2f, (byte) 0x53,
488561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x74, (byte) 0x72, (byte) 0x69, (byte) 0x6e,
489561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x67, (byte) 0x3b,
490561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
491561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x78, // TC_ENDBLOCKDATA
492561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x70, // NULL super class for A class
493561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
494561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // classdata
495561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x74, // TC_STRING
496561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x00, (byte) 0x04, // length
497561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0x6e, (byte) 0x61, (byte) 0x6d, (byte) 0x65, // value
498561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        };
499561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
500561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.write(endStream, 0, endStream.length);
501561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.flush();
502561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
503561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // read created serial. form
504561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(
505561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                out.toByteArray()));
506561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Object o = ois.readObject();
507561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(C.class, o.getClass());
508561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
509561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Regression for HARMONY-846
510561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull(new ObjectInputStream() {}.readObject());
511561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
512561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
513561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
514561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readObjectOverride()
515561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
516561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readObjectOverride() throws Exception {
517561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Regression for HARMONY-846
518561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull(new ObjectInputStream() {
519561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
520561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            @Override
521561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public Object readObjectOverride() throws IOException,
522561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    ClassNotFoundException {
523561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return super.readObjectOverride();
524561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
525561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
526561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }.readObjectOverride());
527561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
528561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
529561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class A implements Serializable {
530561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
531561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private static final long serialVersionUID = 11L;
532561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
533561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public String name = "name";
534561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
535561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
536561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class B extends A {}
537561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
538561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class C extends B {
539561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
540561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private static final long serialVersionUID = 33L;
541561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
542561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
543561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
544561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readObject()
545561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
546561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readObjectCorrupt() throws IOException, ClassNotFoundException {
547561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] bytes = { 00, 00, 00, 0x64, 0x43, 0x48, (byte) 0xFD, 0x71, 00,
548561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                00, 0x0B, (byte) 0xB8, 0x4D, 0x65 };
549561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteArrayInputStream bin = new ByteArrayInputStream(bytes);
550561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
551561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ObjectInputStream in = new ObjectInputStream(bin);
552561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            in.readObject();
553561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected read of corrupted stream");
554561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (StreamCorruptedException e) {
555561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Expected
556561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
557561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
558561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
559561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
560561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readShort()
561561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
562561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readShort() throws IOException {
563561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeShort(Short.MAX_VALUE);
564561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
565561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
566561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Read incorrect short value",
567561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ois.readShort() == Short.MAX_VALUE);
568561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
569561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
570561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
571561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
572561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readUnsignedByte()
573561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
574561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readUnsignedByte() throws IOException {
575561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeByte(-1);
576561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
577561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
578561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Read incorrect unsignedByte value", 255, ois
579561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .readUnsignedByte());
580561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
581561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
582561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
583561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
584561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readUnsignedShort()
585561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
586561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readUnsignedShort() throws IOException {
587561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeShort(-1);
588561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
589561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
590561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Read incorrect unsignedShort value", 65535, ois
591561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .readUnsignedShort());
592561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
593561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
594561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
595561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
596561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#readUTF()
597561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
598561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readUTF() throws IOException {
599561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeUTF("HelloWorld");
600561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
601561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
602561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Read incorrect utf value", "HelloWorld", ois.readUTF());
603561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
604561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
605561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
606561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
607561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#skipBytes(int)
608561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
609561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_skipBytesI() throws IOException {
610561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] buf = new byte[10];
611561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeBytes("HelloWorld");
612561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
613561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
614561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.skipBytes(5);
615561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.read(buf, 0, 5);
616561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
617561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Skipped incorrect bytes", "World", new String(buf, 0, 5, "UTF-8"));
618561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
619561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Regression for HARMONY-844
620561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
621561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new ObjectInputStream() {}.skipBytes(0);
622561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("NullPointerException expected");
623561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {}
624561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
625561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
626561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // Regression Test for JIRA 2192
627561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_readObject_withPrimitiveClass() throws Exception {
628561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		File file = new File("test.ser");
629561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		file.deleteOnExit();
630561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Test test = new Test();
631561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
632561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				file));
633561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out.writeObject(test);
634561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out.close();
635561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
636561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
637561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Test another = (Test) in.readObject();
638561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.close();
639561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(test, another);
640561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
641561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
642561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    //Regression Test for JIRA-2249
643561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class ObjectOutputStreamWithWriteDesc extends
644561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ObjectOutputStream {
645561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public ObjectOutputStreamWithWriteDesc(OutputStream os)
646561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throws IOException {
647561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super(os);
648561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
649561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
650561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        @Override
651561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void writeClassDescriptor(ObjectStreamClass desc)
652561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throws IOException {
653561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
654561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
655561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
656561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class ObjectIutputStreamWithReadDesc extends
657561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ObjectInputStream {
658561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private Class returnClass;
659561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
660561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public ObjectIutputStreamWithReadDesc(InputStream is, Class returnClass)
661561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throws IOException {
662561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super(is);
663561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.returnClass = returnClass;
664561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
665561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
666561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        @Override
667561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public ObjectStreamClass readClassDescriptor() throws IOException,
668561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ClassNotFoundException {
669561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return ObjectStreamClass.lookup(returnClass);
670561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
671561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
672561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
673561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
674561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    static class TestClassForSerialization implements Serializable {
675561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		private static final long serialVersionUID = 1L;
676561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
677561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
678561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_ClassDescriptor() throws IOException,
679561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ClassNotFoundException {
680561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
681561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ByteArrayOutputStream baos = new ByteArrayOutputStream();
682561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ObjectOutputStreamWithWriteDesc oos = new ObjectOutputStreamWithWriteDesc(
683561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				baos);
684561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		oos.writeObject(String.class);
685561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		oos.close();
686561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Class cls = TestClassForSerialization.class;
687561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
688561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ObjectIutputStreamWithReadDesc ois = new ObjectIutputStreamWithReadDesc(
689561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				bais, cls);
690561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Object obj = ois.readObject();
691561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ois.close();
692561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(cls, obj);
693561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
694561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
695561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	// Regression Test for JIRA-2340
696561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class ObjectOutputStreamWithWriteDesc1 extends
697561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ObjectOutputStream {
698561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		public ObjectOutputStreamWithWriteDesc1(OutputStream os)
699561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				throws IOException {
700561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			super(os);
701561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
702561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
703561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		@Override
704561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void writeClassDescriptor(ObjectStreamClass desc)
705561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				throws IOException {
706561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			super.writeClassDescriptor(desc);
707561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
708561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
709561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
710561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public static class ObjectIutputStreamWithReadDesc1 extends
711561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ObjectInputStream {
712561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
713561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		public ObjectIutputStreamWithReadDesc1(InputStream is)
714561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				throws IOException {
715561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			super(is);
716561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
717561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
718561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		@Override
719561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public ObjectStreamClass readClassDescriptor() throws IOException,
720561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				ClassNotFoundException {
721561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			return super.readClassDescriptor();
722561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
723561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
724561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
725561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // Regression test for Harmony-1921
726561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class ObjectInputStreamWithResolve extends ObjectInputStream {
727561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public ObjectInputStreamWithResolve(InputStream in) throws IOException {
728561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super(in);
729561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
730561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
731561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        @Override
732561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        @SuppressWarnings("unchecked")
733561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        protected Class resolveClass(ObjectStreamClass desc)
734561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throws IOException, ClassNotFoundException {
735561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (desc.getName().equals(
736561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    "org.apache.harmony.luni.tests.pkg1.TestClass")) {
737561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return org.apache.harmony.luni.tests.pkg2.TestClass.class;
738561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
739561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return super.resolveClass(desc);
740561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
741561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
742561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
743561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_resolveClass() throws Exception {
744561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        org.apache.harmony.luni.tests.pkg1.TestClass to1 = new org.apache.harmony.luni.tests.pkg1.TestClass();
745561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        to1.i = 555;
746561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteArrayOutputStream baos = new ByteArrayOutputStream();
747561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ObjectOutputStream oos = new ObjectOutputStream(baos);
748561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeObject(to1);
749561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.flush();
750561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] bytes = baos.toByteArray();
751561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
752561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ObjectInputStream ois = new ObjectInputStreamWithResolve(bais);
753561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        org.apache.harmony.luni.tests.pkg2.TestClass to2 = (org.apache.harmony.luni.tests.pkg2.TestClass) ois
754561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .readObject();
755561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
756561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (to2.i != to1.i) {
757561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Wrong object read. Expected val: " + to1.i + ", got: "
758561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + to2.i);
759561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
760561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
761561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
762561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    static class ObjectInputStreamWithResolveObject extends ObjectInputStream {
763561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
764561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public static Integer intObj = Integer.valueOf(1000);
765561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
766561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public ObjectInputStreamWithResolveObject(InputStream in) throws IOException {
767561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super(in);
768561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            enableResolveObject(true);
769561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
770561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
771561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        @Override
772561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        protected Object resolveObject(Object obj) throws IOException {
773561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if(obj instanceof Integer){
774561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                obj = intObj;
775561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
776561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return super.resolveObject(obj);
777561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
778561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
779561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
780561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
781561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.io.ObjectInputStream#resolveObject(Object)
782561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
783561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_resolveObjectLjava_lang_Object() throws Exception {
784561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Write an Integer object into memory
785561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Integer original = new Integer(10);
786561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteArrayOutputStream baos = new ByteArrayOutputStream();
787561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ObjectOutputStream oos = new ObjectOutputStream(baos);
788561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeObject(original);
789561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.flush();
790561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
791561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
792561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Read the object from memory
793561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] bytes = baos.toByteArray();
794561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
795561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ObjectInputStreamWithResolveObject ois =
796561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new ObjectInputStreamWithResolveObject(bais);
797561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Integer actual = (Integer) ois.readObject();
798561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
799561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
800561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // object should be resolved from 10 to 1000
801561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(ObjectInputStreamWithResolveObject.intObj, actual);
802561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
803561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
804561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void test_readClassDescriptor() throws IOException,
805561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ClassNotFoundException {
806561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
807561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ByteArrayOutputStream baos = new ByteArrayOutputStream();
808561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ObjectOutputStreamWithWriteDesc1 oos = new ObjectOutputStreamWithWriteDesc1(
809561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				baos);
810561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ObjectStreamClass desc = ObjectStreamClass
811561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		.lookup(TestClassForSerialization.class);
812561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		oos.writeClassDescriptor(desc);
813561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		oos.close();
814561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
815561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] bytes = baos.toByteArray();
816561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
817561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ObjectIutputStreamWithReadDesc1 ois = new ObjectIutputStreamWithReadDesc1(
818561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				bais);
819561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		Object obj = ois.readClassDescriptor();
820561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ois.close();
821561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(desc.getClass(), obj.getClass());
822561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
823561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //eof
824561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bais = new ByteArrayInputStream(bytes);
825561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ExceptionalBufferedInputStream bis = new ExceptionalBufferedInputStream(
826561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                bais);
827561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectIutputStreamWithReadDesc1(bis);
828561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
829561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bis.setEOF(true);
830561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
831561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
832561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            obj = ois.readClassDescriptor();
833561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IOException e) {
834561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //e.printStackTrace();
835561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
836561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ois.close();
837561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
838561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
839561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //throw exception
840561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bais = new ByteArrayInputStream(bytes);
841561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bis = new ExceptionalBufferedInputStream(bais);
842561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectIutputStreamWithReadDesc1(bis);
843561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
844561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bis.setException(new IOException());
845561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
846561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
847561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            obj = ois.readClassDescriptor();
848561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IOException e) {
849561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //e.printStackTrace();
850561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
851561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ois.close();
852561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
853561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
854561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //corrupt
855561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bais = new ByteArrayInputStream(bytes);
856561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bis = new ExceptionalBufferedInputStream(bais);
857561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois = new ObjectIutputStreamWithReadDesc1(bis);
858561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
859561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bis.setCorrupt(true);
860561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
861561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
862561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            obj = ois.readClassDescriptor();
863561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IOException e) {
864561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //e.printStackTrace();
865561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } finally {
866561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ois.close();
867561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
868561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
869561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
870561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    static class ExceptionalBufferedInputStream extends BufferedInputStream {
871561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private boolean eof = false;
872561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private IOException exception = null;
873561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private boolean corrupt = false;
874561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
875561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public ExceptionalBufferedInputStream(InputStream in) {
876561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super(in);
877561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
878561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
879561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        @Override
880561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public int read() throws IOException {
881561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (exception != null) {
882561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throw exception;
883561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
884561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
885561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (eof) {
886561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return -1;
887561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
888561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
889561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (corrupt) {
890561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return 0;
891561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
892561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return super.read();
893561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
894561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
895561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void setEOF(boolean eof) {
896561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.eof = eof;
897561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
898561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
899561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void setException(IOException exception) {
900561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.exception = exception;
901561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
902561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
903561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void setCorrupt(boolean corrupt) {
904561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.corrupt = corrupt;
905561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
906561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
907561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
908561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class ObjectIutputStreamWithReadDesc2 extends
909561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ObjectInputStream {
910561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private Class returnClass;
911561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
912561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public ObjectIutputStreamWithReadDesc2(InputStream is, Class returnClass)
913561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throws IOException {
914561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super(is);
915561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.returnClass = returnClass;
916561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
917561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
918561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        @Override
919561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public ObjectStreamClass readClassDescriptor() throws IOException,
920561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ClassNotFoundException {
921561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ObjectStreamClass osc = super.readClassDescriptor();
922561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
923561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (osc.getName().equals(returnClass.getName())) {
924561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return ObjectStreamClass.lookup(returnClass);
925561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
926561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return osc;
927561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
928561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
929561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
930561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
931561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Testing classDescriptor replacement with the value generated by
932561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * ObjectStreamClass.lookup() method.
933561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Regression test for HARMONY-4638
934561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
935561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readClassDescriptor_1() throws IOException, ClassNotFoundException {
936561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        A a = new A();
937561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        a.name = "It's a test";
938561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        PipedOutputStream pout = new PipedOutputStream();
939561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        PipedInputStream pin = new PipedInputStream(pout);
940561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ObjectOutputStream out = new ObjectOutputStream(pout);
941561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ObjectInputStream in = new ObjectIutputStreamWithReadDesc2(pin, A.class);
942561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
943561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // test single object
944561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.writeObject(a);
945561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        A a1 = (A) in.readObject();
946561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Single case: incorrectly read the field of A", a.name, a1.name);
947561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
948561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // test cyclic reference
949561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        HashMap m = new HashMap();
950561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        a = new A();
951561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        a.name = "It's a test 0";
952561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        a1 = new A();
953561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        a1.name = "It's a test 1";
954561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        m.put("0", a);
955561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        m.put("1", a1);
956561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.writeObject(m);
957561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        HashMap m1 = (HashMap) in.readObject();
958561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Incorrectly read the field of A", a.name, ((A) m1.get("0")).name);
959561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Incorrectly read the field of A1", a1.name, ((A) m1.get("1")).name);
960561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
961561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
962561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_registerValidation() throws Exception {
963561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Regression Test for Harmony-2402
964561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteArrayOutputStream baos = new ByteArrayOutputStream();
965561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        new ObjectOutputStream(baos);
966561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ObjectInputStream ois = new ObjectInputStream(
967561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                new ByteArrayInputStream(baos.toByteArray()));
968561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
969561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
970561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ois.registerValidation(null, 256);
971561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("NotActiveException should be thrown");
972561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NotActiveException nae) {
973561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
974561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
975561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
976561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Regression Test for Harmony-3916
977561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        baos = new ByteArrayOutputStream();
978561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ObjectOutputStream oos = new ObjectOutputStream(baos);
979561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeObject(new RegisterValidationClass());
980561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.close();
981561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
982561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ObjectInputStream fis = new ObjectInputStream(bais);
983561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // should not throw NotActiveException
984561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        fis.readObject();
985561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
986561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
987561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static class RegisterValidationClass implements Serializable {
988561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        @SuppressWarnings("unused")
989561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private A a = new A();
990561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
991561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            stream.defaultReadObject();
992561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            stream.registerValidation(new MockObjectInputValidation(), 0);
993561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
994561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
995561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
996561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static class MockObjectInputValidation implements ObjectInputValidation {
997561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void validateObject() throws InvalidObjectException {
998561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
999561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1000561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1001561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1002561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    //Regression Test for HARMONY-3726
1003561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readObject_array() throws Exception {
1004561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1005561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        final String resourcePrefix = ObjectInputStreamTest.class.getPackage().getName().replace('.', '/');
1006561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1007561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes//        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("/temp/test_array_strings.ser"));
1008561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes//        TestArray ta = new TestArray(new String[] { "AAA", "BBB" });
1009561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes//        oos.writeObject(ta);
1010561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes//        oos.close();
1011561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes//        oos = new ObjectOutputStream(new FileOutputStream("/temp/test_array_integers.ser"));
1012561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes//        ta = new TestArray(new Integer[] { 10, 20 });
1013561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes//        oos.writeObject(ta);
1014561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes//        oos.close();
1015561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1016561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ObjectInputStream oin = new ObjectInputStream(this.getClass().getClassLoader().getResourceAsStream(
1017561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "serialization/" + resourcePrefix + "/test_array_strings.ser"));
1018561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        TestArray testArray = (TestArray) oin.readObject();
1019561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String[] strings = new String[] { "AAA", "BBB" };
1020561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(java.util.Arrays.equals(strings, testArray.array));
1021561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1022561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oin = new ObjectInputStream(this.getClass().getClassLoader().getResourceAsStream(
1023561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "serialization/" + resourcePrefix + "/test_array_integers.ser"));
1024561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        testArray = (TestArray) oin.readObject();
1025561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Integer[] integers = new Integer[] { 10, 20 };
1026561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(java.util.Arrays.equals(integers, testArray.array));
1027561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1028561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1029561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class TestExtObject implements Externalizable {
1030561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void writeExternal(ObjectOutput out) throws IOException {
1031561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            out.writeInt(10);
1032561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1033561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1034561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
1035561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            in.readInt();
1036561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1037561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1038561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1039561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    static class TestObjectOutputStream extends ObjectOutputStream {
1040561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private ObjectStreamClass[] objs;
1041561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private int pos = 0;
1042561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1043561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public TestObjectOutputStream(OutputStream out, ObjectStreamClass[] objs) throws IOException {
1044561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super(out);
1045561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.objs = objs;
1046561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1047561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1048561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        @Override
1049561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        protected void writeClassDescriptor(ObjectStreamClass osc) throws IOException {
1050561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            objs[pos++] = osc;        }
1051561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1052561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1053561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    static class TestObjectInputStream extends ObjectInputStream {
1054561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private ObjectStreamClass[] objs;
1055561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private int pos = 0;
1056561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1057561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public TestObjectInputStream(InputStream in, ObjectStreamClass[] objs) throws IOException {
1058561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super(in);
1059561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.objs = objs;
1060561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1061561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1062561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        @Override
1063561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {
1064561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return objs[pos++];
1065561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1066561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1067561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1068561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // Regression test for HARMONY-4996
1069561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readObject_replacedClassDescriptor() throws Exception {
1070561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ObjectStreamClass[] objs = new ObjectStreamClass[1000];
1071561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        PipedOutputStream pout = new PipedOutputStream();
1072561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        PipedInputStream pin = new PipedInputStream(pout);
1073561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ObjectOutputStream oout = new TestObjectOutputStream(pout, objs);
1074561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oout.writeObject(new TestExtObject());
1075561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oout.writeObject("test");
1076561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oout.close();
1077561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ObjectInputStream oin = new TestObjectInputStream(pin, objs);
1078561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oin.readObject();
1079561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oin.readObject();
1080561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1081561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1082561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_readObject_replacedClassField() throws Exception {
1083561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteArrayOutputStream out = new ByteArrayOutputStream();
1084561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ObjectOutputStream oos = new ObjectOutputStream(out);
1085561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        FieldReplacementTestClass obj = new FieldReplacementTestClass(1234);
1086561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos.writeObject(obj);
1087561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.flush();
1088561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.close();
1089561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1090fc95c99cfa4921fef424f3f411d013b821589e69Elliott Hughes        ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
1091561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ObjectInputStream ois = new ObjectInputStream(in);
1092561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1093561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
1094561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            FieldReplacementTestClass result =
1095561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (FieldReplacementTestClass)ois.readObject();
1096561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw ClassCastException");
1097561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ClassCastException e) {
1098561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
1099561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ois.close();
1101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
1104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Sets up the fixture, for example, open a network connection. This method
1105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * is called before a test is executed.
1106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
1107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    @Override
1108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void setUp() throws Exception {
1109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        super.setUp();
1110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        oos = new ObjectOutputStream(bao = new ByteArrayOutputStream());
1111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class FieldReplacementTestClass implements Serializable {
1114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private FieldClass c;
1115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public FieldReplacementTestClass(int i) {
1116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super();
1117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            c = new FieldClass(i);
1118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class FieldClass implements Serializable {
1121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private int i;
1122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public FieldClass(int i) {
1123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super();
1124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.i = i;
1125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        protected Object writeReplace() throws ObjectStreamException {
1127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return new ReplacementFieldClass(i);
1128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class ReplacementFieldClass implements Serializable {
1131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        private int i;
1132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public ReplacementFieldClass(int i) {
1133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super();
1134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.i = i;
1135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
1136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
1139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesclass TestArray implements Serializable
1141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes{
1142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static final long serialVersionUID = 1L;
1143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public Object[] array;
1145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public TestArray(Object[] array) {
1147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        this.array = array;
1148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
1151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesclass Test implements Serializable {
1153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	private static final long serialVersionUID = 1L;
1154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	Class classes[] = new Class[] { byte.class, short.class, int.class,
1156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			long.class, boolean.class, char.class, float.class,
1157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        double.class, void.class };
1158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	@Override
1160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public boolean equals(Object o) {
1161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		if (!(o instanceof Test)) {
1162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			return false;
1163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
1164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		return Arrays.equals(classes, ((Test) o).classes);
1165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
1166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
1167