1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
27ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
37ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
47ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes *  this work for additional information regarding copyright ownership.
57ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
67ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes *  (the "License"); you may not use this file except in compliance with
77ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes *  the License.  You may obtain a copy of the License at
87ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
107ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes *
117ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes *  Unless required by applicable law or agreed to in writing, software
127ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
137ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
147ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes *  See the License for the specific language governing permissions and
157ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.luni.tests.java.io;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
207ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.io.BufferedInputStream;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ByteArrayInputStream;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ByteArrayOutputStream;
237ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.io.Externalizable;
247ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.io.File;
257ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.io.FileInputStream;
267ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.io.FileNotFoundException;
277ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.io.FileOutputStream;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream;
307ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.io.InvalidObjectException;
317ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.io.NotActiveException;
327ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.io.ObjectInput;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectInputStream;
347ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.io.ObjectInputValidation;
357ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.io.ObjectOutput;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectOutputStream;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ObjectStreamClass;
387ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.io.OutputStream;
397ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.io.PipedInputStream;
407ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.io.PipedOutputStream;
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Serializable;
427ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.io.SerializablePermission;
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.StreamCorruptedException;
447ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.lang.reflect.Proxy;
457ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.security.Permission;
467ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.util.Arrays;
477ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.util.HashMap;
487ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.util.Hashtable;
497ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport java.util.Vector;
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport junit.framework.TestCase;
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.testframework.serialization.SerializationTest;
547ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesimport org.apache.harmony.testframework.serialization.SerializationTest.SerializableAssert;
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
567ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes@SuppressWarnings("serial")
577ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughespublic class ObjectInputStreamTest extends TestCase implements
587ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        Serializable {
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    ObjectInputStream ois;
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    ObjectOutputStream oos;
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    ByteArrayOutputStream bao;
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
667ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public class SerializableTestHelper implements Serializable {
677ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
687ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public String aField1;
697ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
707ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public String aField2;
717ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
727ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        SerializableTestHelper() {
737ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            aField1 = null;
747ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            aField2 = null;
757ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
767ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
777ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        SerializableTestHelper(String s, String t) {
787ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            aField1 = s;
797ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            aField2 = t;
807ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
817ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
827ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        private void readObject(ObjectInputStream ois) throws Exception {
837ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            // note aField2 is not read
847ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            ObjectInputStream.GetField fields = ois.readFields();
857ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            aField1 = (String) fields.get("aField1", "Zap");
867ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
877ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
887ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        private void writeObject(ObjectOutputStream oos) throws IOException {
897ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            // note aField2 is not written
907ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            ObjectOutputStream.PutField fields = oos.putFields();
917ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            fields.put("aField1", aField1);
927ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            oos.writeFields();
937ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
947ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
957ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public String getText1() {
967ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            return aField1;
977ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
987ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
997ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public void setText1(String s) {
1007ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            aField1 = s;
1017ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
1027ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
1037ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public String getText2() {
1047ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            return aField2;
1057ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
1067ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
1077ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public void setText2(String s) {
1087ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            aField2 = s;
1097ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1127ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public static class A1 implements Serializable {
1137ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
1147ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        private static final long serialVersionUID = 5942584913446079661L;
1157ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
1167ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        B1 b1 = new B1();
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1187ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        B1 b2 = b1;
1197ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
1207ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        Vector v = new Vector();
1217ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
1227ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
1237ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public static class B1 implements Serializable {
1247ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
1257ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        int i = 5;
1267ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
1277ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        Hashtable h = new Hashtable();
1287ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
1297ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
1307ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
131229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readObject()
1327ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
1337ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readObjectMissingClasses() throws Exception {
1347ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        SerializationTest.verifySelf(new A1(), new SerializableAssert() {
1357ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            public void assertDeserialized(Serializable initial,
1367ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                    Serializable deserialized) {
1377ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                assertEquals(5, ((A1) deserialized).b1.i);
1387ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            }
1397ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        });
1407ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
1417ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
1427ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
143229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#ObjectInputStream(java.io.InputStream)
1447ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
1457ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_ConstructorLjava_io_InputStream() throws IOException {
1467ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeDouble(Double.MAX_VALUE);
1477ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
1497ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.close();
1507ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
1517ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1537ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            ois = new ObjectInputStream(new ByteArrayInputStream(new byte[90]));
1547ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            fail("StreamCorruptedException expected");
1557ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        } catch (StreamCorruptedException e) {
1567ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            // Expected
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1587ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
1597ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
1607ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
161229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * {@link java.io.ObjectInputStream#resolveProxyClass(String[])}
1627ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
1637ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_resolveProxyClass() throws IOException,
1647ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            ClassNotFoundException {
1657ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeBytes("HelloWorld");
1667ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
1677ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
1687ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        MockObjectInputStream mockIn = new MockObjectInputStream(
1697ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                new ByteArrayInputStream(bao.toByteArray()));
1707ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        Class[] clazzs = { java.io.ObjectInputStream.class,
1717ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                java.io.Reader.class };
1727ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        for (int i = 0; i < clazzs.length; i++) {
1737ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            Class clazz = clazzs[i];
1747ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            Class[] interfaceNames = clazz.getInterfaces();
1757ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            String[] interfaces = new String[interfaceNames.length];
1767ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            int index = 0;
1777ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            for (Class c : interfaceNames) {
1787ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                interfaces[index] = c.getName();
1797ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                index++;
1807ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            }
1817ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            Class<?> s = mockIn.resolveProxyClass(interfaces);
1827ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
1837ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            if (Proxy.isProxyClass(s)) {
1847ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                Class[] implementedInterfaces = s.getInterfaces();
1857ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                for (index = 0; index < implementedInterfaces.length; index++) {
1867ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                    assertEquals(interfaceNames[index],
1877ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                            implementedInterfaces[index]);
1887ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                }
1897ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            } else {
1907ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                fail("Should return a proxy class that implements the interfaces named in a proxy class descriptor");
1917ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            }
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1937ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        mockIn.close();
1947ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
1957ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
1967ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    class MockObjectInputStream extends ObjectInputStream {
1977ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
1987ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public MockObjectInputStream(InputStream input)
1997ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                throws StreamCorruptedException, IOException {
2007ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            super(input);
2017ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
2027ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
2037ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        @Override
2047ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public Class<?> resolveProxyClass(String[] interfaceNames) throws IOException, ClassNotFoundException {
2057ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            return super.resolveProxyClass(interfaceNames);
2067ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
2077ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
2087ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
2097ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
2107ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
211229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#available()
2127ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
2137ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_available() throws IOException {
2147ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeBytes("HelloWorld");
2157ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
2167ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
2177ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals("Read incorrect bytes", 10, ois.available());
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ois.close();
2197ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
2207ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
2217ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
222229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#close()
2237ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
2247ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_close() throws IOException {
2257ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeBytes("HelloWorld");
2267ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
2277ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
2287ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.close();
2297ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
232229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#defaultReadObject()
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2347ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_defaultReadObject() throws Exception {
2357ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        // SM. This method may as well be private, as if called directly it
2367ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        // throws an exception.
2377ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        String s = "HelloWorld";
2387ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeObject(s);
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        oos.close();
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
2427ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            ois.defaultReadObject();
2437ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            fail("NotActiveException expected");
2447ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        } catch (NotActiveException e) {
2457ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            // Desired behavior
2467ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        } finally {
2477ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            ois.close();
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2497ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
2507ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
2517ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
252229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#read()
2537ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
2547ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_read() throws IOException {
2557ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.write('T');
2567ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
2577ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
2587ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals("Read incorrect byte value", 'T', ois.read());
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ois.close();
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
263229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#read(byte[], int, int)
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2657ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_read$BII() throws IOException {
2667ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        byte[] buf = new byte[10];
2677ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeBytes("HelloWorld");
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        oos.close();
2697ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
2707ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.read(buf, 0, 10);
2717ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.close();
2727ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals("Read incorrect bytes", "HelloWorld", new String(buf, 0,
2737ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                10, "UTF-8"));
2747ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2767ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
277229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readBoolean()
2787ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
2797ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readBoolean() throws IOException {
2807ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeBoolean(true);
2817ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
2827ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
2837ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertTrue("Read incorrect boolean value", ois.readBoolean());
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ois.close();
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
288229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readByte()
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2907ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readByte() throws IOException {
2917ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeByte(127);
2927ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
2937ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
2947ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals("Read incorrect byte value", 127, ois.readByte());
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ois.close();
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
2977ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
299229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readChar()
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
3017ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readChar() throws IOException {
3027ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeChar('T');
3037ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
3047ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
3057ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals("Read incorrect char value", 'T', ois.readChar());
3067ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.close();
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
3087ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
3097ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
310229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readDouble()
3117ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
3127ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readDouble() throws IOException {
3137ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeDouble(Double.MAX_VALUE);
3147ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
3157ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
3167ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertTrue("Read incorrect double value",
3177ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                ois.readDouble() == Double.MAX_VALUE);
3187ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.close();
3197ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
3207ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
3217ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
322229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readFields()
3237ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
3247ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readFields() throws Exception {
3257ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
3267ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        SerializableTestHelper sth;
3277ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
3287ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        /*
3297ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes         * "SerializableTestHelper" is an object created for these tests with
3307ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes         * two fields (Strings) and simple implementations of readObject and
3317ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes         * writeObject which simply read and write the first field but not the
3327ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes         * second
3337ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes         */
3347ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
3357ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeObject(new SerializableTestHelper("Gabba", "Jabba"));
3367ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.flush();
3377ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
3387ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        sth = (SerializableTestHelper) (ois.readObject());
3397ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals("readFields / writeFields failed--first field not set",
3407ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                "Gabba", sth.getText1());
3417ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertNull(
3427ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                "readFields / writeFields failed--second field should not have been set",
3437ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                sth.getText2());
3447ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
3457ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
3467ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
347229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readFloat()
3487ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
3497ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readFloat() throws IOException {
3507ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeFloat(Float.MAX_VALUE);
3517ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
3527ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
3537ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertTrue("Read incorrect float value",
3547ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                ois.readFloat() == Float.MAX_VALUE);
3557ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.close();
3567ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
3577ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
3587ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
359229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readFully(byte[])
3607ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
3617ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readFully$B() throws IOException {
3627ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        byte[] buf = new byte[10];
3637ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeBytes("HelloWorld");
3647ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
3657ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
3667ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.readFully(buf);
3677ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.close();
3687ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals("Read incorrect bytes", "HelloWorld", new String(buf, 0,
3697ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                10, "UTF-8"));
3707ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
3717ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
3727ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
373229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readFully(byte[], int, int)
3747ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
3757ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readFully$BII() throws IOException {
3767ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        byte[] buf = new byte[10];
3777ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeBytes("HelloWorld");
3787ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
3797ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
3807ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.readFully(buf, 0, 10);
3817ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.close();
3827ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals("Read incorrect bytes", "HelloWorld", new String(buf, 0,
3837ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                10, "UTF-8"));
3847ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
3857ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
3867ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
387229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readInt()
3887ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
3897ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readInt() throws IOException {
3907ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeInt(Integer.MAX_VALUE);
3917ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
3927ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
3937ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertTrue("Read incorrect int value",
3947ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                ois.readInt() == Integer.MAX_VALUE);
3957ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.close();
3967ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
3977ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
3987ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
399229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readLine()
4007ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
4017ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    @SuppressWarnings("deprecation")
4027ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readLine() throws IOException {
4037ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeBytes("HelloWorld\nSecondLine");
4047ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
4057ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
4067ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.readLine();
4077ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals("Read incorrect string value", "SecondLine", ois
4087ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                .readLine());
4097ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.close();
4107ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
4117ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
4127ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
413229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readLong()
4147ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
4157ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readLong() throws IOException {
4167ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeLong(Long.MAX_VALUE);
4177ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
4187ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
4197ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertTrue("Read incorrect long value",
4207ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                ois.readLong() == Long.MAX_VALUE);
4217ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.close();
4227ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
4237ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
4247ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
425229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readObject()
4267ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
4277ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readObject() throws Exception {
4287ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        String s = "HelloWorld";
4297ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeObject(s);
4307ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
4317ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
4327ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals("Read incorrect Object value", s, ois.readObject());
4337ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.close();
4347ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
4357ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        // Regression for HARMONY-91
4367ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        // dynamically create serialization byte array for the next hierarchy:
4377ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        // - class A implements Serializable
4387ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        // - class C extends A
4397ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
4407ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        byte[] cName = C.class.getName().getBytes("UTF-8");
4417ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        byte[] aName = A.class.getName().getBytes("UTF-8");
4427ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
4437ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ByteArrayOutputStream out = new ByteArrayOutputStream();
4447ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
4457ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        byte[] begStream = new byte[] { (byte) 0xac, (byte) 0xed, // STREAM_MAGIC
4467ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x00, (byte) 0x05, // STREAM_VERSION
4477ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x73, // TC_OBJECT
4487ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x72, // TC_CLASSDESC
4497ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x00, // only first byte for C class name length
4507ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        };
4517ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
4527ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        out.write(begStream, 0, begStream.length);
4537ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        out.write(cName.length); // second byte for C class name length
4547ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        out.write(cName, 0, cName.length); // C class name
4557ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
4567ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        byte[] midStream = new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00,
4577ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
4587ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x21, // serialVersionUID = 33L
4597ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x02, // flags
4607ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x00, (byte) 0x00, // fields : none
4617ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x78, // TC_ENDBLOCKDATA
4627ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x72, // Super class for C: TC_CLASSDESC for A class
4637ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x00, // only first byte for A class name length
4647ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        };
4657ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
4667ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        out.write(midStream, 0, midStream.length);
4677ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        out.write(aName.length); // second byte for A class name length
4687ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        out.write(aName, 0, aName.length); // A class name
4697ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
4707ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        byte[] endStream = new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00,
4717ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
4727ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x0b, // serialVersionUID = 11L
4737ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x02, // flags
4747ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x00, (byte) 0x01, // fields
4757ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
4767ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x4c, // field description: type L (object)
4777ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x00, (byte) 0x04, // length
4787ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                // field = 'name'
4797ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x6e, (byte) 0x61, (byte) 0x6d, (byte) 0x65,
4807ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
4817ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x74, // className1: TC_STRING
4827ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x00, (byte) 0x12, // length
4837ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                //
4847ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x4c, (byte) 0x6a, (byte) 0x61, (byte) 0x76,
4857ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x61, (byte) 0x2f, (byte) 0x6c, (byte) 0x61,
4867ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x6e, (byte) 0x67, (byte) 0x2f, (byte) 0x53,
4877ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x74, (byte) 0x72, (byte) 0x69, (byte) 0x6e,
4887ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x67, (byte) 0x3b,
4897ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
4907ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x78, // TC_ENDBLOCKDATA
4917ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x70, // NULL super class for A class
4927ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
4937ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                // classdata
4947ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x74, // TC_STRING
4957ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x00, (byte) 0x04, // length
4967ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                (byte) 0x6e, (byte) 0x61, (byte) 0x6d, (byte) 0x65, // value
4977ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        };
4987ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
4997ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        out.write(endStream, 0, endStream.length);
5007ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        out.flush();
5017ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
5027ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        // read created serial. form
5037ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(
5047ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                out.toByteArray()));
5057ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        Object o = ois.readObject();
5067ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals(C.class, o.getClass());
5077ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
5087ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		// Regression for HARMONY-846
5097ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertNull(new ObjectInputStream() {}.readObject());
5107ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
5117ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
5127ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
513229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readObjectOverride()
5147ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
5157ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readObjectOverride() throws Exception {
5167ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        // Regression for HARMONY-846
5177ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertNull(new ObjectInputStream() {
5187ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
5197ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            @Override
5207ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            public Object readObjectOverride() throws IOException,
5217ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                    ClassNotFoundException {
5227ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                return super.readObjectOverride();
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
5247ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
5257ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }.readObjectOverride());
5267ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
5277ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
5287ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public static class A implements Serializable {
5297ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
5307ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        private static final long serialVersionUID = 11L;
5317ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
5327ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public String name = "name";
5337ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
5347ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
5357ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public static class B extends A {}
5367ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
5377ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public static class C extends B {
5387ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
5397ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        private static final long serialVersionUID = 33L;
5407ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
5417ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
5427ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
543229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readObject()
5447ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
5457ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readObjectCorrupt() throws IOException, ClassNotFoundException {
5467ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        byte[] bytes = { 00, 00, 00, 0x64, 0x43, 0x48, (byte) 0xFD, 0x71, 00,
5477ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                00, 0x0B, (byte) 0xB8, 0x4D, 0x65 };
5487ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ByteArrayInputStream bin = new ByteArrayInputStream(bytes);
5497ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        try {
5507ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            ObjectInputStream in = new ObjectInputStream(bin);
5517ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            in.readObject();
5527ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            fail("Unexpected read of corrupted stream");
5537ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        } catch (StreamCorruptedException e) {
5547ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            // Expected
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
5567ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
5577ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
5587ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
559229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readShort()
5607ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
5617ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readShort() throws IOException {
5627ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeShort(Short.MAX_VALUE);
5637ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
5647ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
5657ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertTrue("Read incorrect short value",
5667ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                ois.readShort() == Short.MAX_VALUE);
5677ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.close();
5687ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
5697ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
5707ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
571229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readUnsignedByte()
5727ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
5737ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readUnsignedByte() throws IOException {
5747ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeByte(-1);
5757ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
5767ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
5777ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals("Read incorrect unsignedByte value", 255, ois
5787ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                .readUnsignedByte());
5797ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.close();
5807ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
5817ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
5827ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
583229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readUnsignedShort()
5847ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
5857ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readUnsignedShort() throws IOException {
5867ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeShort(-1);
5877ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
5887ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
5897ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals("Read incorrect unsignedShort value", 65535, ois
5907ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                .readUnsignedShort());
5917ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.close();
5927ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
5937ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
5947ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
595229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#readUTF()
5967ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
5977ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readUTF() throws IOException {
5987ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeUTF("HelloWorld");
5997ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
6007ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
6017ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals("Read incorrect utf value", "HelloWorld", ois.readUTF());
6027ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.close();
6037ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
6047ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
6057ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
606229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#skipBytes(int)
6077ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
6087ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_skipBytesI() throws IOException {
6097ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        byte[] buf = new byte[10];
6107ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeBytes("HelloWorld");
6117ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
6127ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectInputStream(new ByteArrayInputStream(bao.toByteArray()));
6137ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.skipBytes(5);
6147ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.read(buf, 0, 5);
6157ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.close();
6167ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals("Skipped incorrect bytes", "World", new String(buf, 0, 5, "UTF-8"));
6177ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
6187ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        // Regression for HARMONY-844
6197ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        try {
6207ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            new ObjectInputStream() {}.skipBytes(0);
6217ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            fail("NullPointerException expected");
6227ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        } catch (NullPointerException e) {}
6237ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
6247ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
6257ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    // Regression Test for JIRA 2192
6267ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes	public void test_readObject_withPrimitiveClass() throws Exception {
6277ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		File file = new File("test.ser");
6287ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		file.deleteOnExit();
6297ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		Test test = new Test();
6307ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
6317ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes				file));
6327ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		out.writeObject(test);
6337ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		out.close();
6347ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
6357ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
6367ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		Test another = (Test) in.readObject();
6377ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		in.close();
6387ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		assertEquals(test, another);
6397ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes	}
6407ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
6417ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    //Regression Test for JIRA-2249
6427ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public static class ObjectOutputStreamWithWriteDesc extends
6437ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            ObjectOutputStream {
6447ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public ObjectOutputStreamWithWriteDesc(OutputStream os)
6457ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                throws IOException {
6467ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            super(os);
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
6487ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
6507ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public void writeClassDescriptor(ObjectStreamClass desc)
6517ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                throws IOException {
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
6557ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public static class ObjectIutputStreamWithReadDesc extends
6567ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            ObjectInputStream {
6577ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        private Class returnClass;
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
6597ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public ObjectIutputStreamWithReadDesc(InputStream is, Class returnClass)
6607ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                throws IOException {
6617ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            super(is);
6627ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            this.returnClass = returnClass;
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
6647ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
6657ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        @Override
6667ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public ObjectStreamClass readClassDescriptor() throws IOException,
6677ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                ClassNotFoundException {
6687ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            return ObjectStreamClass.lookup(returnClass);
6697ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
6737ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    static class TestClassForSerialization implements Serializable {
6747ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		private static final long serialVersionUID = 1L;
6757ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes	}
6767ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
6777ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_ClassDescriptor() throws IOException,
6787ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes			ClassNotFoundException {
6797ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
6807ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		ByteArrayOutputStream baos = new ByteArrayOutputStream();
6817ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		ObjectOutputStreamWithWriteDesc oos = new ObjectOutputStreamWithWriteDesc(
6827ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes				baos);
6837ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		oos.writeObject(String.class);
6847ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		oos.close();
6857ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		Class cls = TestClassForSerialization.class;
6867ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
6877ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		ObjectIutputStreamWithReadDesc ois = new ObjectIutputStreamWithReadDesc(
6887ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes				bais, cls);
6897ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		Object obj = ois.readObject();
6907ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		ois.close();
6917ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		assertEquals(cls, obj);
6927ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes	}
6937ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
6947ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes	// Regression Test for JIRA-2340
6957ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public static class ObjectOutputStreamWithWriteDesc1 extends
6967ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes			ObjectOutputStream {
6977ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		public ObjectOutputStreamWithWriteDesc1(OutputStream os)
6987ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes				throws IOException {
6997ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes			super(os);
7007ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		}
7017ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
7027ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		@Override
7037ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public void writeClassDescriptor(ObjectStreamClass desc)
7047ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes				throws IOException {
7057ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes			super.writeClassDescriptor(desc);
7067ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		}
7077ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes	}
7087ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
7097ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes	public static class ObjectIutputStreamWithReadDesc1 extends
7107ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes			ObjectInputStream {
7117ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
7127ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		public ObjectIutputStreamWithReadDesc1(InputStream is)
7137ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes				throws IOException {
7147ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes			super(is);
7157ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		}
7167ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
7177ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		@Override
7187ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public ObjectStreamClass readClassDescriptor() throws IOException,
7197ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes				ClassNotFoundException {
7207ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes			return super.readClassDescriptor();
7217ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		}
7227ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes	}
7237ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
7247ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    // Regression test for Harmony-1921
7257ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public static class ObjectInputStreamWithResolve extends ObjectInputStream {
7267ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public ObjectInputStreamWithResolve(InputStream in) throws IOException {
727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super(in);
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
7307ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        @Override
7317ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        @SuppressWarnings("unchecked")
7327ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        protected Class resolveClass(ObjectStreamClass desc)
733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throws IOException, ClassNotFoundException {
7347ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            if (desc.getName().equals(
7357ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                    "org.apache.harmony.luni.tests.pkg1.TestClass")) {
7367ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                return org.apache.harmony.luni.tests.pkg2.TestClass.class;
737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return super.resolveClass(desc);
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
7427ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_resolveClass() throws Exception {
7437ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        org.apache.harmony.luni.tests.pkg1.TestClass to1 = new org.apache.harmony.luni.tests.pkg1.TestClass();
7447ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        to1.i = 555;
7457ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ByteArrayOutputStream baos = new ByteArrayOutputStream();
7467ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ObjectOutputStream oos = new ObjectOutputStream(baos);
7477ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeObject(to1);
7487ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.flush();
7497ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        byte[] bytes = baos.toByteArray();
7507ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
7517ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ObjectInputStream ois = new ObjectInputStreamWithResolve(bais);
7527ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        org.apache.harmony.luni.tests.pkg2.TestClass to2 = (org.apache.harmony.luni.tests.pkg2.TestClass) ois
7537ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                .readObject();
7547ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
7557ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        if (to2.i != to1.i) {
7567ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            fail("Wrong object read. Expected val: " + to1.i + ", got: "
7577ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                    + to2.i);
7587ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
7617ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    static class ObjectInputStreamWithResolveObject extends ObjectInputStream {
7627ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
7637ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public static Integer intObj = Integer.valueOf(1000);
7647ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
7657ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public ObjectInputStreamWithResolveObject(InputStream in) throws IOException {
7667ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            super(in);
7677ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            enableResolveObject(true);
7687ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
7697ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
7707ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        @Override
7717ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        protected Object resolveObject(Object obj) throws IOException {
7727ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            if(obj instanceof Integer){
7737ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                obj = intObj;
7747ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            }
7757ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            return super.resolveObject(obj);
7767ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
7787ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
7797ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
780229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * java.io.ObjectInputStream#resolveObject(Object)
7817ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
7827ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_resolveObjectLjava_lang_Object() throws Exception {
7837ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        // Write an Integer object into memory
7847ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        Integer original = new Integer(10);
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteArrayOutputStream baos = new ByteArrayOutputStream();
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ObjectOutputStream oos = new ObjectOutputStream(baos);
7877ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeObject(original);
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        oos.flush();
7897ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
7907ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
7917ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        // Read the object from memory
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] bytes = baos.toByteArray();
7937ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
7947ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ObjectInputStreamWithResolveObject ois =
7957ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            new ObjectInputStreamWithResolveObject(bais);
7967ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        Integer actual = (Integer) ois.readObject();
7977ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois.close();
7987ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
7997ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        // object should be resolved from 10 to 1000
8007ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals(ObjectInputStreamWithResolveObject.intObj, actual);
8017ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
8027ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
8037ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes	public void test_readClassDescriptor() throws IOException,
8047ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes			ClassNotFoundException {
8057ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
8067ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		ByteArrayOutputStream baos = new ByteArrayOutputStream();
8077ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		ObjectOutputStreamWithWriteDesc1 oos = new ObjectOutputStreamWithWriteDesc1(
8087ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes				baos);
8097ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		ObjectStreamClass desc = ObjectStreamClass
8107ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		.lookup(TestClassForSerialization.class);
8117ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		oos.writeClassDescriptor(desc);
8127ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		oos.close();
8137ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
8147ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        byte[] bytes = baos.toByteArray();
8157ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
8167ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		ObjectIutputStreamWithReadDesc1 ois = new ObjectIutputStreamWithReadDesc1(
8177ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes				bais);
8187ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		Object obj = ois.readClassDescriptor();
8197ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		ois.close();
8207ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		assertEquals(desc.getClass(), obj.getClass());
8217ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
8227ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        //eof
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bais = new ByteArrayInputStream(bytes);
8247ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ExceptionalBufferedInputStream bis = new ExceptionalBufferedInputStream(
8257ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                bais);
8267ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectIutputStreamWithReadDesc1(bis);
8277ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
8287ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        bis.setEOF(true);
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
8317ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            obj = ois.readClassDescriptor();
8327ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        } catch (IOException e) {
8337ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            //e.printStackTrace();
8347ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        } finally {
8357ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            ois.close();
8367ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
8377ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
8387ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        //throw exception
8397ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        bais = new ByteArrayInputStream(bytes);
8407ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        bis = new ExceptionalBufferedInputStream(bais);
8417ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectIutputStreamWithReadDesc1(bis);
8427ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
8437ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        bis.setException(new IOException());
8447ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
8457ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        try {
8467ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            obj = ois.readClassDescriptor();
8477ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        } catch (IOException e) {
8487ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            //e.printStackTrace();
8497ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        } finally {
8507ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            ois.close();
8517ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
8527ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
8537ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        //corrupt
8547ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        bais = new ByteArrayInputStream(bytes);
8557ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        bis = new ExceptionalBufferedInputStream(bais);
8567ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ois = new ObjectIutputStreamWithReadDesc1(bis);
8577ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
8587ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        bis.setCorrupt(true);
8597ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
8607ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        try {
8617ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            obj = ois.readClassDescriptor();
8627ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        } catch (IOException e) {
8637ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            //e.printStackTrace();
8647ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        } finally {
8657ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            ois.close();
8667ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
8677ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes	}
8687ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
8697ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    static class ExceptionalBufferedInputStream extends BufferedInputStream {
8707ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        private boolean eof = false;
8717ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        private IOException exception = null;
8727ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        private boolean corrupt = false;
8737ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
8747ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public ExceptionalBufferedInputStream(InputStream in) {
8757ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            super(in);
8767ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
8777ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
8787ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        @Override
8797ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public int read() throws IOException {
8807ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            if (exception != null) {
8817ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                throw exception;
8827ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            }
8837ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
8847ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            if (eof) {
8857ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                return -1;
8867ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            }
8877ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
8887ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            if (corrupt) {
8897ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                return 0;
8907ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            }
8917ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            return super.read();
8927ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
8937ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
8947ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public void setEOF(boolean eof) {
8957ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            this.eof = eof;
8967ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
8977ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
8987ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public void setException(IOException exception) {
8997ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            this.exception = exception;
9007ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
9017ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
9027ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public void setCorrupt(boolean corrupt) {
9037ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            this.corrupt = corrupt;
9047ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
9057ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
9067ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
9077ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public static class ObjectIutputStreamWithReadDesc2 extends
9087ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            ObjectInputStream {
9097ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        private Class returnClass;
9107ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
9117ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public ObjectIutputStreamWithReadDesc2(InputStream is, Class returnClass)
9127ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                throws IOException {
9137ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            super(is);
9147ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            this.returnClass = returnClass;
9157ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
9167ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
9177ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        @Override
9187ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public ObjectStreamClass readClassDescriptor() throws IOException,
9197ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                ClassNotFoundException {
9207ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            ObjectStreamClass osc = super.readClassDescriptor();
9217ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
9227ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            if (osc.getName().equals(returnClass.getName())) {
9237ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                return ObjectStreamClass.lookup(returnClass);
9247ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            }
9257ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            return osc;
926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
9287ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
9297ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /*
9307ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     * Testing classDescriptor replacement with the value generated by
9317ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     * ObjectStreamClass.lookup() method.
9327ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     * Regression test for HARMONY-4638
9337ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
9347ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readClassDescriptor_1() throws IOException, ClassNotFoundException {
9357ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        A a = new A();
9367ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        a.name = "It's a test";
9377ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        PipedOutputStream pout = new PipedOutputStream();
9387ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        PipedInputStream pin = new PipedInputStream(pout);
9397ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ObjectOutputStream out = new ObjectOutputStream(pout);
9407ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ObjectInputStream in = new ObjectIutputStreamWithReadDesc2(pin, A.class);
9417ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
9427ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        // test single object
9437ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        out.writeObject(a);
9447ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        A a1 = (A) in.readObject();
9457ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals("Single case: incorrectly read the field of A", a.name, a1.name);
9467ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
9477ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        // test cyclic reference
9487ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        HashMap m = new HashMap();
9497ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        a = new A();
9507ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        a.name = "It's a test 0";
9517ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        a1 = new A();
9527ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        a1.name = "It's a test 1";
9537ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        m.put("0", a);
9547ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        m.put("1", a1);
9557ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        out.writeObject(m);
9567ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        HashMap m1 = (HashMap) in.readObject();
9577ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals("Incorrectly read the field of A", a.name, ((A) m1.get("0")).name);
9587ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertEquals("Incorrectly read the field of A1", a1.name, ((A) m1.get("1")).name);
9597ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
9607ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
9617ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_registerValidation() throws Exception {
9627ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        // Regression Test for Harmony-2402
9637ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ByteArrayOutputStream baos = new ByteArrayOutputStream();
9647ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        new ObjectOutputStream(baos);
9657ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ObjectInputStream ois = new ObjectInputStream(
9667ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                new ByteArrayInputStream(baos.toByteArray()));
9677ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
9687ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        try {
9697ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            ois.registerValidation(null, 256);
9707ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            fail("NotActiveException should be thrown");
9717ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        } catch (NotActiveException nae) {
9727ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            // expected
9737ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
9747ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
9757ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        // Regression Test for Harmony-3916
9767ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        baos = new ByteArrayOutputStream();
9777ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ObjectOutputStream oos = new ObjectOutputStream(baos);
9787ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.writeObject(new RegisterValidationClass());
9797ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos.close();
9807ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
9817ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ObjectInputStream fis = new ObjectInputStream(bais);
9827ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        // should not throw NotActiveException
9837ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        fis.readObject();
9847ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
9857ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
9867ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    private static class RegisterValidationClass implements Serializable {
9877ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        @SuppressWarnings("unused")
9887ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        private A a = new A();
9897ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
9907ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            stream.defaultReadObject();
9917ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            stream.registerValidation(new MockObjectInputValidation(), 0);
9927ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
9937ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
9947ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
9957ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    private static class MockObjectInputValidation implements ObjectInputValidation {
9967ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public void validateObject() throws InvalidObjectException {
9977ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
9987ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
9997ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
10007ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
10017ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    //Regression Test for HARMONY-3726
10027ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readObject_array() throws Exception {
10037ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
10047ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        final String resourcePrefix = ObjectInputStreamTest.class.getPackage().getName().replace('.', '/');
10057ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
10067ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes//        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("/temp/test_array_strings.ser"));
10077ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes//        TestArray ta = new TestArray(new String[] { "AAA", "BBB" });
10087ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes//        oos.writeObject(ta);
10097ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes//        oos.close();
10107ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes//        oos = new ObjectOutputStream(new FileOutputStream("/temp/test_array_integers.ser"));
10117ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes//        ta = new TestArray(new Integer[] { 10, 20 });
10127ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes//        oos.writeObject(ta);
10137ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes//        oos.close();
10147ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
10157ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ObjectInputStream oin = new ObjectInputStream(this.getClass().getClassLoader().getResourceAsStream(
10167ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                "serialization/" + resourcePrefix + "/test_array_strings.ser"));
10177ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        TestArray testArray = (TestArray) oin.readObject();
10187ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        String[] strings = new String[] { "AAA", "BBB" };
10197ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertTrue(java.util.Arrays.equals(strings, testArray.array));
10207ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
10217ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oin = new ObjectInputStream(this.getClass().getClassLoader().getResourceAsStream(
10227ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes                "serialization/" + resourcePrefix + "/test_array_integers.ser"));
10237ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        testArray = (TestArray) oin.readObject();
10247ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        Integer[] integers = new Integer[] { 10, 20 };
10257ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        assertTrue(java.util.Arrays.equals(integers, testArray.array));
10267ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
10277ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
10287ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public static class TestExtObject implements Externalizable {
10297ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public void writeExternal(ObjectOutput out) throws IOException {
10307ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            out.writeInt(10);
10317ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
10327ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
10337ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
10347ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            in.readInt();
10357ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
10367ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
10377ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
10387ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    static class TestObjectOutputStream extends ObjectOutputStream {
10397ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        private ObjectStreamClass[] objs;
10407ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        private int pos = 0;
10417ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
10427ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public TestObjectOutputStream(OutputStream out, ObjectStreamClass[] objs) throws IOException {
10437ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            super(out);
10447ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            this.objs = objs;
10457ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
10467ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
10477ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        @Override
10487ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        protected void writeClassDescriptor(ObjectStreamClass osc) throws IOException {
10497ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            objs[pos++] = osc;        }
10507ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
10517ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
10527ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    static class TestObjectInputStream extends ObjectInputStream {
10537ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        private ObjectStreamClass[] objs;
10547ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        private int pos = 0;
10557ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
10567ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        public TestObjectInputStream(InputStream in, ObjectStreamClass[] objs) throws IOException {
10577ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            super(in);
10587ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            this.objs = objs;
10597ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
10607ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
10617ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        @Override
10627ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {
10637ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes            return objs[pos++];
10647ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        }
10657ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
10667ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
10677ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    // Regression test for HARMONY-4996
10687ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public void test_readObject_replacedClassDescriptor() throws Exception {
10697ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ObjectStreamClass[] objs = new ObjectStreamClass[1000];
10707ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        PipedOutputStream pout = new PipedOutputStream();
10717ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        PipedInputStream pin = new PipedInputStream(pout);
10727ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ObjectOutputStream oout = new TestObjectOutputStream(pout, objs);
10737ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oout.writeObject(new TestExtObject());
10747ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oout.writeObject("test");
10757ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oout.close();
10767ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        ObjectInputStream oin = new TestObjectInputStream(pin, objs);
10777ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oin.readObject();
10787ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oin.readObject();
10797ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
10807ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
10817ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    /**
10827ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     * Sets up the fixture, for example, open a network connection. This method
10837ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     * is called before a test is executed.
10847ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes     */
10857ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    @Override
10867ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    protected void setUp() throws Exception {
10877ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        super.setUp();
10887ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        oos = new ObjectOutputStream(bao = new ByteArrayOutputStream());
10897ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
10907ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes}
10917ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
10927ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesclass TestArray implements Serializable
10937ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes{
10947ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    private static final long serialVersionUID = 1L;
10957ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
10967ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public Object[] array;
10977ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
10987ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public TestArray(Object[] array) {
10997ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes        this.array = array;
11007ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    }
11017ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
1102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
1103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
11047ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughesclass Test implements Serializable {
11057ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes	private static final long serialVersionUID = 1L;
11067ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes
11077ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes	Class classes[] = new Class[] { byte.class, short.class, int.class,
11087ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes			long.class, boolean.class, char.class, float.class, double.class };
1109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
11107ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes	@Override
11117ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes    public boolean equals(Object o) {
11127ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		if (!(o instanceof Test)) {
11137ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes			return false;
11147ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		}
11157ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes		return Arrays.equals(classes, ((Test) o).classes);
11167ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes	}
11177ee3a061452c5a7e5c8e661219a1f08a14171858Elliott Hughes}
1118