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