1 /* 2 * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @bug 4100915 27 * @summary Verify that [write/read]ObjectOverride methods get called. 28 * Test verifies that ALL methods to write an object can 29 * be overridden. Howver, the testing for reading an object 30 * is incomplete. Only test that readObjectOverride is called. 31 * An entire protocol would need to be implemented and written 32 * out before being able to test the input side of the API. 33 * 34 * Also, would be appropriate that this program verify 35 * that if SerializablePermission "enableSubclassImplamentation" 36 * is not in the security policy and security is enabled, that 37 * a security excepiton is thrown when constructing the 38 * ObjectOutputStream subclass. 39 * 40 * 41 * @compile AbstractObjectInputStream.java AbstractObjectOutputStream.java XObjectInputStream.java XObjectOutputStream.java Test.java 42 * @run main Test 43 */ 44 45 import java.io.*; 46 47 /** 48 * Test if customized readObject and writeObject are called. 49 */ 50 class B implements Serializable { 51 public int publicIntField; 52 public static int numWriteObjectCalled = 0; 53 B(int v) { 54 publicIntField = v; 55 } 56 private void writeObject(ObjectOutputStream os) throws IOException { 57 numWriteObjectCalled++; 58 os.defaultWriteObject(); 59 } 60 61 private void readObject(ObjectInputStream is) 62 throws IOException, ClassNotFoundException 63 { 64 is.defaultReadObject(); 65 } 66 67 }; 68 69 /** 70 * Test PutFields interface. 71 */ 72 73 class C implements Serializable { 74 public int xx1; 75 public int xx2; 76 static final ObjectStreamField[] serialPersistentFields = { 77 new ObjectStreamField("x1", Integer.TYPE), 78 new ObjectStreamField("x2", Integer.TYPE), 79 new ObjectStreamField("x3", Integer.TYPE), 80 new ObjectStreamField("x4", Integer.TYPE) 81 }; 82 C() { 83 xx1 = 300; 84 xx2 = 400; 85 } 86 87 private void writeObject(ObjectOutputStream os) throws IOException { 88 ObjectOutputStream.PutField putFields = os.putFields(); 89 putFields.put("x1", xx1); 90 putFields.put("x2", xx2); 91 putFields.put("x3", xx1 * 2); 92 putFields.put("x4", xx2 * 2); 93 os.writeFields(); 94 } 95 96 }; 97 98 99 class A implements Serializable { 100 public int publicIntField; 101 public long publicLongField; 102 public B publicBField; 103 public B[] publicBArray = { new B(4), new B(6)}; 104 public C publicCField; 105 106 public A() { 107 publicIntField = 3; 108 publicLongField = 10L; 109 publicBField = new B(5); 110 publicCField = new C(); 111 } 112 }; 113 114 public class Test { 115 public static void main(String argv[]) 116 throws IOException, ClassNotFoundException 117 { 118 boolean expectSecurityException = false; 119 120 if (argv.length > 0 && 121 argv[0].compareTo("-expectSecurityException") == 0) 122 expectSecurityException = true; 123 124 ByteArrayOutputStream baos = new ByteArrayOutputStream(20); 125 XObjectOutputStream os = null; 126 try { 127 os = new XObjectOutputStream(baos); 128 if (expectSecurityException) 129 throw new Error("Assertion failure. " + 130 "Expected a security exception on previous line."); 131 } catch (SecurityException e) { 132 if (expectSecurityException) 133 return; 134 else 135 throw e; 136 } 137 os.writeObject(new A()); 138 os.close(); 139 if (B.numWriteObjectCalled != 3) 140 throw new Error("Expected B.writeObject() to be called 3 times;" + 141 " observed only " + B.numWriteObjectCalled + " times"); 142 143 XObjectInputStream is = 144 new XObjectInputStream(new ByteArrayInputStream(baos.toByteArray())); 145 try { 146 A a = (A)is.readObject(); 147 throw new Error("Expected readObjectOverride() to be called and throw IOException(not implemented)"); 148 } catch (IOException e) { 149 } 150 is.close(); 151 } 152 };