1cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath/*
2cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  Licensed to the Apache Software Foundation (ASF) under one or more
3cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  contributor license agreements.  See the NOTICE file distributed with
4cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  this work for additional information regarding copyright ownership.
5cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  The ASF licenses this file to You under the Apache License, Version 2.0
6cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  (the "License"); you may not use this file except in compliance with
7cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  the License.  You may obtain a copy of the License at
8cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *
9cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *     http://www.apache.org/licenses/LICENSE-2.0
10cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *
11cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  Unless required by applicable law or agreed to in writing, software
12cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  distributed under the License is distributed on an "AS IS" BASIS,
13cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  See the License for the specific language governing permissions and
15cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath *  limitations under the License.
16cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath */
17cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
18ab762bb740405d0fefcccf4a0899a234f995be13Narayan Kamathpackage org.apache.harmony.tests.java.io;
19cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
20cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ByteArrayInputStream;
21cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ByteArrayOutputStream;
22cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.IOException;
23cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.InputStream;
24cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.NotActiveException;
25cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ObjectInputStream;
26cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ObjectOutputStream;
27cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ObjectStreamClass;
28cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.ObjectStreamField;
29cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.OutputStream;
30cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.Serializable;
31cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.io.StreamCorruptedException;
32cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathimport java.util.Date;
33cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
34cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathpublic class ObjectStreamFieldTest extends junit.framework.TestCase {
35cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
36cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    static class DummyClass implements Serializable {
37cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        private static final long serialVersionUID = 999999999999998L;
38cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
39cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        long bam = 999L;
40cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
41cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        int ham = 9999;
42cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
43cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        int sam = 8888;
44cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
45cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        Object hola = new Object();
46cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
47cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        public static long getUID() {
48cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            return serialVersionUID;
49cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
50cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
51cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
52cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    ObjectStreamClass osc;
53cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
54cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    ObjectStreamField hamField;
55cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
56cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    ObjectStreamField samField;
57cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
58cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    ObjectStreamField bamField;
59cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
60cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    ObjectStreamField holaField;
61cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
62cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
63cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.io.ObjectStreamField#ObjectStreamField(java.lang.String,
64cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     *java.lang.Class)
65cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
66cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_ConstructorLjava_lang_StringLjava_lang_Class() {
67cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Used to test", true);
68cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
69cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
70cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_equalsLjava_lang_Object() {
71cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Regression test for HARMONY-4273
72cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue(samField.equals(samField));
73cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse(samField.equals(hamField));
74cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse(samField.equals("fish"));
75cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse(samField.equals(null));
76cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
77cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
78cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
79cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.io.ObjectStreamField#compareTo(java.lang.Object)
80cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
81cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_compareToLjava_lang_Object() {
82cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("Object compared to int did not return > 0", holaField
83cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .compareTo(hamField) > 0);
84cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("Int compared to itself did not return 0", 0, hamField
85cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .compareTo(hamField));
86cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("(Int)ham compared to (Int)sam did not return < 0", hamField
87cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .compareTo(samField) < 0);
88cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
89cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
90cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
91cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.io.ObjectStreamField#getName()
92cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
93cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getName() {
94cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("Field did not return correct name", "hola", holaField
95cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .getName());
96cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
97cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
98cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
99cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.io.ObjectStreamField#getOffset()
100cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
101cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getOffset() {
102cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectStreamField[] osfArray;
103cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        osfArray = osc.getFields();
104cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("getOffset did not return reasonable values", osfArray[0]
105cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .getOffset() != osfArray[1].getOffset());
106cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("getOffset for osfArray[0].getOffset() did not return 0",
107cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                0, osfArray[0].getOffset());
108cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("osfArray[1].getOffset() did not return	8", 8, osfArray[1]
109cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .getOffset());
110cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("osfArray[2].getOffset() did not return 12", 12,
111cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                osfArray[2].getOffset());
112cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
113cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
114cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
115cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.io.ObjectStreamField#getType()
116cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
117cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getType() {
118cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("getType on an Object field did not answer Object",
119cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                holaField.getType().equals(Object.class));
120cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
121cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
122cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
123cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.io.ObjectStreamField#getTypeCode()
124cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
125cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getTypeCode() {
126cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("getTypeCode on an Object field did not answer 'L'", 'L',
127cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                holaField.getTypeCode());
128cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("getTypeCode on a long field did not answer 'J'", 'J',
129cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                bamField.getTypeCode());
130cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
131cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
132cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
133cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.io.ObjectStreamField#getTypeString()
134cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
135cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getTypeString() {
136cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("getTypeString returned: " + holaField.getTypeString(),
137cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                holaField.getTypeString().indexOf("Object") >= 0);
138cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertNull("Primitive types' strings should be null", hamField
139cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                .getTypeString());
140cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
141cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectStreamField osf = new ObjectStreamField("s", String.class, true);
142cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue(osf.getTypeString() == "Ljava/lang/String;");
143cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
144cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
145cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
146cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.io.ObjectStreamField#toString()
147cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
148cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_toString() {
149cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue("toString on a long returned: " + bamField.toString(),
150cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath                bamField.toString().indexOf("bam") >= 0);
151cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
152cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
153cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
154cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.io.ObjectStreamField#getType()
155cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
156cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getType_Deserialized() throws IOException,
157cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ClassNotFoundException {
158cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
159cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectOutputStream oos = new ObjectOutputStream(baos);
160cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        oos.writeObject(new SerializableObject());
161cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        oos.close();
162cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        baos.close();
163cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
164cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        byte[] bytes = baos.toByteArray();
165cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
166cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectInputStream ois = new ObjectInputStream(bais);
167cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        SerializableObject obj = (SerializableObject) ois.readObject();
168cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
169cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectStreamClass oc = obj.getObjectStreamClass();
170cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectStreamField field = oc.getField("i");
171cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(Object.class, field.getType());
172cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
173cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
174cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
175cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * java.io.ObjectStreamField#getType()
176cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
177cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_getType_MockObjectInputStream() throws IOException,
178cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ClassNotFoundException {
179cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
180cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectOutputStream oos = new ObjectOutputStream(baos);
181cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        oos.writeObject(new SerializableObject());
182cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        oos.close();
183cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        baos.close();
184cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
185cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        byte[] bytes = baos.toByteArray();
186cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
187cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        MockObjectInputStream ois = new MockObjectInputStream(bais);
188cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ois.readObject();
189cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
190cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectStreamClass oc = ois.getObjectStreamClass();
191cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectStreamField field = oc.getField("i");
192cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(Object.class, field.getType());
193cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
194cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
195cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_isUnshared() throws Exception {
196cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        SerializableObject2 obj = new SerializableObject2();
197cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
198cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
199cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectOutputStream oos = new ObjectOutputStream(baos);
200cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        oos.writeObject(obj);
201cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        oos.close();
202cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        baos.close();
203cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        byte[] bytes = baos.toByteArray();
204cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
205cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectInputStream ois = new ObjectInputStream(bais);
206cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        SerializableObject2 newObj = (SerializableObject2) ois.readObject();
207cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
208cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectInputStream.GetField getField = newObj.getGetField();
209cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectStreamClass objectStreamClass = getField.getObjectStreamClass();
210cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
211cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue(objectStreamClass.getField("i").isUnshared());
212cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertFalse(objectStreamClass.getField("d").isUnshared());
213cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue(objectStreamClass.getField("s").isUnshared());
214cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
215cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(1000, getField.get("i", null));
216cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(SerializableObject2.today, getField.get("d", null));
217cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals("Richard", getField.get("s", null));
218cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
219cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertTrue(objectStreamClass.getField("s").getTypeString() == "Ljava/lang/String;");
220cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
221cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(0, objectStreamClass.getField("d").getOffset());
222cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(1, objectStreamClass.getField("i").getOffset());
223cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        assertEquals(2, objectStreamClass.getField("s").getOffset());
224cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
225cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
226cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
227cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
228cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * Write/serialize and read/de-serialize an object with primitive field
229cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
230cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public void test_ObjectWithPrimitiveField()
231cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            throws IOException, ClassNotFoundException {
232cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
233cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
234cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final MyObjectOutputStream oos = new MyObjectOutputStream(baos);
235cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        oos.writeObject(new MockClass());
236cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final byte[] bytes = baos.toByteArray();
237cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
238cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final MyObjectInputStream ois = new MyObjectInputStream(bais);
239cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // NullPointerException is thrown by the readObject call below.
240cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ois.readObject();
241cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
242cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
243cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    /**
244cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * Sets up the fixture, for example, open a network connection. This method
245cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     * is called before a test is executed.
246cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath     */
247cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    protected void setUp() {
248cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        osc = ObjectStreamClass.lookup(DummyClass.class);
249cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        bamField = osc.getField("bam");
250cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        samField = osc.getField("sam");
251cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        hamField = osc.getField("ham");
252cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        holaField = osc.getField("hola");
253cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
254cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath}
255cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
256cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathclass SerializableObject implements Serializable {
257cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public ObjectInputStream.GetField getField = null;
258cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
259cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static final long serialVersionUID = -2953957835918368056L;
260cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
261cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public Date d;
262cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
263cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public Integer i;
264cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
265cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public Exception e;
266cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
267cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public SerializableObject() {
268cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        d = new Date();
269cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        i = new Integer(1);
270cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        e = new Exception("e");
271cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
272cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
273cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private void writeObject(ObjectOutputStream o) throws IOException {
274cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        o.putFields().put("d", new Date());
275cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        o.putFields().put("i", new Integer(11));
276cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        o.writeFields();
277cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
278cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
279cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private void readObject(ObjectInputStream in) throws NotActiveException,
280cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            IOException, ClassNotFoundException {
281cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        getField = in.readFields();
282cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        d = (Date) getField.get("d", null);
283cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        i = (Integer) getField.get("i", null);
284cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
285cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
286cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public ObjectStreamClass getObjectStreamClass() {
287cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        return getField.getObjectStreamClass();
288cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
289cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath}
290cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
291cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathclass MockObjectInputStream extends ObjectInputStream {
292cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private ObjectStreamClass temp = null;
293cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
294cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public MockObjectInputStream() throws SecurityException, IOException {
295cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        super();
296cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
297cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
298cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public MockObjectInputStream(InputStream in)
299cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            throws StreamCorruptedException, IOException {
300cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        super(in);
301cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
302cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
303cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public ObjectStreamClass readClassDescriptor() throws IOException,
304cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            ClassNotFoundException {
305cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectStreamClass osc = super.readClassDescriptor();
306cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // To get the ObjectStreamClass of SerializableObject
307cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        if (osc.getSerialVersionUID() == -2953957835918368056L) {
308cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            temp = osc;
309cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        }
310cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        return osc;
311cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
312cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
313cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public ObjectStreamClass getObjectStreamClass() {
314cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        return temp;
315cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
316cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath}
317cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
318cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathclass SerializableObject2 implements Serializable {
319cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
320cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static final long serialVersionUID = 1L;
321cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
322cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private static final ObjectStreamField[] serialPersistentFields = {
323cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            new ObjectStreamField("i", Integer.class, true),
324cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            new ObjectStreamField("d", Date.class, false),
325cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            new ObjectStreamField("s", String.class, true), };
326cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
327cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private ObjectInputStream.GetField getField;
328cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
329cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public static Date today = new Date(1172632429156l);
330cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
331cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    public ObjectInputStream.GetField getGetField() {
332cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        return getField;
333cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
334cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
335cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private void writeObject(ObjectOutputStream o) throws IOException {
336cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        ObjectOutputStream.PutField putField = o.putFields();
337cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        putField.put("i", new Integer(1000));
338cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        putField.put("d", today);
339cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        putField.put("s", "Richard");
340cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        o.writeFields();
341cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
342cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
343cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    private void readObject(ObjectInputStream in) throws NotActiveException,
344cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            IOException, ClassNotFoundException {
345cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        getField = in.readFields();
346cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
347cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath}
348cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
349cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
350cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath// Primitive fields are necessary to cause the NullPointerException.
351cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathclass MockClass implements Serializable {
352cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    String str1 = "string 1";
353cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    String str2 = "string 2";
354cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    int int1 = 1;
355cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    int int2 = 2;
356cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    String str3 = "string 3";
357cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath}
358cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
359cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
360cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath// Overrides writeClassDescriptor to store ObjectStreamClass in map.
361cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathclass MyObjectOutputStream extends ObjectOutputStream {
362cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
363cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    // record the only ObjectStreamClass
364cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    static ObjectStreamClass descs;
365cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
366cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    MyObjectOutputStream(OutputStream out)
367cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            throws IOException {
368cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        super(out);
369cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
370cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
371cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    @Override
372cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    protected void writeClassDescriptor(ObjectStreamClass desc)
373cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            throws IOException {
374cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        descs = desc;
375cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Write a int
376cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        writeInt(1);
377cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
378cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath}
379cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
380cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath// Overrides readClassDescriptor to get ObjectStreamClass from map.
381cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamathclass MyObjectInputStream extends ObjectInputStream {
382cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
383cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    MyObjectInputStream(InputStream in)
384cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            throws IOException {
385cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        super(in);
386cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
387cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath
388cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    @Override
389cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    protected ObjectStreamClass readClassDescriptor()
390cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath            throws IOException, ClassNotFoundException {
391cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        // Read a integer and get the only ObjectStreamClass for the test
392cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        final int id = readInt();
393cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath        return MyObjectOutputStream.descs;
394cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath    }
395cb318c6f4fe5b0e20099fa85f1b95ccb2d24119fNarayan Kamath}
396